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/mono-debug-debugger.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)
82 result = bsd_strtod (ptr, &endptr);
84 if (!*ptr || (endptr && *endptr))
85 mono_raise_exception (mono_exception_from_name (mono_get_corlib (),
93 ves_icall_System_Double_AssertEndianity (double *value)
97 MONO_DOUBLE_ASSERT_ENDIANITY (value);
101 ves_icall_System_Array_GetValueImpl (MonoObject *this, guint32 pos)
110 ao = (MonoArray *)this;
111 ac = (MonoClass *)ao->obj.vtable->klass;
113 esize = mono_array_element_size (ac);
114 ea = (gpointer*)((char*)ao->vector + (pos * esize));
116 if (ac->element_class->valuetype)
117 return mono_value_box (this->vtable->domain, ac->element_class, ea);
123 ves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs)
131 MONO_CHECK_ARG_NULL (idxs);
133 io = (MonoArray *)idxs;
134 ic = (MonoClass *)io->obj.vtable->klass;
136 ao = (MonoArray *)this;
137 ac = (MonoClass *)ao->obj.vtable->klass;
139 g_assert (ic->rank == 1);
140 if (io->bounds != NULL || io->max_length != ac->rank)
141 mono_raise_exception (mono_get_exception_argument (NULL, NULL));
143 ind = (gint32 *)io->vector;
145 if (ao->bounds == NULL) {
146 if (*ind < 0 || *ind >= ao->max_length)
147 mono_raise_exception (mono_get_exception_index_out_of_range ());
149 return ves_icall_System_Array_GetValueImpl (this, *ind);
152 for (i = 0; i < ac->rank; i++)
153 if ((ind [i] < ao->bounds [i].lower_bound) ||
154 (ind [i] >= ao->bounds [i].length + ao->bounds [i].lower_bound))
155 mono_raise_exception (mono_get_exception_index_out_of_range ());
157 pos = ind [0] - ao->bounds [0].lower_bound;
158 for (i = 1; i < ac->rank; i++)
159 pos = pos*ao->bounds [i].length + ind [i] -
160 ao->bounds [i].lower_bound;
162 return ves_icall_System_Array_GetValueImpl (this, pos);
166 ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 pos)
168 MonoClass *ac, *vc, *ec;
179 vc = value->vtable->klass;
183 ac = this->obj.vtable->klass;
184 ec = ac->element_class;
186 esize = mono_array_element_size (ac);
187 ea = (gpointer*)((char*)this->vector + (pos * esize));
188 va = (gpointer*)((char*)value + sizeof (MonoObject));
191 memset (ea, 0, esize);
195 #define NO_WIDENING_CONVERSION G_STMT_START{\
196 mono_raise_exception (mono_get_exception_argument ( \
197 "value", "not a widening conversion")); \
200 #define CHECK_WIDENING_CONVERSION(extra) G_STMT_START{\
201 if (esize < vsize + (extra)) \
202 mono_raise_exception (mono_get_exception_argument ( \
203 "value", "not a widening conversion")); \
206 #define INVALID_CAST G_STMT_START{\
207 mono_raise_exception (mono_get_exception_invalid_cast ()); \
210 /* Check element (destination) type. */
211 switch (ec->byval_arg.type) {
212 case MONO_TYPE_STRING:
213 switch (vc->byval_arg.type) {
214 case MONO_TYPE_STRING:
220 case MONO_TYPE_BOOLEAN:
221 switch (vc->byval_arg.type) {
222 case MONO_TYPE_BOOLEAN:
235 NO_WIDENING_CONVERSION;
242 if (!ec->valuetype) {
243 if (!mono_object_isinst (value, ec))
245 *ea = (gpointer)value;
249 if (mono_object_isinst (value, ec)) {
250 memcpy (ea, (char *)value + sizeof (MonoObject), esize);
257 vsize = mono_class_instance_size (vc) - sizeof (MonoObject);
259 #define ASSIGN_UNSIGNED(etype) G_STMT_START{\
260 switch (vc->byval_arg.type) { \
265 case MONO_TYPE_CHAR: \
266 CHECK_WIDENING_CONVERSION(0); \
267 *(etype *) ea = (etype) u64; \
269 /* You can't assign a signed value to an unsigned array. */ \
274 /* You can't assign a floating point number to an integer array. */ \
277 NO_WIDENING_CONVERSION; \
281 #define ASSIGN_SIGNED(etype) G_STMT_START{\
282 switch (vc->byval_arg.type) { \
287 CHECK_WIDENING_CONVERSION(0); \
288 *(etype *) ea = (etype) i64; \
290 /* You can assign an unsigned value to a signed array if the array's */ \
291 /* element size is larger than the value size. */ \
296 case MONO_TYPE_CHAR: \
297 CHECK_WIDENING_CONVERSION(1); \
298 *(etype *) ea = (etype) u64; \
300 /* You can't assign a floating point number to an integer array. */ \
303 NO_WIDENING_CONVERSION; \
307 #define ASSIGN_REAL(etype) G_STMT_START{\
308 switch (vc->byval_arg.type) { \
311 CHECK_WIDENING_CONVERSION(0); \
312 *(etype *) ea = (etype) r64; \
314 /* All integer values fit into a floating point array, so we don't */ \
315 /* need to CHECK_WIDENING_CONVERSION here. */ \
320 *(etype *) ea = (etype) i64; \
326 case MONO_TYPE_CHAR: \
327 *(etype *) ea = (etype) u64; \
332 switch (vc->byval_arg.type) {
334 u64 = *(guint8 *) va;
337 u64 = *(guint16 *) va;
340 u64 = *(guint32 *) va;
343 u64 = *(guint64 *) va;
349 i64 = *(gint16 *) va;
352 i64 = *(gint32 *) va;
355 i64 = *(gint64 *) va;
358 r64 = *(gfloat *) va;
361 r64 = *(gdouble *) va;
364 u64 = *(guint16 *) va;
366 case MONO_TYPE_BOOLEAN:
367 /* Boolean is only compatible with itself. */
368 switch (ec->byval_arg.type) {
380 NO_WIDENING_CONVERSION;
387 /* If we can't do a direct copy, let's try a widening conversion. */
388 switch (ec->byval_arg.type) {
390 ASSIGN_UNSIGNED (guint16);
392 ASSIGN_UNSIGNED (guint8);
394 ASSIGN_UNSIGNED (guint16);
396 ASSIGN_UNSIGNED (guint32);
398 ASSIGN_UNSIGNED (guint64);
400 ASSIGN_SIGNED (gint8);
402 ASSIGN_SIGNED (gint16);
404 ASSIGN_SIGNED (gint32);
406 ASSIGN_SIGNED (gint64);
408 ASSIGN_REAL (gfloat);
410 ASSIGN_REAL (gdouble);
414 /* Not reached, INVALID_CAST does not return. Just to avoid a compiler warning ... */
418 #undef NO_WIDENING_CONVERSION
419 #undef CHECK_WIDENING_CONVERSION
420 #undef ASSIGN_UNSIGNED
426 ves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value,
434 MONO_CHECK_ARG_NULL (idxs);
436 ic = idxs->obj.vtable->klass;
437 ac = this->obj.vtable->klass;
439 g_assert (ic->rank == 1);
440 if (idxs->bounds != NULL || idxs->max_length != ac->rank)
441 mono_raise_exception (mono_get_exception_argument (NULL, NULL));
443 ind = (gint32 *)idxs->vector;
445 if (this->bounds == NULL) {
446 if (*ind < 0 || *ind >= this->max_length)
447 mono_raise_exception (mono_get_exception_index_out_of_range ());
449 ves_icall_System_Array_SetValueImpl (this, value, *ind);
453 for (i = 0; i < ac->rank; i++)
454 if ((ind [i] < this->bounds [i].lower_bound) ||
455 (ind [i] >= this->bounds [i].length + this->bounds [i].lower_bound))
456 mono_raise_exception (mono_get_exception_index_out_of_range ());
458 pos = ind [0] - this->bounds [0].lower_bound;
459 for (i = 1; i < ac->rank; i++)
460 pos = pos * this->bounds [i].length + ind [i] -
461 this->bounds [i].lower_bound;
463 ves_icall_System_Array_SetValueImpl (this, value, pos);
467 ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)
472 gboolean bounded = FALSE;
476 MONO_CHECK_ARG_NULL (type);
477 MONO_CHECK_ARG_NULL (lengths);
479 MONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);
481 MONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));
483 for (i = 0; i < mono_array_length (lengths); i++)
484 if (mono_array_get (lengths, gint32, i) < 0)
485 mono_raise_exception (mono_get_exception_argument_out_of_range (NULL));
487 if (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint32, 0) != 0))
488 /* vectors are not the same as one dimensional arrays with no-zero bounds */
493 aklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);
495 sizes = alloca (aklass->rank * sizeof(guint32) * 2);
496 for (i = 0; i < aklass->rank; ++i) {
497 sizes [i] = mono_array_get (lengths, guint32, i);
499 sizes [i + aklass->rank] = mono_array_get (bounds, guint32, i);
501 sizes [i + aklass->rank] = 0;
504 array = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);
510 ves_icall_System_Array_GetRank (MonoObject *this)
514 return this->vtable->klass->rank;
518 ves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension)
520 gint32 rank = ((MonoObject *)this)->vtable->klass->rank;
524 if ((dimension < 0) || (dimension >= rank))
525 mono_raise_exception (mono_get_exception_index_out_of_range ());
527 if (this->bounds == NULL)
528 return this->max_length;
530 return this->bounds [dimension].length;
534 ves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension)
536 gint32 rank = ((MonoObject *)this)->vtable->klass->rank;
540 if ((dimension < 0) || (dimension >= rank))
541 mono_raise_exception (mono_get_exception_index_out_of_range ());
543 if (this->bounds == NULL)
546 return this->bounds [dimension].lower_bound;
550 ves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length)
552 int sz = mono_array_element_size (mono_object_class (arr));
553 memset (mono_array_addr_with_size (arr, idx, sz), 0, length * sz);
557 ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length)
562 MonoClass *src_class;
563 MonoClass *dest_class;
568 if (source->obj.vtable->klass->rank != dest->obj.vtable->klass->rank)
571 if (source->bounds || dest->bounds)
574 if ((dest_idx + length > mono_array_length (dest)) ||
575 (source_idx + length > mono_array_length (source)))
578 element_size = mono_array_element_size (source->obj.vtable->klass);
579 dest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);
580 source_addr = mono_array_addr_with_size (source, element_size, source_idx);
582 src_class = source->obj.vtable->klass->element_class;
583 dest_class = dest->obj.vtable->klass->element_class;
586 * Handle common cases.
589 /* Case1: object[] -> valuetype[] (ArrayList::ToArray) */
590 if (src_class == mono_defaults.object_class && dest_class->valuetype) {
591 for (i = source_idx; i < source_idx + length; ++i) {
592 MonoObject *elem = mono_array_get (source, MonoObject*, i);
593 if (elem && !mono_object_isinst (elem, dest_class))
597 element_size = mono_array_element_size (dest->obj.vtable->klass);
598 for (i = 0; i < length; ++i) {
599 MonoObject *elem = mono_array_get (source, MonoObject*, source_idx + i);
600 void *addr = mono_array_addr_with_size (dest, element_size, dest_idx + i);
602 memset (addr, 0, element_size);
604 memcpy (addr, (char *)elem + sizeof (MonoObject), element_size);
609 /* Check if we're copying a char[] <==> (u)short[] */
610 if (src_class != dest_class) {
611 if (dest_class->valuetype || dest_class->enumtype || src_class->valuetype || src_class->enumtype)
614 if (mono_class_is_subclass_of (src_class, dest_class, FALSE))
616 /* Case2: object[] -> reftype[] (ArrayList::ToArray) */
617 else if (mono_class_is_subclass_of (dest_class, src_class, FALSE))
618 for (i = source_idx; i < source_idx + length; ++i) {
619 MonoObject *elem = mono_array_get (source, MonoObject*, i);
620 if (elem && !mono_object_isinst (elem, dest_class))
627 memmove (dest_addr, source_addr, element_size * length);
633 ves_icall_System_Array_InternalArray_GetGenericValueImpl (MonoObject *this, guint32 pos,
643 ao = (MonoArray *)this;
644 ac = (MonoClass *)ao->obj.vtable->klass;
646 esize = mono_array_element_size (ac);
647 ea = (gpointer*)((char*)ao->vector + (pos * esize));
649 memcpy (value, ea, esize);
653 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArray *array, MonoClassField *field_handle)
655 MonoClass *klass = array->obj.vtable->klass;
656 guint32 size = mono_array_element_size (klass);
661 if (array->bounds == NULL)
662 size *= array->max_length;
664 for (i = 0; i < klass->rank; ++i)
665 size *= array->bounds [i].length;
667 memcpy (mono_array_addr (array, char, 0), field_handle->data, size);
669 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
673 guint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \
675 for (i = 0; i < size; i += n/8, data++) { \
676 tmp = read ## n (data); \
681 /* printf ("Initialize array with elements of %s type\n", klass->element_class->name); */
683 switch (mono_type_get_underlying_type (&klass->element_class->byval_arg)->type) {
703 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData (void)
707 return offsetof (MonoString, chars);
711 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObject *obj)
715 if ((obj == NULL) || (! (obj->vtable->klass->valuetype)))
718 return mono_object_clone (obj);
722 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (MonoType *handle)
728 MONO_CHECK_ARG_NULL (handle);
730 klass = mono_class_from_mono_type (handle);
731 MONO_CHECK_ARG (handle, klass);
733 /* This will call the type constructor */
734 if (! (klass->flags & TYPE_ATTRIBUTE_INTERFACE))
735 mono_runtime_class_init (mono_class_vtable (mono_domain_get (), klass));
739 ves_icall_System_Object_MemberwiseClone (MonoObject *this)
743 return mono_object_clone (this);
746 #define MONO_OBJECT_ALIGNMENT_SHIFT 3
749 * Return hashcode based on object address. This function will need to be
750 * smarter in the presence of a moving garbage collector, which will cache
751 * the address hash before relocating the object.
753 * Wang's address-based hash function:
754 * http://www.concentric.net/~Ttwang/tech/addrhash.htm
757 ves_icall_System_Object_GetHashCode (MonoObject *this)
761 return (GPOINTER_TO_UINT (this) >> MONO_OBJECT_ALIGNMENT_SHIFT) * 2654435761u;
765 ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fields)
768 MonoObject **values = NULL;
772 MonoClassField* field;
777 klass = mono_object_class (this);
779 if (mono_class_num_fields (klass) == 0)
780 return ves_icall_System_Object_GetHashCode (this);
783 * Compute the starting value of the hashcode for fields of primitive
784 * types, and return the remaining fields in an array to the managed side.
785 * This way, we can avoid costly reflection operations in managed code.
788 while ((field = mono_class_get_fields (klass, &iter))) {
789 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)
791 if (mono_field_is_deleted (field))
793 /* FIXME: Add more types */
794 switch (field->type->type) {
796 result ^= *(gint32*)((guint8*)this + field->offset);
798 case MONO_TYPE_STRING: {
800 s = *(MonoString**)((guint8*)this + field->offset);
802 result ^= mono_string_hash (s);
807 values = g_newa (MonoObject*, mono_class_num_fields (klass));
808 o = mono_field_get_value_object (mono_object_domain (this), field, this);
809 values [count++] = o;
814 *fields = mono_array_new (mono_domain_get (), mono_defaults.object_class, count);
815 memcpy (mono_array_addr (*fields, MonoObject*, 0), values, count * sizeof (MonoObject*));
823 ves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray **fields)
826 MonoObject **values = NULL;
828 MonoClassField* field;
834 MONO_CHECK_ARG_NULL (that);
836 if (this->vtable != that->vtable)
839 klass = mono_object_class (this);
842 * Do the comparison for fields of primitive type and return a result if
843 * possible. Otherwise, return the remaining fields in an array to the
844 * managed side. This way, we can avoid costly reflection operations in
849 while ((field = mono_class_get_fields (klass, &iter))) {
850 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)
852 if (mono_field_is_deleted (field))
854 /* FIXME: Add more types */
855 switch (field->type->type) {
857 if (*(gint32*)((guint8*)this + field->offset) != *(gint32*)((guint8*)that + field->offset))
860 case MONO_TYPE_STRING: {
862 guint32 s1len, s2len;
863 s1 = *(MonoString**)((guint8*)this + field->offset);
864 s2 = *(MonoString**)((guint8*)that + field->offset);
867 if ((s1 == NULL) || (s2 == NULL))
869 s1len = mono_string_length (s1);
870 s2len = mono_string_length (s2);
874 if (memcmp (mono_string_chars (s1), mono_string_chars (s2), s1len * sizeof (gunichar2)) != 0)
880 values = g_newa (MonoObject*, mono_class_num_fields (klass) * 2);
881 o = mono_field_get_value_object (mono_object_domain (this), field, this);
882 values [count++] = o;
883 o = mono_field_get_value_object (mono_object_domain (this), field, that);
884 values [count++] = o;
889 *fields = mono_array_new (mono_domain_get (), mono_defaults.object_class, count);
890 memcpy (mono_array_addr (*fields, MonoObject*, 0), values, count * sizeof (MonoObject*));
898 static MonoReflectionType *
899 ves_icall_System_Object_GetType (MonoObject *obj)
903 if (obj->vtable->klass != mono_defaults.transparent_proxy_class)
904 return mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);
906 return mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg);
910 mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)
914 mtype->type = &obj->vtable->klass->byval_arg;
915 g_assert (mtype->type->type);
919 ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj)
923 MONO_CHECK_ARG_NULL (obj);
925 return mono_image_create_token (mb->dynamic_image, obj, TRUE);
929 ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb,
930 MonoReflectionMethod *method,
931 MonoArray *opt_param_types)
935 MONO_CHECK_ARG_NULL (method);
937 return mono_image_create_method_token (
938 mb->dynamic_image, (MonoObject *) method, opt_param_types);
942 ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file)
946 mono_image_create_pefile (mb, file);
950 ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)
954 mono_image_build_metadata (mb);
957 static MonoReflectionType *
958 type_from_name (const char *str, MonoBoolean ignoreCase)
960 MonoType *type = NULL;
961 MonoAssembly *assembly;
962 MonoTypeNameParse info;
963 char *temp_str = g_strdup (str);
964 gboolean type_resolve = FALSE;
968 /* mono_reflection_parse_type() mangles the string */
969 if (!mono_reflection_parse_type (temp_str, &info)) {
970 g_list_free (info.modifiers);
971 g_list_free (info.nested);
976 if (info.assembly.name) {
977 assembly = mono_assembly_load (&info.assembly, NULL, NULL);
979 MonoReflectionAssembly *refass;
981 refass = ves_icall_System_Reflection_Assembly_GetCallingAssembly ();
982 assembly = refass->assembly;
986 type = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);
988 if (!info.assembly.name && !type) /* try mscorlib */
989 type = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve);
991 g_list_free (info.modifiers);
992 g_list_free (info.nested);
998 return mono_type_get_object (mono_domain_get (), type);
1002 MonoReflectionType *
1003 mono_type_get (const char *str)
1005 char *copy = g_strdup (str);
1006 MonoReflectionType *type = type_from_name (copy, FALSE);
1013 static MonoReflectionType*
1014 ves_icall_type_from_name (MonoString *name,
1015 MonoBoolean throwOnError,
1016 MonoBoolean ignoreCase)
1018 char *str = mono_string_to_utf8 (name);
1019 MonoReflectionType *type;
1021 type = type_from_name (str, ignoreCase);
1025 mono_raise_exception (mono_get_exception_type_load (name));
1032 static MonoReflectionType*
1033 ves_icall_type_from_handle (MonoType *handle)
1035 MonoDomain *domain = mono_domain_get ();
1036 MonoClass *klass = mono_class_from_mono_type (handle);
1038 MONO_ARCH_SAVE_REGS;
1040 mono_class_init (klass);
1041 return mono_type_get_object (domain, handle);
1045 ves_icall_type_Equals (MonoReflectionType *type, MonoReflectionType *c)
1047 MONO_ARCH_SAVE_REGS;
1049 if (type->type && c->type)
1050 return mono_metadata_type_equal (type->type, c->type);
1055 /* System.TypeCode */
1074 TYPECODE_STRING = 18
1078 ves_icall_type_GetTypeCodeInternal (MonoReflectionType *type)
1080 int t = type->type->type;
1082 MONO_ARCH_SAVE_REGS;
1084 if (type->type->byref)
1085 return TYPECODE_OBJECT;
1089 case MONO_TYPE_VOID:
1090 return TYPECODE_OBJECT;
1091 case MONO_TYPE_BOOLEAN:
1092 return TYPECODE_BOOLEAN;
1094 return TYPECODE_BYTE;
1096 return TYPECODE_SBYTE;
1098 return TYPECODE_UINT16;
1100 return TYPECODE_INT16;
1101 case MONO_TYPE_CHAR:
1102 return TYPECODE_CHAR;
1106 return TYPECODE_OBJECT;
1108 return TYPECODE_UINT32;
1110 return TYPECODE_INT32;
1112 return TYPECODE_UINT64;
1114 return TYPECODE_INT64;
1116 return TYPECODE_SINGLE;
1118 return TYPECODE_DOUBLE;
1119 case MONO_TYPE_VALUETYPE:
1120 if (type->type->data.klass->enumtype) {
1121 t = type->type->data.klass->enum_basetype->type;
1124 MonoClass *k = type->type->data.klass;
1125 if (strcmp (k->name_space, "System") == 0) {
1126 if (strcmp (k->name, "Decimal") == 0)
1127 return TYPECODE_DECIMAL;
1128 else if (strcmp (k->name, "DateTime") == 0)
1129 return TYPECODE_DATETIME;
1132 return TYPECODE_OBJECT;
1133 case MONO_TYPE_STRING:
1134 return TYPECODE_STRING;
1135 case MONO_TYPE_SZARRAY:
1136 case MONO_TYPE_ARRAY:
1137 case MONO_TYPE_OBJECT:
1139 case MONO_TYPE_MVAR:
1140 return TYPECODE_OBJECT;
1141 case MONO_TYPE_CLASS:
1143 MonoClass *k = type->type->data.klass;
1144 if (strcmp (k->name_space, "System") == 0) {
1145 if (strcmp (k->name, "DBNull") == 0)
1146 return TYPECODE_DBNULL;
1149 return TYPECODE_OBJECT;
1150 case MONO_TYPE_GENERICINST:
1151 return TYPECODE_OBJECT;
1153 g_error ("type 0x%02x not handled in GetTypeCode()", t);
1159 ves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, MonoBoolean check_interfaces)
1165 MONO_ARCH_SAVE_REGS;
1167 g_assert (type != NULL);
1169 domain = ((MonoObject *)type)->vtable->domain;
1171 if (!c) /* FIXME: dont know what do do here */
1174 klass = mono_class_from_mono_type (type->type);
1175 klassc = mono_class_from_mono_type (c->type);
1177 if (type->type->byref)
1178 return klassc == mono_defaults.object_class;
1180 return mono_class_is_subclass_of (klass, klassc, check_interfaces);
1184 ves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)
1190 MONO_ARCH_SAVE_REGS;
1192 g_assert (type != NULL);
1194 domain = ((MonoObject *)type)->vtable->domain;
1196 klass = mono_class_from_mono_type (type->type);
1197 klassc = mono_class_from_mono_type (c->type);
1199 if (type->type->byref && !c->type->byref)
1202 return mono_class_is_assignable_from (klass, klassc);
1206 ves_icall_type_IsInstanceOfType (MonoReflectionType *type, MonoObject *obj)
1208 MonoClass *klass = mono_class_from_mono_type (type->type);
1209 return mono_object_isinst (obj, klass) != NULL;
1213 ves_icall_get_attributes (MonoReflectionType *type)
1215 MonoClass *klass = mono_class_from_mono_type (type->type);
1217 MONO_ARCH_SAVE_REGS;
1219 return klass->flags;
1222 static MonoReflectionMarshal*
1223 ves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal (MonoReflectionField *field)
1225 MonoClass *klass = field->field->parent;
1226 MonoMarshalType *info;
1229 if (klass->generic_container ||
1230 (klass->generic_class && klass->generic_class->inst->is_open))
1233 info = mono_marshal_load_type_info (klass);
1235 for (i = 0; i < info->num_fields; ++i) {
1236 if (info->fields [i].field == field->field) {
1237 if (!info->fields [i].mspec)
1240 return mono_reflection_marshal_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);
1247 static MonoReflectionField*
1248 ves_icall_System_Reflection_FieldInfo_internal_from_handle (MonoClassField *handle)
1250 MONO_ARCH_SAVE_REGS;
1254 return mono_field_get_object (mono_domain_get (), handle->parent, handle);
1258 ves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info)
1260 MonoDomain *domain = mono_domain_get ();
1261 MonoMethodSignature* sig;
1262 MONO_ARCH_SAVE_REGS;
1264 if (method->is_inflated)
1265 method = mono_get_inflated_method (method);
1267 sig = mono_method_signature (method);
1269 info->parent = mono_type_get_object (domain, &method->klass->byval_arg);
1270 info->ret = mono_type_get_object (domain, sig->ret);
1271 info->attrs = method->flags;
1272 info->implattrs = method->iflags;
1273 if (sig->call_convention == MONO_CALL_DEFAULT)
1276 if (sig->call_convention == MONO_CALL_VARARG)
1281 info->callconv |= (sig->hasthis << 5) | (sig->explicit_this << 6);
1285 ves_icall_get_parameter_info (MonoMethod *method)
1287 MonoDomain *domain = mono_domain_get ();
1289 MONO_ARCH_SAVE_REGS;
1291 if (method->is_inflated)
1292 method = mono_get_inflated_method (method);
1294 return mono_param_get_objects (domain, method);
1298 ves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)
1300 return field->field->offset - sizeof (MonoObject);
1303 static MonoReflectionType*
1304 ves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)
1307 MONO_ARCH_SAVE_REGS;
1309 parent = declaring? field->field->parent: field->klass;
1311 return mono_type_get_object (mono_object_domain (field), &parent->byval_arg);
1315 ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *obj)
1318 MonoClassField *cf = field->field;
1321 MonoDomain *domain = mono_object_domain (field);
1323 gboolean is_static = FALSE;
1324 gboolean is_ref = FALSE;
1326 MONO_ARCH_SAVE_REGS;
1328 if (field->klass->image->assembly->ref_only)
1329 mono_raise_exception (mono_get_exception_invalid_operation (
1330 "It is illegal to get the value on a field on a type loaded using the ReflectionOnly methods."));
1332 mono_class_init (field->klass);
1334 switch (cf->type->type) {
1335 case MONO_TYPE_STRING:
1336 case MONO_TYPE_OBJECT:
1337 case MONO_TYPE_CLASS:
1338 case MONO_TYPE_ARRAY:
1339 case MONO_TYPE_SZARRAY:
1344 case MONO_TYPE_BOOLEAN:
1347 case MONO_TYPE_CHAR:
1356 case MONO_TYPE_VALUETYPE:
1357 is_ref = cf->type->byref;
1360 g_error ("type 0x%x not handled in "
1361 "ves_icall_Monofield_GetValue", cf->type->type);
1366 if (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {
1368 vtable = mono_class_vtable (domain, field->klass);
1369 if (!vtable->initialized && !(cf->type->attrs & FIELD_ATTRIBUTE_LITERAL))
1370 mono_runtime_class_init (vtable);
1375 mono_field_static_get_value (vtable, cf, &o);
1377 mono_field_get_value (obj, cf, &o);
1382 /* boxed value type */
1383 klass = mono_class_from_mono_type (cf->type);
1384 o = mono_object_new (domain, klass);
1385 v = ((gchar *) o) + sizeof (MonoObject);
1387 mono_field_static_get_value (vtable, cf, v);
1389 mono_field_get_value (obj, cf, v);
1396 ves_icall_FieldInfo_SetValueInternal (MonoReflectionField *field, MonoObject *obj, MonoObject *value)
1398 MonoClassField *cf = field->field;
1401 MONO_ARCH_SAVE_REGS;
1403 if (field->klass->image->assembly->ref_only)
1404 mono_raise_exception (mono_get_exception_invalid_operation (
1405 "It is illegal to set the value on a field on a type loaded using the ReflectionOnly methods."));
1407 v = (gchar *) value;
1408 if (!cf->type->byref) {
1409 switch (cf->type->type) {
1412 case MONO_TYPE_BOOLEAN:
1415 case MONO_TYPE_CHAR:
1424 case MONO_TYPE_VALUETYPE:
1426 v += sizeof (MonoObject);
1428 case MONO_TYPE_STRING:
1429 case MONO_TYPE_OBJECT:
1430 case MONO_TYPE_CLASS:
1431 case MONO_TYPE_ARRAY:
1432 case MONO_TYPE_SZARRAY:
1436 g_error ("type 0x%x not handled in "
1437 "ves_icall_FieldInfo_SetValueInternal", cf->type->type);
1442 if (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {
1443 MonoVTable *vtable = mono_class_vtable (mono_object_domain (field), field->klass);
1444 if (!vtable->initialized)
1445 mono_runtime_class_init (vtable);
1446 mono_field_static_set_value (vtable, cf, v);
1448 mono_field_set_value (obj, cf, v);
1452 static MonoReflectionField*
1453 ves_icall_MonoField_Mono_GetGenericFieldDefinition (MonoReflectionField *field)
1455 MONO_ARCH_SAVE_REGS;
1457 if (field->field->generic_info && field->field->generic_info->reflection_info)
1458 return field->field->generic_info->reflection_info;
1463 static MonoReflectionType*
1464 ves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)
1466 MonoMethod *method = mono_get_inflated_method (rmethod->method.method);
1468 return mono_type_get_object (mono_object_domain (rmethod), &method->klass->byval_arg);
1471 /* From MonoProperty.cs */
1473 PInfo_Attributes = 1,
1474 PInfo_GetMethod = 1 << 1,
1475 PInfo_SetMethod = 1 << 2,
1476 PInfo_ReflectedType = 1 << 3,
1477 PInfo_DeclaringType = 1 << 4,
1482 ves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)
1484 MonoDomain *domain = mono_object_domain (property);
1486 MONO_ARCH_SAVE_REGS;
1488 if ((req_info & PInfo_ReflectedType) != 0)
1489 info->parent = mono_type_get_object (domain, &property->klass->byval_arg);
1490 else if ((req_info & PInfo_DeclaringType) != 0)
1491 info->parent = mono_type_get_object (domain, &property->property->parent->byval_arg);
1493 if ((req_info & PInfo_Name) != 0)
1494 info->name = mono_string_new (domain, property->property->name);
1496 if ((req_info & PInfo_Attributes) != 0)
1497 info->attrs = property->property->attrs;
1499 if ((req_info & PInfo_GetMethod) != 0)
1500 info->get = property->property->get ?
1501 mono_method_get_object (domain, property->property->get, NULL): NULL;
1503 if ((req_info & PInfo_SetMethod) != 0)
1504 info->set = property->property->set ?
1505 mono_method_get_object (domain, property->property->set, NULL): NULL;
1507 * There may be other methods defined for properties, though, it seems they are not exposed
1508 * in the reflection API
1513 ves_icall_get_event_info (MonoReflectionEvent *event, MonoEventInfo *info)
1515 MonoDomain *domain = mono_object_domain (event);
1517 MONO_ARCH_SAVE_REGS;
1519 info->declaring_type = mono_type_get_object (domain, &event->klass->byval_arg);
1520 info->reflected_type = mono_type_get_object (domain, &event->event->parent->byval_arg);
1522 info->name = mono_string_new (domain, event->event->name);
1523 info->attrs = event->event->attrs;
1524 info->add_method = event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL;
1525 info->remove_method = event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL;
1526 info->raise_method = event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL;
1528 if (event->event->other) {
1530 while (event->event->other [n])
1532 info->other_methods = mono_array_new (domain, mono_defaults.method_info_class, n);
1534 for (i = 0; i < n; i++)
1535 mono_array_set (info->other_methods, gpointer, i,
1536 mono_method_get_object (domain, event->event->other [i], NULL));
1541 ves_icall_Type_GetInterfaces (MonoReflectionType* type)
1543 MonoDomain *domain = mono_object_domain (type);
1545 GPtrArray *ifaces = NULL;
1547 MonoClass *class = mono_class_from_mono_type (type->type);
1549 MonoBitSet *slots = mono_bitset_new (class->max_interface_id + 1, 0);
1551 MONO_ARCH_SAVE_REGS;
1554 /* GetInterfaces() returns an empty array in MS.NET (this may be a bug) */
1555 mono_bitset_free (slots);
1556 return mono_array_new (domain, mono_defaults.monotype_class, 0);
1559 for (parent = class; parent; parent = parent->parent) {
1560 GPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent);
1562 for (i = 0; i < tmp_ifaces->len; ++i) {
1563 MonoClass *ic = g_ptr_array_index (tmp_ifaces, i);
1565 if (mono_bitset_test (slots, ic->interface_id))
1568 mono_bitset_set (slots, ic->interface_id);
1570 ifaces = g_ptr_array_new ();
1571 g_ptr_array_add (ifaces, ic);
1573 g_ptr_array_free (tmp_ifaces, TRUE);
1576 mono_bitset_free (slots);
1579 return mono_array_new (domain, mono_defaults.monotype_class, 0);
1581 intf = mono_array_new (domain, mono_defaults.monotype_class, ifaces->len);
1582 for (i = 0; i < ifaces->len; ++i) {
1583 MonoClass *ic = g_ptr_array_index (ifaces, i);
1585 mono_array_set (intf, gpointer, i,
1586 mono_type_get_object (domain, &ic->byval_arg));
1588 g_ptr_array_free (ifaces, TRUE);
1594 ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType *iface, MonoArray **targets, MonoArray **methods)
1596 MonoClass *class = mono_class_from_mono_type (type->type);
1597 MonoClass *iclass = mono_class_from_mono_type (iface->type);
1598 MonoReflectionMethod *member;
1601 int i = 0, len, ioffset;
1604 MONO_ARCH_SAVE_REGS;
1606 /* type doesn't implement iface: the exception is thrown in managed code */
1607 if ((iclass->interface_id > class->max_interface_id) || !class->interface_offsets [iclass->interface_id])
1610 len = mono_class_num_methods (iclass);
1611 ioffset = class->interface_offsets [iclass->interface_id];
1612 domain = mono_object_domain (type);
1613 *targets = mono_array_new (domain, mono_defaults.method_info_class, len);
1614 *methods = mono_array_new (domain, mono_defaults.method_info_class, len);
1617 while ((method = mono_class_get_methods (iclass, &iter))) {
1618 member = mono_method_get_object (domain, method, iclass);
1619 mono_array_set (*methods, gpointer, i, member);
1620 member = mono_method_get_object (domain, class->vtable [i + ioffset], class);
1621 mono_array_set (*targets, gpointer, i, member);
1628 ves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)
1630 MonoClass *klass = mono_class_from_mono_type (type->type);
1632 g_assert (!klass->image->dynamic);
1634 mono_metadata_packing_from_typedef (klass->image, klass->type_token, packing, size);
1637 static MonoReflectionType*
1638 ves_icall_MonoType_GetElementType (MonoReflectionType *type)
1640 MonoClass *class = mono_class_from_mono_type (type->type);
1642 MONO_ARCH_SAVE_REGS;
1644 // GelElementType should only return a type for:
1645 // Array Pointer PassedByRef
1646 if (type->type->byref)
1647 return mono_type_get_object (mono_object_domain (type), &class->byval_arg);
1648 if (class->enumtype && class->enum_basetype) /* types that are modifierd typebuilkders may not have enum_basetype set */
1649 return mono_type_get_object (mono_object_domain (type), class->enum_basetype);
1650 else if (class->element_class && MONO_CLASS_IS_ARRAY (class))
1651 return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
1652 else if (class->element_class && type->type->type == MONO_TYPE_PTR)
1653 return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
1658 static MonoReflectionType*
1659 ves_icall_get_type_parent (MonoReflectionType *type)
1661 MonoClass *class = mono_class_from_mono_type (type->type);
1663 MONO_ARCH_SAVE_REGS;
1665 return class->parent ? mono_type_get_object (mono_object_domain (type), &class->parent->byval_arg): NULL;
1669 ves_icall_type_ispointer (MonoReflectionType *type)
1671 MONO_ARCH_SAVE_REGS;
1673 return type->type->type == MONO_TYPE_PTR;
1677 ves_icall_type_isprimitive (MonoReflectionType *type)
1679 MONO_ARCH_SAVE_REGS;
1681 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)));
1685 ves_icall_type_isbyref (MonoReflectionType *type)
1687 MONO_ARCH_SAVE_REGS;
1689 return type->type->byref;
1692 static MonoReflectionModule*
1693 ves_icall_MonoType_get_Module (MonoReflectionType *type)
1695 MonoClass *class = mono_class_from_mono_type (type->type);
1697 MONO_ARCH_SAVE_REGS;
1699 return mono_module_get_object (mono_object_domain (type), class->image);
1702 static MonoReflectionAssembly*
1703 ves_icall_MonoType_get_Assembly (MonoReflectionType *type)
1705 MonoDomain *domain = mono_domain_get ();
1706 MonoClass *class = mono_class_from_mono_type (type->type);
1708 MONO_ARCH_SAVE_REGS;
1710 return mono_assembly_get_object (domain, class->image->assembly);
1713 static MonoReflectionType*
1714 ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)
1716 MonoDomain *domain = mono_domain_get ();
1717 MonoClass *class = mono_class_from_mono_type (type->type);
1719 MONO_ARCH_SAVE_REGS;
1721 return class->nested_in ? mono_type_get_object (domain, &class->nested_in->byval_arg) : NULL;
1724 static MonoReflectionType*
1725 ves_icall_MonoType_get_UnderlyingSystemType (MonoReflectionType *type)
1727 MonoDomain *domain = mono_domain_get ();
1728 MonoClass *class = mono_class_from_mono_type (type->type);
1730 MONO_ARCH_SAVE_REGS;
1732 if (class->enumtype && class->enum_basetype) /* types that are modified typebuilders may not have enum_basetype set */
1733 return mono_type_get_object (domain, class->enum_basetype);
1734 else if (class->element_class)
1735 return mono_type_get_object (domain, &class->element_class->byval_arg);
1741 ves_icall_MonoType_get_Name (MonoReflectionType *type)
1743 MonoDomain *domain = mono_domain_get ();
1744 MonoClass *class = mono_class_from_mono_type (type->type);
1746 MONO_ARCH_SAVE_REGS;
1748 return mono_string_new (domain, class->name);
1752 ves_icall_MonoType_get_Namespace (MonoReflectionType *type)
1754 MonoDomain *domain = mono_domain_get ();
1755 MonoClass *class = mono_class_from_mono_type (type->type);
1757 MONO_ARCH_SAVE_REGS;
1759 while (class->nested_in)
1760 class = class->nested_in;
1762 if (class->name_space [0] == '\0')
1765 return mono_string_new (domain, class->name_space);
1769 ves_icall_MonoType_GetArrayRank (MonoReflectionType *type)
1771 MonoClass *class = mono_class_from_mono_type (type->type);
1773 MONO_ARCH_SAVE_REGS;
1779 ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)
1782 MonoClass *klass, *pklass;
1784 MONO_ARCH_SAVE_REGS;
1786 klass = mono_class_from_mono_type (type->type);
1788 if (klass->generic_container) {
1789 MonoGenericContainer *container = klass->generic_container;
1790 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, container->type_argc);
1791 for (i = 0; i < container->type_argc; ++i) {
1792 pklass = mono_class_from_generic_parameter (&container->type_params [i], klass->image, FALSE);
1793 mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), &pklass->byval_arg));
1795 } else if (klass->generic_class) {
1796 MonoGenericInst *inst = klass->generic_class->inst;
1797 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, inst->type_argc);
1798 for (i = 0; i < inst->type_argc; ++i) {
1799 mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), inst->type_argv [i]));
1802 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, 0);
1808 ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)
1811 MONO_ARCH_SAVE_REGS;
1813 klass = mono_class_from_mono_type (type->type);
1815 return klass->generic_container != NULL;
1818 static MonoReflectionType*
1819 ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
1822 MONO_ARCH_SAVE_REGS;
1824 klass = mono_class_from_mono_type (type->type);
1825 if (klass->generic_container) {
1826 return type; /* check this one */
1828 if (klass->generic_class) {
1829 MonoClass *generic_class = klass->generic_class->container_class;
1831 if (generic_class->wastypebuilder && generic_class->reflection_info)
1832 return generic_class->reflection_info;
1834 return mono_type_get_object (mono_object_domain (type), &generic_class->byval_arg);
1839 static MonoReflectionType*
1840 ves_icall_Type_BindGenericParameters (MonoReflectionType *type, MonoArray *type_array)
1842 MonoType *geninst, **types;
1845 MONO_ARCH_SAVE_REGS;
1847 count = mono_array_length (type_array);
1848 types = g_new0 (MonoType *, count);
1850 for (i = 0; i < count; i++) {
1851 MonoReflectionType *t = mono_array_get (type_array, gpointer, i);
1852 types [i] = t->type;
1855 geninst = mono_reflection_bind_generic_parameters (type, count, types);
1857 return mono_type_get_object (mono_object_domain (type), geninst);
1861 ves_icall_Type_get_IsGenericInstance (MonoReflectionType *type)
1864 MONO_ARCH_SAVE_REGS;
1866 klass = mono_class_from_mono_type (type->type);
1867 return klass->generic_class != NULL;
1871 ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)
1873 MONO_ARCH_SAVE_REGS;
1875 if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
1876 return type->type->data.generic_param->num;
1880 static GenericParameterAttributes
1881 ves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)
1883 MONO_ARCH_SAVE_REGS;
1884 return type->type->data.generic_param->flags;
1888 ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)
1890 MonoGenericParam *param;
1896 MONO_ARCH_SAVE_REGS;
1898 domain = mono_object_domain (type);
1899 param = type->type->data.generic_param;
1900 for (count = 0, ptr = param->constraints; ptr && *ptr; ptr++, count++)
1903 res = mono_array_new (domain, mono_defaults.monotype_class, count);
1904 for (i = 0; i < count; i++)
1905 mono_array_set (res, gpointer, i,
1906 mono_type_get_object (domain, ¶m->constraints [i]->byval_arg));
1913 ves_icall_MonoType_get_HasGenericArguments (MonoReflectionType *type)
1916 MONO_ARCH_SAVE_REGS;
1918 klass = mono_class_from_mono_type (type->type);
1919 if (klass->generic_container || klass->generic_class)
1925 ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)
1927 MONO_ARCH_SAVE_REGS;
1929 if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
1935 ves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)
1937 MONO_ARCH_SAVE_REGS;
1939 if (tb->type.type->type == MONO_TYPE_VAR || tb->type.type->type == MONO_TYPE_MVAR)
1945 ves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype,
1946 MonoReflectionType *t)
1948 enumtype->type = t->type;
1951 static MonoReflectionType*
1952 ves_icall_MonoGenericClass_GetParentType (MonoReflectionGenericClass *type)
1954 MonoGenericClass *gclass;
1957 MONO_ARCH_SAVE_REGS;
1959 gclass = type->type.type->data.generic_class;
1960 if (!gclass || !gclass->parent || (gclass->parent->type != MONO_TYPE_GENERICINST))
1963 klass = mono_class_from_mono_type (gclass->parent);
1964 if (!klass->generic_class && !klass->generic_container)
1967 if (!klass->generic_class->is_dynamic)
1970 return mono_type_get_object (mono_object_domain (type), gclass->parent);
1974 ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type)
1976 static MonoClass *System_Reflection_MonoGenericClass;
1977 MonoGenericClass *gclass;
1983 MONO_ARCH_SAVE_REGS;
1985 if (!System_Reflection_MonoGenericClass) {
1986 System_Reflection_MonoGenericClass = mono_class_from_name (
1987 mono_defaults.corlib, "System.Reflection", "MonoGenericClass");
1988 g_assert (System_Reflection_MonoGenericClass);
1991 domain = mono_object_domain (type);
1993 gclass = type->type.type->data.generic_class;
1994 if (!gclass || !gclass->ifaces)
1995 return mono_array_new (domain, System_Reflection_MonoGenericClass, 0);
1997 klass = gclass->container_class;
1999 res = mono_array_new (domain, System_Reflection_MonoGenericClass, gclass->count_ifaces);
2001 for (i = 0; i < gclass->count_ifaces; i++) {
2002 MonoReflectionType *iface = mono_type_get_object (domain, gclass->ifaces [i]);
2004 mono_array_set (res, gpointer, i, iface);
2011 static MonoReflectionMethod*
2012 ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod (MonoReflectionGenericClass *type,
2013 MonoReflectionMethod* generic)
2015 MonoGenericClass *gclass;
2016 MonoDynamicGenericClass *dgclass;
2020 MONO_ARCH_SAVE_REGS;
2022 gclass = type->type.type->data.generic_class;
2023 g_assert (gclass->is_dynamic);
2025 dgclass = (MonoDynamicGenericClass *) gclass;
2027 domain = mono_object_domain (type);
2029 for (i = 0; i < dgclass->count_methods; i++)
2030 if (generic->method->token == dgclass->methods [i]->token)
2031 return mono_method_get_object (domain, dgclass->methods [i], NULL);
2036 static MonoReflectionMethod*
2037 ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor (MonoReflectionGenericClass *type,
2038 MonoReflectionMethod* generic)
2040 MonoGenericClass *gclass;
2041 MonoDynamicGenericClass *dgclass;
2045 MONO_ARCH_SAVE_REGS;
2047 gclass = type->type.type->data.generic_class;
2048 g_assert (gclass->is_dynamic);
2050 dgclass = (MonoDynamicGenericClass *) gclass;
2052 domain = mono_object_domain (type);
2054 for (i = 0; i < dgclass->count_ctors; i++)
2055 if (generic->method->token == dgclass->ctors [i]->token)
2056 return mono_method_get_object (domain, dgclass->ctors [i], NULL);
2062 static MonoReflectionField*
2063 ves_icall_MonoGenericClass_GetCorrespondingInflatedField (MonoReflectionGenericClass *type,
2064 MonoString* generic_name)
2066 MonoGenericClass *gclass;
2067 MonoDynamicGenericClass *dgclass;
2069 MonoClass *refclass;
2070 char *utf8_name = mono_string_to_utf8 (generic_name);
2073 MONO_ARCH_SAVE_REGS;
2075 gclass = type->type.type->data.generic_class;
2076 g_assert (gclass->is_dynamic);
2078 dgclass = (MonoDynamicGenericClass *) gclass;
2080 refclass = mono_class_from_mono_type (type->type.type);
2082 domain = mono_object_domain (type);
2084 for (i = 0; i < dgclass->count_fields; i++)
2085 if (strcmp (utf8_name, dgclass->fields [i].name) == 0) {
2087 return mono_field_get_object (domain, refclass, &dgclass->fields [i]);
2096 static MonoReflectionMethod*
2097 ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type,
2098 MonoReflectionMethod* generic)
2105 MONO_ARCH_SAVE_REGS;
2107 domain = ((MonoObject *)type)->vtable->domain;
2109 klass = mono_class_from_mono_type (type->type);
2112 while ((method = mono_class_get_methods (klass, &iter))) {
2113 if (method->token == generic->method->token)
2114 return mono_method_get_object (domain, method, klass);
2121 ves_icall_MonoGenericClass_GetMethods (MonoReflectionGenericClass *type,
2122 MonoReflectionType *reflected_type)
2124 MonoGenericClass *gclass;
2125 MonoDynamicGenericClass *dgclass;
2127 MonoClass *refclass;
2131 MONO_ARCH_SAVE_REGS;
2133 gclass = type->type.type->data.generic_class;
2134 g_assert (gclass->is_dynamic);
2135 dgclass = (MonoDynamicGenericClass *) gclass;
2137 refclass = mono_class_from_mono_type (reflected_type->type);
2139 domain = mono_object_domain (type);
2140 res = mono_array_new (domain, mono_defaults.method_info_class, dgclass->count_methods);
2142 for (i = 0; i < dgclass->count_methods; i++)
2143 mono_array_set (res, gpointer, i,
2144 mono_method_get_object (domain, dgclass->methods [i], refclass));
2150 ves_icall_MonoGenericClass_GetConstructors (MonoReflectionGenericClass *type,
2151 MonoReflectionType *reflected_type)
2153 static MonoClass *System_Reflection_ConstructorInfo;
2154 MonoGenericClass *gclass;
2155 MonoDynamicGenericClass *dgclass;
2157 MonoClass *refclass;
2161 MONO_ARCH_SAVE_REGS;
2163 if (!System_Reflection_ConstructorInfo)
2164 System_Reflection_ConstructorInfo = mono_class_from_name (
2165 mono_defaults.corlib, "System.Reflection", "ConstructorInfo");
2167 gclass = type->type.type->data.generic_class;
2168 g_assert (gclass->is_dynamic);
2169 dgclass = (MonoDynamicGenericClass *) gclass;
2171 refclass = mono_class_from_mono_type (reflected_type->type);
2173 domain = mono_object_domain (type);
2174 res = mono_array_new (domain, System_Reflection_ConstructorInfo, dgclass->count_ctors);
2176 for (i = 0; i < dgclass->count_ctors; i++)
2177 mono_array_set (res, gpointer, i,
2178 mono_method_get_object (domain, dgclass->ctors [i], refclass));
2184 ves_icall_MonoGenericClass_GetFields (MonoReflectionGenericClass *type,
2185 MonoReflectionType *reflected_type)
2187 MonoGenericClass *gclass;
2188 MonoDynamicGenericClass *dgclass;
2190 MonoClass *refclass;
2194 MONO_ARCH_SAVE_REGS;
2196 gclass = type->type.type->data.generic_class;
2197 g_assert (gclass->is_dynamic);
2198 dgclass = (MonoDynamicGenericClass *) gclass;
2200 refclass = mono_class_from_mono_type (reflected_type->type);
2202 domain = mono_object_domain (type);
2203 res = mono_array_new (domain, mono_defaults.field_info_class, dgclass->count_fields);
2205 for (i = 0; i < dgclass->count_fields; i++)
2206 mono_array_set (res, gpointer, i,
2207 mono_field_get_object (domain, refclass, &dgclass->fields [i]));
2213 ves_icall_MonoGenericClass_GetProperties (MonoReflectionGenericClass *type,
2214 MonoReflectionType *reflected_type)
2216 static MonoClass *System_Reflection_PropertyInfo;
2217 MonoGenericClass *gclass;
2218 MonoDynamicGenericClass *dgclass;
2220 MonoClass *refclass;
2224 MONO_ARCH_SAVE_REGS;
2226 if (!System_Reflection_PropertyInfo)
2227 System_Reflection_PropertyInfo = mono_class_from_name (
2228 mono_defaults.corlib, "System.Reflection", "PropertyInfo");
2230 gclass = type->type.type->data.generic_class;
2231 g_assert (gclass->is_dynamic);
2232 dgclass = (MonoDynamicGenericClass *) gclass;
2234 refclass = mono_class_from_mono_type (reflected_type->type);
2236 domain = mono_object_domain (type);
2237 res = mono_array_new (domain, System_Reflection_PropertyInfo, dgclass->count_properties);
2239 for (i = 0; i < dgclass->count_properties; i++)
2240 mono_array_set (res, gpointer, i,
2241 mono_property_get_object (domain, refclass, &dgclass->properties [i]));
2247 ves_icall_MonoGenericClass_GetEvents (MonoReflectionGenericClass *type,
2248 MonoReflectionType *reflected_type)
2250 static MonoClass *System_Reflection_EventInfo;
2251 MonoGenericClass *gclass;
2252 MonoDynamicGenericClass *dgclass;
2254 MonoClass *refclass;
2258 MONO_ARCH_SAVE_REGS;
2260 if (!System_Reflection_EventInfo)
2261 System_Reflection_EventInfo = mono_class_from_name (
2262 mono_defaults.corlib, "System.Reflection", "EventInfo");
2264 gclass = type->type.type->data.generic_class;
2265 g_assert (gclass->is_dynamic);
2266 dgclass = (MonoDynamicGenericClass *) gclass;
2268 refclass = mono_class_from_mono_type (reflected_type->type);
2270 domain = mono_object_domain (type);
2271 res = mono_array_new (domain, System_Reflection_EventInfo, dgclass->count_events);
2273 for (i = 0; i < dgclass->count_events; i++)
2274 mono_array_set (res, gpointer, i,
2275 mono_event_get_object (domain, refclass, &dgclass->events [i]));
2280 static MonoReflectionMethod *
2281 ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *type)
2286 MONO_ARCH_SAVE_REGS;
2288 method = type->type->data.generic_param->method;
2292 klass = mono_class_from_mono_type (type->type);
2293 return mono_method_get_object (mono_object_domain (type), method, klass);
2296 static MonoReflectionDllImportAttribute*
2297 ves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)
2299 static MonoClass *DllImportAttributeClass = NULL;
2300 MonoDomain *domain = mono_domain_get ();
2301 MonoReflectionDllImportAttribute *attr;
2302 MonoImage *image = method->klass->image;
2303 MonoMethodPInvoke *piinfo = (MonoMethodPInvoke *)method;
2304 MonoTableInfo *tables = image->tables;
2305 MonoTableInfo *im = &tables [MONO_TABLE_IMPLMAP];
2306 MonoTableInfo *mr = &tables [MONO_TABLE_MODULEREF];
2307 guint32 im_cols [MONO_IMPLMAP_SIZE];
2308 guint32 scope_token;
2309 const char *import = NULL;
2310 const char *scope = NULL;
2313 if (!method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)
2316 if (!DllImportAttributeClass) {
2317 DllImportAttributeClass =
2318 mono_class_from_name (mono_defaults.corlib,
2319 "System.Runtime.InteropServices", "DllImportAttribute");
2320 g_assert (DllImportAttributeClass);
2323 if (method->klass->image->dynamic) {
2324 MonoReflectionMethodAux *method_aux =
2325 g_hash_table_lookup (
2326 ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method);
2328 import = method_aux->dllentry;
2329 scope = method_aux->dll;
2333 if (piinfo->implmap_idx) {
2334 mono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE);
2336 piinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS];
2337 import = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]);
2338 scope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME);
2339 scope = mono_metadata_string_heap (image, scope_token);
2342 flags = piinfo->piflags;
2344 attr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);
2346 attr->dll = mono_string_new (domain, scope);
2347 attr->entry_point = mono_string_new (domain, import);
2348 attr->call_conv = (flags & 0x700) >> 8;
2349 attr->charset = ((flags & 0x6) >> 1) + 1;
2350 if (attr->charset == 1)
2352 attr->exact_spelling = (flags & 0x1) != 0;
2353 attr->set_last_error = (flags & 0x40) != 0;
2354 attr->best_fit_mapping = (flags & 0x30) == 0x10;
2355 attr->throw_on_unmappable = (flags & 0x3000) == 0x1000;
2356 attr->preserve_sig = FALSE;
2361 static MonoReflectionMethod *
2362 ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
2364 MonoMethodInflated *imethod;
2366 MONO_ARCH_SAVE_REGS;
2368 if (!method->method->is_inflated) {
2369 if (mono_method_signature (method->method)->generic_param_count)
2375 imethod = (MonoMethodInflated *) method->method;
2376 if (imethod->context->gmethod && imethod->context->gmethod->reflection_info)
2377 return imethod->context->gmethod->reflection_info;
2379 return mono_method_get_object (
2380 mono_object_domain (method), imethod->declaring, NULL);
2384 ves_icall_MonoMethod_get_HasGenericParameters (MonoReflectionMethod *method)
2386 MONO_ARCH_SAVE_REGS;
2388 if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
2389 (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
2392 return mono_method_signature (method->method)->generic_param_count != 0;
2396 ves_icall_MonoMethod_get_Mono_IsInflatedMethod (MonoReflectionMethod *method)
2398 MONO_ARCH_SAVE_REGS;
2400 if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
2401 (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
2404 return method->method->is_inflated;
2408 ves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method)
2410 MONO_ARCH_SAVE_REGS;
2412 if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
2413 (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
2416 return mono_method_signature (method->method)->generic_param_count != 0;
2420 ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
2424 MonoMethodNormal *mn;
2426 MONO_ARCH_SAVE_REGS;
2428 domain = mono_object_domain (method);
2430 if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
2431 (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
2432 return mono_array_new (domain, mono_defaults.monotype_class, 0);
2434 if (method->method->is_inflated) {
2435 MonoMethodInflated *imethod = (MonoMethodInflated *) method->method;
2436 MonoGenericMethod *gmethod = imethod->context->gmethod;
2439 count = gmethod->inst->type_argc;
2440 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2442 for (i = 0; i < count; i++) {
2443 MonoType *t = gmethod->inst->type_argv [i];
2445 res, gpointer, i, mono_type_get_object (domain, t));
2452 mn = (MonoMethodNormal *) method->method;
2453 count = mono_method_signature (method->method)->generic_param_count;
2454 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2456 for (i = 0; i < count; i++) {
2457 MonoGenericParam *param = &mn->generic_container->type_params [i];
2458 MonoClass *pklass = mono_class_from_generic_parameter (
2459 param, method->method->klass->image, TRUE);
2460 mono_array_set (res, gpointer, i,
2461 mono_type_get_object (domain, &pklass->byval_arg));
2468 ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params)
2471 * Invoke from reflection is supposed to always be a virtual call (the API
2472 * is stupid), mono_runtime_invoke_*() calls the provided method, allowing
2473 * greater flexibility.
2475 MonoMethod *m = method->method;
2479 MONO_ARCH_SAVE_REGS;
2481 if (!(m->flags & METHOD_ATTRIBUTE_STATIC)) {
2483 if (!mono_object_isinst (this, m->klass))
2484 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetException"));
2485 m = mono_object_get_virtual_method (this, m);
2486 /* must pass the pointer to the value for valuetype methods */
2487 if (m->klass->valuetype)
2488 obj = mono_object_unbox (this);
2489 } else if (strcmp (m->name, ".ctor") && !m->wrapper_type)
2490 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetException"));
2493 pcount = params? mono_array_length (params): 0;
2494 if (pcount != mono_method_signature (m)->param_count)
2495 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetParameterCountException"));
2497 if ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, ".ctor"))
2498 mono_raise_exception (mono_exception_from_name_msg (mono_defaults.corlib, "System", "MethodAccessException", "Cannot invoke constructor of an abstract class."));
2500 if (m->klass->image->assembly->ref_only)
2501 mono_raise_exception (mono_get_exception_invalid_operation ("It is illegal to invoke a method on a type loaded using the ReflectionOnly api."));
2503 if (m->klass->rank && !strcmp (m->name, ".ctor")) {
2506 guint32 *lower_bounds;
2507 pcount = mono_array_length (params);
2508 lengths = alloca (sizeof (guint32) * pcount);
2509 for (i = 0; i < pcount; ++i)
2510 lengths [i] = *(gint32*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));
2512 if (m->klass->rank == pcount) {
2513 /* Only lengths provided. */
2514 lower_bounds = NULL;
2516 g_assert (pcount == (m->klass->rank * 2));
2517 /* lower bounds are first. */
2518 lower_bounds = lengths;
2519 lengths += m->klass->rank;
2522 return (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, lower_bounds);
2524 return mono_runtime_invoke_array (m, obj, params, NULL);
2528 ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoArray **outArgs)
2530 MonoDomain *domain = mono_object_domain (method);
2531 MonoMethod *m = method->method;
2532 MonoMethodSignature *sig = mono_method_signature (m);
2533 MonoArray *out_args;
2535 int i, j, outarg_count = 0;
2537 MONO_ARCH_SAVE_REGS;
2539 if (m->klass == mono_defaults.object_class) {
2541 if (!strcmp (m->name, "FieldGetter")) {
2542 MonoClass *k = this->vtable->klass;
2546 /* If this is a proxy, then it must be a CBO */
2547 if (k == mono_defaults.transparent_proxy_class) {
2548 MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
2549 this = tp->rp->unwrapped_server;
2551 k = this->vtable->klass;
2554 name = mono_array_get (params, MonoString *, 1);
2555 str = mono_string_to_utf8 (name);
2558 MonoClassField* field = mono_class_get_field_from_name (k, str);
2560 MonoClass *field_klass = mono_class_from_mono_type (field->type);
2561 if (field_klass->valuetype)
2562 result = mono_value_box (domain, field_klass, (char *)this + field->offset);
2564 result = *((gpointer *)((char *)this + field->offset));
2567 out_args = mono_array_new (domain, mono_defaults.object_class, 1);
2568 *outArgs = out_args;
2569 mono_array_set (out_args, gpointer, 0, result);
2577 g_assert_not_reached ();
2579 } else if (!strcmp (m->name, "FieldSetter")) {
2580 MonoClass *k = this->vtable->klass;
2585 /* If this is a proxy, then it must be a CBO */
2586 if (k == mono_defaults.transparent_proxy_class) {
2587 MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
2588 this = tp->rp->unwrapped_server;
2590 k = this->vtable->klass;
2593 name = mono_array_get (params, MonoString *, 1);
2594 str = mono_string_to_utf8 (name);
2597 MonoClassField* field = mono_class_get_field_from_name (k, str);
2599 MonoClass *field_klass = mono_class_from_mono_type (field->type);
2600 MonoObject *val = mono_array_get (params, gpointer, 2);
2602 if (field_klass->valuetype) {
2603 size = mono_type_size (field->type, &align);
2604 memcpy ((char *)this + field->offset,
2605 ((char *)val) + sizeof (MonoObject), size);
2607 *(MonoObject**)((char *)this + field->offset) = val;
2609 out_args = mono_array_new (domain, mono_defaults.object_class, 0);
2610 *outArgs = out_args;
2620 g_assert_not_reached ();
2625 for (i = 0; i < mono_array_length (params); i++) {
2626 if (sig->params [i]->byref)
2630 out_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);
2632 /* handle constructors only for objects already allocated */
2633 if (!strcmp (method->method->name, ".ctor"))
2636 /* This can be called only on MBR objects, so no need to unbox for valuetypes. */
2637 g_assert (!method->method->klass->valuetype);
2638 result = mono_runtime_invoke_array (method->method, this, params, NULL);
2640 for (i = 0, j = 0; i < mono_array_length (params); i++) {
2641 if (sig->params [i]->byref) {
2643 arg = mono_array_get (params, gpointer, i);
2644 mono_array_set (out_args, gpointer, j, arg);
2649 *outArgs = out_args;
2655 ves_icall_System_Enum_ToObject (MonoReflectionType *type, MonoObject *obj)
2658 MonoClass *enumc, *objc;
2662 MONO_ARCH_SAVE_REGS;
2664 MONO_CHECK_ARG_NULL (type);
2665 MONO_CHECK_ARG_NULL (obj);
2667 domain = mono_object_domain (type);
2668 enumc = mono_class_from_mono_type (type->type);
2669 objc = obj->vtable->klass;
2671 MONO_CHECK_ARG (obj, enumc->enumtype == TRUE);
2672 MONO_CHECK_ARG (obj, (objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 &&
2673 objc->byval_arg.type <= MONO_TYPE_U8));
2675 s1 = mono_class_value_size (enumc, NULL);
2676 s2 = mono_class_value_size (objc, NULL);
2678 res = mono_object_new (domain, enumc);
2680 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
2681 memcpy ((char *)res + sizeof (MonoObject), (char *)obj + sizeof (MonoObject), MIN (s1, s2));
2683 memcpy ((char *)res + sizeof (MonoObject) + (s1 > s2 ? s1 - s2 : 0),
2684 (char *)obj + sizeof (MonoObject) + (s2 > s1 ? s2 - s1 : 0),
2691 ves_icall_System_Enum_get_value (MonoObject *this)
2699 MONO_ARCH_SAVE_REGS;
2704 g_assert (this->vtable->klass->enumtype);
2706 enumc = mono_class_from_mono_type (this->vtable->klass->enum_basetype);
2707 res = mono_object_new (mono_object_domain (this), enumc);
2708 dst = (char *)res + sizeof (MonoObject);
2709 src = (char *)this + sizeof (MonoObject);
2710 size = mono_class_value_size (enumc, NULL);
2712 memcpy (dst, src, size);
2718 ves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)
2720 MonoDomain *domain = mono_object_domain (type);
2721 MonoClass *enumc = mono_class_from_mono_type (type->type);
2722 guint j = 0, nvalues, crow;
2724 MonoClassField *field;
2726 MONO_ARCH_SAVE_REGS;
2728 info->utype = mono_type_get_object (domain, enumc->enum_basetype);
2729 nvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;
2730 info->names = mono_array_new (domain, mono_defaults.string_class, nvalues);
2731 info->values = mono_array_new (domain, enumc, nvalues);
2735 while ((field = mono_class_get_fields (enumc, &iter))) {
2739 if (strcmp ("value__", field->name) == 0)
2741 if (mono_field_is_deleted (field))
2743 mono_array_set (info->names, gpointer, j, mono_string_new (domain, field->name));
2746 crow = mono_metadata_get_constant_index (enumc->image, mono_class_get_field_token (field), crow + 1);
2747 field->def_type = mono_metadata_decode_row_col (&enumc->image->tables [MONO_TABLE_CONSTANT], crow-1, MONO_CONSTANT_TYPE);
2748 crow = mono_metadata_decode_row_col (&enumc->image->tables [MONO_TABLE_CONSTANT], crow-1, MONO_CONSTANT_VALUE);
2749 field->data = (gpointer)mono_metadata_blob_heap (enumc->image, crow);
2753 len = mono_metadata_decode_blob_size (p, &p);
2754 switch (enumc->enum_basetype->type) {
2757 mono_array_set (info->values, gchar, j, *p);
2759 case MONO_TYPE_CHAR:
2762 mono_array_set (info->values, gint16, j, read16 (p));
2766 mono_array_set (info->values, gint32, j, read32 (p));
2770 mono_array_set (info->values, gint64, j, read64 (p));
2773 g_error ("Implement type 0x%02x in get_enum_info", enumc->enum_basetype->type);
2780 BFLAGS_IgnoreCase = 1,
2781 BFLAGS_DeclaredOnly = 2,
2782 BFLAGS_Instance = 4,
2784 BFLAGS_Public = 0x10,
2785 BFLAGS_NonPublic = 0x20,
2786 BFLAGS_FlattenHierarchy = 0x40,
2787 BFLAGS_InvokeMethod = 0x100,
2788 BFLAGS_CreateInstance = 0x200,
2789 BFLAGS_GetField = 0x400,
2790 BFLAGS_SetField = 0x800,
2791 BFLAGS_GetProperty = 0x1000,
2792 BFLAGS_SetProperty = 0x2000,
2793 BFLAGS_ExactBinding = 0x10000,
2794 BFLAGS_SuppressChangeType = 0x20000,
2795 BFLAGS_OptionalParamBinding = 0x40000
2798 static MonoReflectionField *
2799 ves_icall_Type_GetField (MonoReflectionType *type, MonoString *name, guint32 bflags)
2802 MonoClass *startklass, *klass;
2804 MonoClassField *field;
2807 int (*compare_func) (const char *s1, const char *s2) = NULL;
2808 domain = ((MonoObject *)type)->vtable->domain;
2809 klass = startklass = mono_class_from_mono_type (type->type);
2811 MONO_ARCH_SAVE_REGS;
2814 mono_raise_exception (mono_get_exception_argument_null ("name"));
2815 if (type->type->byref)
2818 compare_func = (bflags & BFLAGS_IgnoreCase) ? g_strcasecmp : strcmp;
2822 while ((field = mono_class_get_fields (klass, &iter))) {
2824 if (mono_field_is_deleted (field))
2826 if ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {
2827 if (bflags & BFLAGS_Public)
2830 if (bflags & BFLAGS_NonPublic)
2836 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
2837 if (bflags & BFLAGS_Static)
2838 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
2841 if (bflags & BFLAGS_Instance)
2848 utf8_name = mono_string_to_utf8 (name);
2850 if (compare_func (field->name, utf8_name)) {
2856 return mono_field_get_object (domain, startklass, field);
2858 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
2865 ves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
2868 GSList *l = NULL, *tmp;
2869 MonoClass *startklass, *klass, *refklass;
2874 MonoClassField *field;
2876 MONO_ARCH_SAVE_REGS;
2878 domain = ((MonoObject *)type)->vtable->domain;
2879 if (type->type->byref)
2880 return mono_array_new (domain, mono_defaults.method_info_class, 0);
2881 klass = startklass = mono_class_from_mono_type (type->type);
2882 refklass = mono_class_from_mono_type (reftype->type);
2886 while ((field = mono_class_get_fields (klass, &iter))) {
2888 if (mono_field_is_deleted (field))
2890 if ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {
2891 if (bflags & BFLAGS_Public)
2894 if (bflags & BFLAGS_NonPublic)
2900 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
2901 if (bflags & BFLAGS_Static)
2902 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
2905 if (bflags & BFLAGS_Instance)
2911 member = (MonoObject*)mono_field_get_object (domain, refklass, field);
2912 l = g_slist_prepend (l, member);
2914 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
2916 len = g_slist_length (l);
2917 res = mono_array_new (domain, mono_defaults.field_info_class, len);
2919 tmp = l = g_slist_reverse (l);
2920 for (; tmp; tmp = tmp->next, ++i)
2921 mono_array_set (res, gpointer, i, tmp->data);
2927 ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
2930 GSList *l = NULL, *tmp;
2931 MonoClass *startklass, *klass, *refklass;
2937 guint32 method_slots_default [8];
2938 guint32 *method_slots;
2939 gchar *mname = NULL;
2940 int (*compare_func) (const char *s1, const char *s2) = NULL;
2942 MONO_ARCH_SAVE_REGS;
2944 domain = ((MonoObject *)type)->vtable->domain;
2945 if (type->type->byref)
2946 return mono_array_new (domain, mono_defaults.method_info_class, 0);
2947 klass = startklass = mono_class_from_mono_type (type->type);
2948 refklass = mono_class_from_mono_type (reftype->type);
2951 mname = mono_string_to_utf8 (name);
2952 compare_func = (ignore_case) ? g_strcasecmp : strcmp;
2955 if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
2956 method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
2958 method_slots = method_slots_default;
2959 memset (method_slots, 0, sizeof (method_slots_default));
2963 while ((method = mono_class_get_methods (klass, &iter))) {
2965 if (method->name [0] == '.' && (strcmp (method->name, ".ctor") == 0 || strcmp (method->name, ".cctor") == 0))
2967 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
2968 if (bflags & BFLAGS_Public)
2971 if (bflags & BFLAGS_NonPublic)
2977 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
2978 if (bflags & BFLAGS_Static)
2979 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
2982 if (bflags & BFLAGS_Instance)
2990 if (compare_func (mname, method->name))
2995 if (method->slot != -1) {
2996 if (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))
2998 method_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);
3001 member = (MonoObject*)mono_method_get_object (domain, method, refklass);
3003 l = g_slist_prepend (l, member);
3006 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3010 res = mono_array_new (domain, mono_defaults.method_info_class, len);
3013 tmp = l = g_slist_reverse (l);
3015 for (; tmp; tmp = tmp->next, ++i)
3016 mono_array_set (res, gpointer, i, tmp->data);
3018 if (method_slots != method_slots_default)
3019 g_free (method_slots);
3024 ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3027 GSList *l = NULL, *tmp;
3028 static MonoClass *System_Reflection_ConstructorInfo;
3029 MonoClass *startklass, *klass, *refklass;
3034 gpointer iter = NULL;
3036 MONO_ARCH_SAVE_REGS;
3038 domain = ((MonoObject *)type)->vtable->domain;
3039 if (type->type->byref)
3040 return mono_array_new (domain, mono_defaults.method_info_class, 0);
3041 klass = startklass = mono_class_from_mono_type (type->type);
3042 refklass = mono_class_from_mono_type (reftype->type);
3045 while ((method = mono_class_get_methods (klass, &iter))) {
3047 if (strcmp (method->name, ".ctor") && strcmp (method->name, ".cctor"))
3049 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3050 if (bflags & BFLAGS_Public)
3053 if (bflags & BFLAGS_NonPublic)
3059 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3060 if (bflags & BFLAGS_Static)
3061 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3064 if (bflags & BFLAGS_Instance)
3070 member = (MonoObject*)mono_method_get_object (domain, method, refklass);
3072 l = g_slist_prepend (l, member);
3074 len = g_slist_length (l);
3075 if (!System_Reflection_ConstructorInfo)
3076 System_Reflection_ConstructorInfo = mono_class_from_name (
3077 mono_defaults.corlib, "System.Reflection", "ConstructorInfo");
3078 res = mono_array_new (domain, System_Reflection_ConstructorInfo, len);
3080 tmp = l = g_slist_reverse (l);
3081 for (; tmp; tmp = tmp->next, ++i)
3082 mono_array_set (res, gpointer, i, tmp->data);
3088 ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
3091 GSList *l = NULL, *tmp;
3092 static MonoClass *System_Reflection_PropertyInfo;
3093 MonoClass *startklass, *klass;
3100 guint32 method_slots_default [8];
3101 guint32 *method_slots;
3102 gchar *propname = NULL;
3103 int (*compare_func) (const char *s1, const char *s2) = NULL;
3106 MONO_ARCH_SAVE_REGS;
3108 if (!System_Reflection_PropertyInfo)
3109 System_Reflection_PropertyInfo = mono_class_from_name (
3110 mono_defaults.corlib, "System.Reflection", "PropertyInfo");
3112 domain = ((MonoObject *)type)->vtable->domain;
3113 if (type->type->byref)
3114 return mono_array_new (domain, System_Reflection_PropertyInfo, 0);
3115 klass = startklass = mono_class_from_mono_type (type->type);
3117 propname = mono_string_to_utf8 (name);
3118 compare_func = (ignore_case) ? g_strcasecmp : strcmp;
3121 if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
3122 method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
3124 method_slots = method_slots_default;
3125 memset (method_slots, 0, sizeof (method_slots_default));
3129 while ((prop = mono_class_get_properties (klass, &iter))) {
3135 flags = method->flags;
3138 if ((prop->get && ((prop->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)) ||
3139 (prop->set && ((prop->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC))) {
3140 if (bflags & BFLAGS_Public)
3143 if (bflags & BFLAGS_NonPublic)
3149 if (flags & METHOD_ATTRIBUTE_STATIC) {
3150 if (bflags & BFLAGS_Static)
3151 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3154 if (bflags & BFLAGS_Instance)
3163 if (compare_func (propname, prop->name))
3167 if (prop->get && prop->get->slot != -1) {
3168 if (method_slots [prop->get->slot >> 5] & (1 << (prop->get->slot & 0x1f)))
3170 method_slots [prop->get->slot >> 5] |= 1 << (prop->get->slot & 0x1f);
3172 if (prop->set && prop->set->slot != -1) {
3173 if (method_slots [prop->set->slot >> 5] & (1 << (prop->set->slot & 0x1f)))
3175 method_slots [prop->set->slot >> 5] |= 1 << (prop->set->slot & 0x1f);
3178 l = g_slist_prepend (l, mono_property_get_object (domain, startklass, prop));
3181 if ((!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)))
3185 res = mono_array_new (domain, System_Reflection_PropertyInfo, len);
3188 tmp = l = g_slist_reverse (l);
3190 for (; tmp; tmp = tmp->next, ++i)
3191 mono_array_set (res, gpointer, i, tmp->data);
3193 if (method_slots != method_slots_default)
3194 g_free (method_slots);
3198 static MonoReflectionEvent *
3199 ves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 bflags)
3202 MonoClass *klass, *startklass;
3208 MONO_ARCH_SAVE_REGS;
3210 event_name = mono_string_to_utf8 (name);
3211 if (type->type->byref)
3213 klass = startklass = mono_class_from_mono_type (type->type);
3214 domain = mono_object_domain (type);
3218 while ((event = mono_class_get_events (klass, &iter))) {
3219 if (strcmp (event->name, event_name))
3222 method = event->add;
3224 method = event->remove;
3226 method = event->raise;
3228 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3229 if (!(bflags & BFLAGS_Public))
3232 if (!(bflags & BFLAGS_NonPublic))
3237 if (!(bflags & BFLAGS_NonPublic))
3240 g_free (event_name);
3241 return mono_event_get_object (domain, startklass, event);
3244 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3247 g_free (event_name);
3252 ves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3255 GSList *l = NULL, *tmp;
3256 static MonoClass *System_Reflection_EventInfo;
3257 MonoClass *startklass, *klass;
3264 MONO_ARCH_SAVE_REGS;
3266 if (!System_Reflection_EventInfo)
3267 System_Reflection_EventInfo = mono_class_from_name (
3268 mono_defaults.corlib, "System.Reflection", "EventInfo");
3270 domain = mono_object_domain (type);
3271 if (type->type->byref)
3272 return mono_array_new (domain, System_Reflection_EventInfo, 0);
3273 klass = startklass = mono_class_from_mono_type (type->type);
3277 while ((event = mono_class_get_events (klass, &iter))) {
3279 method = event->add;
3281 method = event->remove;
3283 method = event->raise;
3285 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3286 if (bflags & BFLAGS_Public)
3289 if (bflags & BFLAGS_NonPublic)
3294 if (bflags & BFLAGS_NonPublic)
3300 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3301 if (bflags & BFLAGS_Static)
3302 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3305 if (bflags & BFLAGS_Instance)
3310 if (bflags & BFLAGS_Instance)
3315 l = g_slist_prepend (l, mono_event_get_object (domain, klass, event));
3317 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3319 len = g_slist_length (l);
3320 res = mono_array_new (domain, System_Reflection_EventInfo, len);
3323 tmp = l = g_slist_reverse (l);
3325 for (; tmp; tmp = tmp->next, ++i)
3326 mono_array_set (res, gpointer, i, tmp->data);
3331 static MonoReflectionType *
3332 ves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint32 bflags)
3335 MonoClass *startklass, *klass;
3340 MONO_ARCH_SAVE_REGS;
3342 domain = ((MonoObject *)type)->vtable->domain;
3343 if (type->type->byref)
3345 klass = startklass = mono_class_from_mono_type (type->type);
3346 str = mono_string_to_utf8 (name);
3349 for (tmpn = klass->nested_classes; tmpn; tmpn = tmpn->next) {
3351 nested = tmpn->data;
3352 if ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
3353 if (bflags & BFLAGS_Public)
3356 if (bflags & BFLAGS_NonPublic)
3361 if (strcmp (nested->name, str) == 0){
3363 return mono_type_get_object (domain, &nested->byval_arg);
3366 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3373 ves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags)
3376 GSList *l = NULL, *tmp;
3378 MonoClass *startklass, *klass;
3384 MONO_ARCH_SAVE_REGS;
3386 domain = ((MonoObject *)type)->vtable->domain;
3387 if (type->type->byref)
3388 return mono_array_new (domain, mono_defaults.monotype_class, 0);
3389 klass = startklass = mono_class_from_mono_type (type->type);
3391 for (tmpn = klass->nested_classes; tmpn; tmpn = tmpn->next) {
3393 nested = tmpn->data;
3394 if ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
3395 if (bflags & BFLAGS_Public)
3398 if (bflags & BFLAGS_NonPublic)
3403 member = (MonoObject*)mono_type_get_object (domain, &nested->byval_arg);
3404 l = g_slist_prepend (l, member);
3406 len = g_slist_length (l);
3407 res = mono_array_new (domain, mono_defaults.monotype_class, len);
3409 tmp = l = g_slist_reverse (l);
3410 for (; tmp; tmp = tmp->next, ++i)
3411 mono_array_set (res, gpointer, i, tmp->data);
3416 static MonoReflectionType*
3417 ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)
3420 MonoType *type = NULL;
3421 MonoTypeNameParse info;
3422 gboolean type_resolve = FALSE;
3424 MONO_ARCH_SAVE_REGS;
3426 str = mono_string_to_utf8 (name);
3427 /*g_print ("requested type %s in %s\n", str, assembly->assembly->aname.name);*/
3428 if (!mono_reflection_parse_type (str, &info)) {
3430 g_list_free (info.modifiers);
3431 g_list_free (info.nested);
3432 if (throwOnError) /* uhm: this is a parse error, though... */
3433 mono_raise_exception (mono_get_exception_type_load (name));
3434 /*g_print ("failed parse\n");*/
3438 if (module != NULL) {
3440 type = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve);
3445 if (assembly->assembly->dynamic) {
3446 /* Enumerate all modules */
3447 MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
3451 if (abuilder->modules) {
3452 for (i = 0; i < mono_array_length (abuilder->modules); ++i) {
3453 MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
3454 type = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve);
3460 if (!type && abuilder->loaded_modules) {
3461 for (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {
3462 MonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
3463 type = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve);
3470 type = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve);
3472 g_list_free (info.modifiers);
3473 g_list_free (info.nested);
3476 mono_raise_exception (mono_get_exception_type_load (name));
3477 /* g_print ("failed find\n"); */
3481 if (type->type == MONO_TYPE_CLASS) {
3482 MonoClass *klass = mono_type_get_class (type);
3483 /* need to report exceptions ? */
3484 if (throwOnError && klass->exception_type) {
3485 /* report SecurityException (or others) that occured when loading the assembly */
3486 MonoException *exc = mono_class_get_exception_for_failure (klass);
3487 mono_raise_exception (exc);
3488 } else if (klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) {
3493 /* g_print ("got it\n"); */
3494 return mono_type_get_object (mono_object_domain (assembly), type);
3498 ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly)
3500 MonoDomain *domain = mono_object_domain (assembly);
3501 MonoAssembly *mass = assembly->assembly;
3506 MONO_ARCH_SAVE_REGS;
3508 absolute = g_build_filename (mass->basedir, mass->image->module_name, NULL);
3509 uri = g_filename_to_uri (absolute, NULL, NULL);
3510 res = mono_string_new (domain, uri);
3517 ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)
3519 MonoAssembly *mass = assembly->assembly;
3521 MONO_ARCH_SAVE_REGS;
3523 return mass->in_gac;
3526 static MonoReflectionAssembly*
3527 ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)
3531 MonoImageOpenStatus status;
3533 MONO_ARCH_SAVE_REGS;
3535 name = mono_string_to_utf8 (mname);
3536 res = mono_assembly_load_with_partial_name (name, &status);
3542 return mono_assembly_get_object (mono_domain_get (), res);
3546 ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assembly)
3548 MonoDomain *domain = mono_object_domain (assembly);
3551 MONO_ARCH_SAVE_REGS;
3553 res = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image));
3559 ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)
3561 MONO_ARCH_SAVE_REGS;
3563 return assembly->assembly->ref_only;
3567 ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssembly *assembly)
3569 MonoDomain *domain = mono_object_domain (assembly);
3571 MONO_ARCH_SAVE_REGS;
3573 return mono_string_new (domain, assembly->assembly->image->version);
3576 static MonoReflectionMethod*
3577 ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly)
3579 guint32 token = mono_image_get_entry_point (assembly->assembly->image);
3581 MONO_ARCH_SAVE_REGS;
3585 return mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL);
3588 static MonoReflectionModule*
3589 ves_icall_System_Reflection_Assembly_get_ManifestModule (MonoReflectionAssembly *assembly)
3591 return mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);
3595 ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly)
3597 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3598 MonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows);
3602 MONO_ARCH_SAVE_REGS;
3604 for (i = 0; i < table->rows; ++i) {
3605 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));
3606 mono_array_set (result, gpointer, i, mono_string_new (mono_object_domain (assembly), val));
3612 create_version (MonoDomain *domain, MonoAssemblyName *aname)
3614 static MonoClass *System_Version = NULL;
3615 static MonoMethod *create_version = NULL;
3617 int major, minor, build, revision;
3620 if (!System_Version) {
3621 System_Version = mono_class_from_name (mono_defaults.corlib, "System", "Version");
3622 g_assert (System_Version);
3625 if (!create_version) {
3626 MonoMethodDesc *desc = mono_method_desc_new (":.ctor(int,int,int,int)", FALSE);
3627 create_version = mono_method_desc_search_in_class (desc, System_Version);
3628 g_assert (create_version);
3629 mono_method_desc_free (desc);
3632 major = aname->major;
3633 minor = aname->minor;
3634 build = aname->build;
3635 revision = aname->revision;
3639 args [3] = &revision;
3640 result = mono_object_new (domain, System_Version);
3641 mono_runtime_invoke (create_version, result, args, NULL);
3647 ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly)
3649 static MonoClass *System_Reflection_AssemblyName;
3651 MonoDomain *domain = mono_object_domain (assembly);
3653 static MonoMethod *create_culture = NULL;
3656 MONO_ARCH_SAVE_REGS;
3658 if (!System_Reflection_AssemblyName)
3659 System_Reflection_AssemblyName = mono_class_from_name (
3660 mono_defaults.corlib, "System.Reflection", "AssemblyName");
3662 t = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];
3665 result = mono_array_new (domain, System_Reflection_AssemblyName, count);
3668 MonoMethodDesc *desc = mono_method_desc_new (
3669 "System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
3670 create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
3671 g_assert (create_culture);
3672 mono_method_desc_free (desc);
3675 for (i = 0; i < count; i++) {
3676 MonoAssembly *assem;
3677 MonoReflectionAssemblyName *aname;
3679 /* FIXME: There is no need to load the assemblies themselves */
3680 mono_assembly_load_reference (assembly->assembly->image, i);
3682 assem = assembly->assembly->image->references [i];
3683 if (assem == (gpointer)-1) {
3684 char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i, assembly->assembly->image->name);
3685 MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);
3687 mono_raise_exception (ex);
3690 aname = (MonoReflectionAssemblyName *) mono_object_new (
3691 domain, System_Reflection_AssemblyName);
3693 aname->name = mono_string_new (domain, assem->aname.name);
3695 aname->major = assem->aname.major;
3696 aname->minor = assem->aname.minor;
3697 aname->build = assem->aname.build;
3698 aname->revision = assem->aname.revision;
3699 aname->hashalg = assem->aname.hash_alg;
3700 aname->flags = assem->aname.flags;
3701 aname->versioncompat = 1; /* SameMachine (default) */
3702 aname->version = create_version (domain, &assem->aname);
3704 if (create_culture) {
3706 args [0] = mono_string_new (domain, assem->aname.culture);
3707 aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL);
3710 if (assem->aname.public_key) {
3712 const char *pkey_ptr = (char*)assem->aname.public_key;
3713 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
3715 aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
3716 memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
3719 /* public key token isn't copied - the class library will
3720 automatically generate it from the public key if required */
3722 /* note: this function doesn't return the codebase on purpose (i.e. it can
3723 be used under partial trust as path information isn't present). */
3725 mono_array_set (result, gpointer, i, aname);
3736 foreach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)
3738 MonoString *name = mono_string_new (mono_object_domain (info->res), key);
3740 mono_array_set (info->res, gpointer, info->idx, name);
3745 ves_icall_System_Reflection_Assembly_GetNamespaces (MonoReflectionAssembly *assembly)
3747 MonoImage *img = assembly->assembly->image;
3751 MONO_ARCH_SAVE_REGS;
3753 res = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, g_hash_table_size (img->name_cache));
3756 g_hash_table_foreach (img->name_cache, (GHFunc)foreach_namespace, &info);
3761 /* move this in some file in mono/util/ */
3763 g_concat_dir_and_file (const char *dir, const char *file)
3765 g_return_val_if_fail (dir != NULL, NULL);
3766 g_return_val_if_fail (file != NULL, NULL);
3769 * If the directory name doesn't have a / on the end, we need
3770 * to add one so we get a proper path to the file
3772 if (dir [strlen(dir) - 1] != G_DIR_SEPARATOR)
3773 return g_strconcat (dir, G_DIR_SEPARATOR_S, file, NULL);
3775 return g_strconcat (dir, file, NULL);
3779 ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module)
3781 char *n = mono_string_to_utf8 (name);
3782 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3784 guint32 cols [MONO_MANIFEST_SIZE];
3785 guint32 impl, file_idx;
3789 MONO_ARCH_SAVE_REGS;
3791 for (i = 0; i < table->rows; ++i) {
3792 mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);
3793 val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);
3794 if (strcmp (val, n) == 0)
3798 if (i == table->rows)
3801 impl = cols [MONO_MANIFEST_IMPLEMENTATION];
3804 * this code should only be called after obtaining the
3805 * ResourceInfo and handling the other cases.
3807 g_assert ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_FILE);
3808 file_idx = impl >> MONO_IMPLEMENTATION_BITS;
3810 module = mono_image_load_file_for_image (assembly->assembly->image, file_idx);
3815 module = assembly->assembly->image;
3817 *ref_module = mono_module_get_object (mono_domain_get (), module);
3819 return (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);
3823 ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)
3825 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3827 guint32 cols [MONO_MANIFEST_SIZE];
3828 guint32 file_cols [MONO_FILE_SIZE];
3832 MONO_ARCH_SAVE_REGS;
3834 n = mono_string_to_utf8 (name);
3835 for (i = 0; i < table->rows; ++i) {
3836 mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);
3837 val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);
3838 if (strcmp (val, n) == 0)
3842 if (i == table->rows)
3845 if (!cols [MONO_MANIFEST_IMPLEMENTATION]) {
3846 info->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;
3849 switch (cols [MONO_MANIFEST_IMPLEMENTATION] & MONO_IMPLEMENTATION_MASK) {
3850 case MONO_IMPLEMENTATION_FILE:
3851 i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
3852 table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
3853 mono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);
3854 val = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);
3855 info->filename = mono_string_new (mono_object_domain (assembly), val);
3856 if (file_cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)
3859 info->location = RESOURCE_LOCATION_EMBEDDED;
3862 case MONO_IMPLEMENTATION_ASSEMBLYREF:
3863 i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
3864 mono_assembly_load_reference (assembly->assembly->image, i - 1);
3865 if (assembly->assembly->image->references [i - 1] == (gpointer)-1) {
3866 char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i - 1, assembly->assembly->image->name);
3867 MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);
3869 mono_raise_exception (ex);
3871 info->assembly = mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]);
3873 /* Obtain info recursively */
3874 ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);
3875 info->location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;
3878 case MONO_IMPLEMENTATION_EXP_TYPE:
3879 g_assert_not_reached ();
3888 ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules)
3890 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
3891 MonoArray *result = NULL;
3896 MONO_ARCH_SAVE_REGS;
3898 /* check hash if needed */
3900 n = mono_string_to_utf8 (name);
3901 for (i = 0; i < table->rows; ++i) {
3902 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
3903 if (strcmp (val, n) == 0) {
3906 n = g_concat_dir_and_file (assembly->assembly->basedir, val);
3907 fn = mono_string_new (mono_object_domain (assembly), n);
3909 return (MonoObject*)fn;
3917 for (i = 0; i < table->rows; ++i) {
3918 if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA))
3922 result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count);
3925 for (i = 0; i < table->rows; ++i) {
3926 if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
3927 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
3928 n = g_concat_dir_and_file (assembly->assembly->basedir, val);
3929 mono_array_set (result, gpointer, count, mono_string_new (mono_object_domain (assembly), n));
3934 return (MonoObject*)result;
3938 ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)
3940 MonoDomain *domain = mono_domain_get();
3943 int i, j, file_count = 0;
3944 MonoImage **modules;
3945 guint32 module_count, real_module_count;
3946 MonoTableInfo *table;
3948 g_assert (assembly->assembly->image != NULL);
3950 if (assembly->assembly->dynamic) {
3951 MonoReflectionAssemblyBuilder *assemblyb = (MonoReflectionAssemblyBuilder*)assembly;
3953 if (assemblyb->modules)
3954 module_count = mono_array_length (assemblyb->modules);
3957 real_module_count = module_count;
3959 modules = g_new0 (MonoImage*, module_count);
3960 if (assemblyb->modules) {
3961 for (i = 0; i < mono_array_length (assemblyb->modules); ++i) {
3963 mono_array_get (assemblyb->modules, MonoReflectionModuleBuilder*, i)->module.image;
3968 table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
3969 file_count = table->rows;
3971 modules = assembly->assembly->image->modules;
3972 module_count = assembly->assembly->image->module_count;
3974 real_module_count = 0;
3975 for (i = 0; i < module_count; ++i)
3977 real_module_count ++;
3980 klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Module");
3981 res = mono_array_new (domain, klass, 1 + real_module_count + file_count);
3983 mono_array_set (res, gpointer, 0, mono_module_get_object (domain, assembly->assembly->image));
3985 for (i = 0; i < module_count; ++i)
3987 mono_array_set (res, gpointer, j, mono_module_get_object (domain, modules[i]));
3991 for (i = 0; i < file_count; ++i, ++j)
3992 mono_array_set (res, gpointer, j, mono_module_file_get_object (domain, assembly->assembly->image, i));
3994 if (assembly->assembly->dynamic)
4000 static MonoReflectionMethod*
4001 ves_icall_GetCurrentMethod (void)
4003 MonoMethod *m = mono_method_get_last_managed ();
4005 MONO_ARCH_SAVE_REGS;
4007 return mono_method_get_object (mono_domain_get (), m, NULL);
4010 static MonoReflectionMethod*
4011 ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal (MonoMethod *method)
4013 return mono_method_get_object (mono_domain_get (), method, NULL);
4016 static MonoReflectionMethodBody*
4017 ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)
4019 return mono_method_body_get_object (mono_domain_get (), method);
4022 static MonoReflectionAssembly*
4023 ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
4025 MonoMethod *m = mono_method_get_last_managed ();
4027 MONO_ARCH_SAVE_REGS;
4029 return mono_assembly_get_object (mono_domain_get (), m->klass->image->assembly);
4034 get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
4036 MonoMethod **dest = data;
4038 /* skip unmanaged frames */
4053 static MonoReflectionAssembly*
4054 ves_icall_System_Reflection_Assembly_GetEntryAssembly (void)
4056 MonoDomain* domain = mono_domain_get ();
4058 MONO_ARCH_SAVE_REGS;
4060 if (!domain->entry_assembly)
4063 return mono_assembly_get_object (domain, domain->entry_assembly);
4067 static MonoReflectionAssembly*
4068 ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
4070 MonoMethod *m = mono_method_get_last_managed ();
4071 MonoMethod *dest = m;
4073 MONO_ARCH_SAVE_REGS;
4075 mono_stack_walk_no_il (get_caller, &dest);
4078 return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
4082 ves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name,
4083 gboolean assembly_qualified)
4085 MonoDomain *domain = mono_object_domain (object);
4086 MonoTypeNameFormat format;
4090 MONO_ARCH_SAVE_REGS;
4092 format = assembly_qualified ?
4093 MONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED :
4094 MONO_TYPE_NAME_FORMAT_FULL_NAME;
4096 format = MONO_TYPE_NAME_FORMAT_REFLECTION;
4098 name = mono_type_get_name_full (object->type, format);
4099 res = mono_string_new (domain, name);
4106 fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute)
4108 static MonoMethod *create_culture = NULL;
4111 const char *pkey_ptr;
4114 MONO_ARCH_SAVE_REGS;
4116 aname->name = mono_string_new (domain, name->name);
4117 aname->major = name->major;
4118 aname->minor = name->minor;
4119 aname->build = name->build;
4120 aname->revision = name->revision;
4121 aname->hashalg = name->hash_alg;
4122 aname->version = create_version (domain, name);
4124 codebase = g_filename_to_uri (absolute, NULL, NULL);
4126 aname->codebase = mono_string_new (domain, codebase);
4130 if (!create_culture) {
4131 MonoMethodDesc *desc = mono_method_desc_new ("System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
4132 create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
4133 g_assert (create_culture);
4134 mono_method_desc_free (desc);
4137 args [0] = mono_string_new (domain, name->culture);
4138 aname->cultureInfo =
4139 mono_runtime_invoke (create_culture, NULL, args, NULL);
4141 if (name->public_key) {
4142 pkey_ptr = (char*)name->public_key;
4143 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
4145 aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
4146 memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
4149 /* MonoAssemblyName keeps the public key token as an hexadecimal string */
4150 if (name->public_key_token [0]) {
4154 aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, 8);
4155 p = mono_array_addr (aname->keyToken, char, 0);
4157 for (i = 0, j = 0; i < 8; i++) {
4158 *p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;
4159 *p |= g_ascii_xdigit_value (name->public_key_token [j++]);
4166 ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)
4170 MONO_ARCH_SAVE_REGS;
4172 absolute = g_build_filename (assembly->assembly->basedir, assembly->assembly->image->module_name, NULL);
4174 fill_reflection_assembly_name (mono_object_domain (assembly), aname,
4175 &assembly->assembly->aname, absolute);
4181 ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)
4184 MonoImageOpenStatus status = MONO_IMAGE_OK;
4187 MonoAssemblyName name;
4189 MONO_ARCH_SAVE_REGS;
4191 filename = mono_string_to_utf8 (fname);
4193 image = mono_image_open (filename, &status);
4199 exc = mono_get_exception_file_not_found (fname);
4200 mono_raise_exception (exc);
4203 res = mono_assembly_fill_assembly_name (image, &name);
4205 mono_image_close (image);
4207 mono_raise_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest"));
4210 fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename);
4213 mono_image_close (image);
4217 ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,
4218 char **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)
4220 MonoBoolean result = FALSE;
4221 MonoDeclSecurityEntry entry;
4223 /* SecurityAction.RequestMinimum */
4224 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {
4225 *minimum = entry.blob;
4226 *minLength = entry.size;
4229 /* SecurityAction.RequestOptional */
4230 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {
4231 *optional = entry.blob;
4232 *optLength = entry.size;
4235 /* SecurityAction.RequestRefuse */
4236 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {
4237 *refused = entry.blob;
4238 *refLength = entry.size;
4246 mono_module_get_types (MonoDomain *domain, MonoImage *image,
4247 MonoBoolean exportedOnly)
4251 MonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];
4253 guint32 attrs, visibility;
4255 /* we start the count from 1 because we skip the special type <Module> */
4258 for (i = 1; i < tdef->rows; ++i) {
4259 attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);
4260 visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;
4261 if (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)
4265 count = tdef->rows - 1;
4267 res = mono_array_new (domain, mono_defaults.monotype_class, count);
4269 for (i = 1; i < tdef->rows; ++i) {
4270 attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);
4271 visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;
4272 if (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) {
4273 klass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF);
4274 mono_array_set (res, gpointer, count, mono_type_get_object (domain, &klass->byval_arg));
4283 ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)
4285 MonoArray *res = NULL;
4286 MonoImage *image = NULL;
4287 MonoTableInfo *table = NULL;
4291 MONO_ARCH_SAVE_REGS;
4293 domain = mono_object_domain (assembly);
4295 if (assembly->assembly->dynamic) {
4296 MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
4297 if (abuilder->modules) {
4298 for (i = 0; i < mono_array_length(abuilder->modules); i++) {
4299 MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
4303 MonoArray *append = mb->types;
4304 if (mono_array_length (append) > 0) {
4307 len1 = mono_array_length (res);
4308 len2 = mono_array_length (append);
4309 new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4310 memcpy (mono_array_addr (new, MonoReflectionType*, 0),
4311 mono_array_addr (res, MonoReflectionType*, 0),
4312 len1 * sizeof (MonoReflectionType*));
4313 memcpy (mono_array_addr (new, MonoReflectionType*, len1),
4314 mono_array_addr (append, MonoReflectionType*, 0),
4315 len2 * sizeof (MonoReflectionType*));
4322 * Replace TypeBuilders with the created types to be compatible
4326 for (i = 0; i < mono_array_length (res); ++i) {
4327 MonoReflectionTypeBuilder *tb = mono_array_get (res, MonoReflectionTypeBuilder*, i);
4329 mono_array_set (res, MonoReflectionType*, i, tb->created);
4334 if (abuilder->loaded_modules)
4335 for (i = 0; i < mono_array_length(abuilder->loaded_modules); i++) {
4336 MonoReflectionModule *rm = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
4338 res = mono_module_get_types (domain, rm->image, exportedOnly);
4340 MonoArray *append = mono_module_get_types (domain, rm->image, exportedOnly);
4341 if (mono_array_length (append) > 0) {
4344 len1 = mono_array_length (res);
4345 len2 = mono_array_length (append);
4346 new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4347 memcpy (mono_array_addr (new, MonoReflectionType*, 0),
4348 mono_array_addr (res, MonoReflectionType*, 0),
4349 len1 * sizeof (MonoReflectionType*));
4350 memcpy (mono_array_addr (new, MonoReflectionType*, len1),
4351 mono_array_addr (append, MonoReflectionType*, 0),
4352 len2 * sizeof (MonoReflectionType*));
4359 image = assembly->assembly->image;
4360 table = &image->tables [MONO_TABLE_FILE];
4361 res = mono_module_get_types (domain, image, exportedOnly);
4363 /* Append data from all modules in the assembly */
4364 for (i = 0; i < table->rows; ++i) {
4365 if (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
4366 MonoImage *loaded_image = mono_assembly_load_module (image->assembly, i + 1);
4368 MonoArray *res2 = mono_module_get_types (domain, loaded_image, exportedOnly);
4369 /* Append the new types to the end of the array */
4370 if (mono_array_length (res2) > 0) {
4374 len1 = mono_array_length (res);
4375 len2 = mono_array_length (res2);
4376 res3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4377 memcpy (mono_array_addr (res3, MonoReflectionType*, 0),
4378 mono_array_addr (res, MonoReflectionType*, 0),
4379 len1 * sizeof (MonoReflectionType*));
4380 memcpy (mono_array_addr (res3, MonoReflectionType*, len1),
4381 mono_array_addr (res2, MonoReflectionType*, 0),
4382 len2 * sizeof (MonoReflectionType*));
4389 if (mono_is_security_manager_active ()) {
4390 /* the ReflectionTypeLoadException must have all the types (Types property),
4391 * NULL replacing types which throws an exception. The LoaderException must
4392 * contains all exceptions for NULL items.
4395 guint32 len = mono_array_length (res);
4398 for (i = 0; i < len; i++) {
4399 MonoReflectionType *t = mono_array_get (res, gpointer, i);
4400 MonoClass *klass = mono_type_get_class (t->type);
4401 if ((klass != NULL) && klass->exception_type) {
4402 /* keep the class in the list */
4403 list = g_list_append (list, klass);
4404 /* and replace Type with NULL */
4405 mono_array_set (res, gpointer, i, NULL);
4411 MonoException *exc = NULL;
4412 int length = g_list_length (list);
4414 MonoArray *exl = mono_array_new (domain, mono_defaults.exception_class, length);
4415 for (i = 0, tmp = list; i < length; i++, tmp = tmp->next) {
4416 MonoException *exc = mono_class_get_exception_for_failure (tmp->data);
4417 mono_array_set (exl, gpointer, i, exc);
4422 exc = mono_get_exception_reflection_type_load (res, exl);
4423 mono_raise_exception (exc);
4430 static MonoReflectionType*
4431 ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)
4433 MonoDomain *domain = mono_object_domain (module);
4436 MONO_ARCH_SAVE_REGS;
4438 g_assert (module->image);
4440 if (module->image->dynamic && ((MonoDynamicImage*)(module->image))->initial_image)
4441 /* These images do not have a global type */
4444 klass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF);
4445 return mono_type_get_object (domain, &klass->byval_arg);
4449 ves_icall_System_Reflection_Module_Close (MonoReflectionModule *module)
4451 /*if (module->image)
4452 mono_image_close (module->image);*/
4456 ves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module)
4458 MonoDomain *domain = mono_object_domain (module);
4460 MONO_ARCH_SAVE_REGS;
4462 g_assert (module->image);
4463 return mono_string_new (domain, module->image->guid);
4467 ves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)
4469 if (image->dynamic) {
4470 MonoDynamicImage *dyn = (MonoDynamicImage*)image;
4471 *pe_kind = dyn->pe_kind;
4472 *machine = dyn->machine;
4475 *pe_kind = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags & 0x3;
4476 *machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;
4481 ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)
4483 MONO_ARCH_SAVE_REGS;
4486 return mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);
4488 return mono_module_get_types (mono_object_domain (module), module->image, FALSE);
4492 mono_metadata_memberref_is_method (MonoImage *image, guint32 token)
4494 guint32 cols [MONO_MEMBERREF_SIZE];
4496 mono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], mono_metadata_token_index (token) - 1, cols, MONO_MEMBERREF_SIZE);
4497 sig = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);
4498 mono_metadata_decode_blob_size (sig, &sig);
4499 return (*sig != 0x6);
4503 ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4506 int table = mono_metadata_token_table (token);
4507 int index = mono_metadata_token_index (token);
4509 *error = ResolveTokenError_Other;
4511 /* Validate token */
4512 if ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) &&
4513 (table != MONO_TABLE_TYPESPEC)) {
4514 *error = ResolveTokenError_BadTable;
4519 return mono_lookup_dynamic_token (image, token);
4521 if ((index <= 0) || (index > image->tables [table].rows)) {
4522 *error = ResolveTokenError_OutOfRange;
4526 klass = mono_class_get (image, token);
4528 return &klass->byval_arg;
4534 ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4536 int table = mono_metadata_token_table (token);
4537 int index = mono_metadata_token_index (token);
4539 *error = ResolveTokenError_Other;
4541 /* Validate token */
4542 if ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) &&
4543 (table != MONO_TABLE_MEMBERREF)) {
4544 *error = ResolveTokenError_BadTable;
4549 /* FIXME: validate memberref token type */
4550 return mono_lookup_dynamic_token (image, token);
4552 if ((index <= 0) || (index > image->tables [table].rows)) {
4553 *error = ResolveTokenError_OutOfRange;
4556 if ((table == MONO_TABLE_MEMBERREF) && (!mono_metadata_memberref_is_method (image, token))) {
4557 *error = ResolveTokenError_BadTable;
4561 return mono_get_method (image, token, NULL);
4565 ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4567 int index = mono_metadata_token_index (token);
4569 *error = ResolveTokenError_Other;
4571 /* Validate token */
4572 if (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {
4573 *error = ResolveTokenError_BadTable;
4578 return mono_lookup_dynamic_token (image, token);
4580 if ((index <= 0) || (index >= image->heap_us.size)) {
4581 *error = ResolveTokenError_OutOfRange;
4585 /* FIXME: What to do if the index points into the middle of a string ? */
4587 return mono_ldstr (mono_domain_get (), image, index);
4590 static MonoClassField*
4591 ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4594 int table = mono_metadata_token_table (token);
4595 int index = mono_metadata_token_index (token);
4597 *error = ResolveTokenError_Other;
4599 /* Validate token */
4600 if ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {
4601 *error = ResolveTokenError_BadTable;
4606 /* FIXME: validate memberref token type */
4607 return mono_lookup_dynamic_token (image, token);
4609 if ((index <= 0) || (index > image->tables [table].rows)) {
4610 *error = ResolveTokenError_OutOfRange;
4613 if ((table == MONO_TABLE_MEMBERREF) && (mono_metadata_memberref_is_method (image, token))) {
4614 *error = ResolveTokenError_BadTable;
4618 return mono_field_from_token (image, token, &klass, NULL);
4623 ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4625 int table = mono_metadata_token_table (token);
4627 *error = ResolveTokenError_Other;
4630 case MONO_TABLE_TYPEDEF:
4631 case MONO_TABLE_TYPEREF:
4632 case MONO_TABLE_TYPESPEC: {
4633 MonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, error);
4635 return (MonoObject*)mono_type_get_object (mono_domain_get (), t);
4639 case MONO_TABLE_METHOD:
4640 case MONO_TABLE_METHODSPEC: {
4641 MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
4643 return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
4647 case MONO_TABLE_FIELD: {
4648 MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
4650 return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
4654 case MONO_TABLE_MEMBERREF:
4655 if (mono_metadata_memberref_is_method (image, token)) {
4656 MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
4658 return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
4663 MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
4665 return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
4672 *error = ResolveTokenError_BadTable;
4678 static MonoReflectionType*
4679 ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, MonoString *smodifiers)
4682 int isbyref = 0, rank;
4683 char *str = mono_string_to_utf8 (smodifiers);
4686 MONO_ARCH_SAVE_REGS;
4688 klass = mono_class_from_mono_type (tb->type.type);
4690 /* logic taken from mono_reflection_parse_type(): keep in sync */
4694 if (isbyref) { /* only one level allowed by the spec */
4701 return mono_type_get_object (mono_object_domain (tb), &klass->this_arg);
4704 klass = mono_ptr_class_get (&klass->byval_arg);
4705 mono_class_init (klass);
4716 else if (*p != '*') { /* '*' means unknown lower bound */
4727 klass = mono_array_class_get (klass, rank);
4728 mono_class_init (klass);
4735 return mono_type_get_object (mono_object_domain (tb), &klass->byval_arg);
4739 ves_icall_Type_IsArrayImpl (MonoReflectionType *t)
4744 MONO_ARCH_SAVE_REGS;
4747 res = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);
4752 static MonoReflectionType *
4753 ves_icall_Type_make_array_type (MonoReflectionType *type, int rank)
4755 MonoClass *klass, *aklass;
4757 MONO_ARCH_SAVE_REGS;
4759 klass = mono_class_from_mono_type (type->type);
4760 aklass = mono_array_class_get (klass, rank);
4762 return mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);
4765 static MonoReflectionType *
4766 ves_icall_Type_make_byref_type (MonoReflectionType *type)
4770 MONO_ARCH_SAVE_REGS;
4772 klass = mono_class_from_mono_type (type->type);
4774 return mono_type_get_object (mono_object_domain (type), &klass->this_arg);
4777 static MonoReflectionType *
4778 ves_icall_Type_MakePointerType (MonoReflectionType *type)
4782 MONO_ARCH_SAVE_REGS;
4784 pklass = mono_ptr_class_get (type->type);
4786 return mono_type_get_object (mono_object_domain (type), &pklass->byval_arg);
4790 ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target,
4791 MonoReflectionMethod *info)
4793 MonoClass *delegate_class = mono_class_from_mono_type (type->type);
4794 MonoObject *delegate;
4797 MONO_ARCH_SAVE_REGS;
4799 mono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class);
4801 delegate = mono_object_new (mono_object_domain (type), delegate_class);
4803 func = mono_compile_method (info->method);
4805 mono_delegate_ctor (delegate, target, func);
4811 ves_icall_System_Delegate_FreeTrampoline (MonoDelegate *this)
4814 Delegates have a finalizer only when needed, now.
4815 mono_delegate_free_ftnptr (this);*/
4819 * Magic number to convert a time which is relative to
4820 * Jan 1, 1970 into a value which is relative to Jan 1, 0001.
4822 #define EPOCH_ADJUST ((guint64)62135596800LL)
4825 * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001
4827 #define FILETIME_ADJUST ((guint64)504911232000000000LL)
4830 * This returns Now in UTC
4833 ves_icall_System_DateTime_GetNow (void)
4835 #ifdef PLATFORM_WIN32
4839 GetSystemTime (&st);
4840 SystemTimeToFileTime (&st, &ft);
4841 return (gint64) FILETIME_ADJUST + ((((gint64)ft.dwHighDateTime)<<32) | ft.dwLowDateTime);
4843 /* FIXME: put this in io-layer and call it GetLocalTime */
4847 MONO_ARCH_SAVE_REGS;
4849 if (gettimeofday (&tv, NULL) == 0) {
4850 res = (((gint64)tv.tv_sec + EPOCH_ADJUST)* 1000000 + tv.tv_usec)*10;
4853 /* fixme: raise exception */
4858 #ifdef PLATFORM_WIN32
4859 /* convert a SYSTEMTIME which is of the form "last thursday in october" to a real date */
4861 convert_to_absolute_date(SYSTEMTIME *date)
4863 #define IS_LEAP(y) ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0))
4864 static int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
4865 static int leap_days_in_month[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
4866 /* from the calendar FAQ */
4867 int a = (14 - date->wMonth) / 12;
4868 int y = date->wYear - a;
4869 int m = date->wMonth + 12 * a - 2;
4870 int d = (1 + y + y/4 - y/100 + y/400 + (31*m)/12) % 7;
4872 /* d is now the day of the week for the first of the month (0 == Sunday) */
4874 int day_of_week = date->wDayOfWeek;
4876 /* set day_in_month to the first day in the month which falls on day_of_week */
4877 int day_in_month = 1 + (day_of_week - d);
4878 if (day_in_month <= 0)
4881 /* wDay is 1 for first weekday in month, 2 for 2nd ... 5 means last - so work that out allowing for days in the month */
4882 date->wDay = day_in_month + (date->wDay - 1) * 7;
4883 if (date->wDay > (IS_LEAP(date->wYear) ? leap_days_in_month[date->wMonth - 1] : days_in_month[date->wMonth - 1]))
4888 #ifndef PLATFORM_WIN32
4890 * Return's the offset from GMT of a local time.
4892 * tm is a local time
4893 * t is the same local time as seconds.
4896 gmt_offset(struct tm *tm, time_t t)
4898 #if defined (HAVE_TM_GMTOFF)
4899 return tm->tm_gmtoff;
4904 g.tm_isdst = tm->tm_isdst;
4906 return (int)difftime(t, t2);
4911 * This is heavily based on zdump.c from glibc 2.2.
4913 * * data[0]: start of daylight saving time (in DateTime ticks).
4914 * * data[1]: end of daylight saving time (in DateTime ticks).
4915 * * data[2]: utcoffset (in TimeSpan ticks).
4916 * * data[3]: additional offset when daylight saving (in TimeSpan ticks).
4917 * * name[0]: name of this timezone when not daylight saving.
4918 * * name[1]: name of this timezone when daylight saving.
4920 * FIXME: This only works with "standard" Unix dates (years between 1900 and 2100) while
4921 * the class library allows years between 1 and 9999.
4923 * Returns true on success and zero on failure.
4926 ves_icall_System_CurrentTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)
4928 #ifndef PLATFORM_WIN32
4929 MonoDomain *domain = mono_domain_get ();
4930 struct tm start, tt;
4934 int is_daylight = 0, day;
4937 MONO_ARCH_SAVE_REGS;
4939 MONO_CHECK_ARG_NULL (data);
4940 MONO_CHECK_ARG_NULL (names);
4942 (*data) = mono_array_new (domain, mono_defaults.int64_class, 4);
4943 (*names) = mono_array_new (domain, mono_defaults.string_class, 2);
4946 * no info is better than crashing: we'll need our own tz data
4947 * to make this work properly, anyway. The range is probably
4948 * reduced to 1970 .. 2037 because that is what mktime is
4949 * guaranteed to support (we get into an infinite loop
4953 memset (&start, 0, sizeof (start));
4956 start.tm_year = year-1900;
4958 t = mktime (&start);
4960 if ((year < 1970) || (year > 2037) || (t == -1)) {
4962 tt = *localtime (&t);
4963 strftime (tzone, sizeof (tzone), "%Z", &tt);
4964 mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
4965 mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
4969 gmtoff = gmt_offset (&start, t);
4971 /* For each day of the year, calculate the tm_gmtoff. */
4972 for (day = 0; day < 365; day++) {
4975 tt = *localtime (&t);
4977 /* Daylight saving starts or ends here. */
4978 if (gmt_offset (&tt, t) != gmtoff) {
4982 /* Try to find the exact hour when daylight saving starts/ends. */
4986 tt1 = *localtime (&t1);
4987 } while (gmt_offset (&tt1, t1) != gmtoff);
4989 /* Try to find the exact minute when daylight saving starts/ends. */
4992 tt1 = *localtime (&t1);
4993 } while (gmt_offset (&tt1, t1) == gmtoff);
4995 strftime (tzone, sizeof (tzone), "%Z", &tt);
4997 /* Write data, if we're already in daylight saving, we're done. */
4999 mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
5000 mono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
5003 mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
5004 mono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
5008 /* This is only set once when we enter daylight saving. */
5009 mono_array_set ((*data), gint64, 2, (gint64)gmtoff * 10000000L);
5010 mono_array_set ((*data), gint64, 3, (gint64)(gmt_offset (&tt, t) - gmtoff) * 10000000L);
5012 gmtoff = gmt_offset (&tt, t);
5017 strftime (tzone, sizeof (tzone), "%Z", &tt);
5018 mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
5019 mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
5020 mono_array_set ((*data), gint64, 0, 0);
5021 mono_array_set ((*data), gint64, 1, 0);
5022 mono_array_set ((*data), gint64, 2, (gint64) gmtoff * 10000000L);
5023 mono_array_set ((*data), gint64, 3, 0);
5028 MonoDomain *domain = mono_domain_get ();
5029 TIME_ZONE_INFORMATION tz_info;
5034 tz_id = GetTimeZoneInformation (&tz_info);
5035 if (tz_id == TIME_ZONE_ID_INVALID)
5038 MONO_CHECK_ARG_NULL (data);
5039 MONO_CHECK_ARG_NULL (names);
5041 (*data) = mono_array_new (domain, mono_defaults.int64_class, 4);
5042 (*names) = mono_array_new (domain, mono_defaults.string_class, 2);
5044 for (i = 0; i < 32; ++i)
5045 if (!tz_info.DaylightName [i])
5047 mono_array_set ((*names), gpointer, 1, mono_string_new_utf16 (domain, tz_info.DaylightName, i));
5048 for (i = 0; i < 32; ++i)
5049 if (!tz_info.StandardName [i])
5051 mono_array_set ((*names), gpointer, 0, mono_string_new_utf16 (domain, tz_info.StandardName, i));
5053 if ((year <= 1601) || (year > 30827)) {
5055 * According to MSDN, the MS time functions can't handle dates outside
5061 /* even if the timezone has no daylight savings it may have Bias (e.g. GMT+13 it seems) */
5062 if (tz_id != TIME_ZONE_ID_UNKNOWN) {
5063 tz_info.StandardDate.wYear = year;
5064 convert_to_absolute_date(&tz_info.StandardDate);
5065 err = SystemTimeToFileTime (&tz_info.StandardDate, &ft);
5067 mono_array_set ((*data), gint64, 1, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));
5068 tz_info.DaylightDate.wYear = year;
5069 convert_to_absolute_date(&tz_info.DaylightDate);
5070 err = SystemTimeToFileTime (&tz_info.DaylightDate, &ft);
5072 mono_array_set ((*data), gint64, 0, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));
5074 mono_array_set ((*data), gint64, 2, (tz_info.Bias + tz_info.StandardBias) * -600000000LL);
5075 mono_array_set ((*data), gint64, 3, (tz_info.DaylightBias - tz_info.StandardBias) * -600000000LL);
5082 ves_icall_System_Object_obj_address (MonoObject *this)
5084 MONO_ARCH_SAVE_REGS;
5091 static inline gint32
5092 mono_array_get_byte_length (MonoArray *array)
5098 klass = array->obj.vtable->klass;
5100 if (array->bounds == NULL)
5101 length = array->max_length;
5104 for (i = 0; i < klass->rank; ++ i)
5105 length *= array->bounds [i].length;
5108 switch (klass->element_class->byval_arg.type) {
5111 case MONO_TYPE_BOOLEAN:
5115 case MONO_TYPE_CHAR:
5123 return length * sizeof (gpointer);
5134 ves_icall_System_Buffer_ByteLengthInternal (MonoArray *array)
5136 MONO_ARCH_SAVE_REGS;
5138 return mono_array_get_byte_length (array);
5142 ves_icall_System_Buffer_GetByteInternal (MonoArray *array, gint32 idx)
5144 MONO_ARCH_SAVE_REGS;
5146 return mono_array_get (array, gint8, idx);
5150 ves_icall_System_Buffer_SetByteInternal (MonoArray *array, gint32 idx, gint8 value)
5152 MONO_ARCH_SAVE_REGS;
5154 mono_array_set (array, gint8, idx, value);
5158 ves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, MonoArray *dest, gint32 dest_offset, gint32 count)
5160 guint8 *src_buf, *dest_buf;
5162 MONO_ARCH_SAVE_REGS;
5164 /* watch out for integer overflow */
5165 if ((src_offset > mono_array_get_byte_length (src) - count) || (dest_offset > mono_array_get_byte_length (dest) - count))
5168 src_buf = (guint8 *)src->vector + src_offset;
5169 dest_buf = (guint8 *)dest->vector + dest_offset;
5172 memcpy (dest_buf, src_buf, count);
5174 memmove (dest_buf, src_buf, count); /* Source and dest are the same array */
5180 ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString *class_name)
5182 MonoDomain *domain = mono_object_domain (this);
5184 MonoRealProxy *rp = ((MonoRealProxy *)this);
5185 MonoTransparentProxy *tp;
5189 MONO_ARCH_SAVE_REGS;
5191 res = mono_object_new (domain, mono_defaults.transparent_proxy_class);
5192 tp = (MonoTransparentProxy*) res;
5195 type = ((MonoReflectionType *)rp->class_to_proxy)->type;
5196 klass = mono_class_from_mono_type (type);
5198 tp->custom_type_info = (mono_object_isinst (this, mono_defaults.iremotingtypeinfo_class) != NULL);
5199 tp->remote_class = mono_remote_class (domain, class_name, klass);
5201 res->vtable = mono_remote_class_vtable (domain, tp->remote_class, rp);
5205 static MonoReflectionType *
5206 ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)
5208 return mono_type_get_object (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg);
5211 /* System.Environment */
5214 ves_icall_System_Environment_get_MachineName (void)
5216 #if defined (PLATFORM_WIN32)
5221 len = MAX_COMPUTERNAME_LENGTH + 1;
5222 buf = g_new (gunichar2, len);
5225 if (GetComputerName (buf, (PDWORD) &len))
5226 result = mono_string_new_utf16 (mono_domain_get (), buf, len);
5235 MONO_ARCH_SAVE_REGS;
5238 buf = g_new (gchar, len);
5241 if (gethostname (buf, len) == 0)
5242 result = mono_string_new (mono_domain_get (), buf);
5250 ves_icall_System_Environment_get_Platform (void)
5252 MONO_ARCH_SAVE_REGS;
5254 #if defined (PLATFORM_WIN32)
5264 ves_icall_System_Environment_get_NewLine (void)
5266 MONO_ARCH_SAVE_REGS;
5268 #if defined (PLATFORM_WIN32)
5269 return mono_string_new (mono_domain_get (), "\r\n");
5271 return mono_string_new (mono_domain_get (), "\n");
5276 ves_icall_System_Environment_GetEnvironmentVariable (MonoString *name)
5281 MONO_ARCH_SAVE_REGS;
5286 utf8_name = mono_string_to_utf8 (name); /* FIXME: this should be ascii */
5287 value = g_getenv (utf8_name);
5293 return mono_string_new (mono_domain_get (), value);
5297 * There is no standard way to get at environ.
5305 ves_icall_System_Environment_GetEnvironmentVariableNames (void)
5313 MONO_ARCH_SAVE_REGS;
5316 for (e = environ; *e != 0; ++ e)
5319 domain = mono_domain_get ();
5320 names = mono_array_new (domain, mono_defaults.string_class, n);
5323 for (e = environ; *e != 0; ++ e) {
5324 parts = g_strsplit (*e, "=", 2);
5326 str = mono_string_new (domain, *parts);
5327 mono_array_set (names, MonoString *, n, str);
5339 * Returns: the number of milliseconds elapsed since the system started.
5342 ves_icall_System_Environment_get_TickCount (void)
5344 return GetTickCount ();
5349 ves_icall_System_Environment_Exit (int result)
5351 MONO_ARCH_SAVE_REGS;
5353 mono_runtime_set_shutting_down ();
5355 /* Suspend all managed threads since the runtime is going away */
5356 mono_thread_suspend_all_other_threads ();
5358 mono_runtime_quit ();
5360 /* we may need to do some cleanup here... */
5365 ves_icall_System_Environment_GetGacPath (void)
5367 return mono_string_new (mono_domain_get (), mono_assembly_getrootdir ());
5371 ves_icall_System_Environment_GetWindowsFolderPath (int folder)
5373 #if defined (PLATFORM_WIN32)
5374 #ifndef CSIDL_FLAG_CREATE
5375 #define CSIDL_FLAG_CREATE 0x8000
5378 WCHAR path [MAX_PATH];
5379 /* Create directory if no existing */
5380 if (SUCCEEDED (SHGetFolderPathW (NULL, folder | CSIDL_FLAG_CREATE, NULL, 0, path))) {
5384 return mono_string_new_utf16 (mono_domain_get (), path, len);
5387 g_warning ("ves_icall_System_Environment_GetWindowsFolderPath should only be called on Windows!");
5389 return mono_string_new (mono_domain_get (), "");
5393 ves_icall_System_Environment_GetLogicalDrives (void)
5395 gunichar2 buf [128], *ptr, *dname;
5397 gint initial_size = 127, size = 128;
5400 MonoString *drivestr;
5401 MonoDomain *domain = mono_domain_get ();
5404 MONO_ARCH_SAVE_REGS;
5409 while (size > initial_size) {
5410 size = GetLogicalDriveStrings (initial_size, ptr);
5411 if (size > initial_size) {
5414 ptr = g_malloc0 ((size + 1) * sizeof (gunichar2));
5415 initial_size = size;
5429 result = mono_array_new (domain, mono_defaults.string_class, ndrives);
5434 while (*u16) { u16++; len ++; }
5435 drivestr = mono_string_new_utf16 (domain, dname, len);
5436 mono_array_set (result, gpointer, ndrives++, drivestr);
5447 ves_icall_System_Environment_InternalGetHome (void)
5449 MONO_ARCH_SAVE_REGS;
5451 return mono_string_new (mono_domain_get (), g_get_home_dir ());
5454 static const char *encodings [] = {
5456 "ascii", "us_ascii", "us", "ansi_x3.4_1968",
5457 "ansi_x3.4_1986", "cp367", "csascii", "ibm367",
5458 "iso_ir_6", "iso646_us", "iso_646.irv:1991",
5460 "utf_7", "csunicode11utf7", "unicode_1_1_utf_7",
5461 "unicode_2_0_utf_7", "x_unicode_1_1_utf_7",
5462 "x_unicode_2_0_utf_7",
5464 "utf_8", "unicode_1_1_utf_8", "unicode_2_0_utf_8",
5465 "x_unicode_1_1_utf_8", "x_unicode_2_0_utf_8",
5467 "utf_16", "UTF_16LE", "ucs_2", "unicode",
5470 "unicodefffe", "utf_16be",
5477 * Returns the internal codepage, if the value of "int_code_page" is
5478 * 1 at entry, and we can not compute a suitable code page number,
5479 * returns the code page as a string
5482 ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page)
5487 char *codepage = NULL;
5489 int want_name = *int_code_page;
5492 *int_code_page = -1;
5493 MONO_ARCH_SAVE_REGS;
5495 g_get_charset (&cset);
5496 c = codepage = strdup (cset);
5497 for (c = codepage; *c; c++){
5498 if (isascii (*c) && isalpha (*c))
5503 /* g_print ("charset: %s\n", cset); */
5505 /* handle some common aliases */
5508 for (i = 0; p != 0; ){
5509 if ((gssize) p < 7){
5511 p = encodings [++i];
5514 if (strcmp (p, codepage) == 0){
5515 *int_code_page = code;
5518 p = encodings [++i];
5521 if (strstr (codepage, "utf_8") != NULL)
5522 *int_code_page |= 0x10000000;
5525 if (want_name && *int_code_page == -1)
5526 return mono_string_new (mono_domain_get (), cset);
5532 ves_icall_System_Environment_get_HasShutdownStarted (void)
5534 if (mono_runtime_is_shutting_down ())
5537 if (mono_domain_is_unloading (mono_domain_get ()))
5544 ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this,
5545 MonoReflectionMethod *method,
5546 MonoArray *out_args)
5548 MONO_ARCH_SAVE_REGS;
5550 mono_message_init (mono_object_domain (this), this, method, out_args);
5554 ves_icall_IsTransparentProxy (MonoObject *proxy)
5556 MONO_ARCH_SAVE_REGS;
5561 if (proxy->vtable->klass == mono_defaults.transparent_proxy_class)
5568 ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (MonoReflectionType *type, MonoBoolean enable)
5573 MONO_ARCH_SAVE_REGS;
5575 klass = mono_class_from_mono_type (type->type);
5576 vtable = mono_class_vtable (mono_domain_get (), klass);
5578 if (enable) vtable->remote = 1;
5579 else vtable->remote = 0;
5583 ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance (MonoReflectionType *type)
5588 MONO_ARCH_SAVE_REGS;
5590 domain = mono_object_domain (type);
5591 klass = mono_class_from_mono_type (type->type);
5593 if (klass->rank >= 1) {
5594 g_assert (klass->rank == 1);
5595 return (MonoObject *) mono_array_new (domain, klass->element_class, 0);
5597 /* Bypass remoting object creation check */
5598 return mono_object_new_alloc_specific (mono_class_vtable (domain, klass));
5603 ves_icall_System_IO_get_temp_path (void)
5605 MONO_ARCH_SAVE_REGS;
5607 return mono_string_new (mono_domain_get (), g_get_tmp_dir ());
5611 ves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method)
5613 MONO_ARCH_SAVE_REGS;
5615 return mono_compile_method (method);
5619 ves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void)
5624 MONO_ARCH_SAVE_REGS;
5626 path = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), "mono", mono_get_runtime_info ()->framework_version, "machine.config", NULL);
5628 #if defined (PLATFORM_WIN32)
5629 /* Avoid mixing '/' and '\\' */
5632 for (i = strlen (path) - 1; i >= 0; i--)
5633 if (path [i] == '/')
5637 mcpath = mono_string_new (mono_domain_get (), path);
5644 ves_icall_System_Web_Util_ICalls_get_machine_install_dir (void)
5649 MONO_ARCH_SAVE_REGS;
5651 path = g_path_get_dirname (mono_get_config_dir ());
5653 #if defined (PLATFORM_WIN32)
5654 /* Avoid mixing '/' and '\\' */
5657 for (i = strlen (path) - 1; i >= 0; i--)
5658 if (path [i] == '/')
5662 ipath = mono_string_new (mono_domain_get (), path);
5669 ves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString (MonoString *message)
5671 #if defined (PLATFORM_WIN32)
5672 static void (*output_debug) (gunichar2 *);
5673 static gboolean tried_loading = FALSE;
5675 MONO_ARCH_SAVE_REGS;
5677 if (!tried_loading && output_debug == NULL) {
5680 tried_loading = TRUE;
5681 k32 = g_module_open ("kernel32", G_MODULE_BIND_LAZY);
5683 gchar *error = g_strdup (g_module_error ());
5684 g_warning ("Failed to load kernel32.dll: %s\n", error);
5689 g_module_symbol (k32, "OutputDebugStringW", (gpointer *) &output_debug);
5690 if (!output_debug) {
5691 gchar *error = g_strdup (g_module_error ());
5692 g_warning ("Failed to load OutputDebugStringW: %s\n", error);
5698 if (output_debug == NULL)
5701 output_debug (mono_string_chars (message));
5703 g_warning ("WriteWindowsDebugString called and PLATFORM_WIN32 not defined!\n");
5707 /* Only used for value types */
5709 ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type)
5714 MONO_ARCH_SAVE_REGS;
5716 domain = mono_object_domain (type);
5717 klass = mono_class_from_mono_type (type->type);
5719 return mono_object_new (domain, klass);
5722 static MonoReflectionMethod *
5723 ves_icall_MonoMethod_get_base_definition (MonoReflectionMethod *m)
5726 MonoMethod *method = m->method;
5727 MonoMethod *result = NULL;
5729 MONO_ARCH_SAVE_REGS;
5731 if (!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) ||
5732 MONO_CLASS_IS_INTERFACE (method->klass) ||
5733 method->flags & METHOD_ATTRIBUTE_NEW_SLOT)
5736 if (method->klass == NULL || (klass = method->klass->parent) == NULL)
5739 if (klass->generic_class)
5740 klass = klass->generic_class->container_class;
5742 mono_class_setup_vtable (klass);
5743 mono_class_setup_vtable (method->klass);
5744 while (result == NULL && klass != NULL && (klass->vtable_size > method->slot))
5746 mono_class_setup_vtable (klass);
5748 result = klass->vtable [method->slot];
5749 if (result == NULL) {
5751 gpointer iter = NULL;
5752 /* It is an abstract method */
5753 while ((m = mono_class_get_methods (klass, &iter))) {
5754 if (m->slot == method->slot) {
5760 klass = klass->parent;
5766 return mono_method_get_object (mono_domain_get (), result, NULL);
5770 mono_ArgIterator_Setup (MonoArgIterator *iter, char* argsp, char* start)
5772 MONO_ARCH_SAVE_REGS;
5774 iter->sig = *(MonoMethodSignature**)argsp;
5776 g_assert (iter->sig->sentinelpos <= iter->sig->param_count);
5777 g_assert (iter->sig->call_convention == MONO_CALL_VARARG);
5780 /* FIXME: it's not documented what start is exactly... */
5784 int i, align, arg_size;
5785 iter->args = argsp + sizeof (gpointer);
5786 #ifndef MONO_ARCH_REGPARMS
5787 for (i = 0; i < iter->sig->sentinelpos; ++i) {
5788 arg_size = mono_type_stack_size (iter->sig->params [i], &align);
5789 iter->args = (char*)iter->args + arg_size;
5793 iter->num_args = iter->sig->param_count - iter->sig->sentinelpos;
5795 /* g_print ("sig %p, param_count: %d, sent: %d\n", iter->sig, iter->sig->param_count, iter->sig->sentinelpos); */
5799 mono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)
5801 gint i, align, arg_size;
5803 MONO_ARCH_SAVE_REGS;
5805 i = iter->sig->sentinelpos + iter->next_arg;
5807 g_assert (i < iter->sig->param_count);
5809 res.type = iter->sig->params [i];
5810 res.klass = mono_class_from_mono_type (res.type);
5811 /* FIXME: endianess issue... */
5812 res.value = iter->args;
5813 arg_size = mono_type_stack_size (res.type, &align);
5814 iter->args = (char*)iter->args + arg_size;
5817 /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
5823 mono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type)
5825 gint i, align, arg_size;
5827 MONO_ARCH_SAVE_REGS;
5829 i = iter->sig->sentinelpos + iter->next_arg;
5831 g_assert (i < iter->sig->param_count);
5833 while (i < iter->sig->param_count) {
5834 if (!mono_metadata_type_equal (type, iter->sig->params [i]))
5836 res.type = iter->sig->params [i];
5837 res.klass = mono_class_from_mono_type (res.type);
5838 /* FIXME: endianess issue... */
5839 res.value = iter->args;
5840 arg_size = mono_type_stack_size (res.type, &align);
5841 iter->args = (char*)iter->args + arg_size;
5843 /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
5846 /* g_print ("arg type 0x%02x not found\n", res.type->type); */
5855 mono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter)
5858 MONO_ARCH_SAVE_REGS;
5860 i = iter->sig->sentinelpos + iter->next_arg;
5862 g_assert (i < iter->sig->param_count);
5864 return iter->sig->params [i];
5868 mono_TypedReference_ToObject (MonoTypedRef tref)
5870 MONO_ARCH_SAVE_REGS;
5872 if (MONO_TYPE_IS_REFERENCE (tref.type)) {
5873 MonoObject** objp = tref.value;
5877 return mono_value_box (mono_domain_get (), tref.klass, tref.value);
5881 mono_TypedReference_ToObjectInternal (MonoType *type, gpointer value, MonoClass *klass)
5883 MONO_ARCH_SAVE_REGS;
5885 if (MONO_TYPE_IS_REFERENCE (type)) {
5886 MonoObject** objp = value;
5890 return mono_value_box (mono_domain_get (), klass, value);
5894 prelink_method (MonoMethod *method)
5896 const char *exc_class, *exc_arg;
5897 if (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
5899 mono_lookup_pinvoke_call (method, &exc_class, &exc_arg);
5901 mono_raise_exception(
5902 mono_exception_from_name_msg (mono_defaults.corlib, "System", exc_class, exc_arg ) );
5904 /* create the wrapper, too? */
5908 ves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method)
5910 MONO_ARCH_SAVE_REGS;
5911 prelink_method (method->method);
5915 ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType *type)
5917 MonoClass *klass = mono_class_from_mono_type (type->type);
5919 gpointer iter = NULL;
5920 MONO_ARCH_SAVE_REGS;
5922 while ((m = mono_class_get_methods (klass, &iter)))
5926 /* These parameters are "readonly" in corlib/System/Char.cs */
5928 ves_icall_System_Char_GetDataTablePointers (guint8 const **category_data,
5929 guint8 const **numeric_data,
5930 gdouble const **numeric_data_values,
5931 guint16 const **to_lower_data_low,
5932 guint16 const **to_lower_data_high,
5933 guint16 const **to_upper_data_low,
5934 guint16 const **to_upper_data_high)
5936 *category_data = CategoryData;
5937 *numeric_data = NumericData;
5938 *numeric_data_values = NumericDataValues;
5939 *to_lower_data_low = ToLowerDataLow;
5940 *to_lower_data_high = ToLowerDataHigh;
5941 *to_upper_data_low = ToUpperDataLow;
5942 *to_upper_data_high = ToUpperDataHigh;
5946 ves_icall_MonoDebugger_check_runtime_version (MonoString *fname)
5948 gchar *filename, *error = NULL;
5950 MONO_ARCH_SAVE_REGS;
5952 filename = mono_string_to_utf8 (fname);
5953 error = mono_debugger_check_runtime_version (filename);
5957 return mono_string_new (mono_domain_get (), error);
5963 ves_icall_MonoDebugger_GetMethodIndex (MonoReflectionMethod *rmethod)
5967 MONO_ARCH_SAVE_REGS;
5969 index = mono_method_get_index (rmethod->method);
5973 return index - rmethod->method->klass->method.first;
5976 static MonoReflectionType*
5977 ves_icall_MonoDebugger_MakeArrayType (MonoReflectionType *type, int rank)
5979 MonoClass *klass, *aklass;
5981 MONO_ARCH_SAVE_REGS;
5983 klass = mono_class_from_mono_type (type->type);
5984 aklass = mono_array_class_get (klass, rank);
5986 return mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);
5990 ves_icall_MonoDebugger_GetTypeToken (MonoObject *obj)
5992 MONO_ARCH_SAVE_REGS;
5994 return mono_reflection_get_token (obj);
5998 custom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type)
6000 MonoCustomAttrInfo *cinfo;
6003 cinfo = mono_reflection_get_custom_attrs_info (obj);
6006 found = mono_custom_attrs_has_attr (cinfo, mono_class_from_mono_type (attr_type->type));
6008 mono_custom_attrs_free (cinfo);
6013 GCHandle_CheckCurrentDomain (guint32 gchandle)
6015 return mono_gchandle_is_in_domain (gchandle, mono_domain_get ());
6019 ves_icall_Mono_Runtime_GetDisplayName (void)
6021 char *display_name_str = g_strdup_printf ("Mono %s", VERSION);
6022 MonoString *display_name = mono_string_new (mono_domain_get (), display_name_str);
6023 g_free (display_name_str);
6024 return display_name;
6027 static guchar dbase64 [] = {
6028 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
6029 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
6030 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63,
6031 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 0, 128, 128,
6032 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
6033 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128,
6034 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
6035 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
6039 base64_to_byte_array (gunichar2 *start, gint ilength)
6051 for (i = 0; i < ilength; i++) {
6055 } else if (c >= sizeof (dbase64)) {
6056 exc = mono_exception_from_name_msg (mono_get_corlib (),
6057 "System", "FormatException",
6058 "Invalid character found.");
6059 mono_raise_exception (exc);
6063 olength = ilength - ignored;
6064 if ((olength & 3) != 0 || olength <= 0) {
6065 exc = mono_exception_from_name_msg (mono_get_corlib (), "System",
6066 "FormatException", "Invalid length.");
6067 mono_raise_exception (exc);
6070 olength = (olength * 3) / 4;
6071 if (start [ilength - 1] == '=')
6074 if (start [ilength - 2] == '=')
6077 result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength);
6078 res_ptr = mono_array_addr (result, guchar, 0);
6079 for (i = 0; i < ilength; ) {
6082 for (k = 0; k < 4 && i < ilength;) {
6088 if (((b [k] = dbase64 [c]) & 0x80) != 0) {
6089 exc = mono_exception_from_name_msg (mono_get_corlib (),
6090 "System", "FormatException",
6091 "Invalid character found.");
6092 mono_raise_exception (exc);
6097 *res_ptr++ = (b [0] << 2) | (b [1] >> 4);
6099 *res_ptr++ = (b [1] << 4) | (b [2] >> 2);
6101 *res_ptr++ = (b [2] << 6) | b [3];
6103 while (i < ilength && isspace (start [i]))
6111 InternalFromBase64String (MonoString *str)
6113 MONO_ARCH_SAVE_REGS;
6115 return base64_to_byte_array (mono_string_chars (str), mono_string_length (str));
6119 InternalFromBase64CharArray (MonoArray *input, gint offset, gint length)
6121 MONO_ARCH_SAVE_REGS;
6123 return base64_to_byte_array (mono_array_addr (input, gunichar2, offset), length);
6134 const IcallEntry *icalls;
6138 static const IcallEntry runtime_icalls [] = {
6139 {"GetDisplayName", ves_icall_Mono_Runtime_GetDisplayName}
6142 static const IcallEntry activator_icalls [] = {
6143 {"CreateInstanceInternal", ves_icall_System_Activator_CreateInstanceInternal}
6145 static const IcallEntry appdomain_icalls [] = {
6146 {"ExecuteAssembly", ves_icall_System_AppDomain_ExecuteAssembly},
6147 {"GetAssemblies", ves_icall_System_AppDomain_GetAssemblies},
6148 {"GetData", ves_icall_System_AppDomain_GetData},
6149 {"InternalGetContext", ves_icall_System_AppDomain_InternalGetContext},
6150 {"InternalGetDefaultContext", ves_icall_System_AppDomain_InternalGetDefaultContext},
6151 {"InternalGetProcessGuid", ves_icall_System_AppDomain_InternalGetProcessGuid},
6152 {"InternalIsFinalizingForUnload", ves_icall_System_AppDomain_InternalIsFinalizingForUnload},
6153 {"InternalPopDomainRef", ves_icall_System_AppDomain_InternalPopDomainRef},
6154 {"InternalPushDomainRef", ves_icall_System_AppDomain_InternalPushDomainRef},
6155 {"InternalPushDomainRefByID", ves_icall_System_AppDomain_InternalPushDomainRefByID},
6156 {"InternalSetContext", ves_icall_System_AppDomain_InternalSetContext},
6157 {"InternalSetDomain", ves_icall_System_AppDomain_InternalSetDomain},
6158 {"InternalSetDomainByID", ves_icall_System_AppDomain_InternalSetDomainByID},
6159 {"InternalUnload", ves_icall_System_AppDomain_InternalUnload},
6160 {"LoadAssembly", ves_icall_System_AppDomain_LoadAssembly},
6161 {"LoadAssemblyRaw", ves_icall_System_AppDomain_LoadAssemblyRaw},
6162 {"SetData", ves_icall_System_AppDomain_SetData},
6163 {"createDomain", ves_icall_System_AppDomain_createDomain},
6164 {"getCurDomain", ves_icall_System_AppDomain_getCurDomain},
6165 {"getFriendlyName", ves_icall_System_AppDomain_getFriendlyName},
6166 {"getRootDomain", ves_icall_System_AppDomain_getRootDomain},
6167 {"getSetup", ves_icall_System_AppDomain_getSetup}
6170 static const IcallEntry argiterator_icalls [] = {
6171 {"IntGetNextArg()", mono_ArgIterator_IntGetNextArg},
6172 {"IntGetNextArg(intptr)", mono_ArgIterator_IntGetNextArgT},
6173 {"IntGetNextArgType", mono_ArgIterator_IntGetNextArgType},
6174 {"Setup", mono_ArgIterator_Setup}
6177 static const IcallEntry array_icalls [] = {
6178 {"ClearInternal", ves_icall_System_Array_ClearInternal},
6179 {"Clone", mono_array_clone},
6180 {"CreateInstanceImpl", ves_icall_System_Array_CreateInstanceImpl},
6181 {"FastCopy", ves_icall_System_Array_FastCopy},
6182 {"GetLength", ves_icall_System_Array_GetLength},
6183 {"GetLowerBound", ves_icall_System_Array_GetLowerBound},
6184 {"GetRank", ves_icall_System_Array_GetRank},
6185 {"GetValue", ves_icall_System_Array_GetValue},
6186 {"GetValueImpl", ves_icall_System_Array_GetValueImpl},
6187 {"SetValue", ves_icall_System_Array_SetValue},
6188 {"SetValueImpl", ves_icall_System_Array_SetValueImpl}
6191 static const IcallEntry buffer_icalls [] = {
6192 {"BlockCopyInternal", ves_icall_System_Buffer_BlockCopyInternal},
6193 {"ByteLengthInternal", ves_icall_System_Buffer_ByteLengthInternal},
6194 {"GetByteInternal", ves_icall_System_Buffer_GetByteInternal},
6195 {"SetByteInternal", ves_icall_System_Buffer_SetByteInternal}
6198 static const IcallEntry char_icalls [] = {
6199 {"GetDataTablePointers", ves_icall_System_Char_GetDataTablePointers}
6202 static const IcallEntry defaultconf_icalls [] = {
6203 {"get_machine_config_path", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path}
6206 static const IcallEntry consoledriver_icalls [] = {
6207 {"InternalKeyAvailable", ves_icall_System_ConsoleDriver_InternalKeyAvailable },
6208 {"Isatty", ves_icall_System_ConsoleDriver_Isatty },
6209 {"SetBreak", ves_icall_System_ConsoleDriver_SetBreak },
6210 {"SetEcho", ves_icall_System_ConsoleDriver_SetEcho },
6211 {"TtySetup", ves_icall_System_ConsoleDriver_TtySetup }
6214 static const IcallEntry convert_icalls [] = {
6215 {"InternalFromBase64CharArray", InternalFromBase64CharArray },
6216 {"InternalFromBase64String", InternalFromBase64String }
6219 static const IcallEntry timezone_icalls [] = {
6220 {"GetTimeZoneData", ves_icall_System_CurrentTimeZone_GetTimeZoneData}
6223 static const IcallEntry datetime_icalls [] = {
6224 {"GetNow", ves_icall_System_DateTime_GetNow}
6227 #ifndef DISABLE_DECIMAL
6228 static const IcallEntry decimal_icalls [] = {
6229 {"decimal2Int64", mono_decimal2Int64},
6230 {"decimal2UInt64", mono_decimal2UInt64},
6231 {"decimal2double", mono_decimal2double},
6232 {"decimal2string", mono_decimal2string},
6233 {"decimalCompare", mono_decimalCompare},
6234 {"decimalDiv", mono_decimalDiv},
6235 {"decimalFloorAndTrunc", mono_decimalFloorAndTrunc},
6236 {"decimalIncr", mono_decimalIncr},
6237 {"decimalIntDiv", mono_decimalIntDiv},
6238 {"decimalMult", mono_decimalMult},
6239 {"decimalRound", mono_decimalRound},
6240 {"decimalSetExponent", mono_decimalSetExponent},
6241 {"double2decimal", mono_double2decimal}, /* FIXME: wrong signature. */
6242 {"string2decimal", mono_string2decimal}
6246 static const IcallEntry delegate_icalls [] = {
6247 {"CreateDelegate_internal", ves_icall_System_Delegate_CreateDelegate_internal},
6248 {"FreeTrampoline", ves_icall_System_Delegate_FreeTrampoline}
6251 static const IcallEntry tracelist_icalls [] = {
6252 {"WriteWindowsDebugString", ves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString}
6255 static const IcallEntry fileversion_icalls [] = {
6256 {"GetVersionInfo_internal(string)", ves_icall_System_Diagnostics_FileVersionInfo_GetVersionInfo_internal}
6259 static const IcallEntry process_icalls [] = {
6260 {"ExitCode_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitCode_internal},
6261 {"ExitTime_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitTime_internal},
6262 {"GetModules_internal()", ves_icall_System_Diagnostics_Process_GetModules_internal},
6263 {"GetPid_internal()", ves_icall_System_Diagnostics_Process_GetPid_internal},
6264 {"GetProcess_internal(int)", ves_icall_System_Diagnostics_Process_GetProcess_internal},
6265 {"GetProcesses_internal()", ves_icall_System_Diagnostics_Process_GetProcesses_internal},
6266 {"GetWorkingSet_internal(intptr,int&,int&)", ves_icall_System_Diagnostics_Process_GetWorkingSet_internal},
6267 {"Kill_internal", ves_icall_System_Diagnostics_Process_Kill_internal},
6268 {"ProcessName_internal(intptr)", ves_icall_System_Diagnostics_Process_ProcessName_internal},
6269 {"Process_free_internal(intptr)", ves_icall_System_Diagnostics_Process_Process_free_internal},
6270 {"SetWorkingSet_internal(intptr,int,int,bool)", ves_icall_System_Diagnostics_Process_SetWorkingSet_internal},
6271 {"StartTime_internal(intptr)", ves_icall_System_Diagnostics_Process_StartTime_internal},
6272 {"Start_internal(string,string,string,intptr,intptr,intptr,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_Start_internal},
6273 {"WaitForExit_internal(intptr,int)", ves_icall_System_Diagnostics_Process_WaitForExit_internal}
6276 static const IcallEntry double_icalls [] = {
6277 {"AssertEndianity", ves_icall_System_Double_AssertEndianity},
6278 {"ParseImpl", mono_double_ParseImpl}
6281 static const IcallEntry enum_icalls [] = {
6282 {"ToObject", ves_icall_System_Enum_ToObject},
6283 {"get_value", ves_icall_System_Enum_get_value}
6286 static const IcallEntry environment_icalls [] = {
6287 {"Exit", ves_icall_System_Environment_Exit},
6288 {"GetCommandLineArgs", mono_runtime_get_main_args},
6289 {"GetEnvironmentVariableNames", ves_icall_System_Environment_GetEnvironmentVariableNames},
6290 {"GetLogicalDrivesInternal", ves_icall_System_Environment_GetLogicalDrives },
6291 {"GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path},
6292 {"GetOSVersionString", ves_icall_System_Environment_GetOSVersionString},
6293 {"GetWindowsFolderPath", ves_icall_System_Environment_GetWindowsFolderPath},
6294 {"get_ExitCode", mono_environment_exitcode_get},
6295 {"get_HasShutdownStarted", ves_icall_System_Environment_get_HasShutdownStarted},
6296 {"get_MachineName", ves_icall_System_Environment_get_MachineName},
6297 {"get_NewLine", ves_icall_System_Environment_get_NewLine},
6298 {"get_Platform", ves_icall_System_Environment_get_Platform},
6299 {"get_TickCount", ves_icall_System_Environment_get_TickCount},
6300 {"get_UserName", ves_icall_System_Environment_get_UserName},
6301 {"internalGetEnvironmentVariable", ves_icall_System_Environment_GetEnvironmentVariable},
6302 {"internalGetGacPath", ves_icall_System_Environment_GetGacPath},
6303 {"internalGetHome", ves_icall_System_Environment_InternalGetHome},
6304 {"set_ExitCode", mono_environment_exitcode_set}
6307 static const IcallEntry cultureinfo_icalls [] = {
6308 {"construct_compareinfo(object,string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo},
6309 {"construct_datetime_format", ves_icall_System_Globalization_CultureInfo_construct_datetime_format},
6310 {"construct_internal_locale(string)", ves_icall_System_Globalization_CultureInfo_construct_internal_locale},
6311 {"construct_internal_locale_from_current_locale", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_current_locale},
6312 {"construct_internal_locale_from_lcid", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid},
6313 {"construct_internal_locale_from_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name},
6314 {"construct_internal_locale_from_specific_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specific_name},
6315 {"construct_number_format", ves_icall_System_Globalization_CultureInfo_construct_number_format},
6316 {"internal_get_cultures", ves_icall_System_Globalization_CultureInfo_internal_get_cultures},
6317 {"internal_is_lcid_neutral", ves_icall_System_Globalization_CultureInfo_internal_is_lcid_neutral}
6320 static const IcallEntry compareinfo_icalls [] = {
6321 {"assign_sortkey(object,string,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_assign_sortkey},
6322 {"construct_compareinfo(string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo},
6323 {"free_internal_collator()", ves_icall_System_Globalization_CompareInfo_free_internal_collator},
6324 {"internal_compare(string,int,int,string,int,int,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_internal_compare},
6325 {"internal_index(string,int,int,char,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index_char},
6326 {"internal_index(string,int,int,string,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index}
6329 static const IcallEntry gc_icalls [] = {
6330 {"GetTotalMemory", ves_icall_System_GC_GetTotalMemory},
6331 {"InternalCollect", ves_icall_System_GC_InternalCollect},
6332 {"KeepAlive", ves_icall_System_GC_KeepAlive},
6333 {"ReRegisterForFinalize", ves_icall_System_GC_ReRegisterForFinalize},
6334 {"SuppressFinalize", ves_icall_System_GC_SuppressFinalize},
6335 {"WaitForPendingFinalizers", ves_icall_System_GC_WaitForPendingFinalizers}
6338 static const IcallEntry famwatcher_icalls [] = {
6339 {"InternalFAMNextEvent", ves_icall_System_IO_FAMW_InternalFAMNextEvent}
6342 static const IcallEntry filewatcher_icalls [] = {
6343 {"InternalCloseDirectory", ves_icall_System_IO_FSW_CloseDirectory},
6344 {"InternalOpenDirectory", ves_icall_System_IO_FSW_OpenDirectory},
6345 {"InternalReadDirectoryChanges", ves_icall_System_IO_FSW_ReadDirectoryChanges},
6346 {"InternalSupportsFSW", ves_icall_System_IO_FSW_SupportsFSW}
6349 static const IcallEntry path_icalls [] = {
6350 {"get_temp_path", ves_icall_System_IO_get_temp_path}
6353 static const IcallEntry monoio_icalls [] = {
6354 {"Close(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Close},
6355 {"CopyFile(string,string,bool,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_CopyFile},
6356 {"CreateDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_CreateDirectory},
6357 {"CreatePipe(intptr&,intptr&)", ves_icall_System_IO_MonoIO_CreatePipe},
6358 {"DeleteFile(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_DeleteFile},
6359 {"FindClose(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_FindClose},
6360 {"FindFirstFile(string,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_FindFirstFile},
6361 {"FindNextFile(intptr,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_FindNextFile},
6362 {"Flush(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Flush},
6363 {"GetCurrentDirectory(System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetCurrentDirectory},
6364 {"GetFileAttributes(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileAttributes},
6365 {"GetFileStat(string,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileStat},
6366 {"GetFileType(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileType},
6367 {"GetLength(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetLength},
6368 {"GetTempPath(string&)", ves_icall_System_IO_MonoIO_GetTempPath},
6369 {"Lock(intptr,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Lock},
6370 {"MoveFile(string,string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_MoveFile},
6371 {"Open(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,bool,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Open},
6372 {"Read(intptr,byte[],int,int,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Read},
6373 {"RemoveDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_RemoveDirectory},
6374 {"Seek(intptr,long,System.IO.SeekOrigin,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Seek},
6375 {"SetCurrentDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetCurrentDirectory},
6376 {"SetFileAttributes(string,System.IO.FileAttributes,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetFileAttributes},
6377 {"SetFileTime(intptr,long,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetFileTime},
6378 {"SetLength(intptr,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetLength},
6379 {"Unlock(intptr,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Unlock},
6380 {"Write(intptr,byte[],int,int,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Write},
6381 {"get_AltDirectorySeparatorChar", ves_icall_System_IO_MonoIO_get_AltDirectorySeparatorChar},
6382 {"get_ConsoleError", ves_icall_System_IO_MonoIO_get_ConsoleError},
6383 {"get_ConsoleInput", ves_icall_System_IO_MonoIO_get_ConsoleInput},
6384 {"get_ConsoleOutput", ves_icall_System_IO_MonoIO_get_ConsoleOutput},
6385 {"get_DirectorySeparatorChar", ves_icall_System_IO_MonoIO_get_DirectorySeparatorChar},
6386 {"get_InvalidPathChars", ves_icall_System_IO_MonoIO_get_InvalidPathChars},
6387 {"get_PathSeparator", ves_icall_System_IO_MonoIO_get_PathSeparator},
6388 {"get_VolumeSeparatorChar", ves_icall_System_IO_MonoIO_get_VolumeSeparatorChar}
6391 static const IcallEntry math_icalls [] = {
6392 {"Acos", ves_icall_System_Math_Acos},
6393 {"Asin", ves_icall_System_Math_Asin},
6394 {"Atan", ves_icall_System_Math_Atan},
6395 {"Atan2", ves_icall_System_Math_Atan2},
6396 {"Cos", ves_icall_System_Math_Cos},
6397 {"Cosh", ves_icall_System_Math_Cosh},
6398 {"Exp", ves_icall_System_Math_Exp},
6399 {"Floor", ves_icall_System_Math_Floor},
6400 {"Log", ves_icall_System_Math_Log},
6401 {"Log10", ves_icall_System_Math_Log10},
6402 {"Pow", ves_icall_System_Math_Pow},
6403 {"Round", ves_icall_System_Math_Round},
6404 {"Round2", ves_icall_System_Math_Round2},
6405 {"Sin", ves_icall_System_Math_Sin},
6406 {"Sinh", ves_icall_System_Math_Sinh},
6407 {"Sqrt", ves_icall_System_Math_Sqrt},
6408 {"Tan", ves_icall_System_Math_Tan},
6409 {"Tanh", ves_icall_System_Math_Tanh}
6412 static const IcallEntry customattrs_icalls [] = {
6413 {"GetCustomAttributesDataInternal", mono_reflection_get_custom_attrs_data},
6414 {"GetCustomAttributesInternal", mono_reflection_get_custom_attrs},
6415 {"IsDefinedInternal", custom_attrs_defined_internal}
6418 static const IcallEntry enuminfo_icalls [] = {
6419 {"get_enum_info", ves_icall_get_enum_info}
6422 static const IcallEntry fieldinfo_icalls [] = {
6423 {"GetUnmanagedMarshal", ves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal},
6424 {"internal_from_handle", ves_icall_System_Reflection_FieldInfo_internal_from_handle}
6427 static const IcallEntry memberinfo_icalls [] = {
6428 {"get_MetadataToken", mono_reflection_get_token}
6431 static const IcallEntry monotype_icalls [] = {
6432 {"GetArrayRank", ves_icall_MonoType_GetArrayRank},
6433 {"GetConstructors", ves_icall_Type_GetConstructors_internal},
6434 {"GetConstructors_internal", ves_icall_Type_GetConstructors_internal},
6435 {"GetCorrespondingInflatedConstructor", ves_icall_MonoType_GetCorrespondingInflatedMethod},
6436 {"GetCorrespondingInflatedMethod", ves_icall_MonoType_GetCorrespondingInflatedMethod},
6437 {"GetElementType", ves_icall_MonoType_GetElementType},
6438 {"GetEvents_internal", ves_icall_Type_GetEvents_internal},
6439 {"GetField", ves_icall_Type_GetField},
6440 {"GetFields_internal", ves_icall_Type_GetFields_internal},
6441 {"GetGenericArguments", ves_icall_MonoType_GetGenericArguments},
6442 {"GetInterfaces", ves_icall_Type_GetInterfaces},
6443 {"GetMethodsByName", ves_icall_Type_GetMethodsByName},
6444 {"GetNestedType", ves_icall_Type_GetNestedType},
6445 {"GetNestedTypes", ves_icall_Type_GetNestedTypes},
6446 {"GetPropertiesByName", ves_icall_Type_GetPropertiesByName},
6447 {"InternalGetEvent", ves_icall_MonoType_GetEvent},
6448 {"IsByRefImpl", ves_icall_type_isbyref},
6449 {"IsPointerImpl", ves_icall_type_ispointer},
6450 {"IsPrimitiveImpl", ves_icall_type_isprimitive},
6451 {"getFullName", ves_icall_System_MonoType_getFullName},
6452 {"get_Assembly", ves_icall_MonoType_get_Assembly},
6453 {"get_BaseType", ves_icall_get_type_parent},
6454 {"get_DeclaringMethod", ves_icall_MonoType_get_DeclaringMethod},
6455 {"get_DeclaringType", ves_icall_MonoType_get_DeclaringType},
6456 {"get_HasGenericArguments", ves_icall_MonoType_get_HasGenericArguments},
6457 {"get_IsGenericParameter", ves_icall_MonoType_get_IsGenericParameter},
6458 {"get_Module", ves_icall_MonoType_get_Module},
6459 {"get_Name", ves_icall_MonoType_get_Name},
6460 {"get_Namespace", ves_icall_MonoType_get_Namespace},
6461 {"get_UnderlyingSystemType", ves_icall_MonoType_get_UnderlyingSystemType},
6462 {"get_attributes", ves_icall_get_attributes},
6463 {"type_from_obj", mono_type_type_from_obj}
6466 static const IcallEntry assembly_icalls [] = {
6467 {"FillName", ves_icall_System_Reflection_Assembly_FillName},
6468 {"GetCallingAssembly", ves_icall_System_Reflection_Assembly_GetCallingAssembly},
6469 {"GetEntryAssembly", ves_icall_System_Reflection_Assembly_GetEntryAssembly},
6470 {"GetExecutingAssembly", ves_icall_System_Reflection_Assembly_GetExecutingAssembly},
6471 {"GetFilesInternal", ves_icall_System_Reflection_Assembly_GetFilesInternal},
6472 {"GetManifestResourceInfoInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal},
6473 {"GetManifestResourceInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInternal},
6474 {"GetManifestResourceNames", ves_icall_System_Reflection_Assembly_GetManifestResourceNames},
6475 {"GetModulesInternal", ves_icall_System_Reflection_Assembly_GetModulesInternal},
6476 {"GetNamespaces", ves_icall_System_Reflection_Assembly_GetNamespaces},
6477 {"GetReferencedAssemblies", ves_icall_System_Reflection_Assembly_GetReferencedAssemblies},
6478 {"GetTypes", ves_icall_System_Reflection_Assembly_GetTypes},
6479 {"InternalGetAssemblyName", ves_icall_System_Reflection_Assembly_InternalGetAssemblyName},
6480 {"InternalGetType", ves_icall_System_Reflection_Assembly_InternalGetType},
6481 {"InternalImageRuntimeVersion", ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion},
6482 {"LoadFrom", ves_icall_System_Reflection_Assembly_LoadFrom},
6483 {"LoadPermissions", ves_icall_System_Reflection_Assembly_LoadPermissions},
6485 * Private icalls for the Mono Debugger
6487 {"MonoDebugger_CheckRuntimeVersion", ves_icall_MonoDebugger_check_runtime_version},
6488 {"MonoDebugger_GetLocalTypeFromSignature", ves_icall_MonoDebugger_GetLocalTypeFromSignature},
6489 {"MonoDebugger_GetMethod", ves_icall_MonoDebugger_GetMethod},
6490 {"MonoDebugger_GetMethodIndex", ves_icall_MonoDebugger_GetMethodIndex},
6491 {"MonoDebugger_GetMethodToken", ves_icall_MonoDebugger_GetMethodToken},
6492 {"MonoDebugger_GetType", ves_icall_MonoDebugger_GetType},
6493 {"MonoDebugger_GetTypeToken", ves_icall_MonoDebugger_GetTypeToken},
6494 {"MonoDebugger_MakeArrayType", ves_icall_MonoDebugger_MakeArrayType},
6496 /* normal icalls again */
6497 {"get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint},
6498 {"get_ManifestModule", ves_icall_System_Reflection_Assembly_get_ManifestModule},
6499 {"get_MetadataToken", mono_reflection_get_token},
6500 {"get_ReflectionOnly", ves_icall_System_Reflection_Assembly_get_ReflectionOnly},
6501 {"get_code_base", ves_icall_System_Reflection_Assembly_get_code_base},
6502 {"get_global_assembly_cache", ves_icall_System_Reflection_Assembly_get_global_assembly_cache},
6503 {"get_location", ves_icall_System_Reflection_Assembly_get_location},
6504 {"load_with_partial_name", ves_icall_System_Reflection_Assembly_load_with_partial_name}
6507 static const IcallEntry methodbase_icalls [] = {
6508 {"GetCurrentMethod", ves_icall_GetCurrentMethod},
6509 {"GetMethodBodyInternal", ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal},
6510 {"GetMethodFromHandleInternal", ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal}
6513 static const IcallEntry module_icalls [] = {
6514 {"Close", ves_icall_System_Reflection_Module_Close},
6515 {"GetGlobalType", ves_icall_System_Reflection_Module_GetGlobalType},
6516 {"GetGuidInternal", ves_icall_System_Reflection_Module_GetGuidInternal},
6517 {"GetPEKind", ves_icall_System_Reflection_Module_GetPEKind},
6518 {"InternalGetTypes", ves_icall_System_Reflection_Module_InternalGetTypes},
6519 {"ResolveFieldToken", ves_icall_System_Reflection_Module_ResolveFieldToken},
6520 {"ResolveMemberToken", ves_icall_System_Reflection_Module_ResolveMemberToken},
6521 {"ResolveMethodToken", ves_icall_System_Reflection_Module_ResolveMethodToken},
6522 {"ResolveStringToken", ves_icall_System_Reflection_Module_ResolveStringToken},
6523 {"ResolveTypeToken", ves_icall_System_Reflection_Module_ResolveTypeToken},
6524 {"get_MetadataToken", mono_reflection_get_token}
6527 static const IcallEntry monocmethod_icalls [] = {
6528 {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
6529 {"InternalInvoke", ves_icall_InternalInvoke},
6530 {"get_Mono_IsInflatedMethod", ves_icall_MonoMethod_get_Mono_IsInflatedMethod}
6533 static const IcallEntry monoeventinfo_icalls [] = {
6534 {"get_event_info", ves_icall_get_event_info}
6537 static const IcallEntry monofield_icalls [] = {
6538 {"GetFieldOffset", ves_icall_MonoField_GetFieldOffset},
6539 {"GetParentType", ves_icall_MonoField_GetParentType},
6540 {"GetValueInternal", ves_icall_MonoField_GetValueInternal},
6541 {"Mono_GetGenericFieldDefinition", ves_icall_MonoField_Mono_GetGenericFieldDefinition},
6542 {"SetValueInternal", ves_icall_FieldInfo_SetValueInternal}
6545 static const IcallEntry monogenericclass_icalls [] = {
6546 {"GetConstructors_internal", ves_icall_MonoGenericClass_GetConstructors},
6547 {"GetCorrespondingInflatedConstructor", ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor},
6548 {"GetCorrespondingInflatedField", ves_icall_MonoGenericClass_GetCorrespondingInflatedField},
6549 {"GetCorrespondingInflatedMethod", ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod},
6550 {"GetEvents_internal", ves_icall_MonoGenericClass_GetEvents},
6551 {"GetFields_internal", ves_icall_MonoGenericClass_GetFields},
6552 {"GetInterfaces_internal", ves_icall_MonoGenericClass_GetInterfaces},
6553 {"GetMethods_internal", ves_icall_MonoGenericClass_GetMethods},
6554 {"GetParentType", ves_icall_MonoGenericClass_GetParentType},
6555 {"GetProperties_internal", ves_icall_MonoGenericClass_GetProperties},
6556 {"initialize", mono_reflection_generic_class_initialize}
6559 static const IcallEntry monogenericmethod_icalls [] = {
6560 {"get_ReflectedType", ves_icall_MonoGenericMethod_get_ReflectedType}
6563 static const IcallEntry generictypeparambuilder_icalls [] = {
6564 {"initialize", mono_reflection_initialize_generic_parameter}
6567 static const IcallEntry monomethod_icalls [] = {
6568 {"BindGenericParameters", mono_reflection_bind_generic_method_parameters},
6569 {"GetDllImportAttribute", ves_icall_MonoMethod_GetDllImportAttribute},
6570 {"GetGenericArguments", ves_icall_MonoMethod_GetGenericArguments},
6571 {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
6572 {"InternalInvoke", ves_icall_InternalInvoke},
6573 {"get_HasGenericParameters", ves_icall_MonoMethod_get_HasGenericParameters},
6574 {"get_IsGenericMethodDefinition", ves_icall_MonoMethod_get_IsGenericMethodDefinition},
6575 {"get_Mono_IsInflatedMethod", ves_icall_MonoMethod_get_Mono_IsInflatedMethod},
6576 {"get_base_definition", ves_icall_MonoMethod_get_base_definition}
6579 static const IcallEntry monomethodinfo_icalls [] = {
6580 {"get_method_info", ves_icall_get_method_info},
6581 {"get_parameter_info", ves_icall_get_parameter_info}
6584 static const IcallEntry monopropertyinfo_icalls [] = {
6585 {"get_property_info", ves_icall_get_property_info}
6588 static const IcallEntry parameterinfo_icalls [] = {
6589 {"get_MetadataToken", mono_reflection_get_token}
6592 static const IcallEntry dns_icalls [] = {
6593 {"GetHostByAddr_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByAddr_internal},
6594 {"GetHostByName_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByName_internal},
6595 {"GetHostName_internal(string&)", ves_icall_System_Net_Dns_GetHostName_internal}
6598 static const IcallEntry socket_icalls [] = {
6599 {"Accept_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Accept_internal},
6600 {"Available_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Available_internal},
6601 {"Bind_internal(intptr,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_Bind_internal},
6602 {"Blocking_internal(intptr,bool,int&)", ves_icall_System_Net_Sockets_Socket_Blocking_internal},
6603 {"Close_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Close_internal},
6604 {"Connect_internal(intptr,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_Connect_internal},
6605 {"GetSocketOption_arr_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,byte[]&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal},
6606 {"GetSocketOption_obj_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal},
6607 {"Listen_internal(intptr,int,int&)", ves_icall_System_Net_Sockets_Socket_Listen_internal},
6608 {"LocalEndPoint_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal},
6609 {"Poll_internal", ves_icall_System_Net_Sockets_Socket_Poll_internal},
6610 {"Receive_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Receive_internal},
6611 {"RecvFrom_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&,int&)", ves_icall_System_Net_Sockets_Socket_RecvFrom_internal},
6612 {"RemoteEndPoint_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal},
6613 {"Select_internal(System.Net.Sockets.Socket[]&,int,int&)", ves_icall_System_Net_Sockets_Socket_Select_internal},
6614 {"SendTo_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_SendTo_internal},
6615 {"Send_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Send_internal},
6616 {"SetSocketOption_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object,byte[],int,int&)", ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal},
6617 {"Shutdown_internal(intptr,System.Net.Sockets.SocketShutdown,int&)", ves_icall_System_Net_Sockets_Socket_Shutdown_internal},
6618 {"Socket_internal(System.Net.Sockets.AddressFamily,System.Net.Sockets.SocketType,System.Net.Sockets.ProtocolType,int&)", ves_icall_System_Net_Sockets_Socket_Socket_internal},
6619 {"WSAIoctl(intptr,int,byte[],byte[],int&)", ves_icall_System_Net_Sockets_Socket_WSAIoctl}
6622 static const IcallEntry socketex_icalls [] = {
6623 {"WSAGetLastError_internal", ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal}
6626 static const IcallEntry object_icalls [] = {
6627 {"GetType", ves_icall_System_Object_GetType},
6628 {"InternalGetHashCode", ves_icall_System_Object_GetHashCode},
6629 {"MemberwiseClone", ves_icall_System_Object_MemberwiseClone},
6630 {"obj_address", ves_icall_System_Object_obj_address}
6633 static const IcallEntry assemblybuilder_icalls[] = {
6634 {"InternalAddModule", mono_image_load_module},
6635 {"basic_init", mono_image_basic_init}
6638 static const IcallEntry customattrbuilder_icalls [] = {
6639 {"GetBlob", mono_reflection_get_custom_attrs_blob}
6642 static const IcallEntry dynamicmethod_icalls [] = {
6643 {"create_dynamic_method", mono_reflection_create_dynamic_method}
6646 static const IcallEntry methodbuilder_icalls [] = {
6647 {"BindGenericParameters", mono_reflection_bind_generic_method_parameters}
6650 static const IcallEntry modulebuilder_icalls [] = {
6651 {"WriteToFile", ves_icall_ModuleBuilder_WriteToFile},
6652 {"basic_init", mono_image_module_basic_init},
6653 {"build_metadata", ves_icall_ModuleBuilder_build_metadata},
6654 {"create_modified_type", ves_icall_ModuleBuilder_create_modified_type},
6655 {"getMethodToken", ves_icall_ModuleBuilder_getMethodToken},
6656 {"getToken", ves_icall_ModuleBuilder_getToken},
6657 {"getUSIndex", mono_image_insert_string}
6660 static const IcallEntry signaturehelper_icalls [] = {
6661 {"get_signature_field", mono_reflection_sighelper_get_signature_field},
6662 {"get_signature_local", mono_reflection_sighelper_get_signature_local}
6665 static const IcallEntry typebuilder_icalls [] = {
6666 {"create_generic_class", mono_reflection_create_generic_class},
6667 {"create_internal_class", mono_reflection_create_internal_class},
6668 {"create_runtime_class", mono_reflection_create_runtime_class},
6669 {"get_IsGenericParameter", ves_icall_TypeBuilder_get_IsGenericParameter},
6670 {"get_event_info", mono_reflection_event_builder_get_event_info},
6671 {"setup_generic_class", mono_reflection_setup_generic_class},
6672 {"setup_internal_class", mono_reflection_setup_internal_class}
6675 static const IcallEntry enumbuilder_icalls [] = {
6676 {"setup_enum_type", ves_icall_EnumBuilder_setup_enum_type}
6679 static const IcallEntry runtimehelpers_icalls [] = {
6680 {"GetObjectValue", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue},
6681 /* REMOVEME: no longer needed, just so we dont break things when not needed */
6682 {"GetOffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData},
6683 {"InitializeArray", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray},
6684 {"RunClassConstructor", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor},
6685 {"get_OffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData}
6688 static const IcallEntry gchandle_icalls [] = {
6689 {"CheckCurrentDomain", GCHandle_CheckCurrentDomain},
6690 {"FreeHandle", ves_icall_System_GCHandle_FreeHandle},
6691 {"GetAddrOfPinnedObject", ves_icall_System_GCHandle_GetAddrOfPinnedObject},
6692 {"GetTarget", ves_icall_System_GCHandle_GetTarget},
6693 {"GetTargetHandle", ves_icall_System_GCHandle_GetTargetHandle}
6696 static const IcallEntry marshal_icalls [] = {
6697 {"AllocCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_AllocCoTaskMem},
6698 {"AllocHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_AllocHGlobal},
6699 {"DestroyStructure", ves_icall_System_Runtime_InteropServices_Marshal_DestroyStructure},
6700 {"FreeCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_FreeCoTaskMem},
6701 {"FreeHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_FreeHGlobal},
6702 {"GetDelegateForFunctionPointerInternal", ves_icall_System_Runtime_InteropServices_Marshal_GetDelegateForFunctionPointerInternal},
6703 {"GetFunctionPointerForDelegateInternal", mono_delegate_to_ftnptr},
6704 {"GetLastWin32Error", ves_icall_System_Runtime_InteropServices_Marshal_GetLastWin32Error},
6705 {"OffsetOf", ves_icall_System_Runtime_InteropServices_Marshal_OffsetOf},
6706 {"Prelink", ves_icall_System_Runtime_InteropServices_Marshal_Prelink},
6707 {"PrelinkAll", ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll},
6708 {"PtrToStringAnsi(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi},
6709 {"PtrToStringAnsi(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len},
6710 {"PtrToStringAuto(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi},
6711 {"PtrToStringAuto(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len},
6712 {"PtrToStringBSTR", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringBSTR},
6713 {"PtrToStringUni(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni},
6714 {"PtrToStringUni(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni_len},
6715 {"PtrToStructure(intptr,System.Type)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure_type},
6716 {"PtrToStructure(intptr,object)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure},
6717 {"ReAllocHGlobal", mono_marshal_realloc},
6718 {"ReadByte", ves_icall_System_Runtime_InteropServices_Marshal_ReadByte},
6719 {"ReadInt16", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt16},
6720 {"ReadInt32", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt32},
6721 {"ReadInt64", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt64},
6722 {"ReadIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_ReadIntPtr},
6723 {"SizeOf", ves_icall_System_Runtime_InteropServices_Marshal_SizeOf},
6724 {"StringToHGlobalAnsi", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi},
6725 {"StringToHGlobalAuto", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi},
6726 {"StringToHGlobalUni", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalUni},
6727 {"StructureToPtr", ves_icall_System_Runtime_InteropServices_Marshal_StructureToPtr},
6728 {"UnsafeAddrOfPinnedArrayElement", ves_icall_System_Runtime_InteropServices_Marshal_UnsafeAddrOfPinnedArrayElement},
6729 {"WriteByte", ves_icall_System_Runtime_InteropServices_Marshal_WriteByte},
6730 {"WriteInt16", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt16},
6731 {"WriteInt32", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt32},
6732 {"WriteInt64", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt64},
6733 {"WriteIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_WriteIntPtr},
6734 {"copy_from_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged},
6735 {"copy_to_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_to_unmanaged}
6738 static const IcallEntry activationservices_icalls [] = {
6739 {"AllocateUninitializedClassInstance", ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance},
6740 {"EnableProxyActivation", ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation}
6743 static const IcallEntry monomethodmessage_icalls [] = {
6744 {"InitMessage", ves_icall_MonoMethodMessage_InitMessage}
6747 static const IcallEntry realproxy_icalls [] = {
6748 {"InternalGetProxyType", ves_icall_Remoting_RealProxy_InternalGetProxyType},
6749 {"InternalGetTransparentProxy", ves_icall_Remoting_RealProxy_GetTransparentProxy}
6752 static const IcallEntry remotingservices_icalls [] = {
6753 {"InternalExecute", ves_icall_InternalExecute},
6754 {"IsTransparentProxy", ves_icall_IsTransparentProxy}
6757 static const IcallEntry rng_icalls [] = {
6758 {"RngClose", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose},
6759 {"RngGetBytes", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngGetBytes},
6760 {"RngInitialize", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize},
6761 {"RngOpen", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen}
6764 static const IcallEntry methodhandle_icalls [] = {
6765 {"GetFunctionPointer", ves_icall_RuntimeMethod_GetFunctionPointer}
6768 static const IcallEntry string_icalls [] = {
6769 {".ctor(char*)", ves_icall_System_String_ctor_charp},
6770 {".ctor(char*,int,int)", ves_icall_System_String_ctor_charp_int_int},
6771 {".ctor(char,int)", ves_icall_System_String_ctor_char_int},
6772 {".ctor(char[])", ves_icall_System_String_ctor_chara},
6773 {".ctor(char[],int,int)", ves_icall_System_String_ctor_chara_int_int},
6774 {".ctor(sbyte*)", ves_icall_System_String_ctor_sbytep},
6775 {".ctor(sbyte*,int,int)", ves_icall_System_String_ctor_sbytep_int_int},
6776 {".ctor(sbyte*,int,int,System.Text.Encoding)", ves_icall_System_String_ctor_encoding},
6777 {"InternalAllocateStr", ves_icall_System_String_InternalAllocateStr},
6778 {"InternalCharCopy", ves_icall_System_String_InternalCharCopy},
6779 {"InternalCopyTo", ves_icall_System_String_InternalCopyTo},
6780 {"InternalIndexOfAny", ves_icall_System_String_InternalIndexOfAny},
6781 {"InternalInsert", ves_icall_System_String_InternalInsert},
6782 {"InternalIntern", ves_icall_System_String_InternalIntern},
6783 {"InternalIsInterned", ves_icall_System_String_InternalIsInterned},
6784 {"InternalJoin", ves_icall_System_String_InternalJoin},
6785 {"InternalLastIndexOfAny", ves_icall_System_String_InternalLastIndexOfAny},
6786 {"InternalPad", ves_icall_System_String_InternalPad},
6787 {"InternalRemove", ves_icall_System_String_InternalRemove},
6788 {"InternalReplace(char,char)", ves_icall_System_String_InternalReplace_Char},
6789 {"InternalReplace(string,string,System.Globalization.CompareInfo)", ves_icall_System_String_InternalReplace_Str_Comp},
6790 {"InternalSplit", ves_icall_System_String_InternalSplit},
6791 {"InternalStrcpy(string,int,char[])", ves_icall_System_String_InternalStrcpy_Chars},
6792 {"InternalStrcpy(string,int,char[],int,int)", ves_icall_System_String_InternalStrcpy_CharsN},
6793 {"InternalStrcpy(string,int,string)", ves_icall_System_String_InternalStrcpy_Str},
6794 {"InternalStrcpy(string,int,string,int,int)", ves_icall_System_String_InternalStrcpy_StrN},
6795 {"InternalTrim", ves_icall_System_String_InternalTrim},
6796 {"get_Chars", ves_icall_System_String_get_Chars}
6799 static const IcallEntry encoding_icalls [] = {
6800 {"InternalCodePage", ves_icall_System_Text_Encoding_InternalCodePage}
6803 static const IcallEntry monitor_icalls [] = {
6804 {"Monitor_exit", ves_icall_System_Threading_Monitor_Monitor_exit},
6805 {"Monitor_pulse", ves_icall_System_Threading_Monitor_Monitor_pulse},
6806 {"Monitor_pulse_all", ves_icall_System_Threading_Monitor_Monitor_pulse_all},
6807 {"Monitor_test_owner", ves_icall_System_Threading_Monitor_Monitor_test_owner},
6808 {"Monitor_test_synchronised", ves_icall_System_Threading_Monitor_Monitor_test_synchronised},
6809 {"Monitor_try_enter", ves_icall_System_Threading_Monitor_Monitor_try_enter},
6810 {"Monitor_wait", ves_icall_System_Threading_Monitor_Monitor_wait}
6813 static const IcallEntry interlocked_icalls [] = {
6814 {"Add(int&,int)", ves_icall_System_Threading_Interlocked_Add_Int},
6815 {"Add(long&,long)", ves_icall_System_Threading_Interlocked_Add_Long},
6816 {"CompareExchange(double&,double,double)", ves_icall_System_Threading_Interlocked_CompareExchange_Double},
6817 {"CompareExchange(int&,int,int)", ves_icall_System_Threading_Interlocked_CompareExchange_Int},
6818 {"CompareExchange(intptr&,intptr,intptr)", ves_icall_System_Threading_Interlocked_CompareExchange_Object},
6819 {"CompareExchange(long&,long,long)", ves_icall_System_Threading_Interlocked_CompareExchange_Long},
6820 {"CompareExchange(object&,object,object)", ves_icall_System_Threading_Interlocked_CompareExchange_Object},
6821 {"CompareExchange(single&,single,single)", ves_icall_System_Threading_Interlocked_CompareExchange_Single},
6822 {"Decrement(int&)", ves_icall_System_Threading_Interlocked_Decrement_Int},
6823 {"Decrement(long&)", ves_icall_System_Threading_Interlocked_Decrement_Long},
6824 {"Exchange(double&,double)", ves_icall_System_Threading_Interlocked_Exchange_Double},
6825 {"Exchange(int&,int)", ves_icall_System_Threading_Interlocked_Exchange_Int},
6826 {"Exchange(intptr&,intptr)", ves_icall_System_Threading_Interlocked_Exchange_Object},
6827 {"Exchange(long&,long)", ves_icall_System_Threading_Interlocked_Exchange_Long},
6828 {"Exchange(object&,object)", ves_icall_System_Threading_Interlocked_Exchange_Object},
6829 {"Exchange(single&,single)", ves_icall_System_Threading_Interlocked_Exchange_Single},
6830 {"Increment(int&)", ves_icall_System_Threading_Interlocked_Increment_Int},
6831 {"Increment(long&)", ves_icall_System_Threading_Interlocked_Increment_Long},
6832 {"Read(long&)", ves_icall_System_Threading_Interlocked_Read_Long}
6835 static const IcallEntry mutex_icalls [] = {
6836 {"CreateMutex_internal(bool,string,bool&)", ves_icall_System_Threading_Mutex_CreateMutex_internal},
6837 {"ReleaseMutex_internal(intptr)", ves_icall_System_Threading_Mutex_ReleaseMutex_internal}
6840 static const IcallEntry nativeevents_icalls [] = {
6841 {"CloseEvent_internal", ves_icall_System_Threading_Events_CloseEvent_internal},
6842 {"CreateEvent_internal", ves_icall_System_Threading_Events_CreateEvent_internal},
6843 {"ResetEvent_internal", ves_icall_System_Threading_Events_ResetEvent_internal},
6844 {"SetEvent_internal", ves_icall_System_Threading_Events_SetEvent_internal}
6847 static const IcallEntry thread_icalls [] = {
6848 {"Abort_internal(object)", ves_icall_System_Threading_Thread_Abort},
6849 {"ClrState", ves_icall_System_Threading_Thread_ClrState},
6850 {"CurrentThread_internal", mono_thread_current},
6851 {"GetCachedCurrentCulture", ves_icall_System_Threading_Thread_GetCachedCurrentCulture},
6852 {"GetCachedCurrentUICulture", ves_icall_System_Threading_Thread_GetCachedCurrentUICulture},
6853 {"GetDomainID", ves_icall_System_Threading_Thread_GetDomainID},
6854 {"GetName_internal", ves_icall_System_Threading_Thread_GetName_internal},
6855 {"GetSerializedCurrentCulture", ves_icall_System_Threading_Thread_GetSerializedCurrentCulture},
6856 {"GetSerializedCurrentUICulture", ves_icall_System_Threading_Thread_GetSerializedCurrentUICulture},
6857 {"GetState", ves_icall_System_Threading_Thread_GetState},
6858 {"Join_internal", ves_icall_System_Threading_Thread_Join_internal},
6859 {"ResetAbort_internal()", ves_icall_System_Threading_Thread_ResetAbort},
6860 {"Resume_internal()", ves_icall_System_Threading_Thread_Resume},
6861 {"SetCachedCurrentCulture", ves_icall_System_Threading_Thread_SetCachedCurrentCulture},
6862 {"SetCachedCurrentUICulture", ves_icall_System_Threading_Thread_SetCachedCurrentUICulture},
6863 {"SetName_internal", ves_icall_System_Threading_Thread_SetName_internal},
6864 {"SetSerializedCurrentCulture", ves_icall_System_Threading_Thread_SetSerializedCurrentCulture},
6865 {"SetSerializedCurrentUICulture", ves_icall_System_Threading_Thread_SetSerializedCurrentUICulture},
6866 {"SetState", ves_icall_System_Threading_Thread_SetState},
6867 {"Sleep_internal", ves_icall_System_Threading_Thread_Sleep_internal},
6868 {"Suspend_internal", ves_icall_System_Threading_Thread_Suspend},
6869 {"Thread_free_internal", ves_icall_System_Threading_Thread_Thread_free_internal},
6870 {"Thread_internal", ves_icall_System_Threading_Thread_Thread_internal},
6871 {"VolatileRead(byte&)", ves_icall_System_Threading_Thread_VolatileRead1},
6872 {"VolatileRead(double&)", ves_icall_System_Threading_Thread_VolatileRead8},
6873 {"VolatileRead(int&)", ves_icall_System_Threading_Thread_VolatileRead4},
6874 {"VolatileRead(int16&)", ves_icall_System_Threading_Thread_VolatileRead2},
6875 {"VolatileRead(intptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
6876 {"VolatileRead(long&)", ves_icall_System_Threading_Thread_VolatileRead8},
6877 {"VolatileRead(object&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
6878 {"VolatileRead(sbyte&)", ves_icall_System_Threading_Thread_VolatileRead1},
6879 {"VolatileRead(single&)", ves_icall_System_Threading_Thread_VolatileRead4},
6880 {"VolatileRead(uint&)", ves_icall_System_Threading_Thread_VolatileRead2},
6881 {"VolatileRead(uint16&)", ves_icall_System_Threading_Thread_VolatileRead2},
6882 {"VolatileRead(uintptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
6883 {"VolatileRead(ulong&)", ves_icall_System_Threading_Thread_VolatileRead8},
6884 {"VolatileWrite(byte&,byte)", ves_icall_System_Threading_Thread_VolatileWrite1},
6885 {"VolatileWrite(double&,double)", ves_icall_System_Threading_Thread_VolatileWrite8},
6886 {"VolatileWrite(int&,int)", ves_icall_System_Threading_Thread_VolatileWrite4},
6887 {"VolatileWrite(int16&,int16)", ves_icall_System_Threading_Thread_VolatileWrite2},
6888 {"VolatileWrite(intptr&,intptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
6889 {"VolatileWrite(long&,long)", ves_icall_System_Threading_Thread_VolatileWrite8},
6890 {"VolatileWrite(object&,object)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
6891 {"VolatileWrite(sbyte&,sbyte)", ves_icall_System_Threading_Thread_VolatileWrite1},
6892 {"VolatileWrite(single&,single)", ves_icall_System_Threading_Thread_VolatileWrite4},
6893 {"VolatileWrite(uint&,uint)", ves_icall_System_Threading_Thread_VolatileWrite2},
6894 {"VolatileWrite(uint16&,uint16)", ves_icall_System_Threading_Thread_VolatileWrite2},
6895 {"VolatileWrite(uintptr&,uintptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
6896 {"VolatileWrite(ulong&,ulong)", ves_icall_System_Threading_Thread_VolatileWrite8},
6897 {"current_lcid()", ves_icall_System_Threading_Thread_current_lcid}
6900 static const IcallEntry threadpool_icalls [] = {
6901 {"GetAvailableThreads", ves_icall_System_Threading_ThreadPool_GetAvailableThreads},
6902 {"GetMaxThreads", ves_icall_System_Threading_ThreadPool_GetMaxThreads},
6903 {"GetMinThreads", ves_icall_System_Threading_ThreadPool_GetMinThreads},
6904 {"SetMinThreads", ves_icall_System_Threading_ThreadPool_SetMinThreads}
6907 static const IcallEntry waithandle_icalls [] = {
6908 {"WaitAll_internal", ves_icall_System_Threading_WaitHandle_WaitAll_internal},
6909 {"WaitAny_internal", ves_icall_System_Threading_WaitHandle_WaitAny_internal},
6910 {"WaitOne_internal", ves_icall_System_Threading_WaitHandle_WaitOne_internal}
6913 static const IcallEntry type_icalls [] = {
6914 {"BindGenericParameters", ves_icall_Type_BindGenericParameters},
6915 {"Equals", ves_icall_type_Equals},
6916 {"GetGenericParameterAttributes", ves_icall_Type_GetGenericParameterAttributes},
6917 {"GetGenericParameterConstraints_impl", ves_icall_Type_GetGenericParameterConstraints},
6918 {"GetGenericParameterPosition", ves_icall_Type_GetGenericParameterPosition},
6919 {"GetGenericTypeDefinition_impl", ves_icall_Type_GetGenericTypeDefinition_impl},
6920 {"GetInterfaceMapData", ves_icall_Type_GetInterfaceMapData},
6921 {"GetPacking", ves_icall_Type_GetPacking},
6922 {"GetTypeCode", ves_icall_type_GetTypeCodeInternal},
6923 {"GetTypeCodeInternal", ves_icall_type_GetTypeCodeInternal},
6924 {"IsArrayImpl", ves_icall_Type_IsArrayImpl},
6925 {"IsInstanceOfType", ves_icall_type_IsInstanceOfType},
6926 {"MakePointerType", ves_icall_Type_MakePointerType},
6927 {"get_IsGenericInstance", ves_icall_Type_get_IsGenericInstance},
6928 {"get_IsGenericTypeDefinition", ves_icall_Type_get_IsGenericTypeDefinition},
6929 {"internal_from_handle", ves_icall_type_from_handle},
6930 {"internal_from_name", ves_icall_type_from_name},
6931 {"make_array_type", ves_icall_Type_make_array_type},
6932 {"make_byref_type", ves_icall_Type_make_byref_type},
6933 {"type_is_assignable_from", ves_icall_type_is_assignable_from},
6934 {"type_is_subtype_of", ves_icall_type_is_subtype_of}
6937 static const IcallEntry typedref_icalls [] = {
6938 {"ToObject", mono_TypedReference_ToObject},
6939 {"ToObjectInternal", mono_TypedReference_ToObjectInternal}
6942 static const IcallEntry valuetype_icalls [] = {
6943 {"InternalEquals", ves_icall_System_ValueType_Equals},
6944 {"InternalGetHashCode", ves_icall_System_ValueType_InternalGetHashCode}
6947 static const IcallEntry web_icalls [] = {
6948 {"GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path},
6949 {"GetMachineInstallDirectory", ves_icall_System_Web_Util_ICalls_get_machine_install_dir}
6952 static const IcallEntry identity_icalls [] = {
6953 {"GetCurrentToken", ves_icall_System_Security_Principal_WindowsIdentity_GetCurrentToken},
6954 {"GetTokenName", ves_icall_System_Security_Principal_WindowsIdentity_GetTokenName},
6955 {"GetUserToken", ves_icall_System_Security_Principal_WindowsIdentity_GetUserToken},
6956 {"_GetRoles", ves_icall_System_Security_Principal_WindowsIdentity_GetRoles}
6959 static const IcallEntry impersonation_icalls [] = {
6960 {"CloseToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_CloseToken},
6961 {"DuplicateToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_DuplicateToken},
6962 {"RevertToSelf", ves_icall_System_Security_Principal_WindowsImpersonationContext_RevertToSelf},
6963 {"SetCurrentToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_SetCurrentToken}
6966 static const IcallEntry principal_icalls [] = {
6967 {"IsMemberOfGroupId", ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupId},
6968 {"IsMemberOfGroupName", ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupName}
6971 static const IcallEntry keypair_icalls [] = {
6972 {"_CanSecure", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_CanSecure},
6973 {"_IsMachineProtected", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsMachineProtected},
6974 {"_IsUserProtected", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsUserProtected},
6975 {"_ProtectMachine", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectMachine},
6976 {"_ProtectUser", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectUser}
6979 static const IcallEntry evidence_icalls [] = {
6980 {"IsAuthenticodePresent", ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent}
6983 static const IcallEntry securitymanager_icalls [] = {
6984 {"GetLinkDemandSecurity", ves_icall_System_Security_SecurityManager_GetLinkDemandSecurity},
6985 {"get_CheckExecutionRights", ves_icall_System_Security_SecurityManager_get_CheckExecutionRights},
6986 {"get_SecurityEnabled", ves_icall_System_Security_SecurityManager_get_SecurityEnabled},
6987 {"set_CheckExecutionRights", ves_icall_System_Security_SecurityManager_set_CheckExecutionRights},
6988 {"set_SecurityEnabled", ves_icall_System_Security_SecurityManager_set_SecurityEnabled}
6991 static const IcallEntry generic_array_icalls [] = {
6992 {"GetGenericValueImpl", ves_icall_System_Array_InternalArray_GetGenericValueImpl}
6996 static const IcallEntry array_icalls [] = {
7001 /* keep the entries all sorted */
7002 static const IcallMap icall_entries [] = {
7003 {"Mono.Runtime", runtime_icalls, G_N_ELEMENTS (runtime_icalls)},
7004 {"Mono.Security.Cryptography.KeyPairPersistence", keypair_icalls, G_N_ELEMENTS (keypair_icalls)},
7005 {"System.Activator", activator_icalls, G_N_ELEMENTS (activator_icalls)},
7006 {"System.AppDomain", appdomain_icalls, G_N_ELEMENTS (appdomain_icalls)},
7007 {"System.ArgIterator", argiterator_icalls, G_N_ELEMENTS (argiterator_icalls)},
7008 {"System.Array", array_icalls, G_N_ELEMENTS (array_icalls)},
7009 {"System.Array/InternalArray`1", generic_array_icalls, G_N_ELEMENTS (generic_array_icalls)},
7010 {"System.Buffer", buffer_icalls, G_N_ELEMENTS (buffer_icalls)},
7011 {"System.Char", char_icalls, G_N_ELEMENTS (char_icalls)},
7012 {"System.Configuration.DefaultConfig", defaultconf_icalls, G_N_ELEMENTS (defaultconf_icalls)},
7013 {"System.ConsoleDriver", consoledriver_icalls, G_N_ELEMENTS (consoledriver_icalls)},
7014 {"System.Convert", convert_icalls, G_N_ELEMENTS (convert_icalls)},
7015 {"System.CurrentTimeZone", timezone_icalls, G_N_ELEMENTS (timezone_icalls)},
7016 {"System.DateTime", datetime_icalls, G_N_ELEMENTS (datetime_icalls)},
7017 #ifndef DISABLE_DECIMAL
7018 {"System.Decimal", decimal_icalls, G_N_ELEMENTS (decimal_icalls)},
7020 {"System.Delegate", delegate_icalls, G_N_ELEMENTS (delegate_icalls)},
7021 {"System.Diagnostics.DefaultTraceListener", tracelist_icalls, G_N_ELEMENTS (tracelist_icalls)},
7022 {"System.Diagnostics.FileVersionInfo", fileversion_icalls, G_N_ELEMENTS (fileversion_icalls)},
7023 {"System.Diagnostics.Process", process_icalls, G_N_ELEMENTS (process_icalls)},
7024 {"System.Double", double_icalls, G_N_ELEMENTS (double_icalls)},
7025 {"System.Enum", enum_icalls, G_N_ELEMENTS (enum_icalls)},
7026 {"System.Environment", environment_icalls, G_N_ELEMENTS (environment_icalls)},
7027 {"System.GC", gc_icalls, G_N_ELEMENTS (gc_icalls)},
7028 {"System.Globalization.CompareInfo", compareinfo_icalls, G_N_ELEMENTS (compareinfo_icalls)},
7029 {"System.Globalization.CultureInfo", cultureinfo_icalls, G_N_ELEMENTS (cultureinfo_icalls)},
7030 {"System.IO.FAMWatcher", famwatcher_icalls, G_N_ELEMENTS (famwatcher_icalls)},
7031 {"System.IO.FileSystemWatcher", filewatcher_icalls, G_N_ELEMENTS (filewatcher_icalls)},
7032 {"System.IO.MonoIO", monoio_icalls, G_N_ELEMENTS (monoio_icalls)},
7033 {"System.IO.Path", path_icalls, G_N_ELEMENTS (path_icalls)},
7034 {"System.Math", math_icalls, G_N_ELEMENTS (math_icalls)},
7035 {"System.MonoCustomAttrs", customattrs_icalls, G_N_ELEMENTS (customattrs_icalls)},
7036 {"System.MonoEnumInfo", enuminfo_icalls, G_N_ELEMENTS (enuminfo_icalls)},
7037 {"System.MonoType", monotype_icalls, G_N_ELEMENTS (monotype_icalls)},
7038 {"System.Net.Dns", dns_icalls, G_N_ELEMENTS (dns_icalls)},
7039 {"System.Net.Sockets.Socket", socket_icalls, G_N_ELEMENTS (socket_icalls)},
7040 {"System.Net.Sockets.SocketException", socketex_icalls, G_N_ELEMENTS (socketex_icalls)},
7041 {"System.Object", object_icalls, G_N_ELEMENTS (object_icalls)},
7042 {"System.Reflection.Assembly", assembly_icalls, G_N_ELEMENTS (assembly_icalls)},
7043 {"System.Reflection.Emit.AssemblyBuilder", assemblybuilder_icalls, G_N_ELEMENTS (assemblybuilder_icalls)},
7044 {"System.Reflection.Emit.CustomAttributeBuilder", customattrbuilder_icalls, G_N_ELEMENTS (customattrbuilder_icalls)},
7045 {"System.Reflection.Emit.DynamicMethod", dynamicmethod_icalls, G_N_ELEMENTS (dynamicmethod_icalls)},
7046 {"System.Reflection.Emit.EnumBuilder", enumbuilder_icalls, G_N_ELEMENTS (enumbuilder_icalls)},
7047 {"System.Reflection.Emit.GenericTypeParameterBuilder", generictypeparambuilder_icalls, G_N_ELEMENTS (generictypeparambuilder_icalls)},
7048 {"System.Reflection.Emit.MethodBuilder", methodbuilder_icalls, G_N_ELEMENTS (methodbuilder_icalls)},
7049 {"System.Reflection.Emit.ModuleBuilder", modulebuilder_icalls, G_N_ELEMENTS (modulebuilder_icalls)},
7050 {"System.Reflection.Emit.SignatureHelper", signaturehelper_icalls, G_N_ELEMENTS (signaturehelper_icalls)},
7051 {"System.Reflection.Emit.TypeBuilder", typebuilder_icalls, G_N_ELEMENTS (typebuilder_icalls)},
7052 {"System.Reflection.FieldInfo", fieldinfo_icalls, G_N_ELEMENTS (fieldinfo_icalls)},
7053 {"System.Reflection.MemberInfo", memberinfo_icalls, G_N_ELEMENTS (memberinfo_icalls)},
7054 {"System.Reflection.MethodBase", methodbase_icalls, G_N_ELEMENTS (methodbase_icalls)},
7055 {"System.Reflection.Module", module_icalls, G_N_ELEMENTS (module_icalls)},
7056 {"System.Reflection.MonoCMethod", monocmethod_icalls, G_N_ELEMENTS (monocmethod_icalls)},
7057 {"System.Reflection.MonoEventInfo", monoeventinfo_icalls, G_N_ELEMENTS (monoeventinfo_icalls)},
7058 {"System.Reflection.MonoField", monofield_icalls, G_N_ELEMENTS (monofield_icalls)},
7059 {"System.Reflection.MonoGenericCMethod", monogenericmethod_icalls, G_N_ELEMENTS (monogenericmethod_icalls)},
7060 {"System.Reflection.MonoGenericClass", monogenericclass_icalls, G_N_ELEMENTS (monogenericclass_icalls)},
7061 {"System.Reflection.MonoGenericMethod", monogenericmethod_icalls, G_N_ELEMENTS (monogenericmethod_icalls)},
7062 {"System.Reflection.MonoMethod", monomethod_icalls, G_N_ELEMENTS (monomethod_icalls)},
7063 {"System.Reflection.MonoMethodInfo", monomethodinfo_icalls, G_N_ELEMENTS (monomethodinfo_icalls)},
7064 {"System.Reflection.MonoPropertyInfo", monopropertyinfo_icalls, G_N_ELEMENTS (monopropertyinfo_icalls)},
7065 {"System.Reflection.ParameterInfo", parameterinfo_icalls, G_N_ELEMENTS (parameterinfo_icalls)},
7066 {"System.Runtime.CompilerServices.RuntimeHelpers", runtimehelpers_icalls, G_N_ELEMENTS (runtimehelpers_icalls)},
7067 {"System.Runtime.InteropServices.GCHandle", gchandle_icalls, G_N_ELEMENTS (gchandle_icalls)},
7068 {"System.Runtime.InteropServices.Marshal", marshal_icalls, G_N_ELEMENTS (marshal_icalls)},
7069 {"System.Runtime.Remoting.Activation.ActivationServices", activationservices_icalls, G_N_ELEMENTS (activationservices_icalls)},
7070 {"System.Runtime.Remoting.Messaging.MonoMethodMessage", monomethodmessage_icalls, G_N_ELEMENTS (monomethodmessage_icalls)},
7071 {"System.Runtime.Remoting.Proxies.RealProxy", realproxy_icalls, G_N_ELEMENTS (realproxy_icalls)},
7072 {"System.Runtime.Remoting.RemotingServices", remotingservices_icalls, G_N_ELEMENTS (remotingservices_icalls)},
7073 {"System.RuntimeMethodHandle", methodhandle_icalls, G_N_ELEMENTS (methodhandle_icalls)},
7074 {"System.Security.Cryptography.RNGCryptoServiceProvider", rng_icalls, G_N_ELEMENTS (rng_icalls)},
7075 {"System.Security.Policy.Evidence", evidence_icalls, G_N_ELEMENTS (evidence_icalls)},
7076 {"System.Security.Principal.WindowsIdentity", identity_icalls, G_N_ELEMENTS (identity_icalls)},
7077 {"System.Security.Principal.WindowsImpersonationContext", impersonation_icalls, G_N_ELEMENTS (impersonation_icalls)},
7078 {"System.Security.Principal.WindowsPrincipal", principal_icalls, G_N_ELEMENTS (principal_icalls)},
7079 {"System.Security.SecurityManager", securitymanager_icalls, G_N_ELEMENTS (securitymanager_icalls)},
7080 {"System.String", string_icalls, G_N_ELEMENTS (string_icalls)},
7081 {"System.Text.Encoding", encoding_icalls, G_N_ELEMENTS (encoding_icalls)},
7082 {"System.Threading.Interlocked", interlocked_icalls, G_N_ELEMENTS (interlocked_icalls)},
7083 {"System.Threading.Monitor", monitor_icalls, G_N_ELEMENTS (monitor_icalls)},
7084 {"System.Threading.Mutex", mutex_icalls, G_N_ELEMENTS (mutex_icalls)},
7085 {"System.Threading.NativeEventCalls", nativeevents_icalls, G_N_ELEMENTS (nativeevents_icalls)},
7086 {"System.Threading.Thread", thread_icalls, G_N_ELEMENTS (thread_icalls)},
7087 {"System.Threading.ThreadPool", threadpool_icalls, G_N_ELEMENTS (threadpool_icalls)},
7088 {"System.Threading.WaitHandle", waithandle_icalls, G_N_ELEMENTS (waithandle_icalls)},
7089 {"System.Type", type_icalls, G_N_ELEMENTS (type_icalls)},
7090 {"System.TypedReference", typedref_icalls, G_N_ELEMENTS (typedref_icalls)},
7091 {"System.ValueType", valuetype_icalls, G_N_ELEMENTS (valuetype_icalls)},
7092 {"System.Web.Util.ICalls", web_icalls, G_N_ELEMENTS (web_icalls)}
7095 static GHashTable *icall_hash = NULL;
7096 static GHashTable *jit_icall_hash_name = NULL;
7097 static GHashTable *jit_icall_hash_addr = NULL;
7100 mono_icall_init (void)
7104 /* check that tables are sorted: disable in release */
7107 const IcallMap *imap;
7108 const IcallEntry *ientry;
7109 const char *prev_class = NULL;
7110 const char *prev_method;
7112 for (i = 0; i < G_N_ELEMENTS (icall_entries); ++i) {
7113 imap = &icall_entries [i];
7115 if (prev_class && strcmp (prev_class, imap->klass) >= 0)
7116 g_print ("class %s should come before class %s\n", imap->klass, prev_class);
7117 prev_class = imap->klass;
7118 for (j = 0; j < imap->size; ++j) {
7119 ientry = &imap->icalls [j];
7120 if (prev_method && strcmp (prev_method, ientry->method) >= 0)
7121 g_print ("method %s should come before method %s\n", ientry->method, prev_method);
7122 prev_method = ientry->method;
7127 icall_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
7131 mono_icall_cleanup (void)
7133 g_hash_table_destroy (icall_hash);
7134 g_hash_table_destroy (jit_icall_hash_name);
7135 g_hash_table_destroy (jit_icall_hash_addr);
7139 mono_add_internal_call (const char *name, gconstpointer method)
7141 mono_loader_lock ();
7143 g_hash_table_insert (icall_hash, g_strdup (name), (gpointer) method);
7145 mono_loader_unlock ();
7149 compare_class_imap (const void *key, const void *elem)
7151 const IcallMap* imap = (const IcallMap*)elem;
7152 return strcmp (key, imap->klass);
7155 static const IcallMap*
7156 find_class_icalls (const char *name)
7158 return (const IcallMap*) bsearch (name, icall_entries, G_N_ELEMENTS (icall_entries), sizeof (IcallMap), compare_class_imap);
7162 compare_method_imap (const void *key, const void *elem)
7164 const IcallEntry* ientry = (const IcallEntry*)elem;
7165 return strcmp (key, ientry->method);
7169 find_method_icall (const IcallMap *imap, const char *name)
7171 const IcallEntry *ientry = (const IcallEntry*) bsearch (name, imap->icalls, imap->size, sizeof (IcallEntry), compare_method_imap);
7173 return (void*)ientry->func;
7178 * we should probably export this as an helper (handle nested types).
7179 * Returns the number of chars written in buf.
7182 concat_class_name (char *buf, int bufsize, MonoClass *klass)
7184 int nspacelen, cnamelen;
7185 nspacelen = strlen (klass->name_space);
7186 cnamelen = strlen (klass->name);
7187 if (nspacelen + cnamelen + 2 > bufsize)
7190 memcpy (buf, klass->name_space, nspacelen);
7191 buf [nspacelen ++] = '.';
7193 memcpy (buf + nspacelen, klass->name, cnamelen);
7194 buf [nspacelen + cnamelen] = 0;
7195 return nspacelen + cnamelen;
7199 mono_lookup_internal_call (MonoMethod *method)
7204 int typelen = 0, mlen, siglen;
7206 const IcallMap *imap;
7208 g_assert (method != NULL);
7210 if (method->klass->nested_in) {
7211 int pos = concat_class_name (mname, sizeof (mname)-2, method->klass->nested_in);
7215 mname [pos++] = '/';
7218 typelen = concat_class_name (mname+pos, sizeof (mname)-pos-1, method->klass);
7224 typelen = concat_class_name (mname, sizeof (mname), method->klass);
7229 imap = find_class_icalls (mname);
7231 mname [typelen] = ':';
7232 mname [typelen + 1] = ':';
7234 mlen = strlen (method->name);
7235 memcpy (mname + typelen + 2, method->name, mlen);
7236 sigstart = mname + typelen + 2 + mlen;
7239 tmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE);
7240 siglen = strlen (tmpsig);
7241 if (typelen + mlen + siglen + 6 > sizeof (mname))
7244 memcpy (sigstart + 1, tmpsig, siglen);
7245 sigstart [siglen + 1] = ')';
7246 sigstart [siglen + 2] = 0;
7249 mono_loader_lock ();
7251 res = g_hash_table_lookup (icall_hash, mname);
7253 mono_loader_unlock ();
7256 /* try without signature */
7258 res = g_hash_table_lookup (icall_hash, mname);
7260 mono_loader_unlock ();
7264 /* it wasn't found in the static call tables */
7266 mono_loader_unlock ();
7269 res = find_method_icall (imap, sigstart - mlen);
7271 mono_loader_unlock ();
7274 /* try _with_ signature */
7276 res = find_method_icall (imap, sigstart - mlen);
7278 mono_loader_unlock ();
7282 g_warning ("cant resolve internal call to \"%s\" (tested without signature also)", mname);
7283 g_print ("\nYour mono runtime and class libraries are out of sync.\n");
7284 g_print ("The out of sync library is: %s\n", method->klass->image->name);
7285 g_print ("\nWhen you update one from cvs you need to update, compile and install\nthe other too.\n");
7286 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");
7287 g_print ("If you see other errors or faults after this message they are probably related\n");
7288 g_print ("and you need to fix your mono install first.\n");
7290 mono_loader_unlock ();
7296 type_from_typename (char *typename)
7298 MonoClass *klass = NULL; /* assignment to shut GCC warning up */
7300 if (!strcmp (typename, "int"))
7301 klass = mono_defaults.int_class;
7302 else if (!strcmp (typename, "ptr"))
7303 klass = mono_defaults.int_class;
7304 else if (!strcmp (typename, "void"))
7305 klass = mono_defaults.void_class;
7306 else if (!strcmp (typename, "int32"))
7307 klass = mono_defaults.int32_class;
7308 else if (!strcmp (typename, "uint32"))
7309 klass = mono_defaults.uint32_class;
7310 else if (!strcmp (typename, "long"))
7311 klass = mono_defaults.int64_class;
7312 else if (!strcmp (typename, "ulong"))
7313 klass = mono_defaults.uint64_class;
7314 else if (!strcmp (typename, "float"))
7315 klass = mono_defaults.single_class;
7316 else if (!strcmp (typename, "double"))
7317 klass = mono_defaults.double_class;
7318 else if (!strcmp (typename, "object"))
7319 klass = mono_defaults.object_class;
7320 else if (!strcmp (typename, "obj"))
7321 klass = mono_defaults.object_class;
7324 g_assert_not_reached ();
7326 return &klass->byval_arg;
7329 MonoMethodSignature*
7330 mono_create_icall_signature (const char *sigstr)
7335 MonoMethodSignature *res;
7337 mono_loader_lock ();
7338 res = g_hash_table_lookup (mono_defaults.corlib->helper_signatures, sigstr);
7340 mono_loader_unlock ();
7344 parts = g_strsplit (sigstr, " ", 256);
7353 res = mono_metadata_signature_alloc (mono_defaults.corlib, len - 1);
7356 #ifdef PLATFORM_WIN32
7358 * Under windows, the default pinvoke calling convention is STDCALL but
7361 res->call_convention = MONO_CALL_C;
7364 res->ret = type_from_typename (parts [0]);
7365 for (i = 1; i < len; ++i) {
7366 res->params [i - 1] = type_from_typename (parts [i]);
7371 g_hash_table_insert (mono_defaults.corlib->helper_signatures, (gpointer)sigstr, res);
7373 mono_loader_unlock ();
7379 mono_find_jit_icall_by_name (const char *name)
7381 MonoJitICallInfo *info;
7382 g_assert (jit_icall_hash_name);
7384 mono_loader_lock ();
7385 info = g_hash_table_lookup (jit_icall_hash_name, name);
7386 mono_loader_unlock ();
7391 mono_find_jit_icall_by_addr (gconstpointer addr)
7393 MonoJitICallInfo *info;
7394 g_assert (jit_icall_hash_addr);
7396 mono_loader_lock ();
7397 info = g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);
7398 mono_loader_unlock ();
7404 mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)
7406 mono_loader_lock ();
7407 g_hash_table_insert (jit_icall_hash_addr, (gpointer)info->wrapper, info);
7408 mono_loader_unlock ();
7412 mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save)
7414 MonoJitICallInfo *info;
7419 mono_loader_lock ();
7421 if (!jit_icall_hash_name) {
7422 jit_icall_hash_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
7423 jit_icall_hash_addr = g_hash_table_new (NULL, NULL);
7426 if (g_hash_table_lookup (jit_icall_hash_name, name)) {
7427 g_warning ("jit icall already defined \"%s\"\n", name);
7428 g_assert_not_reached ();
7431 info = g_new (MonoJitICallInfo, 1);
7438 info->wrapper = func;
7440 info->wrapper = NULL;
7443 g_hash_table_insert (jit_icall_hash_name, (gpointer)info->name, info);
7444 g_hash_table_insert (jit_icall_hash_addr, (gpointer)func, info);
7446 mono_loader_unlock ();