5 * Dietmar Maurer (dietmar@ximian.com)
6 * Paolo Molaro (lupus@ximian.com)
7 * Patrik Torstensson (patrik.torstensson@labs2.com)
9 * (C) 2001 Ximian, Inc.
19 #if defined (PLATFORM_WIN32)
23 #include <mono/metadata/object.h>
24 #include <mono/metadata/threads.h>
25 #include <mono/metadata/threads-types.h>
26 #include <mono/metadata/threadpool.h>
27 #include <mono/metadata/monitor.h>
28 #include <mono/metadata/reflection.h>
29 #include <mono/metadata/assembly.h>
30 #include <mono/metadata/tabledefs.h>
31 #include <mono/metadata/exception.h>
32 #include <mono/metadata/file-io.h>
33 #include <mono/metadata/console-io.h>
34 #include <mono/metadata/socket-io.h>
35 #include <mono/metadata/mono-endian.h>
36 #include <mono/metadata/tokentype.h>
37 #include <mono/metadata/unicode.h>
38 #include <mono/metadata/domain-internals.h>
39 #include <mono/metadata/metadata-internals.h>
40 #include <mono/metadata/class-internals.h>
41 #include <mono/metadata/marshal.h>
42 #include <mono/metadata/gc-internal.h>
43 #include <mono/metadata/rand.h>
44 #include <mono/metadata/sysmath.h>
45 #include <mono/metadata/string-icalls.h>
46 #include <mono/metadata/debug-helpers.h>
47 #include <mono/metadata/process.h>
48 #include <mono/metadata/environment.h>
49 #include <mono/metadata/profiler-private.h>
50 #include <mono/metadata/locales.h>
51 #include <mono/metadata/filewatcher.h>
52 #include <mono/metadata/char-conversions.h>
53 #include <mono/metadata/security.h>
54 #include <mono/metadata/mono-config.h>
55 #include <mono/metadata/cil-coff.h>
56 #include <mono/metadata/security-manager.h>
57 #include <mono/io-layer/io-layer.h>
58 #include <mono/utils/strtod.h>
59 #include <mono/utils/monobitset.h>
61 #if defined (PLATFORM_WIN32)
67 static MonoReflectionAssembly* ves_icall_System_Reflection_Assembly_GetCallingAssembly (void);
71 * We expect a pointer to a char, not a string
74 mono_double_ParseImpl (char *ptr, double *result)
83 *result = strtod (ptr, &endptr);
86 *result = bsd_strtod (ptr, &endptr);
89 if (!*ptr || (endptr && *endptr))
96 ves_icall_System_Double_AssertEndianity (double *value)
100 MONO_DOUBLE_ASSERT_ENDIANITY (value);
104 ves_icall_System_Array_GetValueImpl (MonoObject *this, guint32 pos)
113 ao = (MonoArray *)this;
114 ac = (MonoClass *)ao->obj.vtable->klass;
116 esize = mono_array_element_size (ac);
117 ea = (gpointer*)((char*)ao->vector + (pos * esize));
119 if (ac->element_class->valuetype)
120 return mono_value_box (this->vtable->domain, ac->element_class, ea);
126 ves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs)
134 MONO_CHECK_ARG_NULL (idxs);
136 io = (MonoArray *)idxs;
137 ic = (MonoClass *)io->obj.vtable->klass;
139 ao = (MonoArray *)this;
140 ac = (MonoClass *)ao->obj.vtable->klass;
142 g_assert (ic->rank == 1);
143 if (io->bounds != NULL || io->max_length != ac->rank)
144 mono_raise_exception (mono_get_exception_argument (NULL, NULL));
146 ind = (gint32 *)io->vector;
148 if (ao->bounds == NULL) {
149 if (*ind < 0 || *ind >= ao->max_length)
150 mono_raise_exception (mono_get_exception_index_out_of_range ());
152 return ves_icall_System_Array_GetValueImpl (this, *ind);
155 for (i = 0; i < ac->rank; i++)
156 if ((ind [i] < ao->bounds [i].lower_bound) ||
157 (ind [i] >= ao->bounds [i].length + ao->bounds [i].lower_bound))
158 mono_raise_exception (mono_get_exception_index_out_of_range ());
160 pos = ind [0] - ao->bounds [0].lower_bound;
161 for (i = 1; i < ac->rank; i++)
162 pos = pos*ao->bounds [i].length + ind [i] -
163 ao->bounds [i].lower_bound;
165 return ves_icall_System_Array_GetValueImpl (this, pos);
169 ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 pos)
171 MonoClass *ac, *vc, *ec;
182 vc = value->vtable->klass;
186 ac = this->obj.vtable->klass;
187 ec = ac->element_class;
189 esize = mono_array_element_size (ac);
190 ea = (gpointer*)((char*)this->vector + (pos * esize));
191 va = (gpointer*)((char*)value + sizeof (MonoObject));
194 memset (ea, 0, esize);
198 #define NO_WIDENING_CONVERSION G_STMT_START{\
199 mono_raise_exception (mono_get_exception_argument ( \
200 "value", "not a widening conversion")); \
203 #define CHECK_WIDENING_CONVERSION(extra) G_STMT_START{\
204 if (esize < vsize + (extra)) \
205 mono_raise_exception (mono_get_exception_argument ( \
206 "value", "not a widening conversion")); \
209 #define INVALID_CAST G_STMT_START{\
210 mono_raise_exception (mono_get_exception_invalid_cast ()); \
213 /* Check element (destination) type. */
214 switch (ec->byval_arg.type) {
215 case MONO_TYPE_STRING:
216 switch (vc->byval_arg.type) {
217 case MONO_TYPE_STRING:
223 case MONO_TYPE_BOOLEAN:
224 switch (vc->byval_arg.type) {
225 case MONO_TYPE_BOOLEAN:
238 NO_WIDENING_CONVERSION;
245 if (!ec->valuetype) {
246 if (!mono_object_isinst (value, ec))
248 *ea = (gpointer)value;
252 if (mono_object_isinst (value, ec)) {
253 memcpy (ea, (char *)value + sizeof (MonoObject), esize);
260 vsize = mono_class_instance_size (vc) - sizeof (MonoObject);
262 #define ASSIGN_UNSIGNED(etype) G_STMT_START{\
263 switch (vc->byval_arg.type) { \
268 case MONO_TYPE_CHAR: \
269 CHECK_WIDENING_CONVERSION(0); \
270 *(etype *) ea = (etype) u64; \
272 /* You can't assign a signed value to an unsigned array. */ \
277 /* You can't assign a floating point number to an integer array. */ \
280 NO_WIDENING_CONVERSION; \
284 #define ASSIGN_SIGNED(etype) G_STMT_START{\
285 switch (vc->byval_arg.type) { \
290 CHECK_WIDENING_CONVERSION(0); \
291 *(etype *) ea = (etype) i64; \
293 /* You can assign an unsigned value to a signed array if the array's */ \
294 /* element size is larger than the value size. */ \
299 case MONO_TYPE_CHAR: \
300 CHECK_WIDENING_CONVERSION(1); \
301 *(etype *) ea = (etype) u64; \
303 /* You can't assign a floating point number to an integer array. */ \
306 NO_WIDENING_CONVERSION; \
310 #define ASSIGN_REAL(etype) G_STMT_START{\
311 switch (vc->byval_arg.type) { \
314 CHECK_WIDENING_CONVERSION(0); \
315 *(etype *) ea = (etype) r64; \
317 /* All integer values fit into a floating point array, so we don't */ \
318 /* need to CHECK_WIDENING_CONVERSION here. */ \
323 *(etype *) ea = (etype) i64; \
329 case MONO_TYPE_CHAR: \
330 *(etype *) ea = (etype) u64; \
335 switch (vc->byval_arg.type) {
337 u64 = *(guint8 *) va;
340 u64 = *(guint16 *) va;
343 u64 = *(guint32 *) va;
346 u64 = *(guint64 *) va;
352 i64 = *(gint16 *) va;
355 i64 = *(gint32 *) va;
358 i64 = *(gint64 *) va;
361 r64 = *(gfloat *) va;
364 r64 = *(gdouble *) va;
367 u64 = *(guint16 *) va;
369 case MONO_TYPE_BOOLEAN:
370 /* Boolean is only compatible with itself. */
371 switch (ec->byval_arg.type) {
383 NO_WIDENING_CONVERSION;
390 /* If we can't do a direct copy, let's try a widening conversion. */
391 switch (ec->byval_arg.type) {
393 ASSIGN_UNSIGNED (guint16);
395 ASSIGN_UNSIGNED (guint8);
397 ASSIGN_UNSIGNED (guint16);
399 ASSIGN_UNSIGNED (guint32);
401 ASSIGN_UNSIGNED (guint64);
403 ASSIGN_SIGNED (gint8);
405 ASSIGN_SIGNED (gint16);
407 ASSIGN_SIGNED (gint32);
409 ASSIGN_SIGNED (gint64);
411 ASSIGN_REAL (gfloat);
413 ASSIGN_REAL (gdouble);
417 /* Not reached, INVALID_CAST does not return. Just to avoid a compiler warning ... */
421 #undef NO_WIDENING_CONVERSION
422 #undef CHECK_WIDENING_CONVERSION
423 #undef ASSIGN_UNSIGNED
429 ves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value,
437 MONO_CHECK_ARG_NULL (idxs);
439 ic = idxs->obj.vtable->klass;
440 ac = this->obj.vtable->klass;
442 g_assert (ic->rank == 1);
443 if (idxs->bounds != NULL || idxs->max_length != ac->rank)
444 mono_raise_exception (mono_get_exception_argument (NULL, NULL));
446 ind = (gint32 *)idxs->vector;
448 if (this->bounds == NULL) {
449 if (*ind < 0 || *ind >= this->max_length)
450 mono_raise_exception (mono_get_exception_index_out_of_range ());
452 ves_icall_System_Array_SetValueImpl (this, value, *ind);
456 for (i = 0; i < ac->rank; i++)
457 if ((ind [i] < this->bounds [i].lower_bound) ||
458 (ind [i] >= this->bounds [i].length + this->bounds [i].lower_bound))
459 mono_raise_exception (mono_get_exception_index_out_of_range ());
461 pos = ind [0] - this->bounds [0].lower_bound;
462 for (i = 1; i < ac->rank; i++)
463 pos = pos * this->bounds [i].length + ind [i] -
464 this->bounds [i].lower_bound;
466 ves_icall_System_Array_SetValueImpl (this, value, pos);
470 ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)
475 gboolean bounded = FALSE;
479 MONO_CHECK_ARG_NULL (type);
480 MONO_CHECK_ARG_NULL (lengths);
482 MONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);
484 MONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));
486 for (i = 0; i < mono_array_length (lengths); i++)
487 if (mono_array_get (lengths, gint32, i) < 0)
488 mono_raise_exception (mono_get_exception_argument_out_of_range (NULL));
490 if (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint32, 0) != 0))
491 /* vectors are not the same as one dimensional arrays with no-zero bounds */
496 aklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);
498 sizes = alloca (aklass->rank * sizeof(guint32) * 2);
499 for (i = 0; i < aklass->rank; ++i) {
500 sizes [i] = mono_array_get (lengths, guint32, i);
502 sizes [i + aklass->rank] = mono_array_get (bounds, guint32, i);
504 sizes [i + aklass->rank] = 0;
507 array = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);
513 ves_icall_System_Array_GetRank (MonoObject *this)
517 return this->vtable->klass->rank;
521 ves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension)
523 gint32 rank = ((MonoObject *)this)->vtable->klass->rank;
527 if ((dimension < 0) || (dimension >= rank))
528 mono_raise_exception (mono_get_exception_index_out_of_range ());
530 if (this->bounds == NULL)
531 return this->max_length;
533 return this->bounds [dimension].length;
537 ves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension)
539 gint32 rank = ((MonoObject *)this)->vtable->klass->rank;
543 if ((dimension < 0) || (dimension >= rank))
544 mono_raise_exception (mono_get_exception_index_out_of_range ());
546 if (this->bounds == NULL)
549 return this->bounds [dimension].lower_bound;
553 ves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length)
555 int sz = mono_array_element_size (mono_object_class (arr));
556 memset (mono_array_addr_with_size (arr, sz, idx), 0, length * sz);
560 ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length)
565 MonoClass *src_class;
566 MonoClass *dest_class;
571 if (source->obj.vtable->klass->rank != dest->obj.vtable->klass->rank)
574 if (source->bounds || dest->bounds)
577 if ((dest_idx + length > mono_array_length (dest)) ||
578 (source_idx + length > mono_array_length (source)))
581 element_size = mono_array_element_size (source->obj.vtable->klass);
582 dest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);
583 source_addr = mono_array_addr_with_size (source, element_size, source_idx);
585 src_class = source->obj.vtable->klass->element_class;
586 dest_class = dest->obj.vtable->klass->element_class;
589 * Handle common cases.
592 /* Case1: object[] -> valuetype[] (ArrayList::ToArray) */
593 if (src_class == mono_defaults.object_class && dest_class->valuetype) {
594 for (i = source_idx; i < source_idx + length; ++i) {
595 MonoObject *elem = mono_array_get (source, MonoObject*, i);
596 if (elem && !mono_object_isinst (elem, dest_class))
600 element_size = mono_array_element_size (dest->obj.vtable->klass);
601 for (i = 0; i < length; ++i) {
602 MonoObject *elem = mono_array_get (source, MonoObject*, source_idx + i);
603 void *addr = mono_array_addr_with_size (dest, element_size, dest_idx + i);
605 memset (addr, 0, element_size);
607 memcpy (addr, (char *)elem + sizeof (MonoObject), element_size);
612 /* Check if we're copying a char[] <==> (u)short[] */
613 if (src_class != dest_class) {
614 if (dest_class->valuetype || dest_class->enumtype || src_class->valuetype || src_class->enumtype)
617 if (mono_class_is_subclass_of (src_class, dest_class, FALSE))
619 /* Case2: object[] -> reftype[] (ArrayList::ToArray) */
620 else if (mono_class_is_subclass_of (dest_class, src_class, FALSE))
621 for (i = source_idx; i < source_idx + length; ++i) {
622 MonoObject *elem = mono_array_get (source, MonoObject*, i);
623 if (elem && !mono_object_isinst (elem, dest_class))
630 memmove (dest_addr, source_addr, element_size * length);
636 ves_icall_System_Array_InternalArray_GetGenericValueImpl (MonoObject *this, guint32 pos,
646 ao = (MonoArray *)this;
647 ac = (MonoClass *)ao->obj.vtable->klass;
649 esize = mono_array_element_size (ac);
650 ea = (gpointer*)((char*)ao->vector + (pos * esize));
652 memcpy (value, ea, esize);
656 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArray *array, MonoClassField *field_handle)
658 MonoClass *klass = array->obj.vtable->klass;
659 guint32 size = mono_array_element_size (klass);
664 if (array->bounds == NULL)
665 size *= array->max_length;
667 for (i = 0; i < klass->rank; ++i)
668 size *= array->bounds [i].length;
670 memcpy (mono_array_addr (array, char, 0), field_handle->data, size);
672 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
676 guint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \
678 for (i = 0; i < size; i += n/8, data++) { \
679 tmp = read ## n (data); \
684 /* printf ("Initialize array with elements of %s type\n", klass->element_class->name); */
686 switch (mono_type_get_underlying_type (&klass->element_class->byval_arg)->type) {
706 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData (void)
710 return offsetof (MonoString, chars);
714 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObject *obj)
718 if ((obj == NULL) || (! (obj->vtable->klass->valuetype)))
721 return mono_object_clone (obj);
725 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (MonoType *handle)
731 MONO_CHECK_ARG_NULL (handle);
733 klass = mono_class_from_mono_type (handle);
734 MONO_CHECK_ARG (handle, klass);
736 /* This will call the type constructor */
737 if (! (klass->flags & TYPE_ATTRIBUTE_INTERFACE))
738 mono_runtime_class_init (mono_class_vtable (mono_domain_get (), klass));
742 ves_icall_System_Object_MemberwiseClone (MonoObject *this)
746 return mono_object_clone (this);
749 #define MONO_OBJECT_ALIGNMENT_SHIFT 3
752 * Return hashcode based on object address. This function will need to be
753 * smarter in the presence of a moving garbage collector, which will cache
754 * the address hash before relocating the object.
756 * Wang's address-based hash function:
757 * http://www.concentric.net/~Ttwang/tech/addrhash.htm
760 ves_icall_System_Object_GetHashCode (MonoObject *this)
764 return (GPOINTER_TO_UINT (this) >> MONO_OBJECT_ALIGNMENT_SHIFT) * 2654435761u;
768 ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fields)
771 MonoObject **values = NULL;
775 MonoClassField* field;
780 klass = mono_object_class (this);
782 if (mono_class_num_fields (klass) == 0)
783 return ves_icall_System_Object_GetHashCode (this);
786 * Compute the starting value of the hashcode for fields of primitive
787 * types, and return the remaining fields in an array to the managed side.
788 * This way, we can avoid costly reflection operations in managed code.
791 while ((field = mono_class_get_fields (klass, &iter))) {
792 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)
794 if (mono_field_is_deleted (field))
796 /* FIXME: Add more types */
797 switch (field->type->type) {
799 result ^= *(gint32*)((guint8*)this + field->offset);
801 case MONO_TYPE_STRING: {
803 s = *(MonoString**)((guint8*)this + field->offset);
805 result ^= mono_string_hash (s);
810 values = g_newa (MonoObject*, mono_class_num_fields (klass));
811 o = mono_field_get_value_object (mono_object_domain (this), field, this);
812 values [count++] = o;
817 *fields = mono_array_new (mono_domain_get (), mono_defaults.object_class, count);
818 memcpy (mono_array_addr (*fields, MonoObject*, 0), values, count * sizeof (MonoObject*));
826 ves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray **fields)
829 MonoObject **values = NULL;
831 MonoClassField* field;
837 MONO_CHECK_ARG_NULL (that);
839 if (this->vtable != that->vtable)
842 klass = mono_object_class (this);
845 * Do the comparison for fields of primitive type and return a result if
846 * possible. Otherwise, return the remaining fields in an array to the
847 * managed side. This way, we can avoid costly reflection operations in
852 while ((field = mono_class_get_fields (klass, &iter))) {
853 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)
855 if (mono_field_is_deleted (field))
857 /* FIXME: Add more types */
858 switch (field->type->type) {
860 if (*(gint32*)((guint8*)this + field->offset) != *(gint32*)((guint8*)that + field->offset))
863 case MONO_TYPE_STRING: {
865 guint32 s1len, s2len;
866 s1 = *(MonoString**)((guint8*)this + field->offset);
867 s2 = *(MonoString**)((guint8*)that + field->offset);
870 if ((s1 == NULL) || (s2 == NULL))
872 s1len = mono_string_length (s1);
873 s2len = mono_string_length (s2);
877 if (memcmp (mono_string_chars (s1), mono_string_chars (s2), s1len * sizeof (gunichar2)) != 0)
883 values = g_newa (MonoObject*, mono_class_num_fields (klass) * 2);
884 o = mono_field_get_value_object (mono_object_domain (this), field, this);
885 values [count++] = o;
886 o = mono_field_get_value_object (mono_object_domain (this), field, that);
887 values [count++] = o;
892 *fields = mono_array_new (mono_domain_get (), mono_defaults.object_class, count);
893 memcpy (mono_array_addr (*fields, MonoObject*, 0), values, count * sizeof (MonoObject*));
901 static MonoReflectionType *
902 ves_icall_System_Object_GetType (MonoObject *obj)
906 if (obj->vtable->klass != mono_defaults.transparent_proxy_class)
907 return mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);
909 return mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg);
913 mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)
917 mtype->type = &obj->vtable->klass->byval_arg;
918 g_assert (mtype->type->type);
922 ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj)
926 MONO_CHECK_ARG_NULL (obj);
928 return mono_image_create_token (mb->dynamic_image, obj, TRUE);
932 ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb,
933 MonoReflectionMethod *method,
934 MonoArray *opt_param_types)
938 MONO_CHECK_ARG_NULL (method);
940 return mono_image_create_method_token (
941 mb->dynamic_image, (MonoObject *) method, opt_param_types);
945 ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file)
949 mono_image_create_pefile (mb, file);
953 ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)
957 mono_image_build_metadata (mb);
961 get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
963 MonoMethod **dest = data;
965 /* skip unmanaged frames */
980 static MonoReflectionType *
981 type_from_name (const char *str, MonoBoolean ignoreCase)
983 MonoType *type = NULL;
984 MonoAssembly *assembly = NULL;
985 MonoTypeNameParse info;
986 char *temp_str = g_strdup (str);
987 gboolean type_resolve = FALSE;
991 /* mono_reflection_parse_type() mangles the string */
992 if (!mono_reflection_parse_type (temp_str, &info)) {
993 g_list_free (info.modifiers);
994 g_list_free (info.nested);
999 if (info.assembly.name) {
1000 assembly = mono_assembly_load (&info.assembly, NULL, NULL);
1002 MonoMethod *m = mono_method_get_last_managed ();
1003 MonoMethod *dest = m;
1005 mono_stack_walk_no_il (get_caller, &dest);
1010 * FIXME: mono_method_get_last_managed() sometimes returns NULL, thus
1011 * causing ves_icall_System_Reflection_Assembly_GetCallingAssembly()
1012 * to crash. This only seems to happen in some strange remoting
1013 * scenarios and I was unable to figure out what's happening there.
1014 * Dec 10, 2005 - Martin.
1018 assembly = dest->klass->image->assembly;
1020 g_warning (G_STRLOC);
1025 type = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);
1027 if (!info.assembly.name && !type) /* try mscorlib */
1028 type = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve);
1030 g_list_free (info.modifiers);
1031 g_list_free (info.nested);
1037 return mono_type_get_object (mono_domain_get (), type);
1041 MonoReflectionType *
1042 mono_type_get (const char *str)
1044 char *copy = g_strdup (str);
1045 MonoReflectionType *type = type_from_name (copy, FALSE);
1052 static MonoReflectionType*
1053 ves_icall_type_from_name (MonoString *name,
1054 MonoBoolean throwOnError,
1055 MonoBoolean ignoreCase)
1057 char *str = mono_string_to_utf8 (name);
1058 MonoReflectionType *type;
1060 type = type_from_name (str, ignoreCase);
1064 mono_raise_exception (mono_get_exception_type_load (name, NULL));
1071 static MonoReflectionType*
1072 ves_icall_type_from_handle (MonoType *handle)
1074 MonoDomain *domain = mono_domain_get ();
1075 MonoClass *klass = mono_class_from_mono_type (handle);
1077 MONO_ARCH_SAVE_REGS;
1079 mono_class_init (klass);
1080 return mono_type_get_object (domain, handle);
1084 ves_icall_type_Equals (MonoReflectionType *type, MonoReflectionType *c)
1086 MONO_ARCH_SAVE_REGS;
1088 if (c && type->type && c->type)
1089 return mono_metadata_type_equal (type->type, c->type);
1094 /* System.TypeCode */
1113 TYPECODE_STRING = 18
1117 ves_icall_type_GetTypeCodeInternal (MonoReflectionType *type)
1119 int t = type->type->type;
1121 MONO_ARCH_SAVE_REGS;
1123 if (type->type->byref)
1124 return TYPECODE_OBJECT;
1128 case MONO_TYPE_VOID:
1129 return TYPECODE_OBJECT;
1130 case MONO_TYPE_BOOLEAN:
1131 return TYPECODE_BOOLEAN;
1133 return TYPECODE_BYTE;
1135 return TYPECODE_SBYTE;
1137 return TYPECODE_UINT16;
1139 return TYPECODE_INT16;
1140 case MONO_TYPE_CHAR:
1141 return TYPECODE_CHAR;
1145 return TYPECODE_OBJECT;
1147 return TYPECODE_UINT32;
1149 return TYPECODE_INT32;
1151 return TYPECODE_UINT64;
1153 return TYPECODE_INT64;
1155 return TYPECODE_SINGLE;
1157 return TYPECODE_DOUBLE;
1158 case MONO_TYPE_VALUETYPE:
1159 if (type->type->data.klass->enumtype) {
1160 t = type->type->data.klass->enum_basetype->type;
1163 MonoClass *k = type->type->data.klass;
1164 if (strcmp (k->name_space, "System") == 0) {
1165 if (strcmp (k->name, "Decimal") == 0)
1166 return TYPECODE_DECIMAL;
1167 else if (strcmp (k->name, "DateTime") == 0)
1168 return TYPECODE_DATETIME;
1171 return TYPECODE_OBJECT;
1172 case MONO_TYPE_STRING:
1173 return TYPECODE_STRING;
1174 case MONO_TYPE_SZARRAY:
1175 case MONO_TYPE_ARRAY:
1176 case MONO_TYPE_OBJECT:
1178 case MONO_TYPE_MVAR:
1179 return TYPECODE_OBJECT;
1180 case MONO_TYPE_CLASS:
1182 MonoClass *k = type->type->data.klass;
1183 if (strcmp (k->name_space, "System") == 0) {
1184 if (strcmp (k->name, "DBNull") == 0)
1185 return TYPECODE_DBNULL;
1188 return TYPECODE_OBJECT;
1189 case MONO_TYPE_GENERICINST:
1190 return TYPECODE_OBJECT;
1192 g_error ("type 0x%02x not handled in GetTypeCode()", t);
1198 ves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, MonoBoolean check_interfaces)
1204 MONO_ARCH_SAVE_REGS;
1206 g_assert (type != NULL);
1208 domain = ((MonoObject *)type)->vtable->domain;
1210 if (!c) /* FIXME: dont know what do do here */
1213 klass = mono_class_from_mono_type (type->type);
1214 klassc = mono_class_from_mono_type (c->type);
1216 if (type->type->byref)
1217 return klassc == mono_defaults.object_class;
1219 return mono_class_is_subclass_of (klass, klassc, check_interfaces);
1223 ves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)
1229 MONO_ARCH_SAVE_REGS;
1231 g_assert (type != NULL);
1233 domain = ((MonoObject *)type)->vtable->domain;
1235 klass = mono_class_from_mono_type (type->type);
1236 klassc = mono_class_from_mono_type (c->type);
1238 if (type->type->byref && !c->type->byref)
1241 return mono_class_is_assignable_from (klass, klassc);
1245 ves_icall_type_IsInstanceOfType (MonoReflectionType *type, MonoObject *obj)
1247 MonoClass *klass = mono_class_from_mono_type (type->type);
1248 return mono_object_isinst (obj, klass) != NULL;
1252 ves_icall_get_attributes (MonoReflectionType *type)
1254 MonoClass *klass = mono_class_from_mono_type (type->type);
1256 MONO_ARCH_SAVE_REGS;
1258 return klass->flags;
1261 static MonoReflectionMarshal*
1262 ves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal (MonoReflectionField *field)
1264 MonoClass *klass = field->field->parent;
1265 MonoMarshalType *info;
1268 if (klass->generic_container ||
1269 (klass->generic_class && klass->generic_class->inst->is_open))
1272 info = mono_marshal_load_type_info (klass);
1274 for (i = 0; i < info->num_fields; ++i) {
1275 if (info->fields [i].field == field->field) {
1276 if (!info->fields [i].mspec)
1279 return mono_reflection_marshal_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);
1286 static MonoReflectionField*
1287 ves_icall_System_Reflection_FieldInfo_internal_from_handle (MonoClassField *handle)
1289 MONO_ARCH_SAVE_REGS;
1293 return mono_field_get_object (mono_domain_get (), handle->parent, handle);
1297 ves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info)
1299 MonoDomain *domain = mono_domain_get ();
1300 MonoMethodSignature* sig;
1301 MONO_ARCH_SAVE_REGS;
1303 if (method->is_inflated)
1304 method = mono_get_inflated_method (method);
1306 sig = mono_method_signature (method);
1308 info->parent = mono_type_get_object (domain, &method->klass->byval_arg);
1309 info->ret = mono_type_get_object (domain, sig->ret);
1310 info->attrs = method->flags;
1311 info->implattrs = method->iflags;
1312 if (sig->call_convention == MONO_CALL_DEFAULT)
1315 if (sig->call_convention == MONO_CALL_VARARG)
1320 info->callconv |= (sig->hasthis << 5) | (sig->explicit_this << 6);
1324 ves_icall_get_parameter_info (MonoMethod *method)
1326 MonoDomain *domain = mono_domain_get ();
1328 MONO_ARCH_SAVE_REGS;
1330 if (method->is_inflated)
1331 method = mono_get_inflated_method (method);
1333 return mono_param_get_objects (domain, method);
1336 static MonoReflectionMarshal*
1337 ves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)
1339 MonoDomain *domain = mono_domain_get ();
1340 MonoReflectionMarshal* res = NULL;
1341 MonoMarshalSpec **mspecs;
1344 MONO_ARCH_SAVE_REGS;
1346 if (method->is_inflated)
1347 method = mono_get_inflated_method (method);
1349 mspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);
1350 mono_method_get_marshal_info (method, mspecs);
1353 res = mono_reflection_marshal_from_marshal_spec (domain, method->klass, mspecs [0]);
1355 for (i = mono_method_signature (method)->param_count; i >= 0; i--)
1357 mono_metadata_free_marshal_spec (mspecs [i]);
1364 ves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)
1366 return field->field->offset - sizeof (MonoObject);
1369 static MonoReflectionType*
1370 ves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)
1373 MONO_ARCH_SAVE_REGS;
1375 parent = declaring? field->field->parent: field->klass;
1377 return mono_type_get_object (mono_object_domain (field), &parent->byval_arg);
1381 ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *obj)
1384 MonoClassField *cf = field->field;
1388 MonoDomain *domain = mono_object_domain (field);
1390 gboolean is_static = FALSE;
1391 gboolean is_ref = FALSE;
1393 MONO_ARCH_SAVE_REGS;
1395 if (field->klass->image->assembly->ref_only)
1396 mono_raise_exception (mono_get_exception_invalid_operation (
1397 "It is illegal to get the value on a field on a type loaded using the ReflectionOnly methods."));
1399 mono_class_init (field->klass);
1401 t = mono_type_get_underlying_type (cf->type);
1403 case MONO_TYPE_STRING:
1404 case MONO_TYPE_OBJECT:
1405 case MONO_TYPE_CLASS:
1406 case MONO_TYPE_ARRAY:
1407 case MONO_TYPE_SZARRAY:
1412 case MONO_TYPE_BOOLEAN:
1415 case MONO_TYPE_CHAR:
1424 case MONO_TYPE_VALUETYPE:
1427 case MONO_TYPE_GENERICINST:
1428 if (mono_type_generic_inst_is_valuetype (t)) {
1435 g_error ("type 0x%x not handled in "
1436 "ves_icall_Monofield_GetValue", t->type);
1441 if (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {
1443 vtable = mono_class_vtable (domain, field->klass);
1444 if (!vtable->initialized && !(cf->type->attrs & FIELD_ATTRIBUTE_LITERAL))
1445 mono_runtime_class_init (vtable);
1450 mono_field_static_get_value (vtable, cf, &o);
1452 mono_field_get_value (obj, cf, &o);
1457 if (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {
1458 MonoClass *nklass = mono_class_from_mono_type (cf->type);
1461 /* Convert the Nullable structure into a boxed vtype */
1463 buf = (char*)vtable->data + cf->offset;
1465 buf = (char*)obj + cf->offset;
1467 return mono_nullable_box (buf, nklass);
1470 /* boxed value type */
1471 klass = mono_class_from_mono_type (cf->type);
1472 o = mono_object_new (domain, klass);
1473 v = ((gchar *) o) + sizeof (MonoObject);
1475 mono_field_static_get_value (vtable, cf, v);
1477 mono_field_get_value (obj, cf, v);
1484 ves_icall_FieldInfo_SetValueInternal (MonoReflectionField *field, MonoObject *obj, MonoObject *value)
1486 MonoClassField *cf = field->field;
1489 MONO_ARCH_SAVE_REGS;
1491 if (field->klass->image->assembly->ref_only)
1492 mono_raise_exception (mono_get_exception_invalid_operation (
1493 "It is illegal to set the value on a field on a type loaded using the ReflectionOnly methods."));
1495 v = (gchar *) value;
1496 if (!cf->type->byref) {
1497 switch (cf->type->type) {
1500 case MONO_TYPE_BOOLEAN:
1503 case MONO_TYPE_CHAR:
1512 case MONO_TYPE_VALUETYPE:
1514 v += sizeof (MonoObject);
1516 case MONO_TYPE_STRING:
1517 case MONO_TYPE_OBJECT:
1518 case MONO_TYPE_CLASS:
1519 case MONO_TYPE_ARRAY:
1520 case MONO_TYPE_SZARRAY:
1523 case MONO_TYPE_GENERICINST: {
1524 MonoGenericClass *gclass = cf->type->data.generic_class;
1525 g_assert (!gclass->inst->is_open);
1527 if (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {
1528 MonoClass *nklass = mono_class_from_mono_type (cf->type);
1532 * Convert the boxed vtype into a Nullable structure.
1533 * This is complicated by the fact that Nullables have
1534 * a variable structure.
1536 /* Allocate using alloca so it gets GC tracking */
1537 buf = alloca (nklass->instance_size);
1539 mono_nullable_init (buf, value, nklass);
1544 if (gclass->container_class->valuetype && (v != NULL))
1545 v += sizeof (MonoObject);
1549 g_error ("type 0x%x not handled in "
1550 "ves_icall_FieldInfo_SetValueInternal", cf->type->type);
1555 if (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {
1556 MonoVTable *vtable = mono_class_vtable (mono_object_domain (field), field->klass);
1557 if (!vtable->initialized)
1558 mono_runtime_class_init (vtable);
1559 mono_field_static_set_value (vtable, cf, v);
1561 mono_field_set_value (obj, cf, v);
1565 static MonoReflectionType*
1566 ves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)
1568 MonoMethod *method = mono_get_inflated_method (rmethod->method.method);
1570 return mono_type_get_object (mono_object_domain (rmethod), &method->klass->byval_arg);
1573 /* From MonoProperty.cs */
1575 PInfo_Attributes = 1,
1576 PInfo_GetMethod = 1 << 1,
1577 PInfo_SetMethod = 1 << 2,
1578 PInfo_ReflectedType = 1 << 3,
1579 PInfo_DeclaringType = 1 << 4,
1584 ves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)
1586 MonoDomain *domain = mono_object_domain (property);
1588 MONO_ARCH_SAVE_REGS;
1590 if ((req_info & PInfo_ReflectedType) != 0)
1591 info->parent = mono_type_get_object (domain, &property->klass->byval_arg);
1592 else if ((req_info & PInfo_DeclaringType) != 0)
1593 info->parent = mono_type_get_object (domain, &property->property->parent->byval_arg);
1595 if ((req_info & PInfo_Name) != 0)
1596 info->name = mono_string_new (domain, property->property->name);
1598 if ((req_info & PInfo_Attributes) != 0)
1599 info->attrs = property->property->attrs;
1601 if ((req_info & PInfo_GetMethod) != 0)
1602 info->get = property->property->get ?
1603 mono_method_get_object (domain, property->property->get, NULL): NULL;
1605 if ((req_info & PInfo_SetMethod) != 0)
1606 info->set = property->property->set ?
1607 mono_method_get_object (domain, property->property->set, NULL): NULL;
1609 * There may be other methods defined for properties, though, it seems they are not exposed
1610 * in the reflection API
1615 ves_icall_get_event_info (MonoReflectionEvent *event, MonoEventInfo *info)
1617 MonoDomain *domain = mono_object_domain (event);
1619 MONO_ARCH_SAVE_REGS;
1621 info->reflected_type = mono_type_get_object (domain, &event->klass->byval_arg);
1622 info->declaring_type = mono_type_get_object (domain, &event->event->parent->byval_arg);
1624 info->name = mono_string_new (domain, event->event->name);
1625 info->attrs = event->event->attrs;
1626 info->add_method = event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL;
1627 info->remove_method = event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL;
1628 info->raise_method = event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL;
1630 if (event->event->other) {
1632 while (event->event->other [n])
1634 info->other_methods = mono_array_new (domain, mono_defaults.method_info_class, n);
1636 for (i = 0; i < n; i++)
1637 mono_array_setref (info->other_methods, i, mono_method_get_object (domain, event->event->other [i], NULL));
1642 ves_icall_Type_GetInterfaces (MonoReflectionType* type)
1644 MonoDomain *domain = mono_object_domain (type);
1646 GPtrArray *ifaces = NULL;
1648 MonoClass *class = mono_class_from_mono_type (type->type);
1652 MONO_ARCH_SAVE_REGS;
1654 mono_class_setup_vtable (class);
1656 slots = mono_bitset_new (class->max_interface_id + 1, 0);
1659 /* GetInterfaces() returns an empty array in MS.NET (this may be a bug) */
1660 mono_bitset_free (slots);
1661 return mono_array_new (domain, mono_defaults.monotype_class, 0);
1664 for (parent = class; parent; parent = parent->parent) {
1665 GPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent);
1667 for (i = 0; i < tmp_ifaces->len; ++i) {
1668 MonoClass *ic = g_ptr_array_index (tmp_ifaces, i);
1670 if (mono_bitset_test (slots, ic->interface_id))
1673 mono_bitset_set (slots, ic->interface_id);
1675 ifaces = g_ptr_array_new ();
1676 g_ptr_array_add (ifaces, ic);
1678 g_ptr_array_free (tmp_ifaces, TRUE);
1681 mono_bitset_free (slots);
1684 return mono_array_new (domain, mono_defaults.monotype_class, 0);
1686 intf = mono_array_new (domain, mono_defaults.monotype_class, ifaces->len);
1687 for (i = 0; i < ifaces->len; ++i) {
1688 MonoClass *ic = g_ptr_array_index (ifaces, i);
1690 mono_array_setref (intf, i, mono_type_get_object (domain, &ic->byval_arg));
1692 g_ptr_array_free (ifaces, TRUE);
1698 ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType *iface, MonoArray **targets, MonoArray **methods)
1700 MonoClass *class = mono_class_from_mono_type (type->type);
1701 MonoClass *iclass = mono_class_from_mono_type (iface->type);
1702 MonoReflectionMethod *member;
1705 int i = 0, len, ioffset;
1708 MONO_ARCH_SAVE_REGS;
1710 mono_class_setup_vtable (class);
1712 /* type doesn't implement iface: the exception is thrown in managed code */
1713 if ((iclass->interface_id > class->max_interface_id) || !class->interface_offsets [iclass->interface_id])
1716 len = mono_class_num_methods (iclass);
1717 ioffset = class->interface_offsets [iclass->interface_id];
1718 domain = mono_object_domain (type);
1719 *targets = mono_array_new (domain, mono_defaults.method_info_class, len);
1720 *methods = mono_array_new (domain, mono_defaults.method_info_class, len);
1723 while ((method = mono_class_get_methods (iclass, &iter))) {
1724 member = mono_method_get_object (domain, method, iclass);
1725 mono_array_setref (*methods, i, member);
1726 member = mono_method_get_object (domain, class->vtable [i + ioffset], class);
1727 mono_array_setref (*targets, i, member);
1734 ves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)
1736 MonoClass *klass = mono_class_from_mono_type (type->type);
1738 g_assert (!klass->image->dynamic);
1740 mono_metadata_packing_from_typedef (klass->image, klass->type_token, packing, size);
1743 static MonoReflectionType*
1744 ves_icall_MonoType_GetElementType (MonoReflectionType *type)
1746 MonoClass *class = mono_class_from_mono_type (type->type);
1748 MONO_ARCH_SAVE_REGS;
1750 // GelElementType should only return a type for:
1751 // Array Pointer PassedByRef
1752 if (type->type->byref)
1753 return mono_type_get_object (mono_object_domain (type), &class->byval_arg);
1754 if (class->enumtype && class->enum_basetype) /* types that are modifierd typebuilkders may not have enum_basetype set */
1755 return mono_type_get_object (mono_object_domain (type), class->enum_basetype);
1756 else if (class->element_class && MONO_CLASS_IS_ARRAY (class))
1757 return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
1758 else if (class->element_class && type->type->type == MONO_TYPE_PTR)
1759 return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
1764 static MonoReflectionType*
1765 ves_icall_get_type_parent (MonoReflectionType *type)
1767 MonoClass *class = mono_class_from_mono_type (type->type);
1769 MONO_ARCH_SAVE_REGS;
1771 return class->parent ? mono_type_get_object (mono_object_domain (type), &class->parent->byval_arg): NULL;
1775 ves_icall_type_ispointer (MonoReflectionType *type)
1777 MONO_ARCH_SAVE_REGS;
1779 return type->type->type == MONO_TYPE_PTR;
1783 ves_icall_type_isprimitive (MonoReflectionType *type)
1785 MONO_ARCH_SAVE_REGS;
1787 return (!type->type->byref && (((type->type->type >= MONO_TYPE_BOOLEAN) && (type->type->type <= MONO_TYPE_R8)) || (type->type->type == MONO_TYPE_I) || (type->type->type == MONO_TYPE_U)));
1791 ves_icall_type_isbyref (MonoReflectionType *type)
1793 MONO_ARCH_SAVE_REGS;
1795 return type->type->byref;
1798 static MonoReflectionModule*
1799 ves_icall_MonoType_get_Module (MonoReflectionType *type)
1801 MonoClass *class = mono_class_from_mono_type (type->type);
1803 MONO_ARCH_SAVE_REGS;
1805 return mono_module_get_object (mono_object_domain (type), class->image);
1808 static MonoReflectionAssembly*
1809 ves_icall_MonoType_get_Assembly (MonoReflectionType *type)
1811 MonoDomain *domain = mono_domain_get ();
1812 MonoClass *class = mono_class_from_mono_type (type->type);
1814 MONO_ARCH_SAVE_REGS;
1816 return mono_assembly_get_object (domain, class->image->assembly);
1819 static MonoReflectionType*
1820 ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)
1822 MonoDomain *domain = mono_domain_get ();
1825 MONO_ARCH_SAVE_REGS;
1827 if (type->type->byref)
1829 if (type->type->type == MONO_TYPE_VAR)
1830 class = type->type->data.generic_param->owner->klass;
1831 else if (type->type->type == MONO_TYPE_MVAR)
1832 class = type->type->data.generic_param->method->klass;
1834 class = mono_class_from_mono_type (type->type)->nested_in;
1836 return class ? mono_type_get_object (domain, &class->byval_arg) : NULL;
1839 static MonoReflectionType*
1840 ves_icall_MonoType_get_UnderlyingSystemType (MonoReflectionType *type)
1842 MonoDomain *domain = mono_domain_get ();
1843 MonoClass *class = mono_class_from_mono_type (type->type);
1845 MONO_ARCH_SAVE_REGS;
1847 if (class->enumtype && class->enum_basetype) /* types that are modified typebuilders may not have enum_basetype set */
1848 return mono_type_get_object (domain, class->enum_basetype);
1849 else if (class->element_class)
1850 return mono_type_get_object (domain, &class->element_class->byval_arg);
1856 ves_icall_MonoType_get_Name (MonoReflectionType *type)
1858 MonoDomain *domain = mono_domain_get ();
1859 MonoClass *class = mono_class_from_mono_type (type->type);
1861 MONO_ARCH_SAVE_REGS;
1863 return mono_string_new (domain, class->name);
1867 ves_icall_MonoType_get_Namespace (MonoReflectionType *type)
1869 MonoDomain *domain = mono_domain_get ();
1870 MonoClass *class = mono_class_from_mono_type (type->type);
1872 MONO_ARCH_SAVE_REGS;
1874 while (class->nested_in)
1875 class = class->nested_in;
1877 if (class->name_space [0] == '\0')
1880 return mono_string_new (domain, class->name_space);
1884 ves_icall_MonoType_GetArrayRank (MonoReflectionType *type)
1886 MonoClass *class = mono_class_from_mono_type (type->type);
1888 MONO_ARCH_SAVE_REGS;
1894 ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)
1897 MonoClass *klass, *pklass;
1899 MONO_ARCH_SAVE_REGS;
1901 klass = mono_class_from_mono_type (type->type);
1903 if (klass->generic_container) {
1904 MonoGenericContainer *container = klass->generic_container;
1905 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, container->type_argc);
1906 for (i = 0; i < container->type_argc; ++i) {
1907 pklass = mono_class_from_generic_parameter (&container->type_params [i], klass->image, FALSE);
1908 mono_array_setref (res, i, mono_type_get_object (mono_object_domain (type), &pklass->byval_arg));
1910 } else if (klass->generic_class) {
1911 MonoGenericInst *inst = klass->generic_class->inst;
1912 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, inst->type_argc);
1913 for (i = 0; i < inst->type_argc; ++i)
1914 mono_array_setref (res, i, mono_type_get_object (mono_object_domain (type), inst->type_argv [i]));
1916 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, 0);
1922 ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)
1925 MONO_ARCH_SAVE_REGS;
1927 klass = mono_class_from_mono_type (type->type);
1929 return klass->generic_container != NULL;
1932 static MonoReflectionType*
1933 ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
1936 MONO_ARCH_SAVE_REGS;
1938 klass = mono_class_from_mono_type (type->type);
1939 if (klass->generic_container) {
1940 return type; /* check this one */
1942 if (klass->generic_class) {
1943 MonoClass *generic_class = klass->generic_class->container_class;
1945 if (generic_class->wastypebuilder && generic_class->reflection_info)
1946 return generic_class->reflection_info;
1948 return mono_type_get_object (mono_object_domain (type), &generic_class->byval_arg);
1953 static MonoReflectionType*
1954 ves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array)
1956 MonoType *geninst, **types;
1959 MONO_ARCH_SAVE_REGS;
1961 count = mono_array_length (type_array);
1962 types = g_new0 (MonoType *, count);
1964 for (i = 0; i < count; i++) {
1965 MonoReflectionType *t = mono_array_get (type_array, gpointer, i);
1966 types [i] = t->type;
1969 geninst = mono_reflection_bind_generic_parameters (type, count, types);
1973 return mono_type_get_object (mono_object_domain (type), geninst);
1977 ves_icall_Type_get_IsGenericInstance (MonoReflectionType *type)
1980 MONO_ARCH_SAVE_REGS;
1982 klass = mono_class_from_mono_type (type->type);
1983 return klass->generic_class != NULL;
1987 ves_icall_Type_get_IsGenericType (MonoReflectionType *type)
1990 MONO_ARCH_SAVE_REGS;
1992 klass = mono_class_from_mono_type (type->type);
1993 return klass->generic_class != NULL || klass->generic_container != NULL;
1997 ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)
1999 MONO_ARCH_SAVE_REGS;
2001 if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
2002 return type->type->data.generic_param->num;
2006 static GenericParameterAttributes
2007 ves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)
2009 MONO_ARCH_SAVE_REGS;
2010 return type->type->data.generic_param->flags;
2014 ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)
2016 MonoGenericParam *param;
2022 MONO_ARCH_SAVE_REGS;
2024 domain = mono_object_domain (type);
2025 param = type->type->data.generic_param;
2026 for (count = 0, ptr = param->constraints; ptr && *ptr; ptr++, count++)
2029 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2030 for (i = 0; i < count; i++)
2031 mono_array_setref (res, i, mono_type_get_object (domain, ¶m->constraints [i]->byval_arg));
2038 ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)
2040 MONO_ARCH_SAVE_REGS;
2042 if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
2043 return !type->type->byref;
2048 ves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)
2050 MONO_ARCH_SAVE_REGS;
2052 if (tb->type.type->type == MONO_TYPE_VAR || tb->type.type->type == MONO_TYPE_MVAR)
2053 return !tb->type.type->byref;
2058 ves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype,
2059 MonoReflectionType *t)
2061 enumtype->type = t->type;
2064 static MonoReflectionType*
2065 ves_icall_MonoGenericClass_GetParentType (MonoReflectionGenericClass *type)
2067 MonoDynamicGenericClass *gclass;
2068 MonoReflectionType *parent = NULL;
2073 MONO_ARCH_SAVE_REGS;
2075 g_assert (type->type.type->data.generic_class->is_dynamic);
2076 gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class;
2078 domain = mono_object_domain (type);
2079 klass = mono_class_from_mono_type (type->generic_type->type);
2081 if (!klass->generic_class && !klass->generic_container)
2084 if (!strcmp (type->generic_type->object.vtable->klass->name, "TypeBuilder")) {
2085 MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *) type->generic_type;
2086 parent = tb->parent;
2087 } else if (klass->wastypebuilder) {
2088 MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *) type->generic_type;
2089 parent = tb->parent;
2091 MonoClass *pklass = klass->parent;
2093 parent = mono_type_get_object (domain, &pklass->byval_arg);
2096 if (!parent || (parent->type->type != MONO_TYPE_GENERICINST))
2099 inflated = mono_class_inflate_generic_type (
2100 parent->type, gclass->generic_class.generic_class.context);
2102 return mono_type_get_object (domain, inflated);
2106 ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type)
2108 static MonoClass *System_Reflection_MonoGenericClass;
2109 MonoDynamicGenericClass *gclass;
2110 MonoReflectionTypeBuilder *tb = NULL;
2111 MonoClass *klass = NULL;
2116 MONO_ARCH_SAVE_REGS;
2118 if (!System_Reflection_MonoGenericClass) {
2119 System_Reflection_MonoGenericClass = mono_class_from_name (
2120 mono_defaults.corlib, "System.Reflection", "MonoGenericClass");
2121 g_assert (System_Reflection_MonoGenericClass);
2124 domain = mono_object_domain (type);
2126 g_assert (type->type.type->data.generic_class->is_dynamic);
2127 gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class;
2129 if (!strcmp (type->generic_type->object.vtable->klass->name, "TypeBuilder")) {
2130 tb = (MonoReflectionTypeBuilder *) type->generic_type;
2131 icount = tb->interfaces ? mono_array_length (tb->interfaces) : 0;
2133 klass = gclass->generic_class.generic_class.container_class;
2134 mono_class_init (klass);
2135 icount = klass->interface_count;
2138 res = mono_array_new (domain, System_Reflection_MonoGenericClass, icount);
2140 for (i = 0; i < icount; i++) {
2141 MonoReflectionType *iface;
2145 iface = mono_array_get (tb->interfaces, MonoReflectionType *, i);
2148 it = &klass->interfaces [i]->byval_arg;
2150 it = mono_class_inflate_generic_type (
2151 it, gclass->generic_class.generic_class.context);
2153 iface = mono_type_get_object (domain, it);
2154 mono_array_setref (res, i, iface);
2160 static MonoReflectionMethod*
2161 ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod (MonoReflectionGenericClass *type,
2162 MonoReflectionMethod* generic)
2164 MonoGenericClass *gclass;
2165 MonoDynamicGenericClass *dgclass;
2169 MONO_ARCH_SAVE_REGS;
2171 gclass = type->type.type->data.generic_class;
2172 g_assert (gclass->is_dynamic);
2174 dgclass = (MonoDynamicGenericClass *) gclass;
2176 domain = mono_object_domain (type);
2178 for (i = 0; i < dgclass->count_methods; i++)
2179 if (generic->method->token == dgclass->methods [i]->token)
2180 return mono_method_get_object (domain, dgclass->methods [i], NULL);
2185 static MonoReflectionMethod*
2186 ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor (MonoReflectionGenericClass *type,
2187 MonoReflectionMethod* generic)
2189 MonoGenericClass *gclass;
2190 MonoDynamicGenericClass *dgclass;
2194 MONO_ARCH_SAVE_REGS;
2196 gclass = type->type.type->data.generic_class;
2197 g_assert (gclass->is_dynamic);
2199 dgclass = (MonoDynamicGenericClass *) gclass;
2201 domain = mono_object_domain (type);
2203 for (i = 0; i < dgclass->count_ctors; i++)
2204 if (generic->method->token == dgclass->ctors [i]->token)
2205 return mono_method_get_object (domain, dgclass->ctors [i], NULL);
2211 static MonoReflectionField*
2212 ves_icall_MonoGenericClass_GetCorrespondingInflatedField (MonoReflectionGenericClass *type,
2213 MonoString* generic_name)
2215 MonoGenericClass *gclass;
2216 MonoDynamicGenericClass *dgclass;
2218 MonoClass *refclass;
2219 char *utf8_name = mono_string_to_utf8 (generic_name);
2222 MONO_ARCH_SAVE_REGS;
2224 gclass = type->type.type->data.generic_class;
2225 g_assert (gclass->is_dynamic);
2227 dgclass = (MonoDynamicGenericClass *) gclass;
2229 refclass = mono_class_from_mono_type (type->type.type);
2231 domain = mono_object_domain (type);
2233 for (i = 0; i < dgclass->count_fields; i++)
2234 if (strcmp (utf8_name, dgclass->fields [i].name) == 0) {
2236 return mono_field_get_object (domain, refclass, &dgclass->fields [i]);
2245 static MonoReflectionMethod*
2246 ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type,
2247 MonoReflectionMethod* generic)
2254 MONO_ARCH_SAVE_REGS;
2256 domain = ((MonoObject *)type)->vtable->domain;
2258 klass = mono_class_from_mono_type (type->type);
2261 while ((method = mono_class_get_methods (klass, &iter))) {
2262 if (method->token == generic->method->token)
2263 return mono_method_get_object (domain, method, klass);
2270 ves_icall_MonoGenericClass_GetMethods (MonoReflectionGenericClass *type,
2271 MonoReflectionType *reflected_type)
2273 MonoGenericClass *gclass;
2274 MonoDynamicGenericClass *dgclass;
2276 MonoClass *refclass;
2280 MONO_ARCH_SAVE_REGS;
2282 gclass = type->type.type->data.generic_class;
2283 g_assert (gclass->is_dynamic);
2284 dgclass = (MonoDynamicGenericClass *) gclass;
2286 refclass = mono_class_from_mono_type (reflected_type->type);
2288 domain = mono_object_domain (type);
2289 res = mono_array_new (domain, mono_defaults.method_info_class, dgclass->count_methods);
2291 for (i = 0; i < dgclass->count_methods; i++)
2292 mono_array_setref (res, i, mono_method_get_object (domain, dgclass->methods [i], refclass));
2298 ves_icall_MonoGenericClass_GetConstructors (MonoReflectionGenericClass *type,
2299 MonoReflectionType *reflected_type)
2301 static MonoClass *System_Reflection_ConstructorInfo;
2302 MonoGenericClass *gclass;
2303 MonoDynamicGenericClass *dgclass;
2305 MonoClass *refclass;
2309 MONO_ARCH_SAVE_REGS;
2311 if (!System_Reflection_ConstructorInfo)
2312 System_Reflection_ConstructorInfo = mono_class_from_name (
2313 mono_defaults.corlib, "System.Reflection", "ConstructorInfo");
2315 gclass = type->type.type->data.generic_class;
2316 g_assert (gclass->is_dynamic);
2317 dgclass = (MonoDynamicGenericClass *) gclass;
2319 refclass = mono_class_from_mono_type (reflected_type->type);
2321 domain = mono_object_domain (type);
2322 res = mono_array_new (domain, System_Reflection_ConstructorInfo, dgclass->count_ctors);
2324 for (i = 0; i < dgclass->count_ctors; i++)
2325 mono_array_setref (res, i, mono_method_get_object (domain, dgclass->ctors [i], refclass));
2331 ves_icall_MonoGenericClass_GetFields (MonoReflectionGenericClass *type,
2332 MonoReflectionType *reflected_type)
2334 MonoGenericClass *gclass;
2335 MonoDynamicGenericClass *dgclass;
2337 MonoClass *refclass;
2341 MONO_ARCH_SAVE_REGS;
2343 gclass = type->type.type->data.generic_class;
2344 g_assert (gclass->is_dynamic);
2345 dgclass = (MonoDynamicGenericClass *) gclass;
2347 refclass = mono_class_from_mono_type (reflected_type->type);
2349 domain = mono_object_domain (type);
2350 res = mono_array_new (domain, mono_defaults.field_info_class, dgclass->count_fields);
2352 for (i = 0; i < dgclass->count_fields; i++)
2353 mono_array_setref (res, i, mono_field_get_object (domain, refclass, &dgclass->fields [i]));
2359 ves_icall_MonoGenericClass_GetProperties (MonoReflectionGenericClass *type,
2360 MonoReflectionType *reflected_type)
2362 static MonoClass *System_Reflection_PropertyInfo;
2363 MonoGenericClass *gclass;
2364 MonoDynamicGenericClass *dgclass;
2366 MonoClass *refclass;
2370 MONO_ARCH_SAVE_REGS;
2372 if (!System_Reflection_PropertyInfo)
2373 System_Reflection_PropertyInfo = mono_class_from_name (
2374 mono_defaults.corlib, "System.Reflection", "PropertyInfo");
2376 gclass = type->type.type->data.generic_class;
2377 g_assert (gclass->is_dynamic);
2378 dgclass = (MonoDynamicGenericClass *) gclass;
2380 refclass = mono_class_from_mono_type (reflected_type->type);
2382 domain = mono_object_domain (type);
2383 res = mono_array_new (domain, System_Reflection_PropertyInfo, dgclass->count_properties);
2385 for (i = 0; i < dgclass->count_properties; i++)
2386 mono_array_setref (res, i, mono_property_get_object (domain, refclass, &dgclass->properties [i]));
2392 ves_icall_MonoGenericClass_GetEvents (MonoReflectionGenericClass *type,
2393 MonoReflectionType *reflected_type)
2395 static MonoClass *System_Reflection_EventInfo;
2396 MonoGenericClass *gclass;
2397 MonoDynamicGenericClass *dgclass;
2399 MonoClass *refclass;
2403 MONO_ARCH_SAVE_REGS;
2405 if (!System_Reflection_EventInfo)
2406 System_Reflection_EventInfo = mono_class_from_name (
2407 mono_defaults.corlib, "System.Reflection", "EventInfo");
2409 gclass = type->type.type->data.generic_class;
2410 g_assert (gclass->is_dynamic);
2411 dgclass = (MonoDynamicGenericClass *) gclass;
2413 refclass = mono_class_from_mono_type (reflected_type->type);
2415 domain = mono_object_domain (type);
2416 res = mono_array_new (domain, System_Reflection_EventInfo, dgclass->count_events);
2418 for (i = 0; i < dgclass->count_events; i++)
2419 mono_array_setref (res, i, mono_event_get_object (domain, refclass, &dgclass->events [i]));
2424 static MonoReflectionMethod *
2425 ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *type)
2430 MONO_ARCH_SAVE_REGS;
2432 if (type->type->byref || type->type->type != MONO_TYPE_MVAR)
2435 method = type->type->data.generic_param->method;
2437 klass = mono_class_from_mono_type (type->type);
2438 return mono_method_get_object (mono_object_domain (type), method, klass);
2441 static MonoReflectionDllImportAttribute*
2442 ves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)
2444 static MonoClass *DllImportAttributeClass = NULL;
2445 MonoDomain *domain = mono_domain_get ();
2446 MonoReflectionDllImportAttribute *attr;
2447 MonoImage *image = method->klass->image;
2448 MonoMethodPInvoke *piinfo = (MonoMethodPInvoke *)method;
2449 MonoTableInfo *tables = image->tables;
2450 MonoTableInfo *im = &tables [MONO_TABLE_IMPLMAP];
2451 MonoTableInfo *mr = &tables [MONO_TABLE_MODULEREF];
2452 guint32 im_cols [MONO_IMPLMAP_SIZE];
2453 guint32 scope_token;
2454 const char *import = NULL;
2455 const char *scope = NULL;
2458 if (!method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)
2461 if (!DllImportAttributeClass) {
2462 DllImportAttributeClass =
2463 mono_class_from_name (mono_defaults.corlib,
2464 "System.Runtime.InteropServices", "DllImportAttribute");
2465 g_assert (DllImportAttributeClass);
2468 if (method->klass->image->dynamic) {
2469 MonoReflectionMethodAux *method_aux =
2470 g_hash_table_lookup (
2471 ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method);
2473 import = method_aux->dllentry;
2474 scope = method_aux->dll;
2478 if (piinfo->implmap_idx) {
2479 mono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE);
2481 piinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS];
2482 import = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]);
2483 scope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME);
2484 scope = mono_metadata_string_heap (image, scope_token);
2487 flags = piinfo->piflags;
2489 attr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);
2491 attr->dll = mono_string_new (domain, scope);
2492 attr->entry_point = mono_string_new (domain, import);
2493 attr->call_conv = (flags & 0x700) >> 8;
2494 attr->charset = ((flags & 0x6) >> 1) + 1;
2495 if (attr->charset == 1)
2497 attr->exact_spelling = (flags & 0x1) != 0;
2498 attr->set_last_error = (flags & 0x40) != 0;
2499 attr->best_fit_mapping = (flags & 0x30) == 0x10;
2500 attr->throw_on_unmappable = (flags & 0x3000) == 0x1000;
2501 attr->preserve_sig = FALSE;
2506 static MonoReflectionMethod *
2507 ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
2509 MonoMethodInflated *imethod;
2511 MONO_ARCH_SAVE_REGS;
2513 if (!method->method->is_inflated) {
2514 if (mono_method_signature (method->method)->generic_param_count)
2520 imethod = (MonoMethodInflated *) method->method;
2521 if (imethod->context->gmethod && imethod->context->gmethod->reflection_info)
2522 return imethod->context->gmethod->reflection_info;
2524 return mono_method_get_object (
2525 mono_object_domain (method), imethod->declaring, NULL);
2529 ves_icall_MonoMethod_get_IsGenericMethod (MonoReflectionMethod *method)
2531 MONO_ARCH_SAVE_REGS;
2533 return mono_method_signature (method->method)->generic_param_count != 0;
2537 ves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method)
2539 MONO_ARCH_SAVE_REGS;
2541 return !method->method->is_inflated &&
2542 (mono_method_signature (method->method)->generic_param_count != 0);
2546 ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
2551 MONO_ARCH_SAVE_REGS;
2553 domain = mono_object_domain (method);
2555 if (method->method->is_inflated) {
2556 MonoMethodInflated *imethod = (MonoMethodInflated *) method->method;
2557 MonoGenericMethod *gmethod = imethod->context->gmethod;
2560 count = gmethod->inst->type_argc;
2561 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2563 for (i = 0; i < count; i++)
2564 mono_array_setref (res, i, mono_type_get_object (domain, gmethod->inst->type_argv [i]));
2570 count = mono_method_signature (method->method)->generic_param_count;
2571 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2573 for (i = 0; i < count; i++) {
2574 MonoGenericParam *param = &method->method->generic_container->type_params [i];
2575 MonoClass *pklass = mono_class_from_generic_parameter (
2576 param, method->method->klass->image, TRUE);
2577 mono_array_setref (res, i,
2578 mono_type_get_object (domain, &pklass->byval_arg));
2585 ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params)
2588 * Invoke from reflection is supposed to always be a virtual call (the API
2589 * is stupid), mono_runtime_invoke_*() calls the provided method, allowing
2590 * greater flexibility.
2592 MonoMethod *m = mono_get_inflated_method (method->method);
2596 MONO_ARCH_SAVE_REGS;
2598 if (!(m->flags & METHOD_ATTRIBUTE_STATIC)) {
2600 if (!mono_object_isinst (this, m->klass))
2601 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetException"));
2602 m = mono_object_get_virtual_method (this, m);
2603 /* must pass the pointer to the value for valuetype methods */
2604 if (m->klass->valuetype)
2605 obj = mono_object_unbox (this);
2606 } else if (strcmp (m->name, ".ctor") && !m->wrapper_type)
2607 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetException"));
2610 pcount = params? mono_array_length (params): 0;
2611 if (pcount != mono_method_signature (m)->param_count)
2612 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetParameterCountException"));
2614 if ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, ".ctor"))
2615 mono_raise_exception (mono_exception_from_name_msg (mono_defaults.corlib, "System", "MethodAccessException", "Cannot invoke constructor of an abstract class."));
2617 if (m->klass->image->assembly->ref_only)
2618 mono_raise_exception (mono_get_exception_invalid_operation ("It is illegal to invoke a method on a type loaded using the ReflectionOnly api."));
2620 if (m->klass->rank && !strcmp (m->name, ".ctor")) {
2623 guint32 *lower_bounds;
2624 pcount = mono_array_length (params);
2625 lengths = alloca (sizeof (guint32) * pcount);
2626 for (i = 0; i < pcount; ++i)
2627 lengths [i] = *(gint32*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));
2629 if (m->klass->rank == pcount) {
2630 /* Only lengths provided. */
2631 lower_bounds = NULL;
2633 g_assert (pcount == (m->klass->rank * 2));
2634 /* lower bounds are first. */
2635 lower_bounds = lengths;
2636 lengths += m->klass->rank;
2639 return (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, lower_bounds);
2641 return mono_runtime_invoke_array (m, obj, params, NULL);
2645 ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoArray **outArgs)
2647 MonoDomain *domain = mono_object_domain (method);
2648 MonoMethod *m = method->method;
2649 MonoMethodSignature *sig = mono_method_signature (m);
2650 MonoArray *out_args;
2652 int i, j, outarg_count = 0;
2654 MONO_ARCH_SAVE_REGS;
2656 if (m->klass == mono_defaults.object_class) {
2658 if (!strcmp (m->name, "FieldGetter")) {
2659 MonoClass *k = this->vtable->klass;
2663 /* If this is a proxy, then it must be a CBO */
2664 if (k == mono_defaults.transparent_proxy_class) {
2665 MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
2666 this = tp->rp->unwrapped_server;
2668 k = this->vtable->klass;
2671 name = mono_array_get (params, MonoString *, 1);
2672 str = mono_string_to_utf8 (name);
2675 MonoClassField* field = mono_class_get_field_from_name (k, str);
2677 MonoClass *field_klass = mono_class_from_mono_type (field->type);
2678 if (field_klass->valuetype)
2679 result = mono_value_box (domain, field_klass, (char *)this + field->offset);
2681 result = *((gpointer *)((char *)this + field->offset));
2683 out_args = mono_array_new (domain, mono_defaults.object_class, 1);
2684 *outArgs = out_args;
2685 mono_array_setref (out_args, 0, result);
2693 g_assert_not_reached ();
2695 } else if (!strcmp (m->name, "FieldSetter")) {
2696 MonoClass *k = this->vtable->klass;
2701 /* If this is a proxy, then it must be a CBO */
2702 if (k == mono_defaults.transparent_proxy_class) {
2703 MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
2704 this = tp->rp->unwrapped_server;
2706 k = this->vtable->klass;
2709 name = mono_array_get (params, MonoString *, 1);
2710 str = mono_string_to_utf8 (name);
2713 MonoClassField* field = mono_class_get_field_from_name (k, str);
2715 MonoClass *field_klass = mono_class_from_mono_type (field->type);
2716 MonoObject *val = mono_array_get (params, gpointer, 2);
2718 if (field_klass->valuetype) {
2719 size = mono_type_size (field->type, &align);
2720 memcpy ((char *)this + field->offset,
2721 ((char *)val) + sizeof (MonoObject), size);
2723 *(MonoObject**)((char *)this + field->offset) = val;
2725 out_args = mono_array_new (domain, mono_defaults.object_class, 0);
2726 *outArgs = out_args;
2736 g_assert_not_reached ();
2741 for (i = 0; i < mono_array_length (params); i++) {
2742 if (sig->params [i]->byref)
2746 out_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);
2748 /* handle constructors only for objects already allocated */
2749 if (!strcmp (method->method->name, ".ctor"))
2752 /* This can be called only on MBR objects, so no need to unbox for valuetypes. */
2753 g_assert (!method->method->klass->valuetype);
2754 result = mono_runtime_invoke_array (method->method, this, params, NULL);
2756 for (i = 0, j = 0; i < mono_array_length (params); i++) {
2757 if (sig->params [i]->byref) {
2759 arg = mono_array_get (params, gpointer, i);
2760 mono_array_setref (out_args, j, arg);
2765 *outArgs = out_args;
2771 read_enum_value (char *mem, int type)
2775 return *(guint8*)mem;
2777 return *(gint8*)mem;
2779 return *(guint16*)mem;
2781 return *(gint16*)mem;
2783 return *(guint32*)mem;
2785 return *(gint32*)mem;
2787 return *(guint64*)mem;
2789 return *(gint64*)mem;
2791 g_assert_not_reached ();
2797 write_enum_value (char *mem, int type, guint64 value)
2801 case MONO_TYPE_I1: {
2807 case MONO_TYPE_I2: {
2808 guint16 *p = (void*)mem;
2813 case MONO_TYPE_I4: {
2814 guint32 *p = (void*)mem;
2819 case MONO_TYPE_I8: {
2820 guint64 *p = (void*)mem;
2825 g_assert_not_reached ();
2831 ves_icall_System_Enum_ToObject (MonoReflectionType *type, MonoObject *obj)
2834 MonoClass *enumc, *objc;
2838 MONO_ARCH_SAVE_REGS;
2840 MONO_CHECK_ARG_NULL (type);
2841 MONO_CHECK_ARG_NULL (obj);
2843 domain = mono_object_domain (type);
2844 enumc = mono_class_from_mono_type (type->type);
2845 objc = obj->vtable->klass;
2847 MONO_CHECK_ARG (obj, enumc->enumtype == TRUE);
2848 MONO_CHECK_ARG (obj, (objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 &&
2849 objc->byval_arg.type <= MONO_TYPE_U8));
2851 res = mono_object_new (domain, enumc);
2852 val = read_enum_value ((char *)obj + sizeof (MonoObject), objc->enumtype? objc->enum_basetype->type: objc->byval_arg.type);
2853 write_enum_value ((char *)res + sizeof (MonoObject), enumc->enum_basetype->type, val);
2859 ves_icall_System_Enum_get_value (MonoObject *this)
2867 MONO_ARCH_SAVE_REGS;
2872 g_assert (this->vtable->klass->enumtype);
2874 enumc = mono_class_from_mono_type (this->vtable->klass->enum_basetype);
2875 res = mono_object_new (mono_object_domain (this), enumc);
2876 dst = (char *)res + sizeof (MonoObject);
2877 src = (char *)this + sizeof (MonoObject);
2878 size = mono_class_value_size (enumc, NULL);
2880 memcpy (dst, src, size);
2886 ves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)
2888 MonoDomain *domain = mono_object_domain (type);
2889 MonoClass *enumc = mono_class_from_mono_type (type->type);
2890 guint j = 0, nvalues, crow;
2892 MonoClassField *field;
2894 MONO_ARCH_SAVE_REGS;
2896 info->utype = mono_type_get_object (domain, enumc->enum_basetype);
2897 nvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;
2898 info->names = mono_array_new (domain, mono_defaults.string_class, nvalues);
2899 info->values = mono_array_new (domain, enumc, nvalues);
2903 while ((field = mono_class_get_fields (enumc, &iter))) {
2907 if (strcmp ("value__", field->name) == 0)
2909 if (mono_field_is_deleted (field))
2911 mono_array_setref (info->names, j, mono_string_new (domain, field->name));
2914 crow = mono_metadata_get_constant_index (enumc->image, mono_class_get_field_token (field), crow + 1);
2915 field->def_type = mono_metadata_decode_row_col (&enumc->image->tables [MONO_TABLE_CONSTANT], crow-1, MONO_CONSTANT_TYPE);
2916 crow = mono_metadata_decode_row_col (&enumc->image->tables [MONO_TABLE_CONSTANT], crow-1, MONO_CONSTANT_VALUE);
2917 field->data = (gpointer)mono_metadata_blob_heap (enumc->image, crow);
2921 len = mono_metadata_decode_blob_size (p, &p);
2922 switch (enumc->enum_basetype->type) {
2925 mono_array_set (info->values, gchar, j, *p);
2927 case MONO_TYPE_CHAR:
2930 mono_array_set (info->values, gint16, j, read16 (p));
2934 mono_array_set (info->values, gint32, j, read32 (p));
2938 mono_array_set (info->values, gint64, j, read64 (p));
2941 g_error ("Implement type 0x%02x in get_enum_info", enumc->enum_basetype->type);
2948 BFLAGS_IgnoreCase = 1,
2949 BFLAGS_DeclaredOnly = 2,
2950 BFLAGS_Instance = 4,
2952 BFLAGS_Public = 0x10,
2953 BFLAGS_NonPublic = 0x20,
2954 BFLAGS_FlattenHierarchy = 0x40,
2955 BFLAGS_InvokeMethod = 0x100,
2956 BFLAGS_CreateInstance = 0x200,
2957 BFLAGS_GetField = 0x400,
2958 BFLAGS_SetField = 0x800,
2959 BFLAGS_GetProperty = 0x1000,
2960 BFLAGS_SetProperty = 0x2000,
2961 BFLAGS_ExactBinding = 0x10000,
2962 BFLAGS_SuppressChangeType = 0x20000,
2963 BFLAGS_OptionalParamBinding = 0x40000
2966 static MonoReflectionField *
2967 ves_icall_Type_GetField (MonoReflectionType *type, MonoString *name, guint32 bflags)
2970 MonoClass *startklass, *klass;
2972 MonoClassField *field;
2975 int (*compare_func) (const char *s1, const char *s2) = NULL;
2976 domain = ((MonoObject *)type)->vtable->domain;
2977 klass = startklass = mono_class_from_mono_type (type->type);
2979 MONO_ARCH_SAVE_REGS;
2982 mono_raise_exception (mono_get_exception_argument_null ("name"));
2983 if (type->type->byref)
2986 compare_func = (bflags & BFLAGS_IgnoreCase) ? g_strcasecmp : strcmp;
2990 while ((field = mono_class_get_fields (klass, &iter))) {
2992 if (mono_field_is_deleted (field))
2994 if ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {
2995 if (bflags & BFLAGS_Public)
2998 if (bflags & BFLAGS_NonPublic)
3004 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
3005 if (bflags & BFLAGS_Static)
3006 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3009 if (bflags & BFLAGS_Instance)
3016 utf8_name = mono_string_to_utf8 (name);
3018 if (compare_func (field->name, utf8_name)) {
3024 return mono_field_get_object (domain, klass, field);
3026 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3033 ves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3036 GSList *l = NULL, *tmp;
3037 MonoClass *startklass, *klass, *refklass;
3042 MonoClassField *field;
3044 MONO_ARCH_SAVE_REGS;
3046 domain = ((MonoObject *)type)->vtable->domain;
3047 if (type->type->byref)
3048 return mono_array_new (domain, mono_defaults.method_info_class, 0);
3049 klass = startklass = mono_class_from_mono_type (type->type);
3050 refklass = mono_class_from_mono_type (reftype->type);
3054 while ((field = mono_class_get_fields (klass, &iter))) {
3056 if (mono_field_is_deleted (field))
3058 if ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {
3059 if (bflags & BFLAGS_Public)
3062 if (bflags & BFLAGS_NonPublic)
3068 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
3069 if (bflags & BFLAGS_Static)
3070 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3073 if (bflags & BFLAGS_Instance)
3079 member = (MonoObject*)mono_field_get_object (domain, refklass, field);
3080 l = g_slist_prepend (l, member);
3082 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3084 len = g_slist_length (l);
3085 res = mono_array_new (domain, mono_defaults.field_info_class, len);
3087 tmp = l = g_slist_reverse (l);
3088 for (; tmp; tmp = tmp->next, ++i)
3089 mono_array_setref (res, i, tmp->data);
3095 ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
3098 GSList *l = NULL, *tmp;
3099 MonoClass *startklass, *klass, *refklass;
3105 guint32 method_slots_default [8];
3106 guint32 *method_slots;
3107 gchar *mname = NULL;
3108 int (*compare_func) (const char *s1, const char *s2) = NULL;
3110 MONO_ARCH_SAVE_REGS;
3112 domain = ((MonoObject *)type)->vtable->domain;
3113 if (type->type->byref)
3114 return mono_array_new (domain, mono_defaults.method_info_class, 0);
3115 klass = startklass = mono_class_from_mono_type (type->type);
3116 refklass = mono_class_from_mono_type (reftype->type);
3119 mname = mono_string_to_utf8 (name);
3120 compare_func = (ignore_case) ? g_strcasecmp : strcmp;
3123 mono_class_setup_vtable (klass);
3125 if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
3126 method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
3128 method_slots = method_slots_default;
3129 memset (method_slots, 0, sizeof (method_slots_default));
3132 mono_class_setup_vtable (klass);
3134 while ((method = mono_class_get_methods (klass, &iter))) {
3136 if (method->name [0] == '.' && (strcmp (method->name, ".ctor") == 0 || strcmp (method->name, ".cctor") == 0))
3138 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3139 if (bflags & BFLAGS_Public)
3142 if (bflags & BFLAGS_NonPublic)
3148 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3149 if (bflags & BFLAGS_Static)
3150 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3153 if (bflags & BFLAGS_Instance)
3161 if (compare_func (mname, method->name))
3166 if (method->slot != -1) {
3167 if (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))
3169 method_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);
3172 member = (MonoObject*)mono_method_get_object (domain, method, refklass);
3174 l = g_slist_prepend (l, member);
3177 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3181 res = mono_array_new (domain, mono_defaults.method_info_class, len);
3184 tmp = l = g_slist_reverse (l);
3186 for (; tmp; tmp = tmp->next, ++i)
3187 mono_array_setref (res, i, tmp->data);
3189 if (method_slots != method_slots_default)
3190 g_free (method_slots);
3195 ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3198 GSList *l = NULL, *tmp;
3199 static MonoClass *System_Reflection_ConstructorInfo;
3200 MonoClass *startklass, *klass, *refklass;
3205 gpointer iter = NULL;
3207 MONO_ARCH_SAVE_REGS;
3209 domain = ((MonoObject *)type)->vtable->domain;
3210 if (type->type->byref)
3211 return mono_array_new (domain, mono_defaults.method_info_class, 0);
3212 klass = startklass = mono_class_from_mono_type (type->type);
3213 refklass = mono_class_from_mono_type (reftype->type);
3216 while ((method = mono_class_get_methods (klass, &iter))) {
3218 if (strcmp (method->name, ".ctor") && strcmp (method->name, ".cctor"))
3220 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3221 if (bflags & BFLAGS_Public)
3224 if (bflags & BFLAGS_NonPublic)
3230 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3231 if (bflags & BFLAGS_Static)
3232 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3235 if (bflags & BFLAGS_Instance)
3241 member = (MonoObject*)mono_method_get_object (domain, method, refklass);
3243 l = g_slist_prepend (l, member);
3245 len = g_slist_length (l);
3246 if (!System_Reflection_ConstructorInfo)
3247 System_Reflection_ConstructorInfo = mono_class_from_name (
3248 mono_defaults.corlib, "System.Reflection", "ConstructorInfo");
3249 res = mono_array_new (domain, System_Reflection_ConstructorInfo, len);
3251 tmp = l = g_slist_reverse (l);
3252 for (; tmp; tmp = tmp->next, ++i)
3253 mono_array_setref (res, i, tmp->data);
3259 ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
3262 GSList *l = NULL, *tmp;
3263 static MonoClass *System_Reflection_PropertyInfo;
3264 MonoClass *startklass, *klass;
3271 guint32 method_slots_default [8];
3272 guint32 *method_slots;
3273 gchar *propname = NULL;
3274 int (*compare_func) (const char *s1, const char *s2) = NULL;
3277 MONO_ARCH_SAVE_REGS;
3279 if (!System_Reflection_PropertyInfo)
3280 System_Reflection_PropertyInfo = mono_class_from_name (
3281 mono_defaults.corlib, "System.Reflection", "PropertyInfo");
3283 domain = ((MonoObject *)type)->vtable->domain;
3284 if (type->type->byref)
3285 return mono_array_new (domain, System_Reflection_PropertyInfo, 0);
3286 klass = startklass = mono_class_from_mono_type (type->type);
3288 propname = mono_string_to_utf8 (name);
3289 compare_func = (ignore_case) ? g_strcasecmp : strcmp;
3292 if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
3293 method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
3295 method_slots = method_slots_default;
3296 memset (method_slots, 0, sizeof (method_slots_default));
3299 mono_class_setup_vtable (klass);
3301 while ((prop = mono_class_get_properties (klass, &iter))) {
3307 flags = method->flags;
3310 if ((prop->get && ((prop->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)) ||
3311 (prop->set && ((prop->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC))) {
3312 if (bflags & BFLAGS_Public)
3315 if (bflags & BFLAGS_NonPublic)
3321 if (flags & METHOD_ATTRIBUTE_STATIC) {
3322 if (bflags & BFLAGS_Static)
3323 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3326 if (bflags & BFLAGS_Instance)
3335 if (compare_func (propname, prop->name))
3339 if (prop->get && prop->get->slot != -1) {
3340 if (method_slots [prop->get->slot >> 5] & (1 << (prop->get->slot & 0x1f)))
3342 method_slots [prop->get->slot >> 5] |= 1 << (prop->get->slot & 0x1f);
3344 if (prop->set && prop->set->slot != -1) {
3345 if (method_slots [prop->set->slot >> 5] & (1 << (prop->set->slot & 0x1f)))
3347 method_slots [prop->set->slot >> 5] |= 1 << (prop->set->slot & 0x1f);
3350 l = g_slist_prepend (l, mono_property_get_object (domain, startklass, prop));
3353 if ((!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)))
3357 res = mono_array_new (domain, System_Reflection_PropertyInfo, len);
3360 tmp = l = g_slist_reverse (l);
3362 for (; tmp; tmp = tmp->next, ++i)
3363 mono_array_setref (res, i, tmp->data);
3365 if (method_slots != method_slots_default)
3366 g_free (method_slots);
3370 static MonoReflectionEvent *
3371 ves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 bflags)
3374 MonoClass *klass, *startklass;
3380 MONO_ARCH_SAVE_REGS;
3382 event_name = mono_string_to_utf8 (name);
3383 if (type->type->byref)
3385 klass = startklass = mono_class_from_mono_type (type->type);
3386 domain = mono_object_domain (type);
3390 while ((event = mono_class_get_events (klass, &iter))) {
3391 if (strcmp (event->name, event_name))
3394 method = event->add;
3396 method = event->remove;
3398 method = event->raise;
3400 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3401 if (!(bflags & BFLAGS_Public))
3404 if (!(bflags & BFLAGS_NonPublic))
3409 if (!(bflags & BFLAGS_NonPublic))
3412 g_free (event_name);
3413 return mono_event_get_object (domain, startklass, event);
3416 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3419 g_free (event_name);
3424 ves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3427 GSList *l = NULL, *tmp;
3428 static MonoClass *System_Reflection_EventInfo;
3429 MonoClass *startklass, *klass;
3436 MONO_ARCH_SAVE_REGS;
3438 if (!System_Reflection_EventInfo)
3439 System_Reflection_EventInfo = mono_class_from_name (
3440 mono_defaults.corlib, "System.Reflection", "EventInfo");
3442 domain = mono_object_domain (type);
3443 if (type->type->byref)
3444 return mono_array_new (domain, System_Reflection_EventInfo, 0);
3445 klass = startklass = mono_class_from_mono_type (type->type);
3449 while ((event = mono_class_get_events (klass, &iter))) {
3451 method = event->add;
3453 method = event->remove;
3455 method = event->raise;
3457 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3458 if (bflags & BFLAGS_Public)
3461 if (bflags & BFLAGS_NonPublic)
3466 if (bflags & BFLAGS_NonPublic)
3472 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3473 if (bflags & BFLAGS_Static)
3474 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3477 if (bflags & BFLAGS_Instance)
3482 if (bflags & BFLAGS_Instance)
3487 l = g_slist_prepend (l, mono_event_get_object (domain, startklass, event));
3489 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3491 len = g_slist_length (l);
3492 res = mono_array_new (domain, System_Reflection_EventInfo, len);
3495 tmp = l = g_slist_reverse (l);
3497 for (; tmp; tmp = tmp->next, ++i)
3498 mono_array_setref (res, i, tmp->data);
3503 static MonoReflectionType *
3504 ves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint32 bflags)
3507 MonoClass *startklass, *klass;
3512 MONO_ARCH_SAVE_REGS;
3514 domain = ((MonoObject *)type)->vtable->domain;
3515 if (type->type->byref)
3517 klass = startklass = mono_class_from_mono_type (type->type);
3518 str = mono_string_to_utf8 (name);
3521 for (tmpn = klass->nested_classes; tmpn; tmpn = tmpn->next) {
3523 nested = tmpn->data;
3524 if ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
3525 if (bflags & BFLAGS_Public)
3528 if (bflags & BFLAGS_NonPublic)
3533 if (strcmp (nested->name, str) == 0){
3535 return mono_type_get_object (domain, &nested->byval_arg);
3538 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3545 ves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags)
3548 GSList *l = NULL, *tmp;
3550 MonoClass *startklass, *klass;
3556 MONO_ARCH_SAVE_REGS;
3558 domain = ((MonoObject *)type)->vtable->domain;
3559 if (type->type->byref)
3560 return mono_array_new (domain, mono_defaults.monotype_class, 0);
3561 klass = startklass = mono_class_from_mono_type (type->type);
3563 for (tmpn = klass->nested_classes; tmpn; tmpn = tmpn->next) {
3565 nested = tmpn->data;
3566 if ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
3567 if (bflags & BFLAGS_Public)
3570 if (bflags & BFLAGS_NonPublic)
3575 member = (MonoObject*)mono_type_get_object (domain, &nested->byval_arg);
3576 l = g_slist_prepend (l, member);
3578 len = g_slist_length (l);
3579 res = mono_array_new (domain, mono_defaults.monotype_class, len);
3581 tmp = l = g_slist_reverse (l);
3582 for (; tmp; tmp = tmp->next, ++i)
3583 mono_array_setref (res, i, tmp->data);
3588 static MonoReflectionType*
3589 ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)
3592 MonoType *type = NULL;
3593 MonoTypeNameParse info;
3594 gboolean type_resolve;
3596 MONO_ARCH_SAVE_REGS;
3598 /* On MS.NET, this does not fire a TypeResolve event */
3599 type_resolve = TRUE;
3600 str = mono_string_to_utf8 (name);
3601 /*g_print ("requested type %s in %s\n", str, assembly->assembly->aname.name);*/
3602 if (!mono_reflection_parse_type (str, &info)) {
3604 g_list_free (info.modifiers);
3605 g_list_free (info.nested);
3606 if (throwOnError) /* uhm: this is a parse error, though... */
3607 mono_raise_exception (mono_get_exception_type_load (name, NULL));
3608 /*g_print ("failed parse\n");*/
3612 if (module != NULL) {
3614 type = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve);
3619 if (assembly->assembly->dynamic) {
3620 /* Enumerate all modules */
3621 MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
3625 if (abuilder->modules) {
3626 for (i = 0; i < mono_array_length (abuilder->modules); ++i) {
3627 MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
3628 type = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve);
3634 if (!type && abuilder->loaded_modules) {
3635 for (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {
3636 MonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
3637 type = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve);
3644 type = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve);
3646 g_list_free (info.modifiers);
3647 g_list_free (info.nested);
3650 mono_raise_exception (mono_get_exception_type_load (name, NULL));
3651 /* g_print ("failed find\n"); */
3655 if (type->type == MONO_TYPE_CLASS) {
3656 MonoClass *klass = mono_type_get_class (type);
3657 /* need to report exceptions ? */
3658 if (throwOnError && klass->exception_type) {
3659 /* report SecurityException (or others) that occured when loading the assembly */
3660 MonoException *exc = mono_class_get_exception_for_failure (klass);
3661 mono_raise_exception (exc);
3662 } else if (klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) {
3667 /* g_print ("got it\n"); */
3668 return mono_type_get_object (mono_object_domain (assembly), type);
3672 ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly, MonoBoolean escaped)
3674 MonoDomain *domain = mono_object_domain (assembly);
3675 MonoAssembly *mass = assembly->assembly;
3676 MonoString *res = NULL;
3680 MONO_ARCH_SAVE_REGS;
3682 absolute = g_build_filename (mass->basedir, mass->image->module_name, NULL);
3684 uri = g_filename_to_uri (absolute, NULL, NULL);
3686 uri = g_strconcat ("file://", absolute, NULL);
3690 res = mono_string_new (domain, uri);
3698 ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)
3700 MonoAssembly *mass = assembly->assembly;
3702 MONO_ARCH_SAVE_REGS;
3704 return mass->in_gac;
3707 static MonoReflectionAssembly*
3708 ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)
3712 MonoImageOpenStatus status;
3714 MONO_ARCH_SAVE_REGS;
3716 name = mono_string_to_utf8 (mname);
3717 res = mono_assembly_load_with_partial_name (name, &status);
3723 return mono_assembly_get_object (mono_domain_get (), res);
3727 ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assembly)
3729 MonoDomain *domain = mono_object_domain (assembly);
3732 MONO_ARCH_SAVE_REGS;
3734 res = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image));
3740 ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)
3742 MONO_ARCH_SAVE_REGS;
3744 return assembly->assembly->ref_only;
3748 ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssembly *assembly)
3750 MonoDomain *domain = mono_object_domain (assembly);
3752 MONO_ARCH_SAVE_REGS;
3754 return mono_string_new (domain, assembly->assembly->image->version);
3757 static MonoReflectionMethod*
3758 ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly)
3760 guint32 token = mono_image_get_entry_point (assembly->assembly->image);
3762 MONO_ARCH_SAVE_REGS;
3766 return mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL);
3769 static MonoReflectionModule*
3770 ves_icall_System_Reflection_Assembly_get_ManifestModule (MonoReflectionAssembly *assembly)
3772 return mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);
3776 ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly)
3778 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3779 MonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows);
3783 MONO_ARCH_SAVE_REGS;
3785 for (i = 0; i < table->rows; ++i) {
3786 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));
3787 mono_array_setref (result, i, mono_string_new (mono_object_domain (assembly), val));
3793 create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision)
3795 static MonoClass *System_Version = NULL;
3796 static MonoMethod *create_version = NULL;
3800 if (!System_Version) {
3801 System_Version = mono_class_from_name (mono_defaults.corlib, "System", "Version");
3802 g_assert (System_Version);
3805 if (!create_version) {
3806 MonoMethodDesc *desc = mono_method_desc_new (":.ctor(int,int,int,int)", FALSE);
3807 create_version = mono_method_desc_search_in_class (desc, System_Version);
3808 g_assert (create_version);
3809 mono_method_desc_free (desc);
3815 args [3] = &revision;
3816 result = mono_object_new (domain, System_Version);
3817 mono_runtime_invoke (create_version, result, args, NULL);
3823 ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly)
3825 static MonoClass *System_Reflection_AssemblyName;
3827 MonoDomain *domain = mono_object_domain (assembly);
3829 static MonoMethod *create_culture = NULL;
3830 MonoImage *image = assembly->assembly->image;
3833 MONO_ARCH_SAVE_REGS;
3835 if (!System_Reflection_AssemblyName)
3836 System_Reflection_AssemblyName = mono_class_from_name (
3837 mono_defaults.corlib, "System.Reflection", "AssemblyName");
3839 t = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];
3842 result = mono_array_new (domain, System_Reflection_AssemblyName, count);
3845 MonoMethodDesc *desc = mono_method_desc_new (
3846 "System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
3847 create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
3848 g_assert (create_culture);
3849 mono_method_desc_free (desc);
3852 for (i = 0; i < count; i++) {
3853 MonoReflectionAssemblyName *aname;
3854 guint32 cols [MONO_ASSEMBLYREF_SIZE];
3856 mono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);
3858 aname = (MonoReflectionAssemblyName *) mono_object_new (
3859 domain, System_Reflection_AssemblyName);
3861 aname->name = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME]));
3863 aname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION];
3864 aname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION];
3865 aname->build = cols [MONO_ASSEMBLYREF_BUILD_NUMBER];
3866 aname->revision = cols [MONO_ASSEMBLYREF_REV_NUMBER];
3867 aname->flags = cols [MONO_ASSEMBLYREF_FLAGS];
3868 aname->versioncompat = 1; /* SameMachine (default) */
3869 aname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */
3870 aname->version = create_version (domain, aname->major, aname->minor, aname->build, aname->revision);
3872 if (create_culture) {
3874 args [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));
3875 aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL);
3878 if (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {
3879 const gchar *pkey_ptr = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLYREF_PUBLIC_KEY]);
3880 guint32 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
3882 if ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {
3883 /* public key token isn't copied - the class library will
3884 automatically generate it from the public key if required */
3885 aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
3886 memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
3888 aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
3889 memcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len);
3893 /* note: this function doesn't return the codebase on purpose (i.e. it can
3894 be used under partial trust as path information isn't present). */
3896 mono_array_setref (result, i, aname);
3907 foreach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)
3909 MonoString *name = mono_string_new (mono_object_domain (info->res), key);
3911 mono_array_setref (info->res, info->idx, name);
3916 ves_icall_System_Reflection_Assembly_GetNamespaces (MonoReflectionAssembly *assembly)
3918 MonoImage *img = assembly->assembly->image;
3922 MONO_ARCH_SAVE_REGS;
3924 res = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, g_hash_table_size (img->name_cache));
3927 g_hash_table_foreach (img->name_cache, (GHFunc)foreach_namespace, &info);
3932 /* move this in some file in mono/util/ */
3934 g_concat_dir_and_file (const char *dir, const char *file)
3936 g_return_val_if_fail (dir != NULL, NULL);
3937 g_return_val_if_fail (file != NULL, NULL);
3940 * If the directory name doesn't have a / on the end, we need
3941 * to add one so we get a proper path to the file
3943 if (dir [strlen(dir) - 1] != G_DIR_SEPARATOR)
3944 return g_strconcat (dir, G_DIR_SEPARATOR_S, file, NULL);
3946 return g_strconcat (dir, file, NULL);
3950 ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module)
3952 char *n = mono_string_to_utf8 (name);
3953 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3955 guint32 cols [MONO_MANIFEST_SIZE];
3956 guint32 impl, file_idx;
3960 MONO_ARCH_SAVE_REGS;
3962 for (i = 0; i < table->rows; ++i) {
3963 mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);
3964 val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);
3965 if (strcmp (val, n) == 0)
3969 if (i == table->rows)
3972 impl = cols [MONO_MANIFEST_IMPLEMENTATION];
3975 * this code should only be called after obtaining the
3976 * ResourceInfo and handling the other cases.
3978 g_assert ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_FILE);
3979 file_idx = impl >> MONO_IMPLEMENTATION_BITS;
3981 module = mono_image_load_file_for_image (assembly->assembly->image, file_idx);
3986 module = assembly->assembly->image;
3988 *ref_module = mono_module_get_object (mono_domain_get (), module);
3990 return (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);
3994 ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)
3996 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3998 guint32 cols [MONO_MANIFEST_SIZE];
3999 guint32 file_cols [MONO_FILE_SIZE];
4003 MONO_ARCH_SAVE_REGS;
4005 n = mono_string_to_utf8 (name);
4006 for (i = 0; i < table->rows; ++i) {
4007 mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);
4008 val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);
4009 if (strcmp (val, n) == 0)
4013 if (i == table->rows)
4016 if (!cols [MONO_MANIFEST_IMPLEMENTATION]) {
4017 info->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;
4020 switch (cols [MONO_MANIFEST_IMPLEMENTATION] & MONO_IMPLEMENTATION_MASK) {
4021 case MONO_IMPLEMENTATION_FILE:
4022 i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
4023 table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
4024 mono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);
4025 val = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);
4026 info->filename = mono_string_new (mono_object_domain (assembly), val);
4027 if (file_cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)
4030 info->location = RESOURCE_LOCATION_EMBEDDED;
4033 case MONO_IMPLEMENTATION_ASSEMBLYREF:
4034 i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
4035 mono_assembly_load_reference (assembly->assembly->image, i - 1);
4036 if (assembly->assembly->image->references [i - 1] == (gpointer)-1) {
4037 char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i - 1, assembly->assembly->image->name);
4038 MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);
4040 mono_raise_exception (ex);
4042 info->assembly = mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]);
4044 /* Obtain info recursively */
4045 ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);
4046 info->location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;
4049 case MONO_IMPLEMENTATION_EXP_TYPE:
4050 g_assert_not_reached ();
4059 ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules)
4061 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
4062 MonoArray *result = NULL;
4067 MONO_ARCH_SAVE_REGS;
4069 /* check hash if needed */
4071 n = mono_string_to_utf8 (name);
4072 for (i = 0; i < table->rows; ++i) {
4073 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
4074 if (strcmp (val, n) == 0) {
4077 n = g_concat_dir_and_file (assembly->assembly->basedir, val);
4078 fn = mono_string_new (mono_object_domain (assembly), n);
4080 return (MonoObject*)fn;
4088 for (i = 0; i < table->rows; ++i) {
4089 if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA))
4093 result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count);
4096 for (i = 0; i < table->rows; ++i) {
4097 if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
4098 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
4099 n = g_concat_dir_and_file (assembly->assembly->basedir, val);
4100 mono_array_setref (result, count, mono_string_new (mono_object_domain (assembly), n));
4105 return (MonoObject*)result;
4109 ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)
4111 MonoDomain *domain = mono_domain_get();
4114 int i, j, file_count = 0;
4115 MonoImage **modules;
4116 guint32 module_count, real_module_count;
4117 MonoTableInfo *table;
4119 g_assert (assembly->assembly->image != NULL);
4121 if (assembly->assembly->dynamic) {
4122 MonoReflectionAssemblyBuilder *assemblyb = (MonoReflectionAssemblyBuilder*)assembly;
4124 if (assemblyb->modules)
4125 module_count = mono_array_length (assemblyb->modules);
4128 real_module_count = module_count;
4130 modules = g_new0 (MonoImage*, module_count);
4131 if (assemblyb->modules) {
4132 for (i = 0; i < mono_array_length (assemblyb->modules); ++i) {
4134 mono_array_get (assemblyb->modules, MonoReflectionModuleBuilder*, i)->module.image;
4139 table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
4140 file_count = table->rows;
4142 modules = assembly->assembly->image->modules;
4143 module_count = assembly->assembly->image->module_count;
4145 real_module_count = 0;
4146 for (i = 0; i < module_count; ++i)
4148 real_module_count ++;
4151 klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Module");
4152 res = mono_array_new (domain, klass, 1 + real_module_count + file_count);
4154 mono_array_setref (res, 0, mono_module_get_object (domain, assembly->assembly->image));
4156 for (i = 0; i < module_count; ++i)
4158 mono_array_setref (res, j, mono_module_get_object (domain, modules[i]));
4162 for (i = 0; i < file_count; ++i, ++j)
4163 mono_array_setref (res, j, mono_module_file_get_object (domain, assembly->assembly->image, i));
4165 if (assembly->assembly->dynamic)
4171 static MonoReflectionMethod*
4172 ves_icall_GetCurrentMethod (void)
4174 MonoMethod *m = mono_method_get_last_managed ();
4176 MONO_ARCH_SAVE_REGS;
4178 return mono_method_get_object (mono_domain_get (), m, NULL);
4181 static MonoReflectionMethod*
4182 ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal (MonoMethod *method)
4184 return mono_method_get_object (mono_domain_get (), method, NULL);
4187 static MonoReflectionMethodBody*
4188 ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)
4190 return mono_method_body_get_object (mono_domain_get (), method);
4193 static MonoReflectionAssembly*
4194 ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
4196 MonoMethod *m = mono_method_get_last_managed ();
4198 MONO_ARCH_SAVE_REGS;
4200 return mono_assembly_get_object (mono_domain_get (), m->klass->image->assembly);
4204 static MonoReflectionAssembly*
4205 ves_icall_System_Reflection_Assembly_GetEntryAssembly (void)
4207 MonoDomain* domain = mono_domain_get ();
4209 MONO_ARCH_SAVE_REGS;
4211 if (!domain->entry_assembly)
4214 return mono_assembly_get_object (domain, domain->entry_assembly);
4217 static MonoReflectionAssembly*
4218 ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
4220 MonoMethod *m = mono_method_get_last_managed ();
4221 MonoMethod *dest = m;
4223 MONO_ARCH_SAVE_REGS;
4225 mono_stack_walk_no_il (get_caller, &dest);
4228 return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
4232 ves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name,
4233 gboolean assembly_qualified)
4235 MonoDomain *domain = mono_object_domain (object);
4236 MonoTypeNameFormat format;
4240 MONO_ARCH_SAVE_REGS;
4242 format = assembly_qualified ?
4243 MONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED :
4244 MONO_TYPE_NAME_FORMAT_FULL_NAME;
4246 format = MONO_TYPE_NAME_FORMAT_REFLECTION;
4248 name = mono_type_get_name_full (object->type, format);
4252 if (full_name && (object->type->type == MONO_TYPE_VAR || object->type->type == MONO_TYPE_MVAR))
4255 res = mono_string_new (domain, name);
4262 fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version)
4264 static MonoMethod *create_culture = NULL;
4267 const char *pkey_ptr;
4270 MONO_ARCH_SAVE_REGS;
4272 aname->name = mono_string_new (domain, name->name);
4273 aname->major = name->major;
4274 aname->minor = name->minor;
4275 aname->build = name->build;
4276 aname->revision = name->revision;
4277 aname->hashalg = name->hash_alg;
4278 if (by_default_version)
4279 aname->version = create_version (domain, name->major, name->minor, name->build, name->revision);
4281 codebase = g_filename_to_uri (absolute, NULL, NULL);
4283 aname->codebase = mono_string_new (domain, codebase);
4287 if (!create_culture) {
4288 MonoMethodDesc *desc = mono_method_desc_new ("System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
4289 create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
4290 g_assert (create_culture);
4291 mono_method_desc_free (desc);
4294 if (name->culture) {
4295 args [0] = mono_string_new (domain, name->culture);
4296 aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL);
4299 if (name->public_key) {
4300 pkey_ptr = (char*)name->public_key;
4301 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
4303 aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
4304 memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
4307 /* MonoAssemblyName keeps the public key token as an hexadecimal string */
4308 if (name->public_key_token [0]) {
4312 aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, 8);
4313 p = mono_array_addr (aname->keyToken, char, 0);
4315 for (i = 0, j = 0; i < 8; i++) {
4316 *p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;
4317 *p |= g_ascii_xdigit_value (name->public_key_token [j++]);
4324 ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)
4328 MONO_ARCH_SAVE_REGS;
4330 absolute = g_build_filename (assembly->assembly->basedir, assembly->assembly->image->module_name, NULL);
4332 fill_reflection_assembly_name (mono_object_domain (assembly), aname,
4333 &assembly->assembly->aname, absolute, TRUE);
4339 ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)
4342 MonoImageOpenStatus status = MONO_IMAGE_OK;
4345 MonoAssemblyName name;
4347 MONO_ARCH_SAVE_REGS;
4349 filename = mono_string_to_utf8 (fname);
4351 image = mono_image_open (filename, &status);
4357 exc = mono_get_exception_file_not_found (fname);
4358 mono_raise_exception (exc);
4361 res = mono_assembly_fill_assembly_name (image, &name);
4363 mono_image_close (image);
4365 mono_raise_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest"));
4368 fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename, TRUE);
4371 mono_image_close (image);
4375 ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,
4376 char **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)
4378 MonoBoolean result = FALSE;
4379 MonoDeclSecurityEntry entry;
4381 /* SecurityAction.RequestMinimum */
4382 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {
4383 *minimum = entry.blob;
4384 *minLength = entry.size;
4387 /* SecurityAction.RequestOptional */
4388 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {
4389 *optional = entry.blob;
4390 *optLength = entry.size;
4393 /* SecurityAction.RequestRefuse */
4394 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {
4395 *refused = entry.blob;
4396 *refLength = entry.size;
4404 mono_module_get_types (MonoDomain *domain, MonoImage *image,
4405 MonoBoolean exportedOnly)
4409 MonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];
4411 guint32 attrs, visibility;
4413 /* we start the count from 1 because we skip the special type <Module> */
4416 for (i = 1; i < tdef->rows; ++i) {
4417 attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);
4418 visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;
4419 if (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)
4423 count = tdef->rows - 1;
4425 res = mono_array_new (domain, mono_defaults.monotype_class, count);
4427 for (i = 1; i < tdef->rows; ++i) {
4428 attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);
4429 visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;
4430 if (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) {
4431 klass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF);
4432 mono_array_setref (res, count, mono_type_get_object (domain, &klass->byval_arg));
4441 ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)
4443 MonoArray *res = NULL;
4444 MonoImage *image = NULL;
4445 MonoTableInfo *table = NULL;
4449 MONO_ARCH_SAVE_REGS;
4451 domain = mono_object_domain (assembly);
4453 if (assembly->assembly->dynamic) {
4454 MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
4455 if (abuilder->modules) {
4456 for (i = 0; i < mono_array_length(abuilder->modules); i++) {
4457 MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
4461 MonoArray *append = mb->types;
4462 if (mono_array_length (append) > 0) {
4465 len1 = mono_array_length (res);
4466 len2 = mono_array_length (append);
4467 new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4468 memcpy (mono_array_addr (new, MonoReflectionType*, 0),
4469 mono_array_addr (res, MonoReflectionType*, 0),
4470 len1 * sizeof (MonoReflectionType*));
4471 memcpy (mono_array_addr (new, MonoReflectionType*, len1),
4472 mono_array_addr (append, MonoReflectionType*, 0),
4473 len2 * sizeof (MonoReflectionType*));
4480 * Replace TypeBuilders with the created types to be compatible
4484 for (i = 0; i < mono_array_length (res); ++i) {
4485 MonoReflectionTypeBuilder *tb = mono_array_get (res, MonoReflectionTypeBuilder*, i);
4487 mono_array_setref (res, i, tb->created);
4492 if (abuilder->loaded_modules)
4493 for (i = 0; i < mono_array_length(abuilder->loaded_modules); i++) {
4494 MonoReflectionModule *rm = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
4496 res = mono_module_get_types (domain, rm->image, exportedOnly);
4498 MonoArray *append = mono_module_get_types (domain, rm->image, exportedOnly);
4499 if (mono_array_length (append) > 0) {
4502 len1 = mono_array_length (res);
4503 len2 = mono_array_length (append);
4504 new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4505 memcpy (mono_array_addr (new, MonoReflectionType*, 0),
4506 mono_array_addr (res, MonoReflectionType*, 0),
4507 len1 * sizeof (MonoReflectionType*));
4508 memcpy (mono_array_addr (new, MonoReflectionType*, len1),
4509 mono_array_addr (append, MonoReflectionType*, 0),
4510 len2 * sizeof (MonoReflectionType*));
4517 image = assembly->assembly->image;
4518 table = &image->tables [MONO_TABLE_FILE];
4519 res = mono_module_get_types (domain, image, exportedOnly);
4521 /* Append data from all modules in the assembly */
4522 for (i = 0; i < table->rows; ++i) {
4523 if (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
4524 MonoImage *loaded_image = mono_assembly_load_module (image->assembly, i + 1);
4526 MonoArray *res2 = mono_module_get_types (domain, loaded_image, exportedOnly);
4527 /* Append the new types to the end of the array */
4528 if (mono_array_length (res2) > 0) {
4532 len1 = mono_array_length (res);
4533 len2 = mono_array_length (res2);
4534 res3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4535 memcpy (mono_array_addr (res3, MonoReflectionType*, 0),
4536 mono_array_addr (res, MonoReflectionType*, 0),
4537 len1 * sizeof (MonoReflectionType*));
4538 memcpy (mono_array_addr (res3, MonoReflectionType*, len1),
4539 mono_array_addr (res2, MonoReflectionType*, 0),
4540 len2 * sizeof (MonoReflectionType*));
4547 if (mono_is_security_manager_active ()) {
4548 /* the ReflectionTypeLoadException must have all the types (Types property),
4549 * NULL replacing types which throws an exception. The LoaderException must
4550 * contains all exceptions for NULL items.
4553 guint32 len = mono_array_length (res);
4556 for (i = 0; i < len; i++) {
4557 MonoReflectionType *t = mono_array_get (res, gpointer, i);
4558 MonoClass *klass = mono_type_get_class (t->type);
4559 if ((klass != NULL) && klass->exception_type) {
4560 /* keep the class in the list */
4561 list = g_list_append (list, klass);
4562 /* and replace Type with NULL */
4563 mono_array_setref (res, i, NULL);
4569 MonoException *exc = NULL;
4570 int length = g_list_length (list);
4572 MonoArray *exl = mono_array_new (domain, mono_defaults.exception_class, length);
4573 for (i = 0, tmp = list; i < length; i++, tmp = tmp->next) {
4574 MonoException *exc = mono_class_get_exception_for_failure (tmp->data);
4575 mono_array_setref (exl, i, exc);
4580 exc = mono_get_exception_reflection_type_load (res, exl);
4581 mono_raise_exception (exc);
4589 ves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName *name, MonoString *assname)
4591 MonoAssemblyName aname;
4592 MonoDomain *domain = mono_object_domain (name);
4594 gboolean is_version_defined;
4596 val = mono_string_to_utf8 (assname);
4597 if (!mono_assembly_name_parse_full (val, &aname, TRUE, &is_version_defined))
4600 fill_reflection_assembly_name (domain, name, &aname, "", is_version_defined);
4602 mono_assembly_name_free (&aname);
4603 g_free ((guint8*) aname.public_key);
4609 static MonoReflectionType*
4610 ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)
4612 MonoDomain *domain = mono_object_domain (module);
4615 MONO_ARCH_SAVE_REGS;
4617 g_assert (module->image);
4619 if (module->image->dynamic && ((MonoDynamicImage*)(module->image))->initial_image)
4620 /* These images do not have a global type */
4623 klass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF);
4624 return mono_type_get_object (domain, &klass->byval_arg);
4628 ves_icall_System_Reflection_Module_Close (MonoReflectionModule *module)
4630 /*if (module->image)
4631 mono_image_close (module->image);*/
4635 ves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module)
4637 MonoDomain *domain = mono_object_domain (module);
4639 MONO_ARCH_SAVE_REGS;
4641 g_assert (module->image);
4642 return mono_string_new (domain, module->image->guid);
4646 ves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)
4648 if (image->dynamic) {
4649 MonoDynamicImage *dyn = (MonoDynamicImage*)image;
4650 *pe_kind = dyn->pe_kind;
4651 *machine = dyn->machine;
4654 *pe_kind = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags & 0x3;
4655 *machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;
4660 ves_icall_System_Reflection_Module_get_MDStreamVersion (MonoReflectionModule *module)
4662 MonoImage *image = module->image;
4665 mono_raise_exception (mono_get_exception_not_supported (""));
4667 return (image->md_version_major << 16) | (image->md_version_minor);
4671 ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)
4673 MONO_ARCH_SAVE_REGS;
4676 return mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);
4678 return mono_module_get_types (mono_object_domain (module), module->image, FALSE);
4682 mono_metadata_memberref_is_method (MonoImage *image, guint32 token)
4684 guint32 cols [MONO_MEMBERREF_SIZE];
4686 mono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], mono_metadata_token_index (token) - 1, cols, MONO_MEMBERREF_SIZE);
4687 sig = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);
4688 mono_metadata_decode_blob_size (sig, &sig);
4689 return (*sig != 0x6);
4693 ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4696 int table = mono_metadata_token_table (token);
4697 int index = mono_metadata_token_index (token);
4699 *error = ResolveTokenError_Other;
4701 /* Validate token */
4702 if ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) &&
4703 (table != MONO_TABLE_TYPESPEC)) {
4704 *error = ResolveTokenError_BadTable;
4709 return mono_lookup_dynamic_token (image, token);
4711 if ((index <= 0) || (index > image->tables [table].rows)) {
4712 *error = ResolveTokenError_OutOfRange;
4716 klass = mono_class_get (image, token);
4718 return &klass->byval_arg;
4724 ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4726 int table = mono_metadata_token_table (token);
4727 int index = mono_metadata_token_index (token);
4729 *error = ResolveTokenError_Other;
4731 /* Validate token */
4732 if ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) &&
4733 (table != MONO_TABLE_MEMBERREF)) {
4734 *error = ResolveTokenError_BadTable;
4739 /* FIXME: validate memberref token type */
4740 return mono_lookup_dynamic_token (image, token);
4742 if ((index <= 0) || (index > image->tables [table].rows)) {
4743 *error = ResolveTokenError_OutOfRange;
4746 if ((table == MONO_TABLE_MEMBERREF) && (!mono_metadata_memberref_is_method (image, token))) {
4747 *error = ResolveTokenError_BadTable;
4751 return mono_get_method (image, token, NULL);
4755 ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4757 int index = mono_metadata_token_index (token);
4759 *error = ResolveTokenError_Other;
4761 /* Validate token */
4762 if (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {
4763 *error = ResolveTokenError_BadTable;
4768 return mono_lookup_dynamic_token (image, token);
4770 if ((index <= 0) || (index >= image->heap_us.size)) {
4771 *error = ResolveTokenError_OutOfRange;
4775 /* FIXME: What to do if the index points into the middle of a string ? */
4777 return mono_ldstr (mono_domain_get (), image, index);
4780 static MonoClassField*
4781 ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4784 int table = mono_metadata_token_table (token);
4785 int index = mono_metadata_token_index (token);
4787 *error = ResolveTokenError_Other;
4789 /* Validate token */
4790 if ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {
4791 *error = ResolveTokenError_BadTable;
4796 /* FIXME: validate memberref token type */
4797 return mono_lookup_dynamic_token (image, token);
4799 if ((index <= 0) || (index > image->tables [table].rows)) {
4800 *error = ResolveTokenError_OutOfRange;
4803 if ((table == MONO_TABLE_MEMBERREF) && (mono_metadata_memberref_is_method (image, token))) {
4804 *error = ResolveTokenError_BadTable;
4808 return mono_field_from_token (image, token, &klass, NULL);
4813 ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4815 int table = mono_metadata_token_table (token);
4817 *error = ResolveTokenError_Other;
4820 case MONO_TABLE_TYPEDEF:
4821 case MONO_TABLE_TYPEREF:
4822 case MONO_TABLE_TYPESPEC: {
4823 MonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, error);
4825 return (MonoObject*)mono_type_get_object (mono_domain_get (), t);
4829 case MONO_TABLE_METHOD:
4830 case MONO_TABLE_METHODSPEC: {
4831 MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
4833 return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
4837 case MONO_TABLE_FIELD: {
4838 MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
4840 return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
4844 case MONO_TABLE_MEMBERREF:
4845 if (mono_metadata_memberref_is_method (image, token)) {
4846 MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
4848 return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
4853 MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
4855 return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
4862 *error = ResolveTokenError_BadTable;
4868 static MonoReflectionType*
4869 ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, MonoString *smodifiers)
4872 int isbyref = 0, rank;
4873 char *str = mono_string_to_utf8 (smodifiers);
4876 MONO_ARCH_SAVE_REGS;
4878 klass = mono_class_from_mono_type (tb->type.type);
4880 /* logic taken from mono_reflection_parse_type(): keep in sync */
4884 if (isbyref) { /* only one level allowed by the spec */
4891 return mono_type_get_object (mono_object_domain (tb), &klass->this_arg);
4894 klass = mono_ptr_class_get (&klass->byval_arg);
4895 mono_class_init (klass);
4906 else if (*p != '*') { /* '*' means unknown lower bound */
4917 klass = mono_array_class_get (klass, rank);
4918 mono_class_init (klass);
4925 return mono_type_get_object (mono_object_domain (tb), &klass->byval_arg);
4929 ves_icall_Type_IsArrayImpl (MonoReflectionType *t)
4934 MONO_ARCH_SAVE_REGS;
4937 res = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);
4942 static MonoReflectionType *
4943 ves_icall_Type_make_array_type (MonoReflectionType *type, int rank)
4945 MonoClass *klass, *aklass;
4947 MONO_ARCH_SAVE_REGS;
4949 klass = mono_class_from_mono_type (type->type);
4950 aklass = mono_array_class_get (klass, rank);
4952 return mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);
4955 static MonoReflectionType *
4956 ves_icall_Type_make_byref_type (MonoReflectionType *type)
4960 MONO_ARCH_SAVE_REGS;
4962 klass = mono_class_from_mono_type (type->type);
4964 return mono_type_get_object (mono_object_domain (type), &klass->this_arg);
4967 static MonoReflectionType *
4968 ves_icall_Type_MakePointerType (MonoReflectionType *type)
4972 MONO_ARCH_SAVE_REGS;
4974 pklass = mono_ptr_class_get (type->type);
4976 return mono_type_get_object (mono_object_domain (type), &pklass->byval_arg);
4980 ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target,
4981 MonoReflectionMethod *info)
4983 MonoClass *delegate_class = mono_class_from_mono_type (type->type);
4984 MonoObject *delegate;
4987 MONO_ARCH_SAVE_REGS;
4989 mono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class);
4991 delegate = mono_object_new (mono_object_domain (type), delegate_class);
4993 func = mono_compile_method (info->method);
4995 mono_delegate_ctor (delegate, target, func);
5001 ves_icall_System_Delegate_FreeTrampoline (MonoDelegate *this)
5004 Delegates have a finalizer only when needed, now.
5005 mono_delegate_free_ftnptr (this);*/
5009 * Magic number to convert a time which is relative to
5010 * Jan 1, 1970 into a value which is relative to Jan 1, 0001.
5012 #define EPOCH_ADJUST ((guint64)62135596800LL)
5015 * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001
5017 #define FILETIME_ADJUST ((guint64)504911232000000000LL)
5020 * This returns Now in UTC
5023 ves_icall_System_DateTime_GetNow (void)
5025 #ifdef PLATFORM_WIN32
5029 GetSystemTime (&st);
5030 SystemTimeToFileTime (&st, &ft);
5031 return (gint64) FILETIME_ADJUST + ((((gint64)ft.dwHighDateTime)<<32) | ft.dwLowDateTime);
5033 /* FIXME: put this in io-layer and call it GetLocalTime */
5037 MONO_ARCH_SAVE_REGS;
5039 if (gettimeofday (&tv, NULL) == 0) {
5040 res = (((gint64)tv.tv_sec + EPOCH_ADJUST)* 1000000 + tv.tv_usec)*10;
5043 /* fixme: raise exception */
5048 #ifdef PLATFORM_WIN32
5049 /* convert a SYSTEMTIME which is of the form "last thursday in october" to a real date */
5051 convert_to_absolute_date(SYSTEMTIME *date)
5053 #define IS_LEAP(y) ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0))
5054 static int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
5055 static int leap_days_in_month[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
5056 /* from the calendar FAQ */
5057 int a = (14 - date->wMonth) / 12;
5058 int y = date->wYear - a;
5059 int m = date->wMonth + 12 * a - 2;
5060 int d = (1 + y + y/4 - y/100 + y/400 + (31*m)/12) % 7;
5062 /* d is now the day of the week for the first of the month (0 == Sunday) */
5064 int day_of_week = date->wDayOfWeek;
5066 /* set day_in_month to the first day in the month which falls on day_of_week */
5067 int day_in_month = 1 + (day_of_week - d);
5068 if (day_in_month <= 0)
5071 /* wDay is 1 for first weekday in month, 2 for 2nd ... 5 means last - so work that out allowing for days in the month */
5072 date->wDay = day_in_month + (date->wDay - 1) * 7;
5073 if (date->wDay > (IS_LEAP(date->wYear) ? leap_days_in_month[date->wMonth - 1] : days_in_month[date->wMonth - 1]))
5078 #ifndef PLATFORM_WIN32
5080 * Return's the offset from GMT of a local time.
5082 * tm is a local time
5083 * t is the same local time as seconds.
5086 gmt_offset(struct tm *tm, time_t t)
5088 #if defined (HAVE_TM_GMTOFF)
5089 return tm->tm_gmtoff;
5094 g.tm_isdst = tm->tm_isdst;
5096 return (int)difftime(t, t2);
5101 * This is heavily based on zdump.c from glibc 2.2.
5103 * * data[0]: start of daylight saving time (in DateTime ticks).
5104 * * data[1]: end of daylight saving time (in DateTime ticks).
5105 * * data[2]: utcoffset (in TimeSpan ticks).
5106 * * data[3]: additional offset when daylight saving (in TimeSpan ticks).
5107 * * name[0]: name of this timezone when not daylight saving.
5108 * * name[1]: name of this timezone when daylight saving.
5110 * FIXME: This only works with "standard" Unix dates (years between 1900 and 2100) while
5111 * the class library allows years between 1 and 9999.
5113 * Returns true on success and zero on failure.
5116 ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)
5118 #ifndef PLATFORM_WIN32
5119 MonoDomain *domain = mono_domain_get ();
5120 struct tm start, tt;
5124 int is_daylight = 0, day;
5127 MONO_ARCH_SAVE_REGS;
5129 MONO_CHECK_ARG_NULL (data);
5130 MONO_CHECK_ARG_NULL (names);
5132 (*data) = mono_array_new (domain, mono_defaults.int64_class, 4);
5133 (*names) = mono_array_new (domain, mono_defaults.string_class, 2);
5136 * no info is better than crashing: we'll need our own tz data
5137 * to make this work properly, anyway. The range is probably
5138 * reduced to 1970 .. 2037 because that is what mktime is
5139 * guaranteed to support (we get into an infinite loop
5143 memset (&start, 0, sizeof (start));
5146 start.tm_year = year-1900;
5148 t = mktime (&start);
5150 if ((year < 1970) || (year > 2037) || (t == -1)) {
5152 tt = *localtime (&t);
5153 strftime (tzone, sizeof (tzone), "%Z", &tt);
5154 mono_array_setref ((*names), 0, mono_string_new (domain, tzone));
5155 mono_array_setref ((*names), 1, mono_string_new (domain, tzone));
5159 gmtoff = gmt_offset (&start, t);
5161 /* For each day of the year, calculate the tm_gmtoff. */
5162 for (day = 0; day < 365; day++) {
5165 tt = *localtime (&t);
5167 /* Daylight saving starts or ends here. */
5168 if (gmt_offset (&tt, t) != gmtoff) {
5172 /* Try to find the exact hour when daylight saving starts/ends. */
5176 tt1 = *localtime (&t1);
5177 } while (gmt_offset (&tt1, t1) != gmtoff);
5179 /* Try to find the exact minute when daylight saving starts/ends. */
5182 tt1 = *localtime (&t1);
5183 } while (gmt_offset (&tt1, t1) == gmtoff);
5185 strftime (tzone, sizeof (tzone), "%Z", &tt);
5187 /* Write data, if we're already in daylight saving, we're done. */
5189 mono_array_setref ((*names), 0, mono_string_new (domain, tzone));
5190 mono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
5193 mono_array_setref ((*names), 1, mono_string_new (domain, tzone));
5194 mono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
5198 /* This is only set once when we enter daylight saving. */
5199 mono_array_set ((*data), gint64, 2, (gint64)gmtoff * 10000000L);
5200 mono_array_set ((*data), gint64, 3, (gint64)(gmt_offset (&tt, t) - gmtoff) * 10000000L);
5202 gmtoff = gmt_offset (&tt, t);
5207 strftime (tzone, sizeof (tzone), "%Z", &tt);
5208 mono_array_setref ((*names), 0, mono_string_new (domain, tzone));
5209 mono_array_setref ((*names), 1, mono_string_new (domain, tzone));
5210 mono_array_set ((*data), gint64, 0, 0);
5211 mono_array_set ((*data), gint64, 1, 0);
5212 mono_array_set ((*data), gint64, 2, (gint64) gmtoff * 10000000L);
5213 mono_array_set ((*data), gint64, 3, 0);
5218 MonoDomain *domain = mono_domain_get ();
5219 TIME_ZONE_INFORMATION tz_info;
5224 tz_id = GetTimeZoneInformation (&tz_info);
5225 if (tz_id == TIME_ZONE_ID_INVALID)
5228 MONO_CHECK_ARG_NULL (data);
5229 MONO_CHECK_ARG_NULL (names);
5231 (*data) = mono_array_new (domain, mono_defaults.int64_class, 4);
5232 (*names) = mono_array_new (domain, mono_defaults.string_class, 2);
5234 for (i = 0; i < 32; ++i)
5235 if (!tz_info.DaylightName [i])
5237 mono_array_setref ((*names), 1, mono_string_new_utf16 (domain, tz_info.DaylightName, i));
5238 for (i = 0; i < 32; ++i)
5239 if (!tz_info.StandardName [i])
5241 mono_array_setref ((*names), 0, mono_string_new_utf16 (domain, tz_info.StandardName, i));
5243 if ((year <= 1601) || (year > 30827)) {
5245 * According to MSDN, the MS time functions can't handle dates outside
5251 /* even if the timezone has no daylight savings it may have Bias (e.g. GMT+13 it seems) */
5252 if (tz_id != TIME_ZONE_ID_UNKNOWN) {
5253 tz_info.StandardDate.wYear = year;
5254 convert_to_absolute_date(&tz_info.StandardDate);
5255 err = SystemTimeToFileTime (&tz_info.StandardDate, &ft);
5257 mono_array_set ((*data), gint64, 1, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));
5258 tz_info.DaylightDate.wYear = year;
5259 convert_to_absolute_date(&tz_info.DaylightDate);
5260 err = SystemTimeToFileTime (&tz_info.DaylightDate, &ft);
5262 mono_array_set ((*data), gint64, 0, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));
5264 mono_array_set ((*data), gint64, 2, (tz_info.Bias + tz_info.StandardBias) * -600000000LL);
5265 mono_array_set ((*data), gint64, 3, (tz_info.DaylightBias - tz_info.StandardBias) * -600000000LL);
5272 ves_icall_System_Object_obj_address (MonoObject *this)
5274 MONO_ARCH_SAVE_REGS;
5281 static inline gint32
5282 mono_array_get_byte_length (MonoArray *array)
5288 klass = array->obj.vtable->klass;
5290 if (array->bounds == NULL)
5291 length = array->max_length;
5294 for (i = 0; i < klass->rank; ++ i)
5295 length *= array->bounds [i].length;
5298 switch (klass->element_class->byval_arg.type) {
5301 case MONO_TYPE_BOOLEAN:
5305 case MONO_TYPE_CHAR:
5313 return length * sizeof (gpointer);
5324 ves_icall_System_Buffer_ByteLengthInternal (MonoArray *array)
5326 MONO_ARCH_SAVE_REGS;
5328 return mono_array_get_byte_length (array);
5332 ves_icall_System_Buffer_GetByteInternal (MonoArray *array, gint32 idx)
5334 MONO_ARCH_SAVE_REGS;
5336 return mono_array_get (array, gint8, idx);
5340 ves_icall_System_Buffer_SetByteInternal (MonoArray *array, gint32 idx, gint8 value)
5342 MONO_ARCH_SAVE_REGS;
5344 mono_array_set (array, gint8, idx, value);
5348 ves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, MonoArray *dest, gint32 dest_offset, gint32 count)
5350 guint8 *src_buf, *dest_buf;
5352 MONO_ARCH_SAVE_REGS;
5354 /* watch out for integer overflow */
5355 if ((src_offset > mono_array_get_byte_length (src) - count) || (dest_offset > mono_array_get_byte_length (dest) - count))
5358 src_buf = (guint8 *)src->vector + src_offset;
5359 dest_buf = (guint8 *)dest->vector + dest_offset;
5362 memcpy (dest_buf, src_buf, count);
5364 memmove (dest_buf, src_buf, count); /* Source and dest are the same array */
5370 ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString *class_name)
5372 MonoDomain *domain = mono_object_domain (this);
5374 MonoRealProxy *rp = ((MonoRealProxy *)this);
5375 MonoTransparentProxy *tp;
5379 MONO_ARCH_SAVE_REGS;
5381 res = mono_object_new (domain, mono_defaults.transparent_proxy_class);
5382 tp = (MonoTransparentProxy*) res;
5385 type = ((MonoReflectionType *)rp->class_to_proxy)->type;
5386 klass = mono_class_from_mono_type (type);
5388 tp->custom_type_info = (mono_object_isinst (this, mono_defaults.iremotingtypeinfo_class) != NULL);
5389 tp->remote_class = mono_remote_class (domain, class_name, klass);
5391 res->vtable = mono_remote_class_vtable (domain, tp->remote_class, rp);
5395 static MonoReflectionType *
5396 ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)
5398 return mono_type_get_object (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg);
5401 /* System.Environment */
5404 ves_icall_System_Environment_get_MachineName (void)
5406 #if defined (PLATFORM_WIN32)
5411 len = MAX_COMPUTERNAME_LENGTH + 1;
5412 buf = g_new (gunichar2, len);
5415 if (GetComputerName (buf, (PDWORD) &len))
5416 result = mono_string_new_utf16 (mono_domain_get (), buf, len);
5424 if (gethostname (buf, sizeof (buf)) == 0)
5425 result = mono_string_new (mono_domain_get (), buf);
5434 ves_icall_System_Environment_get_Platform (void)
5436 MONO_ARCH_SAVE_REGS;
5438 #if defined (PLATFORM_WIN32)
5448 ves_icall_System_Environment_get_NewLine (void)
5450 MONO_ARCH_SAVE_REGS;
5452 #if defined (PLATFORM_WIN32)
5453 return mono_string_new (mono_domain_get (), "\r\n");
5455 return mono_string_new (mono_domain_get (), "\n");
5460 ves_icall_System_Environment_GetEnvironmentVariable (MonoString *name)
5465 MONO_ARCH_SAVE_REGS;
5470 utf8_name = mono_string_to_utf8 (name); /* FIXME: this should be ascii */
5471 value = g_getenv (utf8_name);
5478 return mono_string_new (mono_domain_get (), value);
5482 * There is no standard way to get at environ.
5490 ves_icall_System_Environment_GetEnvironmentVariableNames (void)
5498 MONO_ARCH_SAVE_REGS;
5501 for (e = environ; *e != 0; ++ e)
5504 domain = mono_domain_get ();
5505 names = mono_array_new (domain, mono_defaults.string_class, n);
5508 for (e = environ; *e != 0; ++ e) {
5509 parts = g_strsplit (*e, "=", 2);
5511 str = mono_string_new (domain, *parts);
5512 mono_array_setref (names, n, str);
5524 * Returns: the number of milliseconds elapsed since the system started.
5527 ves_icall_System_Environment_get_TickCount (void)
5529 return GetTickCount ();
5534 ves_icall_System_Environment_Exit (int result)
5536 MONO_ARCH_SAVE_REGS;
5538 mono_runtime_set_shutting_down ();
5540 /* Suspend all managed threads since the runtime is going away */
5541 mono_thread_suspend_all_other_threads ();
5543 mono_runtime_quit ();
5545 /* we may need to do some cleanup here... */
5550 ves_icall_System_Environment_GetGacPath (void)
5552 return mono_string_new (mono_domain_get (), mono_assembly_getrootdir ());
5556 ves_icall_System_Environment_GetWindowsFolderPath (int folder)
5558 #if defined (PLATFORM_WIN32)
5559 #ifndef CSIDL_FLAG_CREATE
5560 #define CSIDL_FLAG_CREATE 0x8000
5563 WCHAR path [MAX_PATH];
5564 /* Create directory if no existing */
5565 if (SUCCEEDED (SHGetFolderPathW (NULL, folder | CSIDL_FLAG_CREATE, NULL, 0, path))) {
5569 return mono_string_new_utf16 (mono_domain_get (), path, len);
5572 g_warning ("ves_icall_System_Environment_GetWindowsFolderPath should only be called on Windows!");
5574 return mono_string_new (mono_domain_get (), "");
5578 ves_icall_System_Environment_GetLogicalDrives (void)
5580 gunichar2 buf [128], *ptr, *dname;
5582 gint initial_size = 127, size = 128;
5585 MonoString *drivestr;
5586 MonoDomain *domain = mono_domain_get ();
5589 MONO_ARCH_SAVE_REGS;
5594 while (size > initial_size) {
5595 size = GetLogicalDriveStrings (initial_size, ptr);
5596 if (size > initial_size) {
5599 ptr = g_malloc0 ((size + 1) * sizeof (gunichar2));
5600 initial_size = size;
5614 result = mono_array_new (domain, mono_defaults.string_class, ndrives);
5619 while (*u16) { u16++; len ++; }
5620 drivestr = mono_string_new_utf16 (domain, dname, len);
5621 mono_array_setref (result, ndrives++, drivestr);
5632 ves_icall_System_Environment_InternalGetHome (void)
5634 MONO_ARCH_SAVE_REGS;
5636 return mono_string_new (mono_domain_get (), g_get_home_dir ());
5639 static const char *encodings [] = {
5641 "ascii", "us_ascii", "us", "ansi_x3.4_1968",
5642 "ansi_x3.4_1986", "cp367", "csascii", "ibm367",
5643 "iso_ir_6", "iso646_us", "iso_646.irv:1991",
5645 "utf_7", "csunicode11utf7", "unicode_1_1_utf_7",
5646 "unicode_2_0_utf_7", "x_unicode_1_1_utf_7",
5647 "x_unicode_2_0_utf_7",
5649 "utf_8", "unicode_1_1_utf_8", "unicode_2_0_utf_8",
5650 "x_unicode_1_1_utf_8", "x_unicode_2_0_utf_8",
5652 "utf_16", "UTF_16LE", "ucs_2", "unicode",
5655 "unicodefffe", "utf_16be",
5662 * Returns the internal codepage, if the value of "int_code_page" is
5663 * 1 at entry, and we can not compute a suitable code page number,
5664 * returns the code page as a string
5667 ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page)
5672 char *codepage = NULL;
5674 int want_name = *int_code_page;
5677 *int_code_page = -1;
5678 MONO_ARCH_SAVE_REGS;
5680 g_get_charset (&cset);
5681 c = codepage = strdup (cset);
5682 for (c = codepage; *c; c++){
5683 if (isascii (*c) && isalpha (*c))
5688 /* g_print ("charset: %s\n", cset); */
5690 /* handle some common aliases */
5693 for (i = 0; p != 0; ){
5694 if ((gssize) p < 7){
5696 p = encodings [++i];
5699 if (strcmp (p, codepage) == 0){
5700 *int_code_page = code;
5703 p = encodings [++i];
5706 if (strstr (codepage, "utf_8") != NULL)
5707 *int_code_page |= 0x10000000;
5710 if (want_name && *int_code_page == -1)
5711 return mono_string_new (mono_domain_get (), cset);
5717 ves_icall_System_Environment_get_HasShutdownStarted (void)
5719 if (mono_runtime_is_shutting_down ())
5722 if (mono_domain_is_unloading (mono_domain_get ()))
5729 ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this,
5730 MonoReflectionMethod *method,
5731 MonoArray *out_args)
5733 MONO_ARCH_SAVE_REGS;
5735 mono_message_init (mono_object_domain (this), this, method, out_args);
5739 ves_icall_IsTransparentProxy (MonoObject *proxy)
5741 MONO_ARCH_SAVE_REGS;
5746 if (proxy->vtable->klass == mono_defaults.transparent_proxy_class)
5753 ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (MonoReflectionType *type, MonoBoolean enable)
5758 MONO_ARCH_SAVE_REGS;
5760 klass = mono_class_from_mono_type (type->type);
5761 vtable = mono_class_vtable (mono_domain_get (), klass);
5763 if (enable) vtable->remote = 1;
5764 else vtable->remote = 0;
5768 ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance (MonoReflectionType *type)
5773 MONO_ARCH_SAVE_REGS;
5775 domain = mono_object_domain (type);
5776 klass = mono_class_from_mono_type (type->type);
5778 if (klass->rank >= 1) {
5779 g_assert (klass->rank == 1);
5780 return (MonoObject *) mono_array_new (domain, klass->element_class, 0);
5782 /* Bypass remoting object creation check */
5783 return mono_object_new_alloc_specific (mono_class_vtable (domain, klass));
5788 ves_icall_System_IO_get_temp_path (void)
5790 MONO_ARCH_SAVE_REGS;
5792 return mono_string_new (mono_domain_get (), g_get_tmp_dir ());
5796 ves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method)
5798 MONO_ARCH_SAVE_REGS;
5800 return mono_compile_method (method);
5804 ves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void)
5809 MONO_ARCH_SAVE_REGS;
5811 path = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), "mono", mono_get_runtime_info ()->framework_version, "machine.config", NULL);
5813 #if defined (PLATFORM_WIN32)
5814 /* Avoid mixing '/' and '\\' */
5817 for (i = strlen (path) - 1; i >= 0; i--)
5818 if (path [i] == '/')
5822 mcpath = mono_string_new (mono_domain_get (), path);
5829 ves_icall_System_Web_Util_ICalls_get_machine_install_dir (void)
5834 MONO_ARCH_SAVE_REGS;
5836 path = g_path_get_dirname (mono_get_config_dir ());
5838 #if defined (PLATFORM_WIN32)
5839 /* Avoid mixing '/' and '\\' */
5842 for (i = strlen (path) - 1; i >= 0; i--)
5843 if (path [i] == '/')
5847 ipath = mono_string_new (mono_domain_get (), path);
5854 ves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString (MonoString *message)
5856 #if defined (PLATFORM_WIN32)
5857 static void (*output_debug) (gunichar2 *);
5858 static gboolean tried_loading = FALSE;
5860 MONO_ARCH_SAVE_REGS;
5862 if (!tried_loading && output_debug == NULL) {
5865 tried_loading = TRUE;
5866 k32 = g_module_open ("kernel32", G_MODULE_BIND_LAZY);
5868 gchar *error = g_strdup (g_module_error ());
5869 g_warning ("Failed to load kernel32.dll: %s\n", error);
5874 g_module_symbol (k32, "OutputDebugStringW", (gpointer *) &output_debug);
5875 if (!output_debug) {
5876 gchar *error = g_strdup (g_module_error ());
5877 g_warning ("Failed to load OutputDebugStringW: %s\n", error);
5883 if (output_debug == NULL)
5886 output_debug (mono_string_chars (message));
5888 g_warning ("WriteWindowsDebugString called and PLATFORM_WIN32 not defined!\n");
5892 /* Only used for value types */
5894 ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type)
5899 MONO_ARCH_SAVE_REGS;
5901 domain = mono_object_domain (type);
5902 klass = mono_class_from_mono_type (type->type);
5904 if (mono_class_is_nullable (klass))
5905 /* No arguments -> null */
5908 return mono_object_new (domain, klass);
5911 static MonoReflectionMethod *
5912 ves_icall_MonoMethod_get_base_definition (MonoReflectionMethod *m)
5915 MonoMethod *method = m->method;
5916 MonoMethod *result = NULL;
5918 MONO_ARCH_SAVE_REGS;
5920 if (!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) ||
5921 MONO_CLASS_IS_INTERFACE (method->klass) ||
5922 method->flags & METHOD_ATTRIBUTE_NEW_SLOT)
5925 if (method->klass == NULL || (klass = method->klass->parent) == NULL)
5928 if (klass->generic_class)
5929 klass = klass->generic_class->container_class;
5931 mono_class_setup_vtable (klass);
5932 mono_class_setup_vtable (method->klass);
5933 while (result == NULL && klass != NULL && (klass->vtable_size > method->slot))
5935 mono_class_setup_vtable (klass);
5937 result = klass->vtable [method->slot];
5938 if (result == NULL) {
5940 gpointer iter = NULL;
5941 /* It is an abstract method */
5942 while ((m = mono_class_get_methods (klass, &iter))) {
5943 if (m->slot == method->slot) {
5949 klass = klass->parent;
5955 return mono_method_get_object (mono_domain_get (), result, NULL);
5959 mono_ArgIterator_Setup (MonoArgIterator *iter, char* argsp, char* start)
5961 MONO_ARCH_SAVE_REGS;
5963 iter->sig = *(MonoMethodSignature**)argsp;
5965 g_assert (iter->sig->sentinelpos <= iter->sig->param_count);
5966 g_assert (iter->sig->call_convention == MONO_CALL_VARARG);
5969 /* FIXME: it's not documented what start is exactly... */
5973 int i, align, arg_size;
5974 iter->args = argsp + sizeof (gpointer);
5975 #ifndef MONO_ARCH_REGPARMS
5976 for (i = 0; i < iter->sig->sentinelpos; ++i) {
5977 arg_size = mono_type_stack_size (iter->sig->params [i], &align);
5978 iter->args = (char*)iter->args + arg_size;
5982 iter->num_args = iter->sig->param_count - iter->sig->sentinelpos;
5984 /* g_print ("sig %p, param_count: %d, sent: %d\n", iter->sig, iter->sig->param_count, iter->sig->sentinelpos); */
5988 mono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)
5990 gint i, align, arg_size;
5992 MONO_ARCH_SAVE_REGS;
5994 i = iter->sig->sentinelpos + iter->next_arg;
5996 g_assert (i < iter->sig->param_count);
5998 res.type = iter->sig->params [i];
5999 res.klass = mono_class_from_mono_type (res.type);
6000 /* FIXME: endianess issue... */
6001 res.value = iter->args;
6002 arg_size = mono_type_stack_size (res.type, &align);
6003 iter->args = (char*)iter->args + arg_size;
6006 /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
6012 mono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type)
6014 gint i, align, arg_size;
6016 MONO_ARCH_SAVE_REGS;
6018 i = iter->sig->sentinelpos + iter->next_arg;
6020 g_assert (i < iter->sig->param_count);
6022 while (i < iter->sig->param_count) {
6023 if (!mono_metadata_type_equal (type, iter->sig->params [i]))
6025 res.type = iter->sig->params [i];
6026 res.klass = mono_class_from_mono_type (res.type);
6027 /* FIXME: endianess issue... */
6028 res.value = iter->args;
6029 arg_size = mono_type_stack_size (res.type, &align);
6030 iter->args = (char*)iter->args + arg_size;
6032 /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
6035 /* g_print ("arg type 0x%02x not found\n", res.type->type); */
6044 mono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter)
6047 MONO_ARCH_SAVE_REGS;
6049 i = iter->sig->sentinelpos + iter->next_arg;
6051 g_assert (i < iter->sig->param_count);
6053 return iter->sig->params [i];
6057 mono_TypedReference_ToObject (MonoTypedRef tref)
6059 MONO_ARCH_SAVE_REGS;
6061 if (MONO_TYPE_IS_REFERENCE (tref.type)) {
6062 MonoObject** objp = tref.value;
6066 return mono_value_box (mono_domain_get (), tref.klass, tref.value);
6070 mono_TypedReference_ToObjectInternal (MonoType *type, gpointer value, MonoClass *klass)
6072 MONO_ARCH_SAVE_REGS;
6074 if (MONO_TYPE_IS_REFERENCE (type)) {
6075 MonoObject** objp = value;
6079 return mono_value_box (mono_domain_get (), klass, value);
6083 prelink_method (MonoMethod *method)
6085 const char *exc_class, *exc_arg;
6086 if (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
6088 mono_lookup_pinvoke_call (method, &exc_class, &exc_arg);
6090 mono_raise_exception(
6091 mono_exception_from_name_msg (mono_defaults.corlib, "System", exc_class, exc_arg ) );
6093 /* create the wrapper, too? */
6097 ves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method)
6099 MONO_ARCH_SAVE_REGS;
6100 prelink_method (method->method);
6104 ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType *type)
6106 MonoClass *klass = mono_class_from_mono_type (type->type);
6108 gpointer iter = NULL;
6109 MONO_ARCH_SAVE_REGS;
6111 while ((m = mono_class_get_methods (klass, &iter)))
6115 /* These parameters are "readonly" in corlib/System/Char.cs */
6117 ves_icall_System_Char_GetDataTablePointers (guint8 const **category_data,
6118 guint8 const **numeric_data,
6119 gdouble const **numeric_data_values,
6120 guint16 const **to_lower_data_low,
6121 guint16 const **to_lower_data_high,
6122 guint16 const **to_upper_data_low,
6123 guint16 const **to_upper_data_high)
6125 *category_data = CategoryData;
6126 *numeric_data = NumericData;
6127 *numeric_data_values = NumericDataValues;
6128 *to_lower_data_low = ToLowerDataLow;
6129 *to_lower_data_high = ToLowerDataHigh;
6130 *to_upper_data_low = ToUpperDataLow;
6131 *to_upper_data_high = ToUpperDataHigh;
6135 ves_icall_MonoDebugger_GetMethodToken (MonoReflectionMethod *method)
6137 return method->method->token;
6141 custom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type)
6143 MonoCustomAttrInfo *cinfo;
6146 cinfo = mono_reflection_get_custom_attrs_info (obj);
6149 found = mono_custom_attrs_has_attr (cinfo, mono_class_from_mono_type (attr_type->type));
6151 mono_custom_attrs_free (cinfo);
6156 custom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type)
6158 return mono_reflection_get_custom_attrs_by_type (obj, attr_type ? mono_class_from_mono_type (attr_type->type) : NULL);
6162 GCHandle_CheckCurrentDomain (guint32 gchandle)
6164 return mono_gchandle_is_in_domain (gchandle, mono_domain_get ());
6168 ves_icall_Mono_Runtime_GetDisplayName (void)
6170 static const char display_name_str [] = "Mono " VERSION;
6171 MonoString *display_name = mono_string_new (mono_domain_get (), display_name_str);
6172 return display_name;
6177 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
6178 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
6179 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63,
6180 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 0, 128, 128,
6181 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
6182 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128,
6183 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
6184 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
6188 base64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespaceOnly)
6193 gunichar2 last, prev_last;
6201 last = prev_last = 0;
6202 for (i = 0; i < ilength; i++) {
6204 if (c >= sizeof (dbase64)) {
6205 exc = mono_exception_from_name_msg (mono_get_corlib (),
6206 "System", "FormatException",
6207 "Invalid character found.");
6208 mono_raise_exception (exc);
6209 } else if (isspace (c)) {
6217 olength = ilength - ignored;
6219 if (allowWhitespaceOnly && olength == 0) {
6220 return mono_array_new (mono_domain_get (), mono_defaults.byte_class, 0);
6223 if ((olength & 3) != 0 || olength <= 0) {
6224 exc = mono_exception_from_name_msg (mono_get_corlib (), "System",
6225 "FormatException", "Invalid length.");
6226 mono_raise_exception (exc);
6229 olength = (olength * 3) / 4;
6233 if (prev_last == '=')
6236 result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength);
6237 res_ptr = mono_array_addr (result, guchar, 0);
6238 for (i = 0; i < ilength; ) {
6241 for (k = 0; k < 4 && i < ilength;) {
6247 if (((b [k] = dbase64 [c]) & 0x80) != 0) {
6248 exc = mono_exception_from_name_msg (mono_get_corlib (),
6249 "System", "FormatException",
6250 "Invalid character found.");
6251 mono_raise_exception (exc);
6256 *res_ptr++ = (b [0] << 2) | (b [1] >> 4);
6258 *res_ptr++ = (b [1] << 4) | (b [2] >> 2);
6260 *res_ptr++ = (b [2] << 6) | b [3];
6262 while (i < ilength && isspace (start [i]))
6270 InternalFromBase64String (MonoString *str, MonoBoolean allowWhitespaceOnly)
6272 MONO_ARCH_SAVE_REGS;
6274 return base64_to_byte_array (mono_string_chars (str),
6275 mono_string_length (str), allowWhitespaceOnly);
6279 InternalFromBase64CharArray (MonoArray *input, gint offset, gint length)
6281 MONO_ARCH_SAVE_REGS;
6283 return base64_to_byte_array (mono_array_addr (input, gunichar2, offset),
6295 const IcallEntry *icalls;
6299 static const IcallEntry runtime_icalls [] = {
6300 {"GetDisplayName", ves_icall_Mono_Runtime_GetDisplayName}
6303 static const IcallEntry activator_icalls [] = {
6304 {"CreateInstanceInternal", ves_icall_System_Activator_CreateInstanceInternal}
6306 static const IcallEntry appdomain_icalls [] = {
6307 {"ExecuteAssembly", ves_icall_System_AppDomain_ExecuteAssembly},
6308 {"GetAssemblies", ves_icall_System_AppDomain_GetAssemblies},
6309 {"GetData", ves_icall_System_AppDomain_GetData},
6310 {"InternalGetContext", ves_icall_System_AppDomain_InternalGetContext},
6311 {"InternalGetDefaultContext", ves_icall_System_AppDomain_InternalGetDefaultContext},
6312 {"InternalGetProcessGuid", ves_icall_System_AppDomain_InternalGetProcessGuid},
6313 {"InternalIsFinalizingForUnload", ves_icall_System_AppDomain_InternalIsFinalizingForUnload},
6314 {"InternalPopDomainRef", ves_icall_System_AppDomain_InternalPopDomainRef},
6315 {"InternalPushDomainRef", ves_icall_System_AppDomain_InternalPushDomainRef},
6316 {"InternalPushDomainRefByID", ves_icall_System_AppDomain_InternalPushDomainRefByID},
6317 {"InternalSetContext", ves_icall_System_AppDomain_InternalSetContext},
6318 {"InternalSetDomain", ves_icall_System_AppDomain_InternalSetDomain},
6319 {"InternalSetDomainByID", ves_icall_System_AppDomain_InternalSetDomainByID},
6320 {"InternalUnload", ves_icall_System_AppDomain_InternalUnload},
6321 {"LoadAssembly", ves_icall_System_AppDomain_LoadAssembly},
6322 {"LoadAssemblyRaw", ves_icall_System_AppDomain_LoadAssemblyRaw},
6323 {"SetData", ves_icall_System_AppDomain_SetData},
6324 {"createDomain", ves_icall_System_AppDomain_createDomain},
6325 {"getCurDomain", ves_icall_System_AppDomain_getCurDomain},
6326 {"getFriendlyName", ves_icall_System_AppDomain_getFriendlyName},
6327 {"getRootDomain", ves_icall_System_AppDomain_getRootDomain},
6328 {"getSetup", ves_icall_System_AppDomain_getSetup}
6331 static const IcallEntry argiterator_icalls [] = {
6332 {"IntGetNextArg()", mono_ArgIterator_IntGetNextArg},
6333 {"IntGetNextArg(intptr)", mono_ArgIterator_IntGetNextArgT},
6334 {"IntGetNextArgType", mono_ArgIterator_IntGetNextArgType},
6335 {"Setup", mono_ArgIterator_Setup}
6338 static const IcallEntry array_icalls [] = {
6339 {"ClearInternal", ves_icall_System_Array_ClearInternal},
6340 {"Clone", mono_array_clone},
6341 {"CreateInstanceImpl", ves_icall_System_Array_CreateInstanceImpl},
6342 {"FastCopy", ves_icall_System_Array_FastCopy},
6343 {"GetLength", ves_icall_System_Array_GetLength},
6344 {"GetLowerBound", ves_icall_System_Array_GetLowerBound},
6345 {"GetRank", ves_icall_System_Array_GetRank},
6346 {"GetValue", ves_icall_System_Array_GetValue},
6347 {"GetValueImpl", ves_icall_System_Array_GetValueImpl},
6348 {"SetValue", ves_icall_System_Array_SetValue},
6349 {"SetValueImpl", ves_icall_System_Array_SetValueImpl}
6352 static const IcallEntry buffer_icalls [] = {
6353 {"BlockCopyInternal", ves_icall_System_Buffer_BlockCopyInternal},
6354 {"ByteLengthInternal", ves_icall_System_Buffer_ByteLengthInternal},
6355 {"GetByteInternal", ves_icall_System_Buffer_GetByteInternal},
6356 {"SetByteInternal", ves_icall_System_Buffer_SetByteInternal}
6359 static const IcallEntry char_icalls [] = {
6360 {"GetDataTablePointers", ves_icall_System_Char_GetDataTablePointers}
6363 static const IcallEntry defaultconf_icalls [] = {
6364 {"get_machine_config_path", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path}
6367 static const IcallEntry consoledriver_icalls [] = {
6368 {"GetTtySize", ves_icall_System_ConsoleDriver_GetTtySize },
6369 {"InternalKeyAvailable", ves_icall_System_ConsoleDriver_InternalKeyAvailable },
6370 {"Isatty", ves_icall_System_ConsoleDriver_Isatty },
6371 {"SetBreak", ves_icall_System_ConsoleDriver_SetBreak },
6372 {"SetEcho", ves_icall_System_ConsoleDriver_SetEcho },
6373 {"TtySetup", ves_icall_System_ConsoleDriver_TtySetup }
6376 static const IcallEntry convert_icalls [] = {
6377 {"InternalFromBase64CharArray", InternalFromBase64CharArray },
6378 {"InternalFromBase64String", InternalFromBase64String }
6381 static const IcallEntry timezone_icalls [] = {
6382 {"GetTimeZoneData", ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData}
6385 static const IcallEntry datetime_icalls [] = {
6386 {"GetNow", ves_icall_System_DateTime_GetNow}
6389 #ifndef DISABLE_DECIMAL
6390 static const IcallEntry decimal_icalls [] = {
6391 {"decimal2Int64", mono_decimal2Int64},
6392 {"decimal2UInt64", mono_decimal2UInt64},
6393 {"decimal2double", mono_decimal2double},
6394 {"decimal2string", mono_decimal2string},
6395 {"decimalCompare", mono_decimalCompare},
6396 {"decimalDiv", mono_decimalDiv},
6397 {"decimalFloorAndTrunc", mono_decimalFloorAndTrunc},
6398 {"decimalIncr", mono_decimalIncr},
6399 {"decimalIntDiv", mono_decimalIntDiv},
6400 {"decimalMult", mono_decimalMult},
6401 {"decimalRound", mono_decimalRound},
6402 {"decimalSetExponent", mono_decimalSetExponent},
6403 {"double2decimal", mono_double2decimal}, /* FIXME: wrong signature. */
6404 {"string2decimal", mono_string2decimal}
6408 static const IcallEntry delegate_icalls [] = {
6409 {"CreateDelegate_internal", ves_icall_System_Delegate_CreateDelegate_internal},
6410 {"FreeTrampoline", ves_icall_System_Delegate_FreeTrampoline}
6413 static const IcallEntry tracelist_icalls [] = {
6414 {"WriteWindowsDebugString", ves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString}
6417 static const IcallEntry fileversion_icalls [] = {
6418 {"GetVersionInfo_internal(string)", ves_icall_System_Diagnostics_FileVersionInfo_GetVersionInfo_internal}
6421 static const IcallEntry process_icalls [] = {
6422 {"CreateProcess_internal(System.Diagnostics.ProcessStartInfo,intptr,intptr,intptr,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_CreateProcess_internal},
6423 {"ExitCode_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitCode_internal},
6424 {"ExitTime_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitTime_internal},
6425 {"GetModules_internal()", ves_icall_System_Diagnostics_Process_GetModules_internal},
6426 {"GetPid_internal()", ves_icall_System_Diagnostics_Process_GetPid_internal},
6427 {"GetProcess_internal(int)", ves_icall_System_Diagnostics_Process_GetProcess_internal},
6428 {"GetProcesses_internal()", ves_icall_System_Diagnostics_Process_GetProcesses_internal},
6429 {"GetWorkingSet_internal(intptr,int&,int&)", ves_icall_System_Diagnostics_Process_GetWorkingSet_internal},
6430 {"Kill_internal", ves_icall_System_Diagnostics_Process_Kill_internal},
6431 {"ProcessName_internal(intptr)", ves_icall_System_Diagnostics_Process_ProcessName_internal},
6432 {"Process_free_internal(intptr)", ves_icall_System_Diagnostics_Process_Process_free_internal},
6433 {"SetWorkingSet_internal(intptr,int,int,bool)", ves_icall_System_Diagnostics_Process_SetWorkingSet_internal},
6434 {"ShellExecuteEx_internal(System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_ShellExecuteEx_internal},
6435 {"StartTime_internal(intptr)", ves_icall_System_Diagnostics_Process_StartTime_internal},
6436 {"WaitForExit_internal(intptr,int)", ves_icall_System_Diagnostics_Process_WaitForExit_internal}
6439 static const IcallEntry double_icalls [] = {
6440 {"AssertEndianity", ves_icall_System_Double_AssertEndianity},
6441 {"ParseImpl", mono_double_ParseImpl}
6444 static const IcallEntry enum_icalls [] = {
6445 {"ToObject", ves_icall_System_Enum_ToObject},
6446 {"get_value", ves_icall_System_Enum_get_value}
6449 static const IcallEntry environment_icalls [] = {
6450 {"Exit", ves_icall_System_Environment_Exit},
6451 {"GetCommandLineArgs", mono_runtime_get_main_args},
6452 {"GetEnvironmentVariableNames", ves_icall_System_Environment_GetEnvironmentVariableNames},
6453 {"GetLogicalDrivesInternal", ves_icall_System_Environment_GetLogicalDrives },
6454 {"GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path},
6455 {"GetOSVersionString", ves_icall_System_Environment_GetOSVersionString},
6456 {"GetWindowsFolderPath", ves_icall_System_Environment_GetWindowsFolderPath},
6457 {"get_ExitCode", mono_environment_exitcode_get},
6458 {"get_HasShutdownStarted", ves_icall_System_Environment_get_HasShutdownStarted},
6459 {"get_MachineName", ves_icall_System_Environment_get_MachineName},
6460 {"get_NewLine", ves_icall_System_Environment_get_NewLine},
6461 {"get_Platform", ves_icall_System_Environment_get_Platform},
6462 {"get_TickCount", ves_icall_System_Environment_get_TickCount},
6463 {"get_UserName", ves_icall_System_Environment_get_UserName},
6464 {"internalGetEnvironmentVariable", ves_icall_System_Environment_GetEnvironmentVariable},
6465 {"internalGetGacPath", ves_icall_System_Environment_GetGacPath},
6466 {"internalGetHome", ves_icall_System_Environment_InternalGetHome},
6467 {"set_ExitCode", mono_environment_exitcode_set}
6470 static const IcallEntry cultureinfo_icalls [] = {
6471 {"construct_compareinfo(object,string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo},
6472 {"construct_datetime_format", ves_icall_System_Globalization_CultureInfo_construct_datetime_format},
6473 {"construct_internal_locale(string)", ves_icall_System_Globalization_CultureInfo_construct_internal_locale},
6474 {"construct_internal_locale_from_current_locale", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_current_locale},
6475 {"construct_internal_locale_from_lcid", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid},
6476 {"construct_internal_locale_from_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name},
6477 {"construct_internal_locale_from_specific_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specific_name},
6478 {"construct_number_format", ves_icall_System_Globalization_CultureInfo_construct_number_format},
6479 {"internal_get_cultures", ves_icall_System_Globalization_CultureInfo_internal_get_cultures},
6480 {"internal_is_lcid_neutral", ves_icall_System_Globalization_CultureInfo_internal_is_lcid_neutral}
6483 static const IcallEntry regioninfo_icalls [] = {
6484 {"construct_internal_region_from_lcid", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_lcid},
6485 {"construct_internal_region_from_name", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name}
6488 static const IcallEntry compareinfo_icalls [] = {
6489 {"assign_sortkey(object,string,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_assign_sortkey},
6490 {"construct_compareinfo(string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo},
6491 {"free_internal_collator()", ves_icall_System_Globalization_CompareInfo_free_internal_collator},
6492 {"internal_compare(string,int,int,string,int,int,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_internal_compare},
6493 {"internal_index(string,int,int,char,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index_char},
6494 {"internal_index(string,int,int,string,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index}
6497 static const IcallEntry gc_icalls [] = {
6498 {"GetTotalMemory", ves_icall_System_GC_GetTotalMemory},
6499 {"InternalCollect", ves_icall_System_GC_InternalCollect},
6500 {"KeepAlive", ves_icall_System_GC_KeepAlive},
6501 {"ReRegisterForFinalize", ves_icall_System_GC_ReRegisterForFinalize},
6502 {"SuppressFinalize", ves_icall_System_GC_SuppressFinalize},
6503 {"WaitForPendingFinalizers", ves_icall_System_GC_WaitForPendingFinalizers}
6506 static const IcallEntry famwatcher_icalls [] = {
6507 {"InternalFAMNextEvent", ves_icall_System_IO_FAMW_InternalFAMNextEvent}
6510 static const IcallEntry filewatcher_icalls [] = {
6511 {"InternalCloseDirectory", ves_icall_System_IO_FSW_CloseDirectory},
6512 {"InternalOpenDirectory", ves_icall_System_IO_FSW_OpenDirectory},
6513 {"InternalReadDirectoryChanges", ves_icall_System_IO_FSW_ReadDirectoryChanges},
6514 {"InternalSupportsFSW", ves_icall_System_IO_FSW_SupportsFSW}
6517 static const IcallEntry path_icalls [] = {
6518 {"get_temp_path", ves_icall_System_IO_get_temp_path}
6521 static const IcallEntry monoio_icalls [] = {
6522 {"Close(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Close},
6523 {"CopyFile(string,string,bool,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_CopyFile},
6524 {"CreateDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_CreateDirectory},
6525 {"CreatePipe(intptr&,intptr&)", ves_icall_System_IO_MonoIO_CreatePipe},
6526 {"DeleteFile(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_DeleteFile},
6527 {"Flush(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Flush},
6528 {"GetCurrentDirectory(System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetCurrentDirectory},
6529 {"GetFileAttributes(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileAttributes},
6530 {"GetFileStat(string,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileStat},
6531 {"GetFileSystemEntries", ves_icall_System_IO_MonoIO_GetFileSystemEntries},
6532 {"GetFileType(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileType},
6533 {"GetLength(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetLength},
6534 {"GetTempPath(string&)", ves_icall_System_IO_MonoIO_GetTempPath},
6535 {"Lock(intptr,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Lock},
6536 {"MoveFile(string,string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_MoveFile},
6537 {"Open(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,bool,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Open},
6538 {"Read(intptr,byte[],int,int,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Read},
6539 {"RemoveDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_RemoveDirectory},
6540 {"Seek(intptr,long,System.IO.SeekOrigin,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Seek},
6541 {"SetCurrentDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetCurrentDirectory},
6542 {"SetFileAttributes(string,System.IO.FileAttributes,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetFileAttributes},
6543 {"SetFileTime(intptr,long,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetFileTime},
6544 {"SetLength(intptr,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetLength},
6545 {"Unlock(intptr,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Unlock},
6546 {"Write(intptr,byte[],int,int,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Write},
6547 {"get_AltDirectorySeparatorChar", ves_icall_System_IO_MonoIO_get_AltDirectorySeparatorChar},
6548 {"get_ConsoleError", ves_icall_System_IO_MonoIO_get_ConsoleError},
6549 {"get_ConsoleInput", ves_icall_System_IO_MonoIO_get_ConsoleInput},
6550 {"get_ConsoleOutput", ves_icall_System_IO_MonoIO_get_ConsoleOutput},
6551 {"get_DirectorySeparatorChar", ves_icall_System_IO_MonoIO_get_DirectorySeparatorChar},
6552 {"get_InvalidPathChars", ves_icall_System_IO_MonoIO_get_InvalidPathChars},
6553 {"get_PathSeparator", ves_icall_System_IO_MonoIO_get_PathSeparator},
6554 {"get_VolumeSeparatorChar", ves_icall_System_IO_MonoIO_get_VolumeSeparatorChar}
6557 static const IcallEntry math_icalls [] = {
6558 {"Acos", ves_icall_System_Math_Acos},
6559 {"Asin", ves_icall_System_Math_Asin},
6560 {"Atan", ves_icall_System_Math_Atan},
6561 {"Atan2", ves_icall_System_Math_Atan2},
6562 {"Cos", ves_icall_System_Math_Cos},
6563 {"Cosh", ves_icall_System_Math_Cosh},
6564 {"Exp", ves_icall_System_Math_Exp},
6565 {"Floor", ves_icall_System_Math_Floor},
6566 {"Log", ves_icall_System_Math_Log},
6567 {"Log10", ves_icall_System_Math_Log10},
6568 {"Pow", ves_icall_System_Math_Pow},
6569 {"Round", ves_icall_System_Math_Round},
6570 {"Round2", ves_icall_System_Math_Round2},
6571 {"Sin", ves_icall_System_Math_Sin},
6572 {"Sinh", ves_icall_System_Math_Sinh},
6573 {"Sqrt", ves_icall_System_Math_Sqrt},
6574 {"Tan", ves_icall_System_Math_Tan},
6575 {"Tanh", ves_icall_System_Math_Tanh}
6578 static const IcallEntry customattrs_icalls [] = {
6579 {"GetCustomAttributesDataInternal", mono_reflection_get_custom_attrs_data},
6580 {"GetCustomAttributesInternal", custom_attrs_get_by_type},
6581 {"IsDefinedInternal", custom_attrs_defined_internal}
6584 static const IcallEntry enuminfo_icalls [] = {
6585 {"get_enum_info", ves_icall_get_enum_info}
6588 static const IcallEntry fieldinfo_icalls [] = {
6589 {"GetUnmanagedMarshal", ves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal},
6590 {"internal_from_handle", ves_icall_System_Reflection_FieldInfo_internal_from_handle}
6593 static const IcallEntry memberinfo_icalls [] = {
6594 {"get_MetadataToken", mono_reflection_get_token}
6597 static const IcallEntry monotype_icalls [] = {
6598 {"GetArrayRank", ves_icall_MonoType_GetArrayRank},
6599 {"GetConstructors", ves_icall_Type_GetConstructors_internal},
6600 {"GetConstructors_internal", ves_icall_Type_GetConstructors_internal},
6601 {"GetCorrespondingInflatedConstructor", ves_icall_MonoType_GetCorrespondingInflatedMethod},
6602 {"GetCorrespondingInflatedMethod", ves_icall_MonoType_GetCorrespondingInflatedMethod},
6603 {"GetElementType", ves_icall_MonoType_GetElementType},
6604 {"GetEvents_internal", ves_icall_Type_GetEvents_internal},
6605 {"GetField", ves_icall_Type_GetField},
6606 {"GetFields_internal", ves_icall_Type_GetFields_internal},
6607 {"GetGenericArguments", ves_icall_MonoType_GetGenericArguments},
6608 {"GetInterfaces", ves_icall_Type_GetInterfaces},
6609 {"GetMethodsByName", ves_icall_Type_GetMethodsByName},
6610 {"GetNestedType", ves_icall_Type_GetNestedType},
6611 {"GetNestedTypes", ves_icall_Type_GetNestedTypes},
6612 {"GetPropertiesByName", ves_icall_Type_GetPropertiesByName},
6613 {"InternalGetEvent", ves_icall_MonoType_GetEvent},
6614 {"IsByRefImpl", ves_icall_type_isbyref},
6615 {"IsPointerImpl", ves_icall_type_ispointer},
6616 {"IsPrimitiveImpl", ves_icall_type_isprimitive},
6617 {"getFullName", ves_icall_System_MonoType_getFullName},
6618 {"get_Assembly", ves_icall_MonoType_get_Assembly},
6619 {"get_BaseType", ves_icall_get_type_parent},
6620 {"get_DeclaringMethod", ves_icall_MonoType_get_DeclaringMethod},
6621 {"get_DeclaringType", ves_icall_MonoType_get_DeclaringType},
6622 {"get_IsGenericParameter", ves_icall_MonoType_get_IsGenericParameter},
6623 {"get_Module", ves_icall_MonoType_get_Module},
6624 {"get_Name", ves_icall_MonoType_get_Name},
6625 {"get_Namespace", ves_icall_MonoType_get_Namespace},
6626 {"get_UnderlyingSystemType", ves_icall_MonoType_get_UnderlyingSystemType},
6627 {"get_attributes", ves_icall_get_attributes},
6628 {"type_from_obj", mono_type_type_from_obj}
6631 static const IcallEntry assembly_icalls [] = {
6632 {"FillName", ves_icall_System_Reflection_Assembly_FillName},
6633 {"GetCallingAssembly", ves_icall_System_Reflection_Assembly_GetCallingAssembly},
6634 {"GetEntryAssembly", ves_icall_System_Reflection_Assembly_GetEntryAssembly},
6635 {"GetExecutingAssembly", ves_icall_System_Reflection_Assembly_GetExecutingAssembly},
6636 {"GetFilesInternal", ves_icall_System_Reflection_Assembly_GetFilesInternal},
6637 {"GetManifestResourceInfoInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal},
6638 {"GetManifestResourceInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInternal},
6639 {"GetManifestResourceNames", ves_icall_System_Reflection_Assembly_GetManifestResourceNames},
6640 {"GetModulesInternal", ves_icall_System_Reflection_Assembly_GetModulesInternal},
6641 {"GetNamespaces", ves_icall_System_Reflection_Assembly_GetNamespaces},
6642 {"GetReferencedAssemblies", ves_icall_System_Reflection_Assembly_GetReferencedAssemblies},
6643 {"GetTypes", ves_icall_System_Reflection_Assembly_GetTypes},
6644 {"InternalGetAssemblyName", ves_icall_System_Reflection_Assembly_InternalGetAssemblyName},
6645 {"InternalGetType", ves_icall_System_Reflection_Assembly_InternalGetType},
6646 {"InternalImageRuntimeVersion", ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion},
6647 {"LoadFrom", ves_icall_System_Reflection_Assembly_LoadFrom},
6648 {"LoadPermissions", ves_icall_System_Reflection_Assembly_LoadPermissions},
6650 * Private icalls for the Mono Debugger
6652 {"MonoDebugger_GetMethodToken", ves_icall_MonoDebugger_GetMethodToken},
6654 /* normal icalls again */
6655 {"get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint},
6656 {"get_ManifestModule", ves_icall_System_Reflection_Assembly_get_ManifestModule},
6657 {"get_ReflectionOnly", ves_icall_System_Reflection_Assembly_get_ReflectionOnly},
6658 {"get_code_base", ves_icall_System_Reflection_Assembly_get_code_base},
6659 {"get_global_assembly_cache", ves_icall_System_Reflection_Assembly_get_global_assembly_cache},
6660 {"get_location", ves_icall_System_Reflection_Assembly_get_location},
6661 {"load_with_partial_name", ves_icall_System_Reflection_Assembly_load_with_partial_name}
6664 static const IcallEntry assembly_name_icalls [] = {
6665 {"ParseName", ves_icall_System_Reflection_AssemblyName_ParseName}
6668 static const IcallEntry methodbase_icalls [] = {
6669 {"GetCurrentMethod", ves_icall_GetCurrentMethod},
6670 {"GetMethodBodyInternal", ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal},
6671 {"GetMethodFromHandleInternal", ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal}
6674 static const IcallEntry module_icalls [] = {
6675 {"Close", ves_icall_System_Reflection_Module_Close},
6676 {"GetGlobalType", ves_icall_System_Reflection_Module_GetGlobalType},
6677 {"GetGuidInternal", ves_icall_System_Reflection_Module_GetGuidInternal},
6678 {"GetPEKind", ves_icall_System_Reflection_Module_GetPEKind},
6679 {"InternalGetTypes", ves_icall_System_Reflection_Module_InternalGetTypes},
6680 {"ResolveFieldToken", ves_icall_System_Reflection_Module_ResolveFieldToken},
6681 {"ResolveMemberToken", ves_icall_System_Reflection_Module_ResolveMemberToken},
6682 {"ResolveMethodToken", ves_icall_System_Reflection_Module_ResolveMethodToken},
6683 {"ResolveStringToken", ves_icall_System_Reflection_Module_ResolveStringToken},
6684 {"ResolveTypeToken", ves_icall_System_Reflection_Module_ResolveTypeToken},
6685 {"get_MDStreamVersion", ves_icall_System_Reflection_Module_get_MDStreamVersion},
6686 {"get_MetadataToken", mono_reflection_get_token}
6689 static const IcallEntry monocmethod_icalls [] = {
6690 {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
6691 {"InternalInvoke", ves_icall_InternalInvoke},
6694 static const IcallEntry monoeventinfo_icalls [] = {
6695 {"get_event_info", ves_icall_get_event_info}
6698 static const IcallEntry monofield_icalls [] = {
6699 {"GetFieldOffset", ves_icall_MonoField_GetFieldOffset},
6700 {"GetParentType", ves_icall_MonoField_GetParentType},
6701 {"GetValueInternal", ves_icall_MonoField_GetValueInternal},
6702 {"SetValueInternal", ves_icall_FieldInfo_SetValueInternal}
6705 static const IcallEntry monogenericclass_icalls [] = {
6706 {"GetConstructors_internal", ves_icall_MonoGenericClass_GetConstructors},
6707 {"GetCorrespondingInflatedConstructor", ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor},
6708 {"GetCorrespondingInflatedField", ves_icall_MonoGenericClass_GetCorrespondingInflatedField},
6709 {"GetCorrespondingInflatedMethod", ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod},
6710 {"GetEvents_internal", ves_icall_MonoGenericClass_GetEvents},
6711 {"GetFields_internal", ves_icall_MonoGenericClass_GetFields},
6712 {"GetInterfaces_internal", ves_icall_MonoGenericClass_GetInterfaces},
6713 {"GetMethods_internal", ves_icall_MonoGenericClass_GetMethods},
6714 {"GetParentType", ves_icall_MonoGenericClass_GetParentType},
6715 {"GetProperties_internal", ves_icall_MonoGenericClass_GetProperties},
6716 {"initialize", mono_reflection_generic_class_initialize}
6719 static const IcallEntry monogenericmethod_icalls [] = {
6720 {"get_ReflectedType", ves_icall_MonoGenericMethod_get_ReflectedType}
6723 static const IcallEntry generictypeparambuilder_icalls [] = {
6724 {"initialize", mono_reflection_initialize_generic_parameter}
6727 static const IcallEntry monomethod_icalls [] = {
6728 {"GetDllImportAttribute", ves_icall_MonoMethod_GetDllImportAttribute},
6729 {"GetGenericArguments", ves_icall_MonoMethod_GetGenericArguments},
6730 {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
6731 {"InternalInvoke", ves_icall_InternalInvoke},
6732 {"MakeGenericMethod_impl", mono_reflection_bind_generic_method_parameters},
6733 {"get_IsGenericMethod", ves_icall_MonoMethod_get_IsGenericMethod},
6734 {"get_IsGenericMethodDefinition", ves_icall_MonoMethod_get_IsGenericMethodDefinition},
6735 {"get_base_definition", ves_icall_MonoMethod_get_base_definition}
6738 static const IcallEntry monomethodinfo_icalls [] = {
6739 {"get_method_info", ves_icall_get_method_info},
6740 {"get_parameter_info", ves_icall_get_parameter_info},
6741 {"get_retval_marshal", ves_icall_System_MonoMethodInfo_get_retval_marshal}
6744 static const IcallEntry monopropertyinfo_icalls [] = {
6745 {"get_property_info", ves_icall_get_property_info}
6748 static const IcallEntry parameterinfo_icalls [] = {
6749 {"get_MetadataToken", mono_reflection_get_token}
6752 static const IcallEntry dns_icalls [] = {
6753 {"GetHostByAddr_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByAddr_internal},
6754 {"GetHostByName_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByName_internal},
6755 {"GetHostName_internal(string&)", ves_icall_System_Net_Dns_GetHostName_internal}
6758 static const IcallEntry socket_icalls [] = {
6759 {"Accept_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Accept_internal},
6760 {"Available_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Available_internal},
6761 {"Bind_internal(intptr,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_Bind_internal},
6762 {"Blocking_internal(intptr,bool,int&)", ves_icall_System_Net_Sockets_Socket_Blocking_internal},
6763 {"Close_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Close_internal},
6764 {"Connect_internal(intptr,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_Connect_internal},
6765 {"GetSocketOption_arr_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,byte[]&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal},
6766 {"GetSocketOption_obj_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal},
6767 {"Listen_internal(intptr,int,int&)", ves_icall_System_Net_Sockets_Socket_Listen_internal},
6768 {"LocalEndPoint_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal},
6769 {"Poll_internal", ves_icall_System_Net_Sockets_Socket_Poll_internal},
6770 {"Receive_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Receive_internal},
6771 {"RecvFrom_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&,int&)", ves_icall_System_Net_Sockets_Socket_RecvFrom_internal},
6772 {"RemoteEndPoint_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal},
6773 {"Select_internal(System.Net.Sockets.Socket[]&,int,int&)", ves_icall_System_Net_Sockets_Socket_Select_internal},
6774 {"SendTo_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_SendTo_internal},
6775 {"Send_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Send_internal},
6776 {"SetSocketOption_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object,byte[],int,int&)", ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal},
6777 {"Shutdown_internal(intptr,System.Net.Sockets.SocketShutdown,int&)", ves_icall_System_Net_Sockets_Socket_Shutdown_internal},
6778 {"Socket_internal(System.Net.Sockets.AddressFamily,System.Net.Sockets.SocketType,System.Net.Sockets.ProtocolType,int&)", ves_icall_System_Net_Sockets_Socket_Socket_internal},
6779 {"WSAIoctl(intptr,int,byte[],byte[],int&)", ves_icall_System_Net_Sockets_Socket_WSAIoctl}
6782 static const IcallEntry socketex_icalls [] = {
6783 {"WSAGetLastError_internal", ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal}
6786 static const IcallEntry object_icalls [] = {
6787 {"GetType", ves_icall_System_Object_GetType},
6788 {"InternalGetHashCode", ves_icall_System_Object_GetHashCode},
6789 {"MemberwiseClone", ves_icall_System_Object_MemberwiseClone},
6790 {"obj_address", ves_icall_System_Object_obj_address}
6793 static const IcallEntry assemblybuilder_icalls[] = {
6794 {"InternalAddModule", mono_image_load_module},
6795 {"basic_init", mono_image_basic_init}
6798 static const IcallEntry customattrbuilder_icalls [] = {
6799 {"GetBlob", mono_reflection_get_custom_attrs_blob}
6802 static const IcallEntry dynamicmethod_icalls [] = {
6803 {"create_dynamic_method", mono_reflection_create_dynamic_method}
6806 static const IcallEntry methodbuilder_icalls [] = {
6807 {"MakeGenericMethod", mono_reflection_bind_generic_method_parameters}
6810 static const IcallEntry modulebuilder_icalls [] = {
6811 {"WriteToFile", ves_icall_ModuleBuilder_WriteToFile},
6812 {"basic_init", mono_image_module_basic_init},
6813 {"build_metadata", ves_icall_ModuleBuilder_build_metadata},
6814 {"create_modified_type", ves_icall_ModuleBuilder_create_modified_type},
6815 {"getMethodToken", ves_icall_ModuleBuilder_getMethodToken},
6816 {"getToken", ves_icall_ModuleBuilder_getToken},
6817 {"getUSIndex", mono_image_insert_string}
6820 static const IcallEntry signaturehelper_icalls [] = {
6821 {"get_signature_field", mono_reflection_sighelper_get_signature_field},
6822 {"get_signature_local", mono_reflection_sighelper_get_signature_local}
6825 static const IcallEntry typebuilder_icalls [] = {
6826 {"create_generic_class", mono_reflection_create_generic_class},
6827 {"create_internal_class", mono_reflection_create_internal_class},
6828 {"create_runtime_class", mono_reflection_create_runtime_class},
6829 {"get_IsGenericParameter", ves_icall_TypeBuilder_get_IsGenericParameter},
6830 {"get_event_info", mono_reflection_event_builder_get_event_info},
6831 {"setup_generic_class", mono_reflection_setup_generic_class},
6832 {"setup_internal_class", mono_reflection_setup_internal_class}
6835 static const IcallEntry enumbuilder_icalls [] = {
6836 {"setup_enum_type", ves_icall_EnumBuilder_setup_enum_type}
6839 static const IcallEntry runtimehelpers_icalls [] = {
6840 {"GetObjectValue", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue},
6841 /* REMOVEME: no longer needed, just so we dont break things when not needed */
6842 {"GetOffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData},
6843 {"InitializeArray", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray},
6844 {"RunClassConstructor", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor},
6845 {"get_OffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData}
6848 static const IcallEntry gchandle_icalls [] = {
6849 {"CheckCurrentDomain", GCHandle_CheckCurrentDomain},
6850 {"FreeHandle", ves_icall_System_GCHandle_FreeHandle},
6851 {"GetAddrOfPinnedObject", ves_icall_System_GCHandle_GetAddrOfPinnedObject},
6852 {"GetTarget", ves_icall_System_GCHandle_GetTarget},
6853 {"GetTargetHandle", ves_icall_System_GCHandle_GetTargetHandle}
6856 static const IcallEntry marshal_icalls [] = {
6857 {"AllocCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_AllocCoTaskMem},
6858 {"AllocHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_AllocHGlobal},
6859 {"DestroyStructure", ves_icall_System_Runtime_InteropServices_Marshal_DestroyStructure},
6860 {"FreeCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_FreeCoTaskMem},
6861 {"FreeHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_FreeHGlobal},
6862 {"GetDelegateForFunctionPointerInternal", ves_icall_System_Runtime_InteropServices_Marshal_GetDelegateForFunctionPointerInternal},
6863 {"GetFunctionPointerForDelegateInternal", mono_delegate_to_ftnptr},
6864 {"GetLastWin32Error", ves_icall_System_Runtime_InteropServices_Marshal_GetLastWin32Error},
6865 {"OffsetOf", ves_icall_System_Runtime_InteropServices_Marshal_OffsetOf},
6866 {"Prelink", ves_icall_System_Runtime_InteropServices_Marshal_Prelink},
6867 {"PrelinkAll", ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll},
6868 {"PtrToStringAnsi(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi},
6869 {"PtrToStringAnsi(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len},
6870 {"PtrToStringAuto(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi},
6871 {"PtrToStringAuto(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len},
6872 {"PtrToStringBSTR", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringBSTR},
6873 {"PtrToStringUni(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni},
6874 {"PtrToStringUni(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni_len},
6875 {"PtrToStructure(intptr,System.Type)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure_type},
6876 {"PtrToStructure(intptr,object)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure},
6877 {"ReAllocHGlobal", mono_marshal_realloc},
6878 {"ReadByte", ves_icall_System_Runtime_InteropServices_Marshal_ReadByte},
6879 {"ReadInt16", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt16},
6880 {"ReadInt32", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt32},
6881 {"ReadInt64", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt64},
6882 {"ReadIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_ReadIntPtr},
6883 {"SizeOf", ves_icall_System_Runtime_InteropServices_Marshal_SizeOf},
6884 {"StringToHGlobalAnsi", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi},
6885 {"StringToHGlobalAuto", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi},
6886 {"StringToHGlobalUni", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalUni},
6887 {"StructureToPtr", ves_icall_System_Runtime_InteropServices_Marshal_StructureToPtr},
6888 {"UnsafeAddrOfPinnedArrayElement", ves_icall_System_Runtime_InteropServices_Marshal_UnsafeAddrOfPinnedArrayElement},
6889 {"WriteByte", ves_icall_System_Runtime_InteropServices_Marshal_WriteByte},
6890 {"WriteInt16", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt16},
6891 {"WriteInt32", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt32},
6892 {"WriteInt64", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt64},
6893 {"WriteIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_WriteIntPtr},
6894 {"copy_from_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged},
6895 {"copy_to_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_to_unmanaged}
6898 static const IcallEntry activationservices_icalls [] = {
6899 {"AllocateUninitializedClassInstance", ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance},
6900 {"EnableProxyActivation", ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation}
6903 static const IcallEntry monomethodmessage_icalls [] = {
6904 {"InitMessage", ves_icall_MonoMethodMessage_InitMessage}
6907 static const IcallEntry realproxy_icalls [] = {
6908 {"InternalGetProxyType", ves_icall_Remoting_RealProxy_InternalGetProxyType},
6909 {"InternalGetTransparentProxy", ves_icall_Remoting_RealProxy_GetTransparentProxy}
6912 static const IcallEntry remotingservices_icalls [] = {
6913 {"InternalExecute", ves_icall_InternalExecute},
6914 {"IsTransparentProxy", ves_icall_IsTransparentProxy}
6917 static const IcallEntry rng_icalls [] = {
6918 {"RngClose", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose},
6919 {"RngGetBytes", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngGetBytes},
6920 {"RngInitialize", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize},
6921 {"RngOpen", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen}
6924 static const IcallEntry methodhandle_icalls [] = {
6925 {"GetFunctionPointer", ves_icall_RuntimeMethod_GetFunctionPointer}
6928 static const IcallEntry string_icalls [] = {
6929 {".ctor(char*)", ves_icall_System_String_ctor_charp},
6930 {".ctor(char*,int,int)", ves_icall_System_String_ctor_charp_int_int},
6931 {".ctor(char,int)", ves_icall_System_String_ctor_char_int},
6932 {".ctor(char[])", ves_icall_System_String_ctor_chara},
6933 {".ctor(char[],int,int)", ves_icall_System_String_ctor_chara_int_int},
6934 {".ctor(sbyte*)", ves_icall_System_String_ctor_sbytep},
6935 {".ctor(sbyte*,int,int)", ves_icall_System_String_ctor_sbytep_int_int},
6936 {".ctor(sbyte*,int,int,System.Text.Encoding)", ves_icall_System_String_ctor_encoding},
6937 {"InternalAllocateStr", ves_icall_System_String_InternalAllocateStr},
6938 {"InternalCharCopy", ves_icall_System_String_InternalCharCopy},
6939 {"InternalCopyTo", ves_icall_System_String_InternalCopyTo},
6940 {"InternalIndexOfAny", ves_icall_System_String_InternalIndexOfAny},
6941 {"InternalInsert", ves_icall_System_String_InternalInsert},
6942 {"InternalIntern", ves_icall_System_String_InternalIntern},
6943 {"InternalIsInterned", ves_icall_System_String_InternalIsInterned},
6944 {"InternalJoin", ves_icall_System_String_InternalJoin},
6945 {"InternalLastIndexOfAny", ves_icall_System_String_InternalLastIndexOfAny},
6946 {"InternalPad", ves_icall_System_String_InternalPad},
6947 {"InternalRemove", ves_icall_System_String_InternalRemove},
6948 {"InternalReplace(char,char)", ves_icall_System_String_InternalReplace_Char},
6949 {"InternalReplace(string,string,System.Globalization.CompareInfo)", ves_icall_System_String_InternalReplace_Str_Comp},
6950 {"InternalSplit", ves_icall_System_String_InternalSplit},
6951 {"InternalStrcpy(string,int,char[])", ves_icall_System_String_InternalStrcpy_Chars},
6952 {"InternalStrcpy(string,int,char[],int,int)", ves_icall_System_String_InternalStrcpy_CharsN},
6953 {"InternalStrcpy(string,int,string)", ves_icall_System_String_InternalStrcpy_Str},
6954 {"InternalStrcpy(string,int,string,int,int)", ves_icall_System_String_InternalStrcpy_StrN},
6955 {"InternalTrim", ves_icall_System_String_InternalTrim},
6956 {"get_Chars", ves_icall_System_String_get_Chars}
6959 static const IcallEntry encoding_icalls [] = {
6960 {"InternalCodePage", ves_icall_System_Text_Encoding_InternalCodePage}
6963 static const IcallEntry monitor_icalls [] = {
6964 {"Monitor_exit", ves_icall_System_Threading_Monitor_Monitor_exit},
6965 {"Monitor_pulse", ves_icall_System_Threading_Monitor_Monitor_pulse},
6966 {"Monitor_pulse_all", ves_icall_System_Threading_Monitor_Monitor_pulse_all},
6967 {"Monitor_test_owner", ves_icall_System_Threading_Monitor_Monitor_test_owner},
6968 {"Monitor_test_synchronised", ves_icall_System_Threading_Monitor_Monitor_test_synchronised},
6969 {"Monitor_try_enter", ves_icall_System_Threading_Monitor_Monitor_try_enter},
6970 {"Monitor_wait", ves_icall_System_Threading_Monitor_Monitor_wait}
6973 static const IcallEntry interlocked_icalls [] = {
6974 {"Add(int&,int)", ves_icall_System_Threading_Interlocked_Add_Int},
6975 {"Add(long&,long)", ves_icall_System_Threading_Interlocked_Add_Long},
6976 {"CompareExchange(T&,T,T)", ves_icall_System_Threading_Interlocked_CompareExchange_T},
6977 {"CompareExchange(double&,double,double)", ves_icall_System_Threading_Interlocked_CompareExchange_Double},
6978 {"CompareExchange(int&,int,int)", ves_icall_System_Threading_Interlocked_CompareExchange_Int},
6979 {"CompareExchange(intptr&,intptr,intptr)", ves_icall_System_Threading_Interlocked_CompareExchange_Object},
6980 {"CompareExchange(long&,long,long)", ves_icall_System_Threading_Interlocked_CompareExchange_Long},
6981 {"CompareExchange(object&,object,object)", ves_icall_System_Threading_Interlocked_CompareExchange_Object},
6982 {"CompareExchange(single&,single,single)", ves_icall_System_Threading_Interlocked_CompareExchange_Single},
6983 {"Decrement(int&)", ves_icall_System_Threading_Interlocked_Decrement_Int},
6984 {"Decrement(long&)", ves_icall_System_Threading_Interlocked_Decrement_Long},
6985 {"Exchange(T&,T)", ves_icall_System_Threading_Interlocked_Exchange_T},
6986 {"Exchange(double&,double)", ves_icall_System_Threading_Interlocked_Exchange_Double},
6987 {"Exchange(int&,int)", ves_icall_System_Threading_Interlocked_Exchange_Int},
6988 {"Exchange(intptr&,intptr)", ves_icall_System_Threading_Interlocked_Exchange_Object},
6989 {"Exchange(long&,long)", ves_icall_System_Threading_Interlocked_Exchange_Long},
6990 {"Exchange(object&,object)", ves_icall_System_Threading_Interlocked_Exchange_Object},
6991 {"Exchange(single&,single)", ves_icall_System_Threading_Interlocked_Exchange_Single},
6992 {"Increment(int&)", ves_icall_System_Threading_Interlocked_Increment_Int},
6993 {"Increment(long&)", ves_icall_System_Threading_Interlocked_Increment_Long},
6994 {"Read(long&)", ves_icall_System_Threading_Interlocked_Read_Long}
6997 static const IcallEntry mutex_icalls [] = {
6998 {"CreateMutex_internal(bool,string,bool&)", ves_icall_System_Threading_Mutex_CreateMutex_internal},
6999 {"OpenMutex_internal(string,System.Security.AccessControl.MutexRights,System.IO.MonoIOError&)", ves_icall_System_Threading_Mutex_OpenMutex_internal},
7000 {"ReleaseMutex_internal(intptr)", ves_icall_System_Threading_Mutex_ReleaseMutex_internal}
7003 static const IcallEntry semaphore_icalls [] = {
7004 {"CreateSemaphore_internal(int,int,string,bool&)", ves_icall_System_Threading_Semaphore_CreateSemaphore_internal},
7005 {"OpenSemaphore_internal(string,System.Security.AccessControl.SemaphoreRights,System.IO.MonoIOError&)", ves_icall_System_Threading_Semaphore_OpenSemaphore_internal},
7006 {"ReleaseSemaphore_internal(intptr,int,bool&)", ves_icall_System_Threading_Semaphore_ReleaseSemaphore_internal}
7009 static const IcallEntry nativeevents_icalls [] = {
7010 {"CloseEvent_internal", ves_icall_System_Threading_Events_CloseEvent_internal},
7011 {"CreateEvent_internal(bool,bool,string,bool&)", ves_icall_System_Threading_Events_CreateEvent_internal},
7012 {"OpenEvent_internal(string,System.Security.AccessControl.EventWaitHandleRights,System.IO.MonoIOError&)", ves_icall_System_Threading_Events_OpenEvent_internal},
7013 {"ResetEvent_internal", ves_icall_System_Threading_Events_ResetEvent_internal},
7014 {"SetEvent_internal", ves_icall_System_Threading_Events_SetEvent_internal}
7017 static const IcallEntry thread_icalls [] = {
7018 {"Abort_internal(object)", ves_icall_System_Threading_Thread_Abort},
7019 {"ClrState", ves_icall_System_Threading_Thread_ClrState},
7020 {"CurrentThread_internal", mono_thread_current},
7021 {"GetCachedCurrentCulture", ves_icall_System_Threading_Thread_GetCachedCurrentCulture},
7022 {"GetCachedCurrentUICulture", ves_icall_System_Threading_Thread_GetCachedCurrentUICulture},
7023 {"GetDomainID", ves_icall_System_Threading_Thread_GetDomainID},
7024 {"GetName_internal", ves_icall_System_Threading_Thread_GetName_internal},
7025 {"GetSerializedCurrentCulture", ves_icall_System_Threading_Thread_GetSerializedCurrentCulture},
7026 {"GetSerializedCurrentUICulture", ves_icall_System_Threading_Thread_GetSerializedCurrentUICulture},
7027 {"GetState", ves_icall_System_Threading_Thread_GetState},
7028 {"Join_internal", ves_icall_System_Threading_Thread_Join_internal},
7029 {"MemoryBarrier", ves_icall_System_Threading_Thread_MemoryBarrier},
7030 {"ResetAbort_internal()", ves_icall_System_Threading_Thread_ResetAbort},
7031 {"Resume_internal()", ves_icall_System_Threading_Thread_Resume},
7032 {"SetCachedCurrentCulture", ves_icall_System_Threading_Thread_SetCachedCurrentCulture},
7033 {"SetCachedCurrentUICulture", ves_icall_System_Threading_Thread_SetCachedCurrentUICulture},
7034 {"SetName_internal", ves_icall_System_Threading_Thread_SetName_internal},
7035 {"SetSerializedCurrentCulture", ves_icall_System_Threading_Thread_SetSerializedCurrentCulture},
7036 {"SetSerializedCurrentUICulture", ves_icall_System_Threading_Thread_SetSerializedCurrentUICulture},
7037 {"SetState", ves_icall_System_Threading_Thread_SetState},
7038 {"Sleep_internal", ves_icall_System_Threading_Thread_Sleep_internal},
7039 {"Suspend_internal", ves_icall_System_Threading_Thread_Suspend},
7040 {"Thread_free_internal", ves_icall_System_Threading_Thread_Thread_free_internal},
7041 {"Thread_internal", ves_icall_System_Threading_Thread_Thread_internal},
7042 {"VolatileRead(byte&)", ves_icall_System_Threading_Thread_VolatileRead1},
7043 {"VolatileRead(double&)", ves_icall_System_Threading_Thread_VolatileRead8},
7044 {"VolatileRead(int&)", ves_icall_System_Threading_Thread_VolatileRead4},
7045 {"VolatileRead(int16&)", ves_icall_System_Threading_Thread_VolatileRead2},
7046 {"VolatileRead(intptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
7047 {"VolatileRead(long&)", ves_icall_System_Threading_Thread_VolatileRead8},
7048 {"VolatileRead(object&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
7049 {"VolatileRead(sbyte&)", ves_icall_System_Threading_Thread_VolatileRead1},
7050 {"VolatileRead(single&)", ves_icall_System_Threading_Thread_VolatileRead4},
7051 {"VolatileRead(uint&)", ves_icall_System_Threading_Thread_VolatileRead2},
7052 {"VolatileRead(uint16&)", ves_icall_System_Threading_Thread_VolatileRead2},
7053 {"VolatileRead(uintptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
7054 {"VolatileRead(ulong&)", ves_icall_System_Threading_Thread_VolatileRead8},
7055 {"VolatileWrite(byte&,byte)", ves_icall_System_Threading_Thread_VolatileWrite1},
7056 {"VolatileWrite(double&,double)", ves_icall_System_Threading_Thread_VolatileWrite8},
7057 {"VolatileWrite(int&,int)", ves_icall_System_Threading_Thread_VolatileWrite4},
7058 {"VolatileWrite(int16&,int16)", ves_icall_System_Threading_Thread_VolatileWrite2},
7059 {"VolatileWrite(intptr&,intptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
7060 {"VolatileWrite(long&,long)", ves_icall_System_Threading_Thread_VolatileWrite8},
7061 {"VolatileWrite(object&,object)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
7062 {"VolatileWrite(sbyte&,sbyte)", ves_icall_System_Threading_Thread_VolatileWrite1},
7063 {"VolatileWrite(single&,single)", ves_icall_System_Threading_Thread_VolatileWrite4},
7064 {"VolatileWrite(uint&,uint)", ves_icall_System_Threading_Thread_VolatileWrite2},
7065 {"VolatileWrite(uint16&,uint16)", ves_icall_System_Threading_Thread_VolatileWrite2},
7066 {"VolatileWrite(uintptr&,uintptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
7067 {"VolatileWrite(ulong&,ulong)", ves_icall_System_Threading_Thread_VolatileWrite8},
7068 {"current_lcid()", ves_icall_System_Threading_Thread_current_lcid}
7071 static const IcallEntry threadpool_icalls [] = {
7072 {"GetAvailableThreads", ves_icall_System_Threading_ThreadPool_GetAvailableThreads},
7073 {"GetMaxThreads", ves_icall_System_Threading_ThreadPool_GetMaxThreads},
7074 {"GetMinThreads", ves_icall_System_Threading_ThreadPool_GetMinThreads},
7075 {"SetMinThreads", ves_icall_System_Threading_ThreadPool_SetMinThreads}
7078 static const IcallEntry waithandle_icalls [] = {
7079 {"WaitAll_internal", ves_icall_System_Threading_WaitHandle_WaitAll_internal},
7080 {"WaitAny_internal", ves_icall_System_Threading_WaitHandle_WaitAny_internal},
7081 {"WaitOne_internal", ves_icall_System_Threading_WaitHandle_WaitOne_internal}
7084 static const IcallEntry type_icalls [] = {
7085 {"Equals", ves_icall_type_Equals},
7086 {"GetGenericParameterAttributes", ves_icall_Type_GetGenericParameterAttributes},
7087 {"GetGenericParameterConstraints_impl", ves_icall_Type_GetGenericParameterConstraints},
7088 {"GetGenericParameterPosition", ves_icall_Type_GetGenericParameterPosition},
7089 {"GetGenericTypeDefinition_impl", ves_icall_Type_GetGenericTypeDefinition_impl},
7090 {"GetInterfaceMapData", ves_icall_Type_GetInterfaceMapData},
7091 {"GetPacking", ves_icall_Type_GetPacking},
7092 {"GetTypeCode", ves_icall_type_GetTypeCodeInternal},
7093 {"GetTypeCodeInternal", ves_icall_type_GetTypeCodeInternal},
7094 {"IsArrayImpl", ves_icall_Type_IsArrayImpl},
7095 {"IsInstanceOfType", ves_icall_type_IsInstanceOfType},
7096 {"MakeGenericType", ves_icall_Type_MakeGenericType},
7097 {"MakePointerType", ves_icall_Type_MakePointerType},
7098 {"get_IsGenericInstance", ves_icall_Type_get_IsGenericInstance},
7099 {"get_IsGenericType", ves_icall_Type_get_IsGenericType},
7100 {"get_IsGenericTypeDefinition", ves_icall_Type_get_IsGenericTypeDefinition},
7101 {"internal_from_handle", ves_icall_type_from_handle},
7102 {"internal_from_name", ves_icall_type_from_name},
7103 {"make_array_type", ves_icall_Type_make_array_type},
7104 {"make_byref_type", ves_icall_Type_make_byref_type},
7105 {"type_is_assignable_from", ves_icall_type_is_assignable_from},
7106 {"type_is_subtype_of", ves_icall_type_is_subtype_of}
7109 static const IcallEntry typedref_icalls [] = {
7110 {"ToObject", mono_TypedReference_ToObject},
7111 {"ToObjectInternal", mono_TypedReference_ToObjectInternal}
7114 static const IcallEntry valuetype_icalls [] = {
7115 {"InternalEquals", ves_icall_System_ValueType_Equals},
7116 {"InternalGetHashCode", ves_icall_System_ValueType_InternalGetHashCode}
7119 static const IcallEntry web_icalls [] = {
7120 {"GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path},
7121 {"GetMachineInstallDirectory", ves_icall_System_Web_Util_ICalls_get_machine_install_dir}
7124 static const IcallEntry identity_icalls [] = {
7125 {"GetCurrentToken", ves_icall_System_Security_Principal_WindowsIdentity_GetCurrentToken},
7126 {"GetTokenName", ves_icall_System_Security_Principal_WindowsIdentity_GetTokenName},
7127 {"GetUserToken", ves_icall_System_Security_Principal_WindowsIdentity_GetUserToken},
7128 {"_GetRoles", ves_icall_System_Security_Principal_WindowsIdentity_GetRoles}
7131 static const IcallEntry impersonation_icalls [] = {
7132 {"CloseToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_CloseToken},
7133 {"DuplicateToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_DuplicateToken},
7134 {"RevertToSelf", ves_icall_System_Security_Principal_WindowsImpersonationContext_RevertToSelf},
7135 {"SetCurrentToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_SetCurrentToken}
7138 static const IcallEntry principal_icalls [] = {
7139 {"IsMemberOfGroupId", ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupId},
7140 {"IsMemberOfGroupName", ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupName}
7143 static const IcallEntry keypair_icalls [] = {
7144 {"_CanSecure", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_CanSecure},
7145 {"_IsMachineProtected", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsMachineProtected},
7146 {"_IsUserProtected", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsUserProtected},
7147 {"_ProtectMachine", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectMachine},
7148 {"_ProtectUser", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectUser}
7151 static const IcallEntry evidence_icalls [] = {
7152 {"IsAuthenticodePresent", ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent}
7155 static const IcallEntry securitymanager_icalls [] = {
7156 {"GetLinkDemandSecurity", ves_icall_System_Security_SecurityManager_GetLinkDemandSecurity},
7157 {"get_CheckExecutionRights", ves_icall_System_Security_SecurityManager_get_CheckExecutionRights},
7158 {"get_SecurityEnabled", ves_icall_System_Security_SecurityManager_get_SecurityEnabled},
7159 {"set_CheckExecutionRights", ves_icall_System_Security_SecurityManager_set_CheckExecutionRights},
7160 {"set_SecurityEnabled", ves_icall_System_Security_SecurityManager_set_SecurityEnabled}
7163 static const IcallEntry generic_array_icalls [] = {
7164 {"GetGenericValueImpl", ves_icall_System_Array_InternalArray_GetGenericValueImpl}
7168 static const IcallEntry array_icalls [] = {
7173 /* keep the entries all sorted */
7174 static const IcallMap icall_entries [] = {
7175 {"Mono.Runtime", runtime_icalls, G_N_ELEMENTS (runtime_icalls)},
7176 {"Mono.Security.Cryptography.KeyPairPersistence", keypair_icalls, G_N_ELEMENTS (keypair_icalls)},
7177 {"System.Activator", activator_icalls, G_N_ELEMENTS (activator_icalls)},
7178 {"System.AppDomain", appdomain_icalls, G_N_ELEMENTS (appdomain_icalls)},
7179 {"System.ArgIterator", argiterator_icalls, G_N_ELEMENTS (argiterator_icalls)},
7180 {"System.Array", array_icalls, G_N_ELEMENTS (array_icalls)},
7181 {"System.Array/InternalArray`1", generic_array_icalls, G_N_ELEMENTS (generic_array_icalls)},
7182 {"System.Buffer", buffer_icalls, G_N_ELEMENTS (buffer_icalls)},
7183 {"System.Char", char_icalls, G_N_ELEMENTS (char_icalls)},
7184 {"System.Configuration.DefaultConfig", defaultconf_icalls, G_N_ELEMENTS (defaultconf_icalls)},
7185 {"System.ConsoleDriver", consoledriver_icalls, G_N_ELEMENTS (consoledriver_icalls)},
7186 {"System.Convert", convert_icalls, G_N_ELEMENTS (convert_icalls)},
7187 {"System.CurrentSystemTimeZone", timezone_icalls, G_N_ELEMENTS (timezone_icalls)},
7188 {"System.DateTime", datetime_icalls, G_N_ELEMENTS (datetime_icalls)},
7189 #ifndef DISABLE_DECIMAL
7190 {"System.Decimal", decimal_icalls, G_N_ELEMENTS (decimal_icalls)},
7192 {"System.Delegate", delegate_icalls, G_N_ELEMENTS (delegate_icalls)},
7193 {"System.Diagnostics.DefaultTraceListener", tracelist_icalls, G_N_ELEMENTS (tracelist_icalls)},
7194 {"System.Diagnostics.FileVersionInfo", fileversion_icalls, G_N_ELEMENTS (fileversion_icalls)},
7195 {"System.Diagnostics.Process", process_icalls, G_N_ELEMENTS (process_icalls)},
7196 {"System.Double", double_icalls, G_N_ELEMENTS (double_icalls)},
7197 {"System.Enum", enum_icalls, G_N_ELEMENTS (enum_icalls)},
7198 {"System.Environment", environment_icalls, G_N_ELEMENTS (environment_icalls)},
7199 {"System.GC", gc_icalls, G_N_ELEMENTS (gc_icalls)},
7200 {"System.Globalization.CompareInfo", compareinfo_icalls, G_N_ELEMENTS (compareinfo_icalls)},
7201 {"System.Globalization.CultureInfo", cultureinfo_icalls, G_N_ELEMENTS (cultureinfo_icalls)},
7202 {"System.Globalization.RegionInfo", regioninfo_icalls, G_N_ELEMENTS (regioninfo_icalls)},
7203 {"System.IO.FAMWatcher", famwatcher_icalls, G_N_ELEMENTS (famwatcher_icalls)},
7204 {"System.IO.FileSystemWatcher", filewatcher_icalls, G_N_ELEMENTS (filewatcher_icalls)},
7205 {"System.IO.MonoIO", monoio_icalls, G_N_ELEMENTS (monoio_icalls)},
7206 {"System.IO.Path", path_icalls, G_N_ELEMENTS (path_icalls)},
7207 {"System.Math", math_icalls, G_N_ELEMENTS (math_icalls)},
7208 {"System.MonoCustomAttrs", customattrs_icalls, G_N_ELEMENTS (customattrs_icalls)},
7209 {"System.MonoEnumInfo", enuminfo_icalls, G_N_ELEMENTS (enuminfo_icalls)},
7210 {"System.MonoType", monotype_icalls, G_N_ELEMENTS (monotype_icalls)},
7211 {"System.Net.Dns", dns_icalls, G_N_ELEMENTS (dns_icalls)},
7212 {"System.Net.Sockets.Socket", socket_icalls, G_N_ELEMENTS (socket_icalls)},
7213 {"System.Net.Sockets.SocketException", socketex_icalls, G_N_ELEMENTS (socketex_icalls)},
7214 {"System.Object", object_icalls, G_N_ELEMENTS (object_icalls)},
7215 {"System.Reflection.Assembly", assembly_icalls, G_N_ELEMENTS (assembly_icalls)},
7216 {"System.Reflection.AssemblyName", assembly_name_icalls, G_N_ELEMENTS (assembly_name_icalls)},
7217 {"System.Reflection.Emit.AssemblyBuilder", assemblybuilder_icalls, G_N_ELEMENTS (assemblybuilder_icalls)},
7218 {"System.Reflection.Emit.CustomAttributeBuilder", customattrbuilder_icalls, G_N_ELEMENTS (customattrbuilder_icalls)},
7219 {"System.Reflection.Emit.DynamicMethod", dynamicmethod_icalls, G_N_ELEMENTS (dynamicmethod_icalls)},
7220 {"System.Reflection.Emit.EnumBuilder", enumbuilder_icalls, G_N_ELEMENTS (enumbuilder_icalls)},
7221 {"System.Reflection.Emit.GenericTypeParameterBuilder", generictypeparambuilder_icalls, G_N_ELEMENTS (generictypeparambuilder_icalls)},
7222 {"System.Reflection.Emit.MethodBuilder", methodbuilder_icalls, G_N_ELEMENTS (methodbuilder_icalls)},
7223 {"System.Reflection.Emit.ModuleBuilder", modulebuilder_icalls, G_N_ELEMENTS (modulebuilder_icalls)},
7224 {"System.Reflection.Emit.SignatureHelper", signaturehelper_icalls, G_N_ELEMENTS (signaturehelper_icalls)},
7225 {"System.Reflection.Emit.TypeBuilder", typebuilder_icalls, G_N_ELEMENTS (typebuilder_icalls)},
7226 {"System.Reflection.FieldInfo", fieldinfo_icalls, G_N_ELEMENTS (fieldinfo_icalls)},
7227 {"System.Reflection.MemberInfo", memberinfo_icalls, G_N_ELEMENTS (memberinfo_icalls)},
7228 {"System.Reflection.MethodBase", methodbase_icalls, G_N_ELEMENTS (methodbase_icalls)},
7229 {"System.Reflection.Module", module_icalls, G_N_ELEMENTS (module_icalls)},
7230 {"System.Reflection.MonoCMethod", monocmethod_icalls, G_N_ELEMENTS (monocmethod_icalls)},
7231 {"System.Reflection.MonoEventInfo", monoeventinfo_icalls, G_N_ELEMENTS (monoeventinfo_icalls)},
7232 {"System.Reflection.MonoField", monofield_icalls, G_N_ELEMENTS (monofield_icalls)},
7233 {"System.Reflection.MonoGenericCMethod", monogenericmethod_icalls, G_N_ELEMENTS (monogenericmethod_icalls)},
7234 {"System.Reflection.MonoGenericClass", monogenericclass_icalls, G_N_ELEMENTS (monogenericclass_icalls)},
7235 {"System.Reflection.MonoGenericMethod", monogenericmethod_icalls, G_N_ELEMENTS (monogenericmethod_icalls)},
7236 {"System.Reflection.MonoMethod", monomethod_icalls, G_N_ELEMENTS (monomethod_icalls)},
7237 {"System.Reflection.MonoMethodInfo", monomethodinfo_icalls, G_N_ELEMENTS (monomethodinfo_icalls)},
7238 {"System.Reflection.MonoPropertyInfo", monopropertyinfo_icalls, G_N_ELEMENTS (monopropertyinfo_icalls)},
7239 {"System.Reflection.ParameterInfo", parameterinfo_icalls, G_N_ELEMENTS (parameterinfo_icalls)},
7240 {"System.Runtime.CompilerServices.RuntimeHelpers", runtimehelpers_icalls, G_N_ELEMENTS (runtimehelpers_icalls)},
7241 {"System.Runtime.InteropServices.GCHandle", gchandle_icalls, G_N_ELEMENTS (gchandle_icalls)},
7242 {"System.Runtime.InteropServices.Marshal", marshal_icalls, G_N_ELEMENTS (marshal_icalls)},
7243 {"System.Runtime.Remoting.Activation.ActivationServices", activationservices_icalls, G_N_ELEMENTS (activationservices_icalls)},
7244 {"System.Runtime.Remoting.Messaging.MonoMethodMessage", monomethodmessage_icalls, G_N_ELEMENTS (monomethodmessage_icalls)},
7245 {"System.Runtime.Remoting.Proxies.RealProxy", realproxy_icalls, G_N_ELEMENTS (realproxy_icalls)},
7246 {"System.Runtime.Remoting.RemotingServices", remotingservices_icalls, G_N_ELEMENTS (remotingservices_icalls)},
7247 {"System.RuntimeMethodHandle", methodhandle_icalls, G_N_ELEMENTS (methodhandle_icalls)},
7248 {"System.Security.Cryptography.RNGCryptoServiceProvider", rng_icalls, G_N_ELEMENTS (rng_icalls)},
7249 {"System.Security.Policy.Evidence", evidence_icalls, G_N_ELEMENTS (evidence_icalls)},
7250 {"System.Security.Principal.WindowsIdentity", identity_icalls, G_N_ELEMENTS (identity_icalls)},
7251 {"System.Security.Principal.WindowsImpersonationContext", impersonation_icalls, G_N_ELEMENTS (impersonation_icalls)},
7252 {"System.Security.Principal.WindowsPrincipal", principal_icalls, G_N_ELEMENTS (principal_icalls)},
7253 {"System.Security.SecurityManager", securitymanager_icalls, G_N_ELEMENTS (securitymanager_icalls)},
7254 {"System.String", string_icalls, G_N_ELEMENTS (string_icalls)},
7255 {"System.Text.Encoding", encoding_icalls, G_N_ELEMENTS (encoding_icalls)},
7256 {"System.Threading.Interlocked", interlocked_icalls, G_N_ELEMENTS (interlocked_icalls)},
7257 {"System.Threading.Monitor", monitor_icalls, G_N_ELEMENTS (monitor_icalls)},
7258 {"System.Threading.Mutex", mutex_icalls, G_N_ELEMENTS (mutex_icalls)},
7259 {"System.Threading.NativeEventCalls", nativeevents_icalls, G_N_ELEMENTS (nativeevents_icalls)},
7260 {"System.Threading.Semaphore", semaphore_icalls, G_N_ELEMENTS (semaphore_icalls)},
7261 {"System.Threading.Thread", thread_icalls, G_N_ELEMENTS (thread_icalls)},
7262 {"System.Threading.ThreadPool", threadpool_icalls, G_N_ELEMENTS (threadpool_icalls)},
7263 {"System.Threading.WaitHandle", waithandle_icalls, G_N_ELEMENTS (waithandle_icalls)},
7264 {"System.Type", type_icalls, G_N_ELEMENTS (type_icalls)},
7265 {"System.TypedReference", typedref_icalls, G_N_ELEMENTS (typedref_icalls)},
7266 {"System.ValueType", valuetype_icalls, G_N_ELEMENTS (valuetype_icalls)},
7267 {"System.Web.Util.ICalls", web_icalls, G_N_ELEMENTS (web_icalls)}
7270 static GHashTable *icall_hash = NULL;
7271 static GHashTable *jit_icall_hash_name = NULL;
7272 static GHashTable *jit_icall_hash_addr = NULL;
7275 mono_icall_init (void)
7279 /* check that tables are sorted: disable in release */
7282 const IcallMap *imap;
7283 const IcallEntry *ientry;
7284 const char *prev_class = NULL;
7285 const char *prev_method;
7287 for (i = 0; i < G_N_ELEMENTS (icall_entries); ++i) {
7288 imap = &icall_entries [i];
7290 if (prev_class && strcmp (prev_class, imap->klass) >= 0)
7291 g_print ("class %s should come before class %s\n", imap->klass, prev_class);
7292 prev_class = imap->klass;
7293 for (j = 0; j < imap->size; ++j) {
7294 ientry = &imap->icalls [j];
7295 if (prev_method && strcmp (prev_method, ientry->method) >= 0)
7296 g_print ("method %s should come before method %s\n", ientry->method, prev_method);
7297 prev_method = ientry->method;
7302 icall_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
7306 mono_icall_cleanup (void)
7308 g_hash_table_destroy (icall_hash);
7309 g_hash_table_destroy (jit_icall_hash_name);
7310 g_hash_table_destroy (jit_icall_hash_addr);
7314 mono_add_internal_call (const char *name, gconstpointer method)
7316 mono_loader_lock ();
7318 g_hash_table_insert (icall_hash, g_strdup (name), (gpointer) method);
7320 mono_loader_unlock ();
7324 compare_class_imap (const void *key, const void *elem)
7326 const IcallMap* imap = (const IcallMap*)elem;
7327 return strcmp (key, imap->klass);
7330 static const IcallMap*
7331 find_class_icalls (const char *name)
7333 return (const IcallMap*) bsearch (name, icall_entries, G_N_ELEMENTS (icall_entries), sizeof (IcallMap), compare_class_imap);
7337 compare_method_imap (const void *key, const void *elem)
7339 const IcallEntry* ientry = (const IcallEntry*)elem;
7340 return strcmp (key, ientry->method);
7344 find_method_icall (const IcallMap *imap, const char *name)
7346 const IcallEntry *ientry = (const IcallEntry*) bsearch (name, imap->icalls, imap->size, sizeof (IcallEntry), compare_method_imap);
7348 return (void*)ientry->func;
7353 * we should probably export this as an helper (handle nested types).
7354 * Returns the number of chars written in buf.
7357 concat_class_name (char *buf, int bufsize, MonoClass *klass)
7359 int nspacelen, cnamelen;
7360 nspacelen = strlen (klass->name_space);
7361 cnamelen = strlen (klass->name);
7362 if (nspacelen + cnamelen + 2 > bufsize)
7365 memcpy (buf, klass->name_space, nspacelen);
7366 buf [nspacelen ++] = '.';
7368 memcpy (buf + nspacelen, klass->name, cnamelen);
7369 buf [nspacelen + cnamelen] = 0;
7370 return nspacelen + cnamelen;
7374 mono_lookup_internal_call (MonoMethod *method)
7379 int typelen = 0, mlen, siglen;
7381 const IcallMap *imap;
7383 g_assert (method != NULL);
7385 if (method->is_inflated)
7386 method = ((MonoMethodInflated *) method)->declaring;
7388 if (method->klass->nested_in) {
7389 int pos = concat_class_name (mname, sizeof (mname)-2, method->klass->nested_in);
7393 mname [pos++] = '/';
7396 typelen = concat_class_name (mname+pos, sizeof (mname)-pos-1, method->klass);
7402 typelen = concat_class_name (mname, sizeof (mname), method->klass);
7407 imap = find_class_icalls (mname);
7409 mname [typelen] = ':';
7410 mname [typelen + 1] = ':';
7412 mlen = strlen (method->name);
7413 memcpy (mname + typelen + 2, method->name, mlen);
7414 sigstart = mname + typelen + 2 + mlen;
7417 tmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE);
7418 siglen = strlen (tmpsig);
7419 if (typelen + mlen + siglen + 6 > sizeof (mname))
7422 memcpy (sigstart + 1, tmpsig, siglen);
7423 sigstart [siglen + 1] = ')';
7424 sigstart [siglen + 2] = 0;
7427 mono_loader_lock ();
7429 res = g_hash_table_lookup (icall_hash, mname);
7431 mono_loader_unlock ();
7434 /* try without signature */
7436 res = g_hash_table_lookup (icall_hash, mname);
7438 mono_loader_unlock ();
7442 /* it wasn't found in the static call tables */
7444 mono_loader_unlock ();
7447 res = find_method_icall (imap, sigstart - mlen);
7449 mono_loader_unlock ();
7452 /* try _with_ signature */
7454 res = find_method_icall (imap, sigstart - mlen);
7456 mono_loader_unlock ();
7460 g_warning ("cant resolve internal call to \"%s\" (tested without signature also)", mname);
7461 g_print ("\nYour mono runtime and class libraries are out of sync.\n");
7462 g_print ("The out of sync library is: %s\n", method->klass->image->name);
7463 g_print ("\nWhen you update one from cvs you need to update, compile and install\nthe other too.\n");
7464 g_print ("Do not report this as a bug unless you're sure you have updated correctly:\nyou probably have a broken mono install.\n");
7465 g_print ("If you see other errors or faults after this message they are probably related\n");
7466 g_print ("and you need to fix your mono install first.\n");
7468 mono_loader_unlock ();
7474 type_from_typename (char *typename)
7476 MonoClass *klass = NULL; /* assignment to shut GCC warning up */
7478 if (!strcmp (typename, "int"))
7479 klass = mono_defaults.int_class;
7480 else if (!strcmp (typename, "ptr"))
7481 klass = mono_defaults.int_class;
7482 else if (!strcmp (typename, "void"))
7483 klass = mono_defaults.void_class;
7484 else if (!strcmp (typename, "int32"))
7485 klass = mono_defaults.int32_class;
7486 else if (!strcmp (typename, "uint32"))
7487 klass = mono_defaults.uint32_class;
7488 else if (!strcmp (typename, "long"))
7489 klass = mono_defaults.int64_class;
7490 else if (!strcmp (typename, "ulong"))
7491 klass = mono_defaults.uint64_class;
7492 else if (!strcmp (typename, "float"))
7493 klass = mono_defaults.single_class;
7494 else if (!strcmp (typename, "double"))
7495 klass = mono_defaults.double_class;
7496 else if (!strcmp (typename, "object"))
7497 klass = mono_defaults.object_class;
7498 else if (!strcmp (typename, "obj"))
7499 klass = mono_defaults.object_class;
7502 g_assert_not_reached ();
7504 return &klass->byval_arg;
7507 MonoMethodSignature*
7508 mono_create_icall_signature (const char *sigstr)
7513 MonoMethodSignature *res;
7515 mono_loader_lock ();
7516 res = g_hash_table_lookup (mono_defaults.corlib->helper_signatures, sigstr);
7518 mono_loader_unlock ();
7522 parts = g_strsplit (sigstr, " ", 256);
7531 res = mono_metadata_signature_alloc (mono_defaults.corlib, len - 1);
7534 #ifdef PLATFORM_WIN32
7536 * Under windows, the default pinvoke calling convention is STDCALL but
7539 res->call_convention = MONO_CALL_C;
7542 res->ret = type_from_typename (parts [0]);
7543 for (i = 1; i < len; ++i) {
7544 res->params [i - 1] = type_from_typename (parts [i]);
7549 g_hash_table_insert (mono_defaults.corlib->helper_signatures, (gpointer)sigstr, res);
7551 mono_loader_unlock ();
7557 mono_find_jit_icall_by_name (const char *name)
7559 MonoJitICallInfo *info;
7560 g_assert (jit_icall_hash_name);
7562 mono_loader_lock ();
7563 info = g_hash_table_lookup (jit_icall_hash_name, name);
7564 mono_loader_unlock ();
7569 mono_find_jit_icall_by_addr (gconstpointer addr)
7571 MonoJitICallInfo *info;
7572 g_assert (jit_icall_hash_addr);
7574 mono_loader_lock ();
7575 info = g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);
7576 mono_loader_unlock ();
7582 mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)
7584 mono_loader_lock ();
7585 g_hash_table_insert (jit_icall_hash_addr, wrapper, info);
7586 mono_loader_unlock ();
7590 mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save)
7592 MonoJitICallInfo *info;
7597 mono_loader_lock ();
7599 if (!jit_icall_hash_name) {
7600 jit_icall_hash_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
7601 jit_icall_hash_addr = g_hash_table_new (NULL, NULL);
7604 if (g_hash_table_lookup (jit_icall_hash_name, name)) {
7605 g_warning ("jit icall already defined \"%s\"\n", name);
7606 g_assert_not_reached ();
7609 info = g_new0 (MonoJitICallInfo, 1);
7616 info->wrapper = func;
7618 info->wrapper = NULL;
7621 g_hash_table_insert (jit_icall_hash_name, (gpointer)info->name, info);
7622 g_hash_table_insert (jit_icall_hash_addr, (gpointer)func, info);
7624 mono_loader_unlock ();