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:
1435 case MONO_TYPE_GENERICINST: {
1436 MonoGenericClass *gclass = cf->type->data.generic_class;
1437 g_assert (!gclass->inst->is_open);
1438 if (gclass->container_class->valuetype && (v != NULL))
1439 v += sizeof (MonoObject);
1443 g_error ("type 0x%x not handled in "
1444 "ves_icall_FieldInfo_SetValueInternal", cf->type->type);
1449 if (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {
1450 MonoVTable *vtable = mono_class_vtable (mono_object_domain (field), field->klass);
1451 if (!vtable->initialized)
1452 mono_runtime_class_init (vtable);
1453 mono_field_static_set_value (vtable, cf, v);
1455 mono_field_set_value (obj, cf, v);
1459 static MonoReflectionField*
1460 ves_icall_MonoField_Mono_GetGenericFieldDefinition (MonoReflectionField *field)
1462 MONO_ARCH_SAVE_REGS;
1464 if (field->field->generic_info && field->field->generic_info->reflection_info)
1465 return field->field->generic_info->reflection_info;
1470 static MonoReflectionType*
1471 ves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)
1473 MonoMethod *method = mono_get_inflated_method (rmethod->method.method);
1475 return mono_type_get_object (mono_object_domain (rmethod), &method->klass->byval_arg);
1478 /* From MonoProperty.cs */
1480 PInfo_Attributes = 1,
1481 PInfo_GetMethod = 1 << 1,
1482 PInfo_SetMethod = 1 << 2,
1483 PInfo_ReflectedType = 1 << 3,
1484 PInfo_DeclaringType = 1 << 4,
1489 ves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)
1491 MonoDomain *domain = mono_object_domain (property);
1493 MONO_ARCH_SAVE_REGS;
1495 if ((req_info & PInfo_ReflectedType) != 0)
1496 info->parent = mono_type_get_object (domain, &property->klass->byval_arg);
1497 else if ((req_info & PInfo_DeclaringType) != 0)
1498 info->parent = mono_type_get_object (domain, &property->property->parent->byval_arg);
1500 if ((req_info & PInfo_Name) != 0)
1501 info->name = mono_string_new (domain, property->property->name);
1503 if ((req_info & PInfo_Attributes) != 0)
1504 info->attrs = property->property->attrs;
1506 if ((req_info & PInfo_GetMethod) != 0)
1507 info->get = property->property->get ?
1508 mono_method_get_object (domain, property->property->get, NULL): NULL;
1510 if ((req_info & PInfo_SetMethod) != 0)
1511 info->set = property->property->set ?
1512 mono_method_get_object (domain, property->property->set, NULL): NULL;
1514 * There may be other methods defined for properties, though, it seems they are not exposed
1515 * in the reflection API
1520 ves_icall_get_event_info (MonoReflectionEvent *event, MonoEventInfo *info)
1522 MonoDomain *domain = mono_object_domain (event);
1524 MONO_ARCH_SAVE_REGS;
1526 info->declaring_type = mono_type_get_object (domain, &event->klass->byval_arg);
1527 info->reflected_type = mono_type_get_object (domain, &event->event->parent->byval_arg);
1529 info->name = mono_string_new (domain, event->event->name);
1530 info->attrs = event->event->attrs;
1531 info->add_method = event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL;
1532 info->remove_method = event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL;
1533 info->raise_method = event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL;
1535 if (event->event->other) {
1537 while (event->event->other [n])
1539 info->other_methods = mono_array_new (domain, mono_defaults.method_info_class, n);
1541 for (i = 0; i < n; i++)
1542 mono_array_set (info->other_methods, gpointer, i,
1543 mono_method_get_object (domain, event->event->other [i], NULL));
1548 ves_icall_Type_GetInterfaces (MonoReflectionType* type)
1550 MonoDomain *domain = mono_object_domain (type);
1552 GPtrArray *ifaces = NULL;
1554 MonoClass *class = mono_class_from_mono_type (type->type);
1556 MonoBitSet *slots = mono_bitset_new (class->max_interface_id + 1, 0);
1558 MONO_ARCH_SAVE_REGS;
1561 /* GetInterfaces() returns an empty array in MS.NET (this may be a bug) */
1562 mono_bitset_free (slots);
1563 return mono_array_new (domain, mono_defaults.monotype_class, 0);
1566 for (parent = class; parent; parent = parent->parent) {
1567 GPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent);
1569 for (i = 0; i < tmp_ifaces->len; ++i) {
1570 MonoClass *ic = g_ptr_array_index (tmp_ifaces, i);
1572 if (mono_bitset_test (slots, ic->interface_id))
1575 mono_bitset_set (slots, ic->interface_id);
1577 ifaces = g_ptr_array_new ();
1578 g_ptr_array_add (ifaces, ic);
1580 g_ptr_array_free (tmp_ifaces, TRUE);
1583 mono_bitset_free (slots);
1586 return mono_array_new (domain, mono_defaults.monotype_class, 0);
1588 intf = mono_array_new (domain, mono_defaults.monotype_class, ifaces->len);
1589 for (i = 0; i < ifaces->len; ++i) {
1590 MonoClass *ic = g_ptr_array_index (ifaces, i);
1592 mono_array_set (intf, gpointer, i,
1593 mono_type_get_object (domain, &ic->byval_arg));
1595 g_ptr_array_free (ifaces, TRUE);
1601 ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType *iface, MonoArray **targets, MonoArray **methods)
1603 MonoClass *class = mono_class_from_mono_type (type->type);
1604 MonoClass *iclass = mono_class_from_mono_type (iface->type);
1605 MonoReflectionMethod *member;
1608 int i = 0, len, ioffset;
1611 MONO_ARCH_SAVE_REGS;
1613 /* type doesn't implement iface: the exception is thrown in managed code */
1614 if ((iclass->interface_id > class->max_interface_id) || !class->interface_offsets [iclass->interface_id])
1617 len = mono_class_num_methods (iclass);
1618 ioffset = class->interface_offsets [iclass->interface_id];
1619 domain = mono_object_domain (type);
1620 *targets = mono_array_new (domain, mono_defaults.method_info_class, len);
1621 *methods = mono_array_new (domain, mono_defaults.method_info_class, len);
1624 while ((method = mono_class_get_methods (iclass, &iter))) {
1625 member = mono_method_get_object (domain, method, iclass);
1626 mono_array_set (*methods, gpointer, i, member);
1627 member = mono_method_get_object (domain, class->vtable [i + ioffset], class);
1628 mono_array_set (*targets, gpointer, i, member);
1635 ves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)
1637 MonoClass *klass = mono_class_from_mono_type (type->type);
1639 g_assert (!klass->image->dynamic);
1641 mono_metadata_packing_from_typedef (klass->image, klass->type_token, packing, size);
1644 static MonoReflectionType*
1645 ves_icall_MonoType_GetElementType (MonoReflectionType *type)
1647 MonoClass *class = mono_class_from_mono_type (type->type);
1649 MONO_ARCH_SAVE_REGS;
1651 // GelElementType should only return a type for:
1652 // Array Pointer PassedByRef
1653 if (type->type->byref)
1654 return mono_type_get_object (mono_object_domain (type), &class->byval_arg);
1655 if (class->enumtype && class->enum_basetype) /* types that are modifierd typebuilkders may not have enum_basetype set */
1656 return mono_type_get_object (mono_object_domain (type), class->enum_basetype);
1657 else if (class->element_class && MONO_CLASS_IS_ARRAY (class))
1658 return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
1659 else if (class->element_class && type->type->type == MONO_TYPE_PTR)
1660 return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
1665 static MonoReflectionType*
1666 ves_icall_get_type_parent (MonoReflectionType *type)
1668 MonoClass *class = mono_class_from_mono_type (type->type);
1670 MONO_ARCH_SAVE_REGS;
1672 return class->parent ? mono_type_get_object (mono_object_domain (type), &class->parent->byval_arg): NULL;
1676 ves_icall_type_ispointer (MonoReflectionType *type)
1678 MONO_ARCH_SAVE_REGS;
1680 return type->type->type == MONO_TYPE_PTR;
1684 ves_icall_type_isprimitive (MonoReflectionType *type)
1686 MONO_ARCH_SAVE_REGS;
1688 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)));
1692 ves_icall_type_isbyref (MonoReflectionType *type)
1694 MONO_ARCH_SAVE_REGS;
1696 return type->type->byref;
1699 static MonoReflectionModule*
1700 ves_icall_MonoType_get_Module (MonoReflectionType *type)
1702 MonoClass *class = mono_class_from_mono_type (type->type);
1704 MONO_ARCH_SAVE_REGS;
1706 return mono_module_get_object (mono_object_domain (type), class->image);
1709 static MonoReflectionAssembly*
1710 ves_icall_MonoType_get_Assembly (MonoReflectionType *type)
1712 MonoDomain *domain = mono_domain_get ();
1713 MonoClass *class = mono_class_from_mono_type (type->type);
1715 MONO_ARCH_SAVE_REGS;
1717 return mono_assembly_get_object (domain, class->image->assembly);
1720 static MonoReflectionType*
1721 ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)
1723 MonoDomain *domain = mono_domain_get ();
1724 MonoClass *class = mono_class_from_mono_type (type->type);
1726 MONO_ARCH_SAVE_REGS;
1728 return class->nested_in ? mono_type_get_object (domain, &class->nested_in->byval_arg) : NULL;
1731 static MonoReflectionType*
1732 ves_icall_MonoType_get_UnderlyingSystemType (MonoReflectionType *type)
1734 MonoDomain *domain = mono_domain_get ();
1735 MonoClass *class = mono_class_from_mono_type (type->type);
1737 MONO_ARCH_SAVE_REGS;
1739 if (class->enumtype && class->enum_basetype) /* types that are modified typebuilders may not have enum_basetype set */
1740 return mono_type_get_object (domain, class->enum_basetype);
1741 else if (class->element_class)
1742 return mono_type_get_object (domain, &class->element_class->byval_arg);
1748 ves_icall_MonoType_get_Name (MonoReflectionType *type)
1750 MonoDomain *domain = mono_domain_get ();
1751 MonoClass *class = mono_class_from_mono_type (type->type);
1753 MONO_ARCH_SAVE_REGS;
1755 return mono_string_new (domain, class->name);
1759 ves_icall_MonoType_get_Namespace (MonoReflectionType *type)
1761 MonoDomain *domain = mono_domain_get ();
1762 MonoClass *class = mono_class_from_mono_type (type->type);
1764 MONO_ARCH_SAVE_REGS;
1766 while (class->nested_in)
1767 class = class->nested_in;
1769 if (class->name_space [0] == '\0')
1772 return mono_string_new (domain, class->name_space);
1776 ves_icall_MonoType_GetArrayRank (MonoReflectionType *type)
1778 MonoClass *class = mono_class_from_mono_type (type->type);
1780 MONO_ARCH_SAVE_REGS;
1786 ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)
1789 MonoClass *klass, *pklass;
1791 MONO_ARCH_SAVE_REGS;
1793 klass = mono_class_from_mono_type (type->type);
1795 if (klass->generic_container) {
1796 MonoGenericContainer *container = klass->generic_container;
1797 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, container->type_argc);
1798 for (i = 0; i < container->type_argc; ++i) {
1799 pklass = mono_class_from_generic_parameter (&container->type_params [i], klass->image, FALSE);
1800 mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), &pklass->byval_arg));
1802 } else if (klass->generic_class) {
1803 MonoGenericInst *inst = klass->generic_class->inst;
1804 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, inst->type_argc);
1805 for (i = 0; i < inst->type_argc; ++i) {
1806 mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), inst->type_argv [i]));
1809 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, 0);
1815 ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)
1818 MONO_ARCH_SAVE_REGS;
1820 klass = mono_class_from_mono_type (type->type);
1822 return klass->generic_container != NULL;
1825 static MonoReflectionType*
1826 ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
1829 MONO_ARCH_SAVE_REGS;
1831 klass = mono_class_from_mono_type (type->type);
1832 if (klass->generic_container) {
1833 return type; /* check this one */
1835 if (klass->generic_class) {
1836 MonoClass *generic_class = klass->generic_class->container_class;
1838 if (generic_class->wastypebuilder && generic_class->reflection_info)
1839 return generic_class->reflection_info;
1841 return mono_type_get_object (mono_object_domain (type), &generic_class->byval_arg);
1846 static MonoReflectionType*
1847 ves_icall_Type_BindGenericParameters (MonoReflectionType *type, MonoArray *type_array)
1849 MonoType *geninst, **types;
1852 MONO_ARCH_SAVE_REGS;
1854 count = mono_array_length (type_array);
1855 types = g_new0 (MonoType *, count);
1857 for (i = 0; i < count; i++) {
1858 MonoReflectionType *t = mono_array_get (type_array, gpointer, i);
1859 types [i] = t->type;
1862 geninst = mono_reflection_bind_generic_parameters (type, count, types);
1866 return mono_type_get_object (mono_object_domain (type), geninst);
1870 ves_icall_Type_get_IsGenericInstance (MonoReflectionType *type)
1873 MONO_ARCH_SAVE_REGS;
1875 klass = mono_class_from_mono_type (type->type);
1876 return klass->generic_class != NULL;
1880 ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)
1882 MONO_ARCH_SAVE_REGS;
1884 if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
1885 return type->type->data.generic_param->num;
1889 static GenericParameterAttributes
1890 ves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)
1892 MONO_ARCH_SAVE_REGS;
1893 return type->type->data.generic_param->flags;
1897 ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)
1899 MonoGenericParam *param;
1905 MONO_ARCH_SAVE_REGS;
1907 domain = mono_object_domain (type);
1908 param = type->type->data.generic_param;
1909 for (count = 0, ptr = param->constraints; ptr && *ptr; ptr++, count++)
1912 res = mono_array_new (domain, mono_defaults.monotype_class, count);
1913 for (i = 0; i < count; i++)
1914 mono_array_set (res, gpointer, i,
1915 mono_type_get_object (domain, ¶m->constraints [i]->byval_arg));
1922 ves_icall_MonoType_get_HasGenericArguments (MonoReflectionType *type)
1925 MONO_ARCH_SAVE_REGS;
1927 klass = mono_class_from_mono_type (type->type);
1928 if (klass->generic_container || klass->generic_class)
1934 ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)
1936 MONO_ARCH_SAVE_REGS;
1938 if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
1944 ves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)
1946 MONO_ARCH_SAVE_REGS;
1948 if (tb->type.type->type == MONO_TYPE_VAR || tb->type.type->type == MONO_TYPE_MVAR)
1954 ves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype,
1955 MonoReflectionType *t)
1957 enumtype->type = t->type;
1960 static MonoReflectionType*
1961 ves_icall_MonoGenericClass_GetParentType (MonoReflectionGenericClass *type)
1963 MonoDynamicGenericClass *gclass;
1966 MONO_ARCH_SAVE_REGS;
1968 g_assert (type->type.type->data.generic_class->is_dynamic);
1969 gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class;
1971 if (!gclass->parent || (gclass->parent->type != MONO_TYPE_GENERICINST))
1974 klass = mono_class_from_mono_type (gclass->parent);
1975 if (!klass->generic_class && !klass->generic_container)
1978 if (!klass->generic_class->is_dynamic)
1981 return mono_type_get_object (mono_object_domain (type), gclass->parent);
1985 ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type)
1987 static MonoClass *System_Reflection_MonoGenericClass;
1988 MonoDynamicGenericClass *gclass;
1994 MONO_ARCH_SAVE_REGS;
1996 if (!System_Reflection_MonoGenericClass) {
1997 System_Reflection_MonoGenericClass = mono_class_from_name (
1998 mono_defaults.corlib, "System.Reflection", "MonoGenericClass");
1999 g_assert (System_Reflection_MonoGenericClass);
2002 domain = mono_object_domain (type);
2004 g_assert (type->type.type->data.generic_class->is_dynamic);
2005 gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class;
2006 if (!gclass->ifaces)
2007 return mono_array_new (domain, System_Reflection_MonoGenericClass, 0);
2009 klass = gclass->generic_class.generic_class.container_class;
2011 res = mono_array_new (domain, System_Reflection_MonoGenericClass, gclass->count_ifaces);
2013 for (i = 0; i < gclass->count_ifaces; i++) {
2014 MonoReflectionType *iface = mono_type_get_object (domain, gclass->ifaces [i]);
2016 mono_array_set (res, gpointer, i, iface);
2023 static MonoReflectionMethod*
2024 ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod (MonoReflectionGenericClass *type,
2025 MonoReflectionMethod* generic)
2027 MonoGenericClass *gclass;
2028 MonoDynamicGenericClass *dgclass;
2032 MONO_ARCH_SAVE_REGS;
2034 gclass = type->type.type->data.generic_class;
2035 g_assert (gclass->is_dynamic);
2037 dgclass = (MonoDynamicGenericClass *) gclass;
2039 domain = mono_object_domain (type);
2041 for (i = 0; i < dgclass->count_methods; i++)
2042 if (generic->method->token == dgclass->methods [i]->token)
2043 return mono_method_get_object (domain, dgclass->methods [i], NULL);
2048 static MonoReflectionMethod*
2049 ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor (MonoReflectionGenericClass *type,
2050 MonoReflectionMethod* generic)
2052 MonoGenericClass *gclass;
2053 MonoDynamicGenericClass *dgclass;
2057 MONO_ARCH_SAVE_REGS;
2059 gclass = type->type.type->data.generic_class;
2060 g_assert (gclass->is_dynamic);
2062 dgclass = (MonoDynamicGenericClass *) gclass;
2064 domain = mono_object_domain (type);
2066 for (i = 0; i < dgclass->count_ctors; i++)
2067 if (generic->method->token == dgclass->ctors [i]->token)
2068 return mono_method_get_object (domain, dgclass->ctors [i], NULL);
2074 static MonoReflectionField*
2075 ves_icall_MonoGenericClass_GetCorrespondingInflatedField (MonoReflectionGenericClass *type,
2076 MonoString* generic_name)
2078 MonoGenericClass *gclass;
2079 MonoDynamicGenericClass *dgclass;
2081 MonoClass *refclass;
2082 char *utf8_name = mono_string_to_utf8 (generic_name);
2085 MONO_ARCH_SAVE_REGS;
2087 gclass = type->type.type->data.generic_class;
2088 g_assert (gclass->is_dynamic);
2090 dgclass = (MonoDynamicGenericClass *) gclass;
2092 refclass = mono_class_from_mono_type (type->type.type);
2094 domain = mono_object_domain (type);
2096 for (i = 0; i < dgclass->count_fields; i++)
2097 if (strcmp (utf8_name, dgclass->fields [i].name) == 0) {
2099 return mono_field_get_object (domain, refclass, &dgclass->fields [i]);
2108 static MonoReflectionMethod*
2109 ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type,
2110 MonoReflectionMethod* generic)
2117 MONO_ARCH_SAVE_REGS;
2119 domain = ((MonoObject *)type)->vtable->domain;
2121 klass = mono_class_from_mono_type (type->type);
2124 while ((method = mono_class_get_methods (klass, &iter))) {
2125 if (method->token == generic->method->token)
2126 return mono_method_get_object (domain, method, klass);
2133 ves_icall_MonoGenericClass_GetMethods (MonoReflectionGenericClass *type,
2134 MonoReflectionType *reflected_type)
2136 MonoGenericClass *gclass;
2137 MonoDynamicGenericClass *dgclass;
2139 MonoClass *refclass;
2143 MONO_ARCH_SAVE_REGS;
2145 gclass = type->type.type->data.generic_class;
2146 g_assert (gclass->is_dynamic);
2147 dgclass = (MonoDynamicGenericClass *) gclass;
2149 refclass = mono_class_from_mono_type (reflected_type->type);
2151 domain = mono_object_domain (type);
2152 res = mono_array_new (domain, mono_defaults.method_info_class, dgclass->count_methods);
2154 for (i = 0; i < dgclass->count_methods; i++)
2155 mono_array_set (res, gpointer, i,
2156 mono_method_get_object (domain, dgclass->methods [i], refclass));
2162 ves_icall_MonoGenericClass_GetConstructors (MonoReflectionGenericClass *type,
2163 MonoReflectionType *reflected_type)
2165 static MonoClass *System_Reflection_ConstructorInfo;
2166 MonoGenericClass *gclass;
2167 MonoDynamicGenericClass *dgclass;
2169 MonoClass *refclass;
2173 MONO_ARCH_SAVE_REGS;
2175 if (!System_Reflection_ConstructorInfo)
2176 System_Reflection_ConstructorInfo = mono_class_from_name (
2177 mono_defaults.corlib, "System.Reflection", "ConstructorInfo");
2179 gclass = type->type.type->data.generic_class;
2180 g_assert (gclass->is_dynamic);
2181 dgclass = (MonoDynamicGenericClass *) gclass;
2183 refclass = mono_class_from_mono_type (reflected_type->type);
2185 domain = mono_object_domain (type);
2186 res = mono_array_new (domain, System_Reflection_ConstructorInfo, dgclass->count_ctors);
2188 for (i = 0; i < dgclass->count_ctors; i++)
2189 mono_array_set (res, gpointer, i,
2190 mono_method_get_object (domain, dgclass->ctors [i], refclass));
2196 ves_icall_MonoGenericClass_GetFields (MonoReflectionGenericClass *type,
2197 MonoReflectionType *reflected_type)
2199 MonoGenericClass *gclass;
2200 MonoDynamicGenericClass *dgclass;
2202 MonoClass *refclass;
2206 MONO_ARCH_SAVE_REGS;
2208 gclass = type->type.type->data.generic_class;
2209 g_assert (gclass->is_dynamic);
2210 dgclass = (MonoDynamicGenericClass *) gclass;
2212 refclass = mono_class_from_mono_type (reflected_type->type);
2214 domain = mono_object_domain (type);
2215 res = mono_array_new (domain, mono_defaults.field_info_class, dgclass->count_fields);
2217 for (i = 0; i < dgclass->count_fields; i++)
2218 mono_array_set (res, gpointer, i,
2219 mono_field_get_object (domain, refclass, &dgclass->fields [i]));
2225 ves_icall_MonoGenericClass_GetProperties (MonoReflectionGenericClass *type,
2226 MonoReflectionType *reflected_type)
2228 static MonoClass *System_Reflection_PropertyInfo;
2229 MonoGenericClass *gclass;
2230 MonoDynamicGenericClass *dgclass;
2232 MonoClass *refclass;
2236 MONO_ARCH_SAVE_REGS;
2238 if (!System_Reflection_PropertyInfo)
2239 System_Reflection_PropertyInfo = mono_class_from_name (
2240 mono_defaults.corlib, "System.Reflection", "PropertyInfo");
2242 gclass = type->type.type->data.generic_class;
2243 g_assert (gclass->is_dynamic);
2244 dgclass = (MonoDynamicGenericClass *) gclass;
2246 refclass = mono_class_from_mono_type (reflected_type->type);
2248 domain = mono_object_domain (type);
2249 res = mono_array_new (domain, System_Reflection_PropertyInfo, dgclass->count_properties);
2251 for (i = 0; i < dgclass->count_properties; i++)
2252 mono_array_set (res, gpointer, i,
2253 mono_property_get_object (domain, refclass, &dgclass->properties [i]));
2259 ves_icall_MonoGenericClass_GetEvents (MonoReflectionGenericClass *type,
2260 MonoReflectionType *reflected_type)
2262 static MonoClass *System_Reflection_EventInfo;
2263 MonoGenericClass *gclass;
2264 MonoDynamicGenericClass *dgclass;
2266 MonoClass *refclass;
2270 MONO_ARCH_SAVE_REGS;
2272 if (!System_Reflection_EventInfo)
2273 System_Reflection_EventInfo = mono_class_from_name (
2274 mono_defaults.corlib, "System.Reflection", "EventInfo");
2276 gclass = type->type.type->data.generic_class;
2277 g_assert (gclass->is_dynamic);
2278 dgclass = (MonoDynamicGenericClass *) gclass;
2280 refclass = mono_class_from_mono_type (reflected_type->type);
2282 domain = mono_object_domain (type);
2283 res = mono_array_new (domain, System_Reflection_EventInfo, dgclass->count_events);
2285 for (i = 0; i < dgclass->count_events; i++)
2286 mono_array_set (res, gpointer, i,
2287 mono_event_get_object (domain, refclass, &dgclass->events [i]));
2292 static MonoReflectionMethod *
2293 ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *type)
2298 MONO_ARCH_SAVE_REGS;
2300 method = type->type->data.generic_param->method;
2304 klass = mono_class_from_mono_type (type->type);
2305 return mono_method_get_object (mono_object_domain (type), method, klass);
2308 static MonoReflectionDllImportAttribute*
2309 ves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)
2311 static MonoClass *DllImportAttributeClass = NULL;
2312 MonoDomain *domain = mono_domain_get ();
2313 MonoReflectionDllImportAttribute *attr;
2314 MonoImage *image = method->klass->image;
2315 MonoMethodPInvoke *piinfo = (MonoMethodPInvoke *)method;
2316 MonoTableInfo *tables = image->tables;
2317 MonoTableInfo *im = &tables [MONO_TABLE_IMPLMAP];
2318 MonoTableInfo *mr = &tables [MONO_TABLE_MODULEREF];
2319 guint32 im_cols [MONO_IMPLMAP_SIZE];
2320 guint32 scope_token;
2321 const char *import = NULL;
2322 const char *scope = NULL;
2325 if (!method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)
2328 if (!DllImportAttributeClass) {
2329 DllImportAttributeClass =
2330 mono_class_from_name (mono_defaults.corlib,
2331 "System.Runtime.InteropServices", "DllImportAttribute");
2332 g_assert (DllImportAttributeClass);
2335 if (method->klass->image->dynamic) {
2336 MonoReflectionMethodAux *method_aux =
2337 g_hash_table_lookup (
2338 ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method);
2340 import = method_aux->dllentry;
2341 scope = method_aux->dll;
2345 if (piinfo->implmap_idx) {
2346 mono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE);
2348 piinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS];
2349 import = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]);
2350 scope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME);
2351 scope = mono_metadata_string_heap (image, scope_token);
2354 flags = piinfo->piflags;
2356 attr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);
2358 attr->dll = mono_string_new (domain, scope);
2359 attr->entry_point = mono_string_new (domain, import);
2360 attr->call_conv = (flags & 0x700) >> 8;
2361 attr->charset = ((flags & 0x6) >> 1) + 1;
2362 if (attr->charset == 1)
2364 attr->exact_spelling = (flags & 0x1) != 0;
2365 attr->set_last_error = (flags & 0x40) != 0;
2366 attr->best_fit_mapping = (flags & 0x30) == 0x10;
2367 attr->throw_on_unmappable = (flags & 0x3000) == 0x1000;
2368 attr->preserve_sig = FALSE;
2373 static MonoReflectionMethod *
2374 ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
2376 MonoMethodInflated *imethod;
2378 MONO_ARCH_SAVE_REGS;
2380 if (!method->method->is_inflated) {
2381 if (mono_method_signature (method->method)->generic_param_count)
2387 imethod = (MonoMethodInflated *) method->method;
2388 if (imethod->context->gmethod && imethod->context->gmethod->reflection_info)
2389 return imethod->context->gmethod->reflection_info;
2391 return mono_method_get_object (
2392 mono_object_domain (method), imethod->declaring, NULL);
2396 ves_icall_MonoMethod_get_HasGenericParameters (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 mono_method_signature (method->method)->generic_param_count != 0;
2408 ves_icall_MonoMethod_get_Mono_IsInflatedMethod (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 method->method->is_inflated;
2420 ves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method)
2422 MONO_ARCH_SAVE_REGS;
2424 if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
2425 (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
2428 return mono_method_signature (method->method)->generic_param_count != 0;
2432 ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
2436 MonoMethodNormal *mn;
2438 MONO_ARCH_SAVE_REGS;
2440 domain = mono_object_domain (method);
2442 if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
2443 (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
2444 return mono_array_new (domain, mono_defaults.monotype_class, 0);
2446 if (method->method->is_inflated) {
2447 MonoMethodInflated *imethod = (MonoMethodInflated *) method->method;
2448 MonoGenericMethod *gmethod = imethod->context->gmethod;
2451 count = gmethod->inst->type_argc;
2452 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2454 for (i = 0; i < count; i++) {
2455 MonoType *t = gmethod->inst->type_argv [i];
2457 res, gpointer, i, mono_type_get_object (domain, t));
2464 mn = (MonoMethodNormal *) method->method;
2465 count = mono_method_signature (method->method)->generic_param_count;
2466 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2468 for (i = 0; i < count; i++) {
2469 MonoGenericParam *param = &mn->generic_container->type_params [i];
2470 MonoClass *pklass = mono_class_from_generic_parameter (
2471 param, method->method->klass->image, TRUE);
2472 mono_array_set (res, gpointer, i,
2473 mono_type_get_object (domain, &pklass->byval_arg));
2480 ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params)
2483 * Invoke from reflection is supposed to always be a virtual call (the API
2484 * is stupid), mono_runtime_invoke_*() calls the provided method, allowing
2485 * greater flexibility.
2487 MonoMethod *m = method->method;
2491 MONO_ARCH_SAVE_REGS;
2493 if (!(m->flags & METHOD_ATTRIBUTE_STATIC)) {
2495 if (!mono_object_isinst (this, m->klass))
2496 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetException"));
2497 m = mono_object_get_virtual_method (this, m);
2498 /* must pass the pointer to the value for valuetype methods */
2499 if (m->klass->valuetype)
2500 obj = mono_object_unbox (this);
2501 } else if (strcmp (m->name, ".ctor") && !m->wrapper_type)
2502 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetException"));
2505 pcount = params? mono_array_length (params): 0;
2506 if (pcount != mono_method_signature (m)->param_count)
2507 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetParameterCountException"));
2509 if ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, ".ctor"))
2510 mono_raise_exception (mono_exception_from_name_msg (mono_defaults.corlib, "System", "MethodAccessException", "Cannot invoke constructor of an abstract class."));
2512 if (m->klass->image->assembly->ref_only)
2513 mono_raise_exception (mono_get_exception_invalid_operation ("It is illegal to invoke a method on a type loaded using the ReflectionOnly api."));
2515 if (m->klass->rank && !strcmp (m->name, ".ctor")) {
2518 guint32 *lower_bounds;
2519 pcount = mono_array_length (params);
2520 lengths = alloca (sizeof (guint32) * pcount);
2521 for (i = 0; i < pcount; ++i)
2522 lengths [i] = *(gint32*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));
2524 if (m->klass->rank == pcount) {
2525 /* Only lengths provided. */
2526 lower_bounds = NULL;
2528 g_assert (pcount == (m->klass->rank * 2));
2529 /* lower bounds are first. */
2530 lower_bounds = lengths;
2531 lengths += m->klass->rank;
2534 return (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, lower_bounds);
2536 return mono_runtime_invoke_array (m, obj, params, NULL);
2540 ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoArray **outArgs)
2542 MonoDomain *domain = mono_object_domain (method);
2543 MonoMethod *m = method->method;
2544 MonoMethodSignature *sig = mono_method_signature (m);
2545 MonoArray *out_args;
2547 int i, j, outarg_count = 0;
2549 MONO_ARCH_SAVE_REGS;
2551 if (m->klass == mono_defaults.object_class) {
2553 if (!strcmp (m->name, "FieldGetter")) {
2554 MonoClass *k = this->vtable->klass;
2558 /* If this is a proxy, then it must be a CBO */
2559 if (k == mono_defaults.transparent_proxy_class) {
2560 MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
2561 this = tp->rp->unwrapped_server;
2563 k = this->vtable->klass;
2566 name = mono_array_get (params, MonoString *, 1);
2567 str = mono_string_to_utf8 (name);
2570 MonoClassField* field = mono_class_get_field_from_name (k, str);
2572 MonoClass *field_klass = mono_class_from_mono_type (field->type);
2573 if (field_klass->valuetype)
2574 result = mono_value_box (domain, field_klass, (char *)this + field->offset);
2576 result = *((gpointer *)((char *)this + field->offset));
2578 out_args = mono_array_new (domain, mono_defaults.object_class, 1);
2579 *outArgs = out_args;
2580 mono_array_set (out_args, gpointer, 0, result);
2588 g_assert_not_reached ();
2590 } else if (!strcmp (m->name, "FieldSetter")) {
2591 MonoClass *k = this->vtable->klass;
2596 /* If this is a proxy, then it must be a CBO */
2597 if (k == mono_defaults.transparent_proxy_class) {
2598 MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
2599 this = tp->rp->unwrapped_server;
2601 k = this->vtable->klass;
2604 name = mono_array_get (params, MonoString *, 1);
2605 str = mono_string_to_utf8 (name);
2608 MonoClassField* field = mono_class_get_field_from_name (k, str);
2610 MonoClass *field_klass = mono_class_from_mono_type (field->type);
2611 MonoObject *val = mono_array_get (params, gpointer, 2);
2613 if (field_klass->valuetype) {
2614 size = mono_type_size (field->type, &align);
2615 memcpy ((char *)this + field->offset,
2616 ((char *)val) + sizeof (MonoObject), size);
2618 *(MonoObject**)((char *)this + field->offset) = val;
2620 out_args = mono_array_new (domain, mono_defaults.object_class, 0);
2621 *outArgs = out_args;
2631 g_assert_not_reached ();
2636 for (i = 0; i < mono_array_length (params); i++) {
2637 if (sig->params [i]->byref)
2641 out_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);
2643 /* handle constructors only for objects already allocated */
2644 if (!strcmp (method->method->name, ".ctor"))
2647 /* This can be called only on MBR objects, so no need to unbox for valuetypes. */
2648 g_assert (!method->method->klass->valuetype);
2649 result = mono_runtime_invoke_array (method->method, this, params, NULL);
2651 for (i = 0, j = 0; i < mono_array_length (params); i++) {
2652 if (sig->params [i]->byref) {
2654 arg = mono_array_get (params, gpointer, i);
2655 mono_array_set (out_args, gpointer, j, arg);
2660 *outArgs = out_args;
2666 ves_icall_System_Enum_ToObject (MonoReflectionType *type, MonoObject *obj)
2669 MonoClass *enumc, *objc;
2673 MONO_ARCH_SAVE_REGS;
2675 MONO_CHECK_ARG_NULL (type);
2676 MONO_CHECK_ARG_NULL (obj);
2678 domain = mono_object_domain (type);
2679 enumc = mono_class_from_mono_type (type->type);
2680 objc = obj->vtable->klass;
2682 MONO_CHECK_ARG (obj, enumc->enumtype == TRUE);
2683 MONO_CHECK_ARG (obj, (objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 &&
2684 objc->byval_arg.type <= MONO_TYPE_U8));
2686 s1 = mono_class_value_size (enumc, NULL);
2687 s2 = mono_class_value_size (objc, NULL);
2689 res = mono_object_new (domain, enumc);
2691 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
2692 memcpy ((char *)res + sizeof (MonoObject), (char *)obj + sizeof (MonoObject), MIN (s1, s2));
2694 memcpy ((char *)res + sizeof (MonoObject) + (s1 > s2 ? s1 - s2 : 0),
2695 (char *)obj + sizeof (MonoObject) + (s2 > s1 ? s2 - s1 : 0),
2702 ves_icall_System_Enum_get_value (MonoObject *this)
2710 MONO_ARCH_SAVE_REGS;
2715 g_assert (this->vtable->klass->enumtype);
2717 enumc = mono_class_from_mono_type (this->vtable->klass->enum_basetype);
2718 res = mono_object_new (mono_object_domain (this), enumc);
2719 dst = (char *)res + sizeof (MonoObject);
2720 src = (char *)this + sizeof (MonoObject);
2721 size = mono_class_value_size (enumc, NULL);
2723 memcpy (dst, src, size);
2729 ves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)
2731 MonoDomain *domain = mono_object_domain (type);
2732 MonoClass *enumc = mono_class_from_mono_type (type->type);
2733 guint j = 0, nvalues, crow;
2735 MonoClassField *field;
2737 MONO_ARCH_SAVE_REGS;
2739 info->utype = mono_type_get_object (domain, enumc->enum_basetype);
2740 nvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;
2741 info->names = mono_array_new (domain, mono_defaults.string_class, nvalues);
2742 info->values = mono_array_new (domain, enumc, nvalues);
2746 while ((field = mono_class_get_fields (enumc, &iter))) {
2750 if (strcmp ("value__", field->name) == 0)
2752 if (mono_field_is_deleted (field))
2754 mono_array_set (info->names, gpointer, j, mono_string_new (domain, field->name));
2757 crow = mono_metadata_get_constant_index (enumc->image, mono_class_get_field_token (field), crow + 1);
2758 field->def_type = mono_metadata_decode_row_col (&enumc->image->tables [MONO_TABLE_CONSTANT], crow-1, MONO_CONSTANT_TYPE);
2759 crow = mono_metadata_decode_row_col (&enumc->image->tables [MONO_TABLE_CONSTANT], crow-1, MONO_CONSTANT_VALUE);
2760 field->data = (gpointer)mono_metadata_blob_heap (enumc->image, crow);
2764 len = mono_metadata_decode_blob_size (p, &p);
2765 switch (enumc->enum_basetype->type) {
2768 mono_array_set (info->values, gchar, j, *p);
2770 case MONO_TYPE_CHAR:
2773 mono_array_set (info->values, gint16, j, read16 (p));
2777 mono_array_set (info->values, gint32, j, read32 (p));
2781 mono_array_set (info->values, gint64, j, read64 (p));
2784 g_error ("Implement type 0x%02x in get_enum_info", enumc->enum_basetype->type);
2791 BFLAGS_IgnoreCase = 1,
2792 BFLAGS_DeclaredOnly = 2,
2793 BFLAGS_Instance = 4,
2795 BFLAGS_Public = 0x10,
2796 BFLAGS_NonPublic = 0x20,
2797 BFLAGS_FlattenHierarchy = 0x40,
2798 BFLAGS_InvokeMethod = 0x100,
2799 BFLAGS_CreateInstance = 0x200,
2800 BFLAGS_GetField = 0x400,
2801 BFLAGS_SetField = 0x800,
2802 BFLAGS_GetProperty = 0x1000,
2803 BFLAGS_SetProperty = 0x2000,
2804 BFLAGS_ExactBinding = 0x10000,
2805 BFLAGS_SuppressChangeType = 0x20000,
2806 BFLAGS_OptionalParamBinding = 0x40000
2809 static MonoReflectionField *
2810 ves_icall_Type_GetField (MonoReflectionType *type, MonoString *name, guint32 bflags)
2813 MonoClass *startklass, *klass;
2815 MonoClassField *field;
2818 int (*compare_func) (const char *s1, const char *s2) = NULL;
2819 domain = ((MonoObject *)type)->vtable->domain;
2820 klass = startklass = mono_class_from_mono_type (type->type);
2822 MONO_ARCH_SAVE_REGS;
2825 mono_raise_exception (mono_get_exception_argument_null ("name"));
2826 if (type->type->byref)
2829 compare_func = (bflags & BFLAGS_IgnoreCase) ? g_strcasecmp : strcmp;
2833 while ((field = mono_class_get_fields (klass, &iter))) {
2835 if (mono_field_is_deleted (field))
2837 if ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {
2838 if (bflags & BFLAGS_Public)
2841 if (bflags & BFLAGS_NonPublic)
2847 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
2848 if (bflags & BFLAGS_Static)
2849 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
2852 if (bflags & BFLAGS_Instance)
2859 utf8_name = mono_string_to_utf8 (name);
2861 if (compare_func (field->name, utf8_name)) {
2867 return mono_field_get_object (domain, startklass, field);
2869 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
2876 ves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
2879 GSList *l = NULL, *tmp;
2880 MonoClass *startklass, *klass, *refklass;
2885 MonoClassField *field;
2887 MONO_ARCH_SAVE_REGS;
2889 domain = ((MonoObject *)type)->vtable->domain;
2890 if (type->type->byref)
2891 return mono_array_new (domain, mono_defaults.method_info_class, 0);
2892 klass = startklass = mono_class_from_mono_type (type->type);
2893 refklass = mono_class_from_mono_type (reftype->type);
2897 while ((field = mono_class_get_fields (klass, &iter))) {
2899 if (mono_field_is_deleted (field))
2901 if ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {
2902 if (bflags & BFLAGS_Public)
2905 if (bflags & BFLAGS_NonPublic)
2911 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
2912 if (bflags & BFLAGS_Static)
2913 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
2916 if (bflags & BFLAGS_Instance)
2922 member = (MonoObject*)mono_field_get_object (domain, refklass, field);
2923 l = g_slist_prepend (l, member);
2925 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
2927 len = g_slist_length (l);
2928 res = mono_array_new (domain, mono_defaults.field_info_class, len);
2930 tmp = l = g_slist_reverse (l);
2931 for (; tmp; tmp = tmp->next, ++i)
2932 mono_array_set (res, gpointer, i, tmp->data);
2938 ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
2941 GSList *l = NULL, *tmp;
2942 MonoClass *startklass, *klass, *refklass;
2948 guint32 method_slots_default [8];
2949 guint32 *method_slots;
2950 gchar *mname = NULL;
2951 int (*compare_func) (const char *s1, const char *s2) = NULL;
2953 MONO_ARCH_SAVE_REGS;
2955 domain = ((MonoObject *)type)->vtable->domain;
2956 if (type->type->byref)
2957 return mono_array_new (domain, mono_defaults.method_info_class, 0);
2958 klass = startklass = mono_class_from_mono_type (type->type);
2959 refklass = mono_class_from_mono_type (reftype->type);
2962 mname = mono_string_to_utf8 (name);
2963 compare_func = (ignore_case) ? g_strcasecmp : strcmp;
2966 if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
2967 method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
2969 method_slots = method_slots_default;
2970 memset (method_slots, 0, sizeof (method_slots_default));
2973 mono_class_setup_vtable (klass);
2975 while ((method = mono_class_get_methods (klass, &iter))) {
2977 if (method->name [0] == '.' && (strcmp (method->name, ".ctor") == 0 || strcmp (method->name, ".cctor") == 0))
2979 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
2980 if (bflags & BFLAGS_Public)
2983 if (bflags & BFLAGS_NonPublic)
2989 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
2990 if (bflags & BFLAGS_Static)
2991 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
2994 if (bflags & BFLAGS_Instance)
3002 if (compare_func (mname, method->name))
3007 if (method->slot != -1) {
3008 if (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))
3010 method_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);
3013 member = (MonoObject*)mono_method_get_object (domain, method, refklass);
3015 l = g_slist_prepend (l, member);
3018 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3022 res = mono_array_new (domain, mono_defaults.method_info_class, len);
3025 tmp = l = g_slist_reverse (l);
3027 for (; tmp; tmp = tmp->next, ++i)
3028 mono_array_set (res, gpointer, i, tmp->data);
3030 if (method_slots != method_slots_default)
3031 g_free (method_slots);
3036 ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3039 GSList *l = NULL, *tmp;
3040 static MonoClass *System_Reflection_ConstructorInfo;
3041 MonoClass *startklass, *klass, *refklass;
3046 gpointer iter = NULL;
3048 MONO_ARCH_SAVE_REGS;
3050 domain = ((MonoObject *)type)->vtable->domain;
3051 if (type->type->byref)
3052 return mono_array_new (domain, mono_defaults.method_info_class, 0);
3053 klass = startklass = mono_class_from_mono_type (type->type);
3054 refklass = mono_class_from_mono_type (reftype->type);
3057 while ((method = mono_class_get_methods (klass, &iter))) {
3059 if (strcmp (method->name, ".ctor") && strcmp (method->name, ".cctor"))
3061 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3062 if (bflags & BFLAGS_Public)
3065 if (bflags & BFLAGS_NonPublic)
3071 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3072 if (bflags & BFLAGS_Static)
3073 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3076 if (bflags & BFLAGS_Instance)
3082 member = (MonoObject*)mono_method_get_object (domain, method, refklass);
3084 l = g_slist_prepend (l, member);
3086 len = g_slist_length (l);
3087 if (!System_Reflection_ConstructorInfo)
3088 System_Reflection_ConstructorInfo = mono_class_from_name (
3089 mono_defaults.corlib, "System.Reflection", "ConstructorInfo");
3090 res = mono_array_new (domain, System_Reflection_ConstructorInfo, len);
3092 tmp = l = g_slist_reverse (l);
3093 for (; tmp; tmp = tmp->next, ++i)
3094 mono_array_set (res, gpointer, i, tmp->data);
3100 ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
3103 GSList *l = NULL, *tmp;
3104 static MonoClass *System_Reflection_PropertyInfo;
3105 MonoClass *startklass, *klass;
3112 guint32 method_slots_default [8];
3113 guint32 *method_slots;
3114 gchar *propname = NULL;
3115 int (*compare_func) (const char *s1, const char *s2) = NULL;
3118 MONO_ARCH_SAVE_REGS;
3120 if (!System_Reflection_PropertyInfo)
3121 System_Reflection_PropertyInfo = mono_class_from_name (
3122 mono_defaults.corlib, "System.Reflection", "PropertyInfo");
3124 domain = ((MonoObject *)type)->vtable->domain;
3125 if (type->type->byref)
3126 return mono_array_new (domain, System_Reflection_PropertyInfo, 0);
3127 klass = startklass = mono_class_from_mono_type (type->type);
3129 propname = mono_string_to_utf8 (name);
3130 compare_func = (ignore_case) ? g_strcasecmp : strcmp;
3133 if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
3134 method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
3136 method_slots = method_slots_default;
3137 memset (method_slots, 0, sizeof (method_slots_default));
3140 mono_class_setup_vtable (klass);
3142 while ((prop = mono_class_get_properties (klass, &iter))) {
3148 flags = method->flags;
3151 if ((prop->get && ((prop->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)) ||
3152 (prop->set && ((prop->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC))) {
3153 if (bflags & BFLAGS_Public)
3156 if (bflags & BFLAGS_NonPublic)
3162 if (flags & METHOD_ATTRIBUTE_STATIC) {
3163 if (bflags & BFLAGS_Static)
3164 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3167 if (bflags & BFLAGS_Instance)
3176 if (compare_func (propname, prop->name))
3180 if (prop->get && prop->get->slot != -1) {
3181 if (method_slots [prop->get->slot >> 5] & (1 << (prop->get->slot & 0x1f)))
3183 method_slots [prop->get->slot >> 5] |= 1 << (prop->get->slot & 0x1f);
3185 if (prop->set && prop->set->slot != -1) {
3186 if (method_slots [prop->set->slot >> 5] & (1 << (prop->set->slot & 0x1f)))
3188 method_slots [prop->set->slot >> 5] |= 1 << (prop->set->slot & 0x1f);
3191 l = g_slist_prepend (l, mono_property_get_object (domain, startklass, prop));
3194 if ((!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)))
3198 res = mono_array_new (domain, System_Reflection_PropertyInfo, len);
3201 tmp = l = g_slist_reverse (l);
3203 for (; tmp; tmp = tmp->next, ++i)
3204 mono_array_set (res, gpointer, i, tmp->data);
3206 if (method_slots != method_slots_default)
3207 g_free (method_slots);
3211 static MonoReflectionEvent *
3212 ves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 bflags)
3215 MonoClass *klass, *startklass;
3221 MONO_ARCH_SAVE_REGS;
3223 event_name = mono_string_to_utf8 (name);
3224 if (type->type->byref)
3226 klass = startklass = mono_class_from_mono_type (type->type);
3227 domain = mono_object_domain (type);
3231 while ((event = mono_class_get_events (klass, &iter))) {
3232 if (strcmp (event->name, event_name))
3235 method = event->add;
3237 method = event->remove;
3239 method = event->raise;
3241 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3242 if (!(bflags & BFLAGS_Public))
3245 if (!(bflags & BFLAGS_NonPublic))
3250 if (!(bflags & BFLAGS_NonPublic))
3253 g_free (event_name);
3254 return mono_event_get_object (domain, startklass, event);
3257 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3260 g_free (event_name);
3265 ves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3268 GSList *l = NULL, *tmp;
3269 static MonoClass *System_Reflection_EventInfo;
3270 MonoClass *startklass, *klass;
3277 MONO_ARCH_SAVE_REGS;
3279 if (!System_Reflection_EventInfo)
3280 System_Reflection_EventInfo = mono_class_from_name (
3281 mono_defaults.corlib, "System.Reflection", "EventInfo");
3283 domain = mono_object_domain (type);
3284 if (type->type->byref)
3285 return mono_array_new (domain, System_Reflection_EventInfo, 0);
3286 klass = startklass = mono_class_from_mono_type (type->type);
3290 while ((event = mono_class_get_events (klass, &iter))) {
3292 method = event->add;
3294 method = event->remove;
3296 method = event->raise;
3298 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3299 if (bflags & BFLAGS_Public)
3302 if (bflags & BFLAGS_NonPublic)
3307 if (bflags & BFLAGS_NonPublic)
3313 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3314 if (bflags & BFLAGS_Static)
3315 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3318 if (bflags & BFLAGS_Instance)
3323 if (bflags & BFLAGS_Instance)
3328 l = g_slist_prepend (l, mono_event_get_object (domain, klass, event));
3330 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3332 len = g_slist_length (l);
3333 res = mono_array_new (domain, System_Reflection_EventInfo, len);
3336 tmp = l = g_slist_reverse (l);
3338 for (; tmp; tmp = tmp->next, ++i)
3339 mono_array_set (res, gpointer, i, tmp->data);
3344 static MonoReflectionType *
3345 ves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint32 bflags)
3348 MonoClass *startklass, *klass;
3353 MONO_ARCH_SAVE_REGS;
3355 domain = ((MonoObject *)type)->vtable->domain;
3356 if (type->type->byref)
3358 klass = startklass = mono_class_from_mono_type (type->type);
3359 str = mono_string_to_utf8 (name);
3362 for (tmpn = klass->nested_classes; tmpn; tmpn = tmpn->next) {
3364 nested = tmpn->data;
3365 if ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
3366 if (bflags & BFLAGS_Public)
3369 if (bflags & BFLAGS_NonPublic)
3374 if (strcmp (nested->name, str) == 0){
3376 return mono_type_get_object (domain, &nested->byval_arg);
3379 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3386 ves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags)
3389 GSList *l = NULL, *tmp;
3391 MonoClass *startklass, *klass;
3397 MONO_ARCH_SAVE_REGS;
3399 domain = ((MonoObject *)type)->vtable->domain;
3400 if (type->type->byref)
3401 return mono_array_new (domain, mono_defaults.monotype_class, 0);
3402 klass = startklass = mono_class_from_mono_type (type->type);
3404 for (tmpn = klass->nested_classes; tmpn; tmpn = tmpn->next) {
3406 nested = tmpn->data;
3407 if ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
3408 if (bflags & BFLAGS_Public)
3411 if (bflags & BFLAGS_NonPublic)
3416 member = (MonoObject*)mono_type_get_object (domain, &nested->byval_arg);
3417 l = g_slist_prepend (l, member);
3419 len = g_slist_length (l);
3420 res = mono_array_new (domain, mono_defaults.monotype_class, len);
3422 tmp = l = g_slist_reverse (l);
3423 for (; tmp; tmp = tmp->next, ++i)
3424 mono_array_set (res, gpointer, i, tmp->data);
3429 static MonoReflectionType*
3430 ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)
3433 MonoType *type = NULL;
3434 MonoTypeNameParse info;
3435 gboolean type_resolve = FALSE;
3437 MONO_ARCH_SAVE_REGS;
3439 str = mono_string_to_utf8 (name);
3440 /*g_print ("requested type %s in %s\n", str, assembly->assembly->aname.name);*/
3441 if (!mono_reflection_parse_type (str, &info)) {
3443 g_list_free (info.modifiers);
3444 g_list_free (info.nested);
3445 if (throwOnError) /* uhm: this is a parse error, though... */
3446 mono_raise_exception (mono_get_exception_type_load (name));
3447 /*g_print ("failed parse\n");*/
3451 if (module != NULL) {
3453 type = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve);
3458 if (assembly->assembly->dynamic) {
3459 /* Enumerate all modules */
3460 MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
3464 if (abuilder->modules) {
3465 for (i = 0; i < mono_array_length (abuilder->modules); ++i) {
3466 MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
3467 type = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve);
3473 if (!type && abuilder->loaded_modules) {
3474 for (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {
3475 MonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
3476 type = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve);
3483 type = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve);
3485 g_list_free (info.modifiers);
3486 g_list_free (info.nested);
3489 mono_raise_exception (mono_get_exception_type_load (name));
3490 /* g_print ("failed find\n"); */
3494 if (type->type == MONO_TYPE_CLASS) {
3495 MonoClass *klass = mono_type_get_class (type);
3496 /* need to report exceptions ? */
3497 if (throwOnError && klass->exception_type) {
3498 /* report SecurityException (or others) that occured when loading the assembly */
3499 MonoException *exc = mono_class_get_exception_for_failure (klass);
3500 mono_raise_exception (exc);
3501 } else if (klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) {
3506 /* g_print ("got it\n"); */
3507 return mono_type_get_object (mono_object_domain (assembly), type);
3511 ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly)
3513 MonoDomain *domain = mono_object_domain (assembly);
3514 MonoAssembly *mass = assembly->assembly;
3519 MONO_ARCH_SAVE_REGS;
3521 absolute = g_build_filename (mass->basedir, mass->image->module_name, NULL);
3522 uri = g_filename_to_uri (absolute, NULL, NULL);
3523 res = mono_string_new (domain, uri);
3530 ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)
3532 MonoAssembly *mass = assembly->assembly;
3534 MONO_ARCH_SAVE_REGS;
3536 return mass->in_gac;
3539 static MonoReflectionAssembly*
3540 ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)
3544 MonoImageOpenStatus status;
3546 MONO_ARCH_SAVE_REGS;
3548 name = mono_string_to_utf8 (mname);
3549 res = mono_assembly_load_with_partial_name (name, &status);
3555 return mono_assembly_get_object (mono_domain_get (), res);
3559 ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assembly)
3561 MonoDomain *domain = mono_object_domain (assembly);
3564 MONO_ARCH_SAVE_REGS;
3566 res = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image));
3572 ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)
3574 MONO_ARCH_SAVE_REGS;
3576 return assembly->assembly->ref_only;
3580 ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssembly *assembly)
3582 MonoDomain *domain = mono_object_domain (assembly);
3584 MONO_ARCH_SAVE_REGS;
3586 return mono_string_new (domain, assembly->assembly->image->version);
3589 static MonoReflectionMethod*
3590 ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly)
3592 guint32 token = mono_image_get_entry_point (assembly->assembly->image);
3594 MONO_ARCH_SAVE_REGS;
3598 return mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL);
3601 static MonoReflectionModule*
3602 ves_icall_System_Reflection_Assembly_get_ManifestModule (MonoReflectionAssembly *assembly)
3604 return mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);
3608 ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly)
3610 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3611 MonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows);
3615 MONO_ARCH_SAVE_REGS;
3617 for (i = 0; i < table->rows; ++i) {
3618 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));
3619 mono_array_set (result, gpointer, i, mono_string_new (mono_object_domain (assembly), val));
3625 create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision)
3627 static MonoClass *System_Version = NULL;
3628 static MonoMethod *create_version = NULL;
3632 if (!System_Version) {
3633 System_Version = mono_class_from_name (mono_defaults.corlib, "System", "Version");
3634 g_assert (System_Version);
3637 if (!create_version) {
3638 MonoMethodDesc *desc = mono_method_desc_new (":.ctor(int,int,int,int)", FALSE);
3639 create_version = mono_method_desc_search_in_class (desc, System_Version);
3640 g_assert (create_version);
3641 mono_method_desc_free (desc);
3647 args [3] = &revision;
3648 result = mono_object_new (domain, System_Version);
3649 mono_runtime_invoke (create_version, result, args, NULL);
3655 ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly)
3657 static MonoClass *System_Reflection_AssemblyName;
3659 MonoDomain *domain = mono_object_domain (assembly);
3661 static MonoMethod *create_culture = NULL;
3662 MonoImage *image = assembly->assembly->image;
3665 MONO_ARCH_SAVE_REGS;
3667 if (!System_Reflection_AssemblyName)
3668 System_Reflection_AssemblyName = mono_class_from_name (
3669 mono_defaults.corlib, "System.Reflection", "AssemblyName");
3671 t = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];
3674 result = mono_array_new (domain, System_Reflection_AssemblyName, count);
3677 MonoMethodDesc *desc = mono_method_desc_new (
3678 "System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
3679 create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
3680 g_assert (create_culture);
3681 mono_method_desc_free (desc);
3684 for (i = 0; i < count; i++) {
3685 MonoReflectionAssemblyName *aname;
3686 guint32 cols [MONO_ASSEMBLYREF_SIZE];
3688 mono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);
3690 aname = (MonoReflectionAssemblyName *) mono_object_new (
3691 domain, System_Reflection_AssemblyName);
3693 aname->name = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME]));
3695 aname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION];
3696 aname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION];
3697 aname->build = cols [MONO_ASSEMBLYREF_BUILD_NUMBER];
3698 aname->revision = cols [MONO_ASSEMBLYREF_REV_NUMBER];
3699 aname->flags = cols [MONO_ASSEMBLYREF_FLAGS];
3700 aname->versioncompat = 1; /* SameMachine (default) */
3701 aname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */
3702 aname->version = create_version (domain, aname->major, aname->minor, aname->build, aname->revision);
3704 if (create_culture) {
3706 args [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));
3707 aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL);
3710 if (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {
3711 const gchar *pkey_ptr = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLYREF_PUBLIC_KEY]);
3712 guint32 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
3714 if ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {
3715 /* public key token isn't copied - the class library will
3716 automatically generate it from the public key if required */
3717 aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
3718 memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
3720 aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
3721 memcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len);
3725 /* note: this function doesn't return the codebase on purpose (i.e. it can
3726 be used under partial trust as path information isn't present). */
3728 mono_array_set (result, gpointer, i, aname);
3739 foreach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)
3741 MonoString *name = mono_string_new (mono_object_domain (info->res), key);
3743 mono_array_set (info->res, gpointer, info->idx, name);
3748 ves_icall_System_Reflection_Assembly_GetNamespaces (MonoReflectionAssembly *assembly)
3750 MonoImage *img = assembly->assembly->image;
3754 MONO_ARCH_SAVE_REGS;
3756 res = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, g_hash_table_size (img->name_cache));
3759 g_hash_table_foreach (img->name_cache, (GHFunc)foreach_namespace, &info);
3764 /* move this in some file in mono/util/ */
3766 g_concat_dir_and_file (const char *dir, const char *file)
3768 g_return_val_if_fail (dir != NULL, NULL);
3769 g_return_val_if_fail (file != NULL, NULL);
3772 * If the directory name doesn't have a / on the end, we need
3773 * to add one so we get a proper path to the file
3775 if (dir [strlen(dir) - 1] != G_DIR_SEPARATOR)
3776 return g_strconcat (dir, G_DIR_SEPARATOR_S, file, NULL);
3778 return g_strconcat (dir, file, NULL);
3782 ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module)
3784 char *n = mono_string_to_utf8 (name);
3785 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3787 guint32 cols [MONO_MANIFEST_SIZE];
3788 guint32 impl, file_idx;
3792 MONO_ARCH_SAVE_REGS;
3794 for (i = 0; i < table->rows; ++i) {
3795 mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);
3796 val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);
3797 if (strcmp (val, n) == 0)
3801 if (i == table->rows)
3804 impl = cols [MONO_MANIFEST_IMPLEMENTATION];
3807 * this code should only be called after obtaining the
3808 * ResourceInfo and handling the other cases.
3810 g_assert ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_FILE);
3811 file_idx = impl >> MONO_IMPLEMENTATION_BITS;
3813 module = mono_image_load_file_for_image (assembly->assembly->image, file_idx);
3818 module = assembly->assembly->image;
3820 *ref_module = mono_module_get_object (mono_domain_get (), module);
3822 return (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);
3826 ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)
3828 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3830 guint32 cols [MONO_MANIFEST_SIZE];
3831 guint32 file_cols [MONO_FILE_SIZE];
3835 MONO_ARCH_SAVE_REGS;
3837 n = mono_string_to_utf8 (name);
3838 for (i = 0; i < table->rows; ++i) {
3839 mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);
3840 val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);
3841 if (strcmp (val, n) == 0)
3845 if (i == table->rows)
3848 if (!cols [MONO_MANIFEST_IMPLEMENTATION]) {
3849 info->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;
3852 switch (cols [MONO_MANIFEST_IMPLEMENTATION] & MONO_IMPLEMENTATION_MASK) {
3853 case MONO_IMPLEMENTATION_FILE:
3854 i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
3855 table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
3856 mono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);
3857 val = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);
3858 info->filename = mono_string_new (mono_object_domain (assembly), val);
3859 if (file_cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)
3862 info->location = RESOURCE_LOCATION_EMBEDDED;
3865 case MONO_IMPLEMENTATION_ASSEMBLYREF:
3866 i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
3867 mono_assembly_load_reference (assembly->assembly->image, i - 1);
3868 if (assembly->assembly->image->references [i - 1] == (gpointer)-1) {
3869 char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i - 1, assembly->assembly->image->name);
3870 MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);
3872 mono_raise_exception (ex);
3874 info->assembly = mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]);
3876 /* Obtain info recursively */
3877 ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);
3878 info->location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;
3881 case MONO_IMPLEMENTATION_EXP_TYPE:
3882 g_assert_not_reached ();
3891 ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules)
3893 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
3894 MonoArray *result = NULL;
3899 MONO_ARCH_SAVE_REGS;
3901 /* check hash if needed */
3903 n = mono_string_to_utf8 (name);
3904 for (i = 0; i < table->rows; ++i) {
3905 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
3906 if (strcmp (val, n) == 0) {
3909 n = g_concat_dir_and_file (assembly->assembly->basedir, val);
3910 fn = mono_string_new (mono_object_domain (assembly), n);
3912 return (MonoObject*)fn;
3920 for (i = 0; i < table->rows; ++i) {
3921 if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA))
3925 result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count);
3928 for (i = 0; i < table->rows; ++i) {
3929 if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
3930 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
3931 n = g_concat_dir_and_file (assembly->assembly->basedir, val);
3932 mono_array_set (result, gpointer, count, mono_string_new (mono_object_domain (assembly), n));
3937 return (MonoObject*)result;
3941 ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)
3943 MonoDomain *domain = mono_domain_get();
3946 int i, j, file_count = 0;
3947 MonoImage **modules;
3948 guint32 module_count, real_module_count;
3949 MonoTableInfo *table;
3951 g_assert (assembly->assembly->image != NULL);
3953 if (assembly->assembly->dynamic) {
3954 MonoReflectionAssemblyBuilder *assemblyb = (MonoReflectionAssemblyBuilder*)assembly;
3956 if (assemblyb->modules)
3957 module_count = mono_array_length (assemblyb->modules);
3960 real_module_count = module_count;
3962 modules = g_new0 (MonoImage*, module_count);
3963 if (assemblyb->modules) {
3964 for (i = 0; i < mono_array_length (assemblyb->modules); ++i) {
3966 mono_array_get (assemblyb->modules, MonoReflectionModuleBuilder*, i)->module.image;
3971 table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
3972 file_count = table->rows;
3974 modules = assembly->assembly->image->modules;
3975 module_count = assembly->assembly->image->module_count;
3977 real_module_count = 0;
3978 for (i = 0; i < module_count; ++i)
3980 real_module_count ++;
3983 klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Module");
3984 res = mono_array_new (domain, klass, 1 + real_module_count + file_count);
3986 mono_array_set (res, gpointer, 0, mono_module_get_object (domain, assembly->assembly->image));
3988 for (i = 0; i < module_count; ++i)
3990 mono_array_set (res, gpointer, j, mono_module_get_object (domain, modules[i]));
3994 for (i = 0; i < file_count; ++i, ++j)
3995 mono_array_set (res, gpointer, j, mono_module_file_get_object (domain, assembly->assembly->image, i));
3997 if (assembly->assembly->dynamic)
4003 static MonoReflectionMethod*
4004 ves_icall_GetCurrentMethod (void)
4006 MonoMethod *m = mono_method_get_last_managed ();
4008 MONO_ARCH_SAVE_REGS;
4010 return mono_method_get_object (mono_domain_get (), m, NULL);
4013 static MonoReflectionMethod*
4014 ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal (MonoMethod *method)
4016 return mono_method_get_object (mono_domain_get (), method, NULL);
4019 static MonoReflectionMethodBody*
4020 ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)
4022 return mono_method_body_get_object (mono_domain_get (), method);
4025 static MonoReflectionAssembly*
4026 ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
4028 MonoMethod *m = mono_method_get_last_managed ();
4030 MONO_ARCH_SAVE_REGS;
4032 return mono_assembly_get_object (mono_domain_get (), m->klass->image->assembly);
4037 get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
4039 MonoMethod **dest = data;
4041 /* skip unmanaged frames */
4056 static MonoReflectionAssembly*
4057 ves_icall_System_Reflection_Assembly_GetEntryAssembly (void)
4059 MonoDomain* domain = mono_domain_get ();
4061 MONO_ARCH_SAVE_REGS;
4063 if (!domain->entry_assembly)
4066 return mono_assembly_get_object (domain, domain->entry_assembly);
4070 static MonoReflectionAssembly*
4071 ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
4073 MonoMethod *m = mono_method_get_last_managed ();
4074 MonoMethod *dest = m;
4076 MONO_ARCH_SAVE_REGS;
4078 mono_stack_walk_no_il (get_caller, &dest);
4081 return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
4085 ves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name,
4086 gboolean assembly_qualified)
4088 MonoDomain *domain = mono_object_domain (object);
4089 MonoTypeNameFormat format;
4093 MONO_ARCH_SAVE_REGS;
4095 format = assembly_qualified ?
4096 MONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED :
4097 MONO_TYPE_NAME_FORMAT_FULL_NAME;
4099 format = MONO_TYPE_NAME_FORMAT_REFLECTION;
4101 name = mono_type_get_name_full (object->type, format);
4105 res = mono_string_new (domain, name);
4112 fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute)
4114 static MonoMethod *create_culture = NULL;
4117 const char *pkey_ptr;
4120 MONO_ARCH_SAVE_REGS;
4122 aname->name = mono_string_new (domain, name->name);
4123 aname->major = name->major;
4124 aname->minor = name->minor;
4125 aname->build = name->build;
4126 aname->revision = name->revision;
4127 aname->hashalg = name->hash_alg;
4128 aname->version = create_version (domain, name->major, name->minor, name->build, name->revision);
4130 codebase = g_filename_to_uri (absolute, NULL, NULL);
4132 aname->codebase = mono_string_new (domain, codebase);
4136 if (!create_culture) {
4137 MonoMethodDesc *desc = mono_method_desc_new ("System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
4138 create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
4139 g_assert (create_culture);
4140 mono_method_desc_free (desc);
4143 args [0] = mono_string_new (domain, name->culture);
4144 aname->cultureInfo =
4145 mono_runtime_invoke (create_culture, NULL, args, NULL);
4147 if (name->public_key) {
4148 pkey_ptr = (char*)name->public_key;
4149 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
4151 aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
4152 memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
4155 /* MonoAssemblyName keeps the public key token as an hexadecimal string */
4156 if (name->public_key_token [0]) {
4160 aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, 8);
4161 p = mono_array_addr (aname->keyToken, char, 0);
4163 for (i = 0, j = 0; i < 8; i++) {
4164 *p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;
4165 *p |= g_ascii_xdigit_value (name->public_key_token [j++]);
4172 ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)
4176 MONO_ARCH_SAVE_REGS;
4178 absolute = g_build_filename (assembly->assembly->basedir, assembly->assembly->image->module_name, NULL);
4180 fill_reflection_assembly_name (mono_object_domain (assembly), aname,
4181 &assembly->assembly->aname, absolute);
4187 ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)
4190 MonoImageOpenStatus status = MONO_IMAGE_OK;
4193 MonoAssemblyName name;
4195 MONO_ARCH_SAVE_REGS;
4197 filename = mono_string_to_utf8 (fname);
4199 image = mono_image_open (filename, &status);
4205 exc = mono_get_exception_file_not_found (fname);
4206 mono_raise_exception (exc);
4209 res = mono_assembly_fill_assembly_name (image, &name);
4211 mono_image_close (image);
4213 mono_raise_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest"));
4216 fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename);
4219 mono_image_close (image);
4223 ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,
4224 char **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)
4226 MonoBoolean result = FALSE;
4227 MonoDeclSecurityEntry entry;
4229 /* SecurityAction.RequestMinimum */
4230 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {
4231 *minimum = entry.blob;
4232 *minLength = entry.size;
4235 /* SecurityAction.RequestOptional */
4236 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {
4237 *optional = entry.blob;
4238 *optLength = entry.size;
4241 /* SecurityAction.RequestRefuse */
4242 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {
4243 *refused = entry.blob;
4244 *refLength = entry.size;
4252 mono_module_get_types (MonoDomain *domain, MonoImage *image,
4253 MonoBoolean exportedOnly)
4257 MonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];
4259 guint32 attrs, visibility;
4261 /* we start the count from 1 because we skip the special type <Module> */
4264 for (i = 1; i < tdef->rows; ++i) {
4265 attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);
4266 visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;
4267 if (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)
4271 count = tdef->rows - 1;
4273 res = mono_array_new (domain, mono_defaults.monotype_class, count);
4275 for (i = 1; i < tdef->rows; ++i) {
4276 attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);
4277 visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;
4278 if (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) {
4279 klass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF);
4280 mono_array_set (res, gpointer, count, mono_type_get_object (domain, &klass->byval_arg));
4289 ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)
4291 MonoArray *res = NULL;
4292 MonoImage *image = NULL;
4293 MonoTableInfo *table = NULL;
4297 MONO_ARCH_SAVE_REGS;
4299 domain = mono_object_domain (assembly);
4301 if (assembly->assembly->dynamic) {
4302 MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
4303 if (abuilder->modules) {
4304 for (i = 0; i < mono_array_length(abuilder->modules); i++) {
4305 MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
4309 MonoArray *append = mb->types;
4310 if (mono_array_length (append) > 0) {
4313 len1 = mono_array_length (res);
4314 len2 = mono_array_length (append);
4315 new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4316 memcpy (mono_array_addr (new, MonoReflectionType*, 0),
4317 mono_array_addr (res, MonoReflectionType*, 0),
4318 len1 * sizeof (MonoReflectionType*));
4319 memcpy (mono_array_addr (new, MonoReflectionType*, len1),
4320 mono_array_addr (append, MonoReflectionType*, 0),
4321 len2 * sizeof (MonoReflectionType*));
4328 * Replace TypeBuilders with the created types to be compatible
4332 for (i = 0; i < mono_array_length (res); ++i) {
4333 MonoReflectionTypeBuilder *tb = mono_array_get (res, MonoReflectionTypeBuilder*, i);
4335 mono_array_set (res, MonoReflectionType*, i, tb->created);
4340 if (abuilder->loaded_modules)
4341 for (i = 0; i < mono_array_length(abuilder->loaded_modules); i++) {
4342 MonoReflectionModule *rm = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
4344 res = mono_module_get_types (domain, rm->image, exportedOnly);
4346 MonoArray *append = mono_module_get_types (domain, rm->image, exportedOnly);
4347 if (mono_array_length (append) > 0) {
4350 len1 = mono_array_length (res);
4351 len2 = mono_array_length (append);
4352 new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4353 memcpy (mono_array_addr (new, MonoReflectionType*, 0),
4354 mono_array_addr (res, MonoReflectionType*, 0),
4355 len1 * sizeof (MonoReflectionType*));
4356 memcpy (mono_array_addr (new, MonoReflectionType*, len1),
4357 mono_array_addr (append, MonoReflectionType*, 0),
4358 len2 * sizeof (MonoReflectionType*));
4365 image = assembly->assembly->image;
4366 table = &image->tables [MONO_TABLE_FILE];
4367 res = mono_module_get_types (domain, image, exportedOnly);
4369 /* Append data from all modules in the assembly */
4370 for (i = 0; i < table->rows; ++i) {
4371 if (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
4372 MonoImage *loaded_image = mono_assembly_load_module (image->assembly, i + 1);
4374 MonoArray *res2 = mono_module_get_types (domain, loaded_image, exportedOnly);
4375 /* Append the new types to the end of the array */
4376 if (mono_array_length (res2) > 0) {
4380 len1 = mono_array_length (res);
4381 len2 = mono_array_length (res2);
4382 res3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4383 memcpy (mono_array_addr (res3, MonoReflectionType*, 0),
4384 mono_array_addr (res, MonoReflectionType*, 0),
4385 len1 * sizeof (MonoReflectionType*));
4386 memcpy (mono_array_addr (res3, MonoReflectionType*, len1),
4387 mono_array_addr (res2, MonoReflectionType*, 0),
4388 len2 * sizeof (MonoReflectionType*));
4395 if (mono_is_security_manager_active ()) {
4396 /* the ReflectionTypeLoadException must have all the types (Types property),
4397 * NULL replacing types which throws an exception. The LoaderException must
4398 * contains all exceptions for NULL items.
4401 guint32 len = mono_array_length (res);
4404 for (i = 0; i < len; i++) {
4405 MonoReflectionType *t = mono_array_get (res, gpointer, i);
4406 MonoClass *klass = mono_type_get_class (t->type);
4407 if ((klass != NULL) && klass->exception_type) {
4408 /* keep the class in the list */
4409 list = g_list_append (list, klass);
4410 /* and replace Type with NULL */
4411 mono_array_set (res, gpointer, i, NULL);
4417 MonoException *exc = NULL;
4418 int length = g_list_length (list);
4420 MonoArray *exl = mono_array_new (domain, mono_defaults.exception_class, length);
4421 for (i = 0, tmp = list; i < length; i++, tmp = tmp->next) {
4422 MonoException *exc = mono_class_get_exception_for_failure (tmp->data);
4423 mono_array_set (exl, gpointer, i, exc);
4428 exc = mono_get_exception_reflection_type_load (res, exl);
4429 mono_raise_exception (exc);
4436 static MonoReflectionType*
4437 ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)
4439 MonoDomain *domain = mono_object_domain (module);
4442 MONO_ARCH_SAVE_REGS;
4444 g_assert (module->image);
4446 if (module->image->dynamic && ((MonoDynamicImage*)(module->image))->initial_image)
4447 /* These images do not have a global type */
4450 klass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF);
4451 return mono_type_get_object (domain, &klass->byval_arg);
4455 ves_icall_System_Reflection_Module_Close (MonoReflectionModule *module)
4457 /*if (module->image)
4458 mono_image_close (module->image);*/
4462 ves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module)
4464 MonoDomain *domain = mono_object_domain (module);
4466 MONO_ARCH_SAVE_REGS;
4468 g_assert (module->image);
4469 return mono_string_new (domain, module->image->guid);
4473 ves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)
4475 if (image->dynamic) {
4476 MonoDynamicImage *dyn = (MonoDynamicImage*)image;
4477 *pe_kind = dyn->pe_kind;
4478 *machine = dyn->machine;
4481 *pe_kind = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags & 0x3;
4482 *machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;
4487 ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)
4489 MONO_ARCH_SAVE_REGS;
4492 return mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);
4494 return mono_module_get_types (mono_object_domain (module), module->image, FALSE);
4498 mono_metadata_memberref_is_method (MonoImage *image, guint32 token)
4500 guint32 cols [MONO_MEMBERREF_SIZE];
4502 mono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], mono_metadata_token_index (token) - 1, cols, MONO_MEMBERREF_SIZE);
4503 sig = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);
4504 mono_metadata_decode_blob_size (sig, &sig);
4505 return (*sig != 0x6);
4509 ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4512 int table = mono_metadata_token_table (token);
4513 int index = mono_metadata_token_index (token);
4515 *error = ResolveTokenError_Other;
4517 /* Validate token */
4518 if ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) &&
4519 (table != MONO_TABLE_TYPESPEC)) {
4520 *error = ResolveTokenError_BadTable;
4525 return mono_lookup_dynamic_token (image, token);
4527 if ((index <= 0) || (index > image->tables [table].rows)) {
4528 *error = ResolveTokenError_OutOfRange;
4532 klass = mono_class_get (image, token);
4534 return &klass->byval_arg;
4540 ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4542 int table = mono_metadata_token_table (token);
4543 int index = mono_metadata_token_index (token);
4545 *error = ResolveTokenError_Other;
4547 /* Validate token */
4548 if ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) &&
4549 (table != MONO_TABLE_MEMBERREF)) {
4550 *error = ResolveTokenError_BadTable;
4555 /* FIXME: validate memberref token type */
4556 return mono_lookup_dynamic_token (image, token);
4558 if ((index <= 0) || (index > image->tables [table].rows)) {
4559 *error = ResolveTokenError_OutOfRange;
4562 if ((table == MONO_TABLE_MEMBERREF) && (!mono_metadata_memberref_is_method (image, token))) {
4563 *error = ResolveTokenError_BadTable;
4567 return mono_get_method (image, token, NULL);
4571 ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4573 int index = mono_metadata_token_index (token);
4575 *error = ResolveTokenError_Other;
4577 /* Validate token */
4578 if (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {
4579 *error = ResolveTokenError_BadTable;
4584 return mono_lookup_dynamic_token (image, token);
4586 if ((index <= 0) || (index >= image->heap_us.size)) {
4587 *error = ResolveTokenError_OutOfRange;
4591 /* FIXME: What to do if the index points into the middle of a string ? */
4593 return mono_ldstr (mono_domain_get (), image, index);
4596 static MonoClassField*
4597 ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4600 int table = mono_metadata_token_table (token);
4601 int index = mono_metadata_token_index (token);
4603 *error = ResolveTokenError_Other;
4605 /* Validate token */
4606 if ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {
4607 *error = ResolveTokenError_BadTable;
4612 /* FIXME: validate memberref token type */
4613 return mono_lookup_dynamic_token (image, token);
4615 if ((index <= 0) || (index > image->tables [table].rows)) {
4616 *error = ResolveTokenError_OutOfRange;
4619 if ((table == MONO_TABLE_MEMBERREF) && (mono_metadata_memberref_is_method (image, token))) {
4620 *error = ResolveTokenError_BadTable;
4624 return mono_field_from_token (image, token, &klass, NULL);
4629 ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4631 int table = mono_metadata_token_table (token);
4633 *error = ResolveTokenError_Other;
4636 case MONO_TABLE_TYPEDEF:
4637 case MONO_TABLE_TYPEREF:
4638 case MONO_TABLE_TYPESPEC: {
4639 MonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, error);
4641 return (MonoObject*)mono_type_get_object (mono_domain_get (), t);
4645 case MONO_TABLE_METHOD:
4646 case MONO_TABLE_METHODSPEC: {
4647 MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
4649 return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
4653 case MONO_TABLE_FIELD: {
4654 MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
4656 return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
4660 case MONO_TABLE_MEMBERREF:
4661 if (mono_metadata_memberref_is_method (image, token)) {
4662 MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
4664 return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
4669 MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
4671 return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
4678 *error = ResolveTokenError_BadTable;
4684 static MonoReflectionType*
4685 ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, MonoString *smodifiers)
4688 int isbyref = 0, rank;
4689 char *str = mono_string_to_utf8 (smodifiers);
4692 MONO_ARCH_SAVE_REGS;
4694 klass = mono_class_from_mono_type (tb->type.type);
4696 /* logic taken from mono_reflection_parse_type(): keep in sync */
4700 if (isbyref) { /* only one level allowed by the spec */
4707 return mono_type_get_object (mono_object_domain (tb), &klass->this_arg);
4710 klass = mono_ptr_class_get (&klass->byval_arg);
4711 mono_class_init (klass);
4722 else if (*p != '*') { /* '*' means unknown lower bound */
4733 klass = mono_array_class_get (klass, rank);
4734 mono_class_init (klass);
4741 return mono_type_get_object (mono_object_domain (tb), &klass->byval_arg);
4745 ves_icall_Type_IsArrayImpl (MonoReflectionType *t)
4750 MONO_ARCH_SAVE_REGS;
4753 res = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);
4758 static MonoReflectionType *
4759 ves_icall_Type_make_array_type (MonoReflectionType *type, int rank)
4761 MonoClass *klass, *aklass;
4763 MONO_ARCH_SAVE_REGS;
4765 klass = mono_class_from_mono_type (type->type);
4766 aklass = mono_array_class_get (klass, rank);
4768 return mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);
4771 static MonoReflectionType *
4772 ves_icall_Type_make_byref_type (MonoReflectionType *type)
4776 MONO_ARCH_SAVE_REGS;
4778 klass = mono_class_from_mono_type (type->type);
4780 return mono_type_get_object (mono_object_domain (type), &klass->this_arg);
4783 static MonoReflectionType *
4784 ves_icall_Type_MakePointerType (MonoReflectionType *type)
4788 MONO_ARCH_SAVE_REGS;
4790 pklass = mono_ptr_class_get (type->type);
4792 return mono_type_get_object (mono_object_domain (type), &pklass->byval_arg);
4796 ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target,
4797 MonoReflectionMethod *info)
4799 MonoClass *delegate_class = mono_class_from_mono_type (type->type);
4800 MonoObject *delegate;
4803 MONO_ARCH_SAVE_REGS;
4805 mono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class);
4807 delegate = mono_object_new (mono_object_domain (type), delegate_class);
4809 func = mono_compile_method (info->method);
4811 mono_delegate_ctor (delegate, target, func);
4817 ves_icall_System_Delegate_FreeTrampoline (MonoDelegate *this)
4820 Delegates have a finalizer only when needed, now.
4821 mono_delegate_free_ftnptr (this);*/
4825 * Magic number to convert a time which is relative to
4826 * Jan 1, 1970 into a value which is relative to Jan 1, 0001.
4828 #define EPOCH_ADJUST ((guint64)62135596800LL)
4831 * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001
4833 #define FILETIME_ADJUST ((guint64)504911232000000000LL)
4836 * This returns Now in UTC
4839 ves_icall_System_DateTime_GetNow (void)
4841 #ifdef PLATFORM_WIN32
4845 GetSystemTime (&st);
4846 SystemTimeToFileTime (&st, &ft);
4847 return (gint64) FILETIME_ADJUST + ((((gint64)ft.dwHighDateTime)<<32) | ft.dwLowDateTime);
4849 /* FIXME: put this in io-layer and call it GetLocalTime */
4853 MONO_ARCH_SAVE_REGS;
4855 if (gettimeofday (&tv, NULL) == 0) {
4856 res = (((gint64)tv.tv_sec + EPOCH_ADJUST)* 1000000 + tv.tv_usec)*10;
4859 /* fixme: raise exception */
4864 #ifdef PLATFORM_WIN32
4865 /* convert a SYSTEMTIME which is of the form "last thursday in october" to a real date */
4867 convert_to_absolute_date(SYSTEMTIME *date)
4869 #define IS_LEAP(y) ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0))
4870 static int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
4871 static int leap_days_in_month[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
4872 /* from the calendar FAQ */
4873 int a = (14 - date->wMonth) / 12;
4874 int y = date->wYear - a;
4875 int m = date->wMonth + 12 * a - 2;
4876 int d = (1 + y + y/4 - y/100 + y/400 + (31*m)/12) % 7;
4878 /* d is now the day of the week for the first of the month (0 == Sunday) */
4880 int day_of_week = date->wDayOfWeek;
4882 /* set day_in_month to the first day in the month which falls on day_of_week */
4883 int day_in_month = 1 + (day_of_week - d);
4884 if (day_in_month <= 0)
4887 /* wDay is 1 for first weekday in month, 2 for 2nd ... 5 means last - so work that out allowing for days in the month */
4888 date->wDay = day_in_month + (date->wDay - 1) * 7;
4889 if (date->wDay > (IS_LEAP(date->wYear) ? leap_days_in_month[date->wMonth - 1] : days_in_month[date->wMonth - 1]))
4894 #ifndef PLATFORM_WIN32
4896 * Return's the offset from GMT of a local time.
4898 * tm is a local time
4899 * t is the same local time as seconds.
4902 gmt_offset(struct tm *tm, time_t t)
4904 #if defined (HAVE_TM_GMTOFF)
4905 return tm->tm_gmtoff;
4910 g.tm_isdst = tm->tm_isdst;
4912 return (int)difftime(t, t2);
4917 * This is heavily based on zdump.c from glibc 2.2.
4919 * * data[0]: start of daylight saving time (in DateTime ticks).
4920 * * data[1]: end of daylight saving time (in DateTime ticks).
4921 * * data[2]: utcoffset (in TimeSpan ticks).
4922 * * data[3]: additional offset when daylight saving (in TimeSpan ticks).
4923 * * name[0]: name of this timezone when not daylight saving.
4924 * * name[1]: name of this timezone when daylight saving.
4926 * FIXME: This only works with "standard" Unix dates (years between 1900 and 2100) while
4927 * the class library allows years between 1 and 9999.
4929 * Returns true on success and zero on failure.
4932 ves_icall_System_CurrentTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)
4934 #ifndef PLATFORM_WIN32
4935 MonoDomain *domain = mono_domain_get ();
4936 struct tm start, tt;
4940 int is_daylight = 0, day;
4943 MONO_ARCH_SAVE_REGS;
4945 MONO_CHECK_ARG_NULL (data);
4946 MONO_CHECK_ARG_NULL (names);
4948 (*data) = mono_array_new (domain, mono_defaults.int64_class, 4);
4949 (*names) = mono_array_new (domain, mono_defaults.string_class, 2);
4952 * no info is better than crashing: we'll need our own tz data
4953 * to make this work properly, anyway. The range is probably
4954 * reduced to 1970 .. 2037 because that is what mktime is
4955 * guaranteed to support (we get into an infinite loop
4959 memset (&start, 0, sizeof (start));
4962 start.tm_year = year-1900;
4964 t = mktime (&start);
4966 if ((year < 1970) || (year > 2037) || (t == -1)) {
4968 tt = *localtime (&t);
4969 strftime (tzone, sizeof (tzone), "%Z", &tt);
4970 mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
4971 mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
4975 gmtoff = gmt_offset (&start, t);
4977 /* For each day of the year, calculate the tm_gmtoff. */
4978 for (day = 0; day < 365; day++) {
4981 tt = *localtime (&t);
4983 /* Daylight saving starts or ends here. */
4984 if (gmt_offset (&tt, t) != gmtoff) {
4988 /* Try to find the exact hour when daylight saving starts/ends. */
4992 tt1 = *localtime (&t1);
4993 } while (gmt_offset (&tt1, t1) != gmtoff);
4995 /* Try to find the exact minute when daylight saving starts/ends. */
4998 tt1 = *localtime (&t1);
4999 } while (gmt_offset (&tt1, t1) == gmtoff);
5001 strftime (tzone, sizeof (tzone), "%Z", &tt);
5003 /* Write data, if we're already in daylight saving, we're done. */
5005 mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
5006 mono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
5009 mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
5010 mono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
5014 /* This is only set once when we enter daylight saving. */
5015 mono_array_set ((*data), gint64, 2, (gint64)gmtoff * 10000000L);
5016 mono_array_set ((*data), gint64, 3, (gint64)(gmt_offset (&tt, t) - gmtoff) * 10000000L);
5018 gmtoff = gmt_offset (&tt, t);
5023 strftime (tzone, sizeof (tzone), "%Z", &tt);
5024 mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
5025 mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
5026 mono_array_set ((*data), gint64, 0, 0);
5027 mono_array_set ((*data), gint64, 1, 0);
5028 mono_array_set ((*data), gint64, 2, (gint64) gmtoff * 10000000L);
5029 mono_array_set ((*data), gint64, 3, 0);
5034 MonoDomain *domain = mono_domain_get ();
5035 TIME_ZONE_INFORMATION tz_info;
5040 tz_id = GetTimeZoneInformation (&tz_info);
5041 if (tz_id == TIME_ZONE_ID_INVALID)
5044 MONO_CHECK_ARG_NULL (data);
5045 MONO_CHECK_ARG_NULL (names);
5047 (*data) = mono_array_new (domain, mono_defaults.int64_class, 4);
5048 (*names) = mono_array_new (domain, mono_defaults.string_class, 2);
5050 for (i = 0; i < 32; ++i)
5051 if (!tz_info.DaylightName [i])
5053 mono_array_set ((*names), gpointer, 1, mono_string_new_utf16 (domain, tz_info.DaylightName, i));
5054 for (i = 0; i < 32; ++i)
5055 if (!tz_info.StandardName [i])
5057 mono_array_set ((*names), gpointer, 0, mono_string_new_utf16 (domain, tz_info.StandardName, i));
5059 if ((year <= 1601) || (year > 30827)) {
5061 * According to MSDN, the MS time functions can't handle dates outside
5067 /* even if the timezone has no daylight savings it may have Bias (e.g. GMT+13 it seems) */
5068 if (tz_id != TIME_ZONE_ID_UNKNOWN) {
5069 tz_info.StandardDate.wYear = year;
5070 convert_to_absolute_date(&tz_info.StandardDate);
5071 err = SystemTimeToFileTime (&tz_info.StandardDate, &ft);
5073 mono_array_set ((*data), gint64, 1, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));
5074 tz_info.DaylightDate.wYear = year;
5075 convert_to_absolute_date(&tz_info.DaylightDate);
5076 err = SystemTimeToFileTime (&tz_info.DaylightDate, &ft);
5078 mono_array_set ((*data), gint64, 0, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));
5080 mono_array_set ((*data), gint64, 2, (tz_info.Bias + tz_info.StandardBias) * -600000000LL);
5081 mono_array_set ((*data), gint64, 3, (tz_info.DaylightBias - tz_info.StandardBias) * -600000000LL);
5088 ves_icall_System_Object_obj_address (MonoObject *this)
5090 MONO_ARCH_SAVE_REGS;
5097 static inline gint32
5098 mono_array_get_byte_length (MonoArray *array)
5104 klass = array->obj.vtable->klass;
5106 if (array->bounds == NULL)
5107 length = array->max_length;
5110 for (i = 0; i < klass->rank; ++ i)
5111 length *= array->bounds [i].length;
5114 switch (klass->element_class->byval_arg.type) {
5117 case MONO_TYPE_BOOLEAN:
5121 case MONO_TYPE_CHAR:
5129 return length * sizeof (gpointer);
5140 ves_icall_System_Buffer_ByteLengthInternal (MonoArray *array)
5142 MONO_ARCH_SAVE_REGS;
5144 return mono_array_get_byte_length (array);
5148 ves_icall_System_Buffer_GetByteInternal (MonoArray *array, gint32 idx)
5150 MONO_ARCH_SAVE_REGS;
5152 return mono_array_get (array, gint8, idx);
5156 ves_icall_System_Buffer_SetByteInternal (MonoArray *array, gint32 idx, gint8 value)
5158 MONO_ARCH_SAVE_REGS;
5160 mono_array_set (array, gint8, idx, value);
5164 ves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, MonoArray *dest, gint32 dest_offset, gint32 count)
5166 guint8 *src_buf, *dest_buf;
5168 MONO_ARCH_SAVE_REGS;
5170 /* watch out for integer overflow */
5171 if ((src_offset > mono_array_get_byte_length (src) - count) || (dest_offset > mono_array_get_byte_length (dest) - count))
5174 src_buf = (guint8 *)src->vector + src_offset;
5175 dest_buf = (guint8 *)dest->vector + dest_offset;
5178 memcpy (dest_buf, src_buf, count);
5180 memmove (dest_buf, src_buf, count); /* Source and dest are the same array */
5186 ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString *class_name)
5188 MonoDomain *domain = mono_object_domain (this);
5190 MonoRealProxy *rp = ((MonoRealProxy *)this);
5191 MonoTransparentProxy *tp;
5195 MONO_ARCH_SAVE_REGS;
5197 res = mono_object_new (domain, mono_defaults.transparent_proxy_class);
5198 tp = (MonoTransparentProxy*) res;
5201 type = ((MonoReflectionType *)rp->class_to_proxy)->type;
5202 klass = mono_class_from_mono_type (type);
5204 tp->custom_type_info = (mono_object_isinst (this, mono_defaults.iremotingtypeinfo_class) != NULL);
5205 tp->remote_class = mono_remote_class (domain, class_name, klass);
5207 res->vtable = mono_remote_class_vtable (domain, tp->remote_class, rp);
5211 static MonoReflectionType *
5212 ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)
5214 return mono_type_get_object (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg);
5217 /* System.Environment */
5220 ves_icall_System_Environment_get_MachineName (void)
5222 #if defined (PLATFORM_WIN32)
5227 len = MAX_COMPUTERNAME_LENGTH + 1;
5228 buf = g_new (gunichar2, len);
5231 if (GetComputerName (buf, (PDWORD) &len))
5232 result = mono_string_new_utf16 (mono_domain_get (), buf, len);
5241 MONO_ARCH_SAVE_REGS;
5244 buf = g_new (gchar, len);
5247 if (gethostname (buf, len) == 0)
5248 result = mono_string_new (mono_domain_get (), buf);
5256 ves_icall_System_Environment_get_Platform (void)
5258 MONO_ARCH_SAVE_REGS;
5260 #if defined (PLATFORM_WIN32)
5270 ves_icall_System_Environment_get_NewLine (void)
5272 MONO_ARCH_SAVE_REGS;
5274 #if defined (PLATFORM_WIN32)
5275 return mono_string_new (mono_domain_get (), "\r\n");
5277 return mono_string_new (mono_domain_get (), "\n");
5282 ves_icall_System_Environment_GetEnvironmentVariable (MonoString *name)
5287 MONO_ARCH_SAVE_REGS;
5292 utf8_name = mono_string_to_utf8 (name); /* FIXME: this should be ascii */
5293 value = g_getenv (utf8_name);
5299 return mono_string_new (mono_domain_get (), value);
5303 * There is no standard way to get at environ.
5311 ves_icall_System_Environment_GetEnvironmentVariableNames (void)
5319 MONO_ARCH_SAVE_REGS;
5322 for (e = environ; *e != 0; ++ e)
5325 domain = mono_domain_get ();
5326 names = mono_array_new (domain, mono_defaults.string_class, n);
5329 for (e = environ; *e != 0; ++ e) {
5330 parts = g_strsplit (*e, "=", 2);
5332 str = mono_string_new (domain, *parts);
5333 mono_array_set (names, MonoString *, n, str);
5345 * Returns: the number of milliseconds elapsed since the system started.
5348 ves_icall_System_Environment_get_TickCount (void)
5350 return GetTickCount ();
5355 ves_icall_System_Environment_Exit (int result)
5357 MONO_ARCH_SAVE_REGS;
5359 mono_runtime_set_shutting_down ();
5361 /* Suspend all managed threads since the runtime is going away */
5362 mono_thread_suspend_all_other_threads ();
5364 mono_runtime_quit ();
5366 /* we may need to do some cleanup here... */
5371 ves_icall_System_Environment_GetGacPath (void)
5373 return mono_string_new (mono_domain_get (), mono_assembly_getrootdir ());
5377 ves_icall_System_Environment_GetWindowsFolderPath (int folder)
5379 #if defined (PLATFORM_WIN32)
5380 #ifndef CSIDL_FLAG_CREATE
5381 #define CSIDL_FLAG_CREATE 0x8000
5384 WCHAR path [MAX_PATH];
5385 /* Create directory if no existing */
5386 if (SUCCEEDED (SHGetFolderPathW (NULL, folder | CSIDL_FLAG_CREATE, NULL, 0, path))) {
5390 return mono_string_new_utf16 (mono_domain_get (), path, len);
5393 g_warning ("ves_icall_System_Environment_GetWindowsFolderPath should only be called on Windows!");
5395 return mono_string_new (mono_domain_get (), "");
5399 ves_icall_System_Environment_GetLogicalDrives (void)
5401 gunichar2 buf [128], *ptr, *dname;
5403 gint initial_size = 127, size = 128;
5406 MonoString *drivestr;
5407 MonoDomain *domain = mono_domain_get ();
5410 MONO_ARCH_SAVE_REGS;
5415 while (size > initial_size) {
5416 size = GetLogicalDriveStrings (initial_size, ptr);
5417 if (size > initial_size) {
5420 ptr = g_malloc0 ((size + 1) * sizeof (gunichar2));
5421 initial_size = size;
5435 result = mono_array_new (domain, mono_defaults.string_class, ndrives);
5440 while (*u16) { u16++; len ++; }
5441 drivestr = mono_string_new_utf16 (domain, dname, len);
5442 mono_array_set (result, gpointer, ndrives++, drivestr);
5453 ves_icall_System_Environment_InternalGetHome (void)
5455 MONO_ARCH_SAVE_REGS;
5457 return mono_string_new (mono_domain_get (), g_get_home_dir ());
5460 static const char *encodings [] = {
5462 "ascii", "us_ascii", "us", "ansi_x3.4_1968",
5463 "ansi_x3.4_1986", "cp367", "csascii", "ibm367",
5464 "iso_ir_6", "iso646_us", "iso_646.irv:1991",
5466 "utf_7", "csunicode11utf7", "unicode_1_1_utf_7",
5467 "unicode_2_0_utf_7", "x_unicode_1_1_utf_7",
5468 "x_unicode_2_0_utf_7",
5470 "utf_8", "unicode_1_1_utf_8", "unicode_2_0_utf_8",
5471 "x_unicode_1_1_utf_8", "x_unicode_2_0_utf_8",
5473 "utf_16", "UTF_16LE", "ucs_2", "unicode",
5476 "unicodefffe", "utf_16be",
5483 * Returns the internal codepage, if the value of "int_code_page" is
5484 * 1 at entry, and we can not compute a suitable code page number,
5485 * returns the code page as a string
5488 ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page)
5493 char *codepage = NULL;
5495 int want_name = *int_code_page;
5498 *int_code_page = -1;
5499 MONO_ARCH_SAVE_REGS;
5501 g_get_charset (&cset);
5502 c = codepage = strdup (cset);
5503 for (c = codepage; *c; c++){
5504 if (isascii (*c) && isalpha (*c))
5509 /* g_print ("charset: %s\n", cset); */
5511 /* handle some common aliases */
5514 for (i = 0; p != 0; ){
5515 if ((gssize) p < 7){
5517 p = encodings [++i];
5520 if (strcmp (p, codepage) == 0){
5521 *int_code_page = code;
5524 p = encodings [++i];
5527 if (strstr (codepage, "utf_8") != NULL)
5528 *int_code_page |= 0x10000000;
5531 if (want_name && *int_code_page == -1)
5532 return mono_string_new (mono_domain_get (), cset);
5538 ves_icall_System_Environment_get_HasShutdownStarted (void)
5540 if (mono_runtime_is_shutting_down ())
5543 if (mono_domain_is_unloading (mono_domain_get ()))
5550 ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this,
5551 MonoReflectionMethod *method,
5552 MonoArray *out_args)
5554 MONO_ARCH_SAVE_REGS;
5556 mono_message_init (mono_object_domain (this), this, method, out_args);
5560 ves_icall_IsTransparentProxy (MonoObject *proxy)
5562 MONO_ARCH_SAVE_REGS;
5567 if (proxy->vtable->klass == mono_defaults.transparent_proxy_class)
5574 ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (MonoReflectionType *type, MonoBoolean enable)
5579 MONO_ARCH_SAVE_REGS;
5581 klass = mono_class_from_mono_type (type->type);
5582 vtable = mono_class_vtable (mono_domain_get (), klass);
5584 if (enable) vtable->remote = 1;
5585 else vtable->remote = 0;
5589 ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance (MonoReflectionType *type)
5594 MONO_ARCH_SAVE_REGS;
5596 domain = mono_object_domain (type);
5597 klass = mono_class_from_mono_type (type->type);
5599 if (klass->rank >= 1) {
5600 g_assert (klass->rank == 1);
5601 return (MonoObject *) mono_array_new (domain, klass->element_class, 0);
5603 /* Bypass remoting object creation check */
5604 return mono_object_new_alloc_specific (mono_class_vtable (domain, klass));
5609 ves_icall_System_IO_get_temp_path (void)
5611 MONO_ARCH_SAVE_REGS;
5613 return mono_string_new (mono_domain_get (), g_get_tmp_dir ());
5617 ves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method)
5619 MONO_ARCH_SAVE_REGS;
5621 return mono_compile_method (method);
5625 ves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void)
5630 MONO_ARCH_SAVE_REGS;
5632 path = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), "mono", mono_get_runtime_info ()->framework_version, "machine.config", NULL);
5634 #if defined (PLATFORM_WIN32)
5635 /* Avoid mixing '/' and '\\' */
5638 for (i = strlen (path) - 1; i >= 0; i--)
5639 if (path [i] == '/')
5643 mcpath = mono_string_new (mono_domain_get (), path);
5650 ves_icall_System_Web_Util_ICalls_get_machine_install_dir (void)
5655 MONO_ARCH_SAVE_REGS;
5657 path = g_path_get_dirname (mono_get_config_dir ());
5659 #if defined (PLATFORM_WIN32)
5660 /* Avoid mixing '/' and '\\' */
5663 for (i = strlen (path) - 1; i >= 0; i--)
5664 if (path [i] == '/')
5668 ipath = mono_string_new (mono_domain_get (), path);
5675 ves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString (MonoString *message)
5677 #if defined (PLATFORM_WIN32)
5678 static void (*output_debug) (gunichar2 *);
5679 static gboolean tried_loading = FALSE;
5681 MONO_ARCH_SAVE_REGS;
5683 if (!tried_loading && output_debug == NULL) {
5686 tried_loading = TRUE;
5687 k32 = g_module_open ("kernel32", G_MODULE_BIND_LAZY);
5689 gchar *error = g_strdup (g_module_error ());
5690 g_warning ("Failed to load kernel32.dll: %s\n", error);
5695 g_module_symbol (k32, "OutputDebugStringW", (gpointer *) &output_debug);
5696 if (!output_debug) {
5697 gchar *error = g_strdup (g_module_error ());
5698 g_warning ("Failed to load OutputDebugStringW: %s\n", error);
5704 if (output_debug == NULL)
5707 output_debug (mono_string_chars (message));
5709 g_warning ("WriteWindowsDebugString called and PLATFORM_WIN32 not defined!\n");
5713 /* Only used for value types */
5715 ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type)
5720 MONO_ARCH_SAVE_REGS;
5722 domain = mono_object_domain (type);
5723 klass = mono_class_from_mono_type (type->type);
5725 return mono_object_new (domain, klass);
5728 static MonoReflectionMethod *
5729 ves_icall_MonoMethod_get_base_definition (MonoReflectionMethod *m)
5732 MonoMethod *method = m->method;
5733 MonoMethod *result = NULL;
5735 MONO_ARCH_SAVE_REGS;
5737 if (!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) ||
5738 MONO_CLASS_IS_INTERFACE (method->klass) ||
5739 method->flags & METHOD_ATTRIBUTE_NEW_SLOT)
5742 if (method->klass == NULL || (klass = method->klass->parent) == NULL)
5745 if (klass->generic_class)
5746 klass = klass->generic_class->container_class;
5748 mono_class_setup_vtable (klass);
5749 mono_class_setup_vtable (method->klass);
5750 while (result == NULL && klass != NULL && (klass->vtable_size > method->slot))
5752 mono_class_setup_vtable (klass);
5754 result = klass->vtable [method->slot];
5755 if (result == NULL) {
5757 gpointer iter = NULL;
5758 /* It is an abstract method */
5759 while ((m = mono_class_get_methods (klass, &iter))) {
5760 if (m->slot == method->slot) {
5766 klass = klass->parent;
5772 return mono_method_get_object (mono_domain_get (), result, NULL);
5776 mono_ArgIterator_Setup (MonoArgIterator *iter, char* argsp, char* start)
5778 MONO_ARCH_SAVE_REGS;
5780 iter->sig = *(MonoMethodSignature**)argsp;
5782 g_assert (iter->sig->sentinelpos <= iter->sig->param_count);
5783 g_assert (iter->sig->call_convention == MONO_CALL_VARARG);
5786 /* FIXME: it's not documented what start is exactly... */
5790 int i, align, arg_size;
5791 iter->args = argsp + sizeof (gpointer);
5792 #ifndef MONO_ARCH_REGPARMS
5793 for (i = 0; i < iter->sig->sentinelpos; ++i) {
5794 arg_size = mono_type_stack_size (iter->sig->params [i], &align);
5795 iter->args = (char*)iter->args + arg_size;
5799 iter->num_args = iter->sig->param_count - iter->sig->sentinelpos;
5801 /* g_print ("sig %p, param_count: %d, sent: %d\n", iter->sig, iter->sig->param_count, iter->sig->sentinelpos); */
5805 mono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)
5807 gint i, align, arg_size;
5809 MONO_ARCH_SAVE_REGS;
5811 i = iter->sig->sentinelpos + iter->next_arg;
5813 g_assert (i < iter->sig->param_count);
5815 res.type = iter->sig->params [i];
5816 res.klass = mono_class_from_mono_type (res.type);
5817 /* FIXME: endianess issue... */
5818 res.value = iter->args;
5819 arg_size = mono_type_stack_size (res.type, &align);
5820 iter->args = (char*)iter->args + arg_size;
5823 /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
5829 mono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type)
5831 gint i, align, arg_size;
5833 MONO_ARCH_SAVE_REGS;
5835 i = iter->sig->sentinelpos + iter->next_arg;
5837 g_assert (i < iter->sig->param_count);
5839 while (i < iter->sig->param_count) {
5840 if (!mono_metadata_type_equal (type, iter->sig->params [i]))
5842 res.type = iter->sig->params [i];
5843 res.klass = mono_class_from_mono_type (res.type);
5844 /* FIXME: endianess issue... */
5845 res.value = iter->args;
5846 arg_size = mono_type_stack_size (res.type, &align);
5847 iter->args = (char*)iter->args + arg_size;
5849 /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
5852 /* g_print ("arg type 0x%02x not found\n", res.type->type); */
5861 mono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter)
5864 MONO_ARCH_SAVE_REGS;
5866 i = iter->sig->sentinelpos + iter->next_arg;
5868 g_assert (i < iter->sig->param_count);
5870 return iter->sig->params [i];
5874 mono_TypedReference_ToObject (MonoTypedRef tref)
5876 MONO_ARCH_SAVE_REGS;
5878 if (MONO_TYPE_IS_REFERENCE (tref.type)) {
5879 MonoObject** objp = tref.value;
5883 return mono_value_box (mono_domain_get (), tref.klass, tref.value);
5887 mono_TypedReference_ToObjectInternal (MonoType *type, gpointer value, MonoClass *klass)
5889 MONO_ARCH_SAVE_REGS;
5891 if (MONO_TYPE_IS_REFERENCE (type)) {
5892 MonoObject** objp = value;
5896 return mono_value_box (mono_domain_get (), klass, value);
5900 prelink_method (MonoMethod *method)
5902 const char *exc_class, *exc_arg;
5903 if (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
5905 mono_lookup_pinvoke_call (method, &exc_class, &exc_arg);
5907 mono_raise_exception(
5908 mono_exception_from_name_msg (mono_defaults.corlib, "System", exc_class, exc_arg ) );
5910 /* create the wrapper, too? */
5914 ves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method)
5916 MONO_ARCH_SAVE_REGS;
5917 prelink_method (method->method);
5921 ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType *type)
5923 MonoClass *klass = mono_class_from_mono_type (type->type);
5925 gpointer iter = NULL;
5926 MONO_ARCH_SAVE_REGS;
5928 while ((m = mono_class_get_methods (klass, &iter)))
5932 /* These parameters are "readonly" in corlib/System/Char.cs */
5934 ves_icall_System_Char_GetDataTablePointers (guint8 const **category_data,
5935 guint8 const **numeric_data,
5936 gdouble const **numeric_data_values,
5937 guint16 const **to_lower_data_low,
5938 guint16 const **to_lower_data_high,
5939 guint16 const **to_upper_data_low,
5940 guint16 const **to_upper_data_high)
5942 *category_data = CategoryData;
5943 *numeric_data = NumericData;
5944 *numeric_data_values = NumericDataValues;
5945 *to_lower_data_low = ToLowerDataLow;
5946 *to_lower_data_high = ToLowerDataHigh;
5947 *to_upper_data_low = ToUpperDataLow;
5948 *to_upper_data_high = ToUpperDataHigh;
5952 ves_icall_MonoDebugger_check_runtime_version (MonoString *fname)
5954 gchar *filename, *error = NULL;
5956 MONO_ARCH_SAVE_REGS;
5958 filename = mono_string_to_utf8 (fname);
5959 error = mono_debugger_check_runtime_version (filename);
5963 return mono_string_new (mono_domain_get (), error);
5969 ves_icall_MonoDebugger_GetMethodIndex (MonoReflectionMethod *rmethod)
5973 MONO_ARCH_SAVE_REGS;
5975 index = mono_method_get_index (rmethod->method);
5979 return index - rmethod->method->klass->method.first;
5982 static MonoReflectionType*
5983 ves_icall_MonoDebugger_MakeArrayType (MonoReflectionType *type, int rank)
5985 MonoClass *klass, *aklass;
5987 MONO_ARCH_SAVE_REGS;
5989 klass = mono_class_from_mono_type (type->type);
5990 aklass = mono_array_class_get (klass, rank);
5992 return mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);
5996 ves_icall_MonoDebugger_GetTypeToken (MonoObject *obj)
5998 MONO_ARCH_SAVE_REGS;
6000 return mono_reflection_get_token (obj);
6004 custom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type)
6006 MonoCustomAttrInfo *cinfo;
6009 cinfo = mono_reflection_get_custom_attrs_info (obj);
6012 found = mono_custom_attrs_has_attr (cinfo, mono_class_from_mono_type (attr_type->type));
6014 mono_custom_attrs_free (cinfo);
6019 GCHandle_CheckCurrentDomain (guint32 gchandle)
6021 return mono_gchandle_is_in_domain (gchandle, mono_domain_get ());
6025 ves_icall_Mono_Runtime_GetDisplayName (void)
6027 char *display_name_str = g_strdup_printf ("Mono %s", VERSION);
6028 MonoString *display_name = mono_string_new (mono_domain_get (), display_name_str);
6029 g_free (display_name_str);
6030 return display_name;
6033 static guchar dbase64 [] = {
6034 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
6035 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
6036 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63,
6037 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 0, 128, 128,
6038 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
6039 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128,
6040 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
6041 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
6045 base64_to_byte_array (gunichar2 *start, gint ilength)
6057 for (i = 0; i < ilength; i++) {
6061 } else if (c >= sizeof (dbase64)) {
6062 exc = mono_exception_from_name_msg (mono_get_corlib (),
6063 "System", "FormatException",
6064 "Invalid character found.");
6065 mono_raise_exception (exc);
6069 olength = ilength - ignored;
6070 if ((olength & 3) != 0 || olength <= 0) {
6071 exc = mono_exception_from_name_msg (mono_get_corlib (), "System",
6072 "FormatException", "Invalid length.");
6073 mono_raise_exception (exc);
6076 olength = (olength * 3) / 4;
6077 if (start [ilength - 1] == '=')
6080 if (start [ilength - 2] == '=')
6083 result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength);
6084 res_ptr = mono_array_addr (result, guchar, 0);
6085 for (i = 0; i < ilength; ) {
6088 for (k = 0; k < 4 && i < ilength;) {
6094 if (((b [k] = dbase64 [c]) & 0x80) != 0) {
6095 exc = mono_exception_from_name_msg (mono_get_corlib (),
6096 "System", "FormatException",
6097 "Invalid character found.");
6098 mono_raise_exception (exc);
6103 *res_ptr++ = (b [0] << 2) | (b [1] >> 4);
6105 *res_ptr++ = (b [1] << 4) | (b [2] >> 2);
6107 *res_ptr++ = (b [2] << 6) | b [3];
6109 while (i < ilength && isspace (start [i]))
6117 InternalFromBase64String (MonoString *str)
6119 MONO_ARCH_SAVE_REGS;
6121 return base64_to_byte_array (mono_string_chars (str), mono_string_length (str));
6125 InternalFromBase64CharArray (MonoArray *input, gint offset, gint length)
6127 MONO_ARCH_SAVE_REGS;
6129 return base64_to_byte_array (mono_array_addr (input, gunichar2, offset), length);
6140 const IcallEntry *icalls;
6144 static const IcallEntry runtime_icalls [] = {
6145 {"GetDisplayName", ves_icall_Mono_Runtime_GetDisplayName}
6148 static const IcallEntry activator_icalls [] = {
6149 {"CreateInstanceInternal", ves_icall_System_Activator_CreateInstanceInternal}
6151 static const IcallEntry appdomain_icalls [] = {
6152 {"ExecuteAssembly", ves_icall_System_AppDomain_ExecuteAssembly},
6153 {"GetAssemblies", ves_icall_System_AppDomain_GetAssemblies},
6154 {"GetData", ves_icall_System_AppDomain_GetData},
6155 {"InternalGetContext", ves_icall_System_AppDomain_InternalGetContext},
6156 {"InternalGetDefaultContext", ves_icall_System_AppDomain_InternalGetDefaultContext},
6157 {"InternalGetProcessGuid", ves_icall_System_AppDomain_InternalGetProcessGuid},
6158 {"InternalIsFinalizingForUnload", ves_icall_System_AppDomain_InternalIsFinalizingForUnload},
6159 {"InternalPopDomainRef", ves_icall_System_AppDomain_InternalPopDomainRef},
6160 {"InternalPushDomainRef", ves_icall_System_AppDomain_InternalPushDomainRef},
6161 {"InternalPushDomainRefByID", ves_icall_System_AppDomain_InternalPushDomainRefByID},
6162 {"InternalSetContext", ves_icall_System_AppDomain_InternalSetContext},
6163 {"InternalSetDomain", ves_icall_System_AppDomain_InternalSetDomain},
6164 {"InternalSetDomainByID", ves_icall_System_AppDomain_InternalSetDomainByID},
6165 {"InternalUnload", ves_icall_System_AppDomain_InternalUnload},
6166 {"LoadAssembly", ves_icall_System_AppDomain_LoadAssembly},
6167 {"LoadAssemblyRaw", ves_icall_System_AppDomain_LoadAssemblyRaw},
6168 {"SetData", ves_icall_System_AppDomain_SetData},
6169 {"createDomain", ves_icall_System_AppDomain_createDomain},
6170 {"getCurDomain", ves_icall_System_AppDomain_getCurDomain},
6171 {"getFriendlyName", ves_icall_System_AppDomain_getFriendlyName},
6172 {"getRootDomain", ves_icall_System_AppDomain_getRootDomain},
6173 {"getSetup", ves_icall_System_AppDomain_getSetup}
6176 static const IcallEntry argiterator_icalls [] = {
6177 {"IntGetNextArg()", mono_ArgIterator_IntGetNextArg},
6178 {"IntGetNextArg(intptr)", mono_ArgIterator_IntGetNextArgT},
6179 {"IntGetNextArgType", mono_ArgIterator_IntGetNextArgType},
6180 {"Setup", mono_ArgIterator_Setup}
6183 static const IcallEntry array_icalls [] = {
6184 {"ClearInternal", ves_icall_System_Array_ClearInternal},
6185 {"Clone", mono_array_clone},
6186 {"CreateInstanceImpl", ves_icall_System_Array_CreateInstanceImpl},
6187 {"FastCopy", ves_icall_System_Array_FastCopy},
6188 {"GetLength", ves_icall_System_Array_GetLength},
6189 {"GetLowerBound", ves_icall_System_Array_GetLowerBound},
6190 {"GetRank", ves_icall_System_Array_GetRank},
6191 {"GetValue", ves_icall_System_Array_GetValue},
6192 {"GetValueImpl", ves_icall_System_Array_GetValueImpl},
6193 {"SetValue", ves_icall_System_Array_SetValue},
6194 {"SetValueImpl", ves_icall_System_Array_SetValueImpl}
6197 static const IcallEntry buffer_icalls [] = {
6198 {"BlockCopyInternal", ves_icall_System_Buffer_BlockCopyInternal},
6199 {"ByteLengthInternal", ves_icall_System_Buffer_ByteLengthInternal},
6200 {"GetByteInternal", ves_icall_System_Buffer_GetByteInternal},
6201 {"SetByteInternal", ves_icall_System_Buffer_SetByteInternal}
6204 static const IcallEntry char_icalls [] = {
6205 {"GetDataTablePointers", ves_icall_System_Char_GetDataTablePointers}
6208 static const IcallEntry defaultconf_icalls [] = {
6209 {"get_machine_config_path", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path}
6212 static const IcallEntry consoledriver_icalls [] = {
6213 {"InternalKeyAvailable", ves_icall_System_ConsoleDriver_InternalKeyAvailable },
6214 {"Isatty", ves_icall_System_ConsoleDriver_Isatty },
6215 {"SetBreak", ves_icall_System_ConsoleDriver_SetBreak },
6216 {"SetEcho", ves_icall_System_ConsoleDriver_SetEcho },
6217 {"TtySetup", ves_icall_System_ConsoleDriver_TtySetup }
6220 static const IcallEntry convert_icalls [] = {
6221 {"InternalFromBase64CharArray", InternalFromBase64CharArray },
6222 {"InternalFromBase64String", InternalFromBase64String }
6225 static const IcallEntry timezone_icalls [] = {
6226 {"GetTimeZoneData", ves_icall_System_CurrentTimeZone_GetTimeZoneData}
6229 static const IcallEntry datetime_icalls [] = {
6230 {"GetNow", ves_icall_System_DateTime_GetNow}
6233 #ifndef DISABLE_DECIMAL
6234 static const IcallEntry decimal_icalls [] = {
6235 {"decimal2Int64", mono_decimal2Int64},
6236 {"decimal2UInt64", mono_decimal2UInt64},
6237 {"decimal2double", mono_decimal2double},
6238 {"decimal2string", mono_decimal2string},
6239 {"decimalCompare", mono_decimalCompare},
6240 {"decimalDiv", mono_decimalDiv},
6241 {"decimalFloorAndTrunc", mono_decimalFloorAndTrunc},
6242 {"decimalIncr", mono_decimalIncr},
6243 {"decimalIntDiv", mono_decimalIntDiv},
6244 {"decimalMult", mono_decimalMult},
6245 {"decimalRound", mono_decimalRound},
6246 {"decimalSetExponent", mono_decimalSetExponent},
6247 {"double2decimal", mono_double2decimal}, /* FIXME: wrong signature. */
6248 {"string2decimal", mono_string2decimal}
6252 static const IcallEntry delegate_icalls [] = {
6253 {"CreateDelegate_internal", ves_icall_System_Delegate_CreateDelegate_internal},
6254 {"FreeTrampoline", ves_icall_System_Delegate_FreeTrampoline}
6257 static const IcallEntry tracelist_icalls [] = {
6258 {"WriteWindowsDebugString", ves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString}
6261 static const IcallEntry fileversion_icalls [] = {
6262 {"GetVersionInfo_internal(string)", ves_icall_System_Diagnostics_FileVersionInfo_GetVersionInfo_internal}
6265 static const IcallEntry process_icalls [] = {
6266 {"ExitCode_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitCode_internal},
6267 {"ExitTime_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitTime_internal},
6268 {"GetModules_internal()", ves_icall_System_Diagnostics_Process_GetModules_internal},
6269 {"GetPid_internal()", ves_icall_System_Diagnostics_Process_GetPid_internal},
6270 {"GetProcess_internal(int)", ves_icall_System_Diagnostics_Process_GetProcess_internal},
6271 {"GetProcesses_internal()", ves_icall_System_Diagnostics_Process_GetProcesses_internal},
6272 {"GetWorkingSet_internal(intptr,int&,int&)", ves_icall_System_Diagnostics_Process_GetWorkingSet_internal},
6273 {"Kill_internal", ves_icall_System_Diagnostics_Process_Kill_internal},
6274 {"ProcessName_internal(intptr)", ves_icall_System_Diagnostics_Process_ProcessName_internal},
6275 {"Process_free_internal(intptr)", ves_icall_System_Diagnostics_Process_Process_free_internal},
6276 {"SetWorkingSet_internal(intptr,int,int,bool)", ves_icall_System_Diagnostics_Process_SetWorkingSet_internal},
6277 {"StartTime_internal(intptr)", ves_icall_System_Diagnostics_Process_StartTime_internal},
6278 {"Start_internal(string,string,string,intptr,intptr,intptr,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_Start_internal},
6279 {"WaitForExit_internal(intptr,int)", ves_icall_System_Diagnostics_Process_WaitForExit_internal}
6282 static const IcallEntry double_icalls [] = {
6283 {"AssertEndianity", ves_icall_System_Double_AssertEndianity},
6284 {"ParseImpl", mono_double_ParseImpl}
6287 static const IcallEntry enum_icalls [] = {
6288 {"ToObject", ves_icall_System_Enum_ToObject},
6289 {"get_value", ves_icall_System_Enum_get_value}
6292 static const IcallEntry environment_icalls [] = {
6293 {"Exit", ves_icall_System_Environment_Exit},
6294 {"GetCommandLineArgs", mono_runtime_get_main_args},
6295 {"GetEnvironmentVariableNames", ves_icall_System_Environment_GetEnvironmentVariableNames},
6296 {"GetLogicalDrivesInternal", ves_icall_System_Environment_GetLogicalDrives },
6297 {"GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path},
6298 {"GetOSVersionString", ves_icall_System_Environment_GetOSVersionString},
6299 {"GetWindowsFolderPath", ves_icall_System_Environment_GetWindowsFolderPath},
6300 {"get_ExitCode", mono_environment_exitcode_get},
6301 {"get_HasShutdownStarted", ves_icall_System_Environment_get_HasShutdownStarted},
6302 {"get_MachineName", ves_icall_System_Environment_get_MachineName},
6303 {"get_NewLine", ves_icall_System_Environment_get_NewLine},
6304 {"get_Platform", ves_icall_System_Environment_get_Platform},
6305 {"get_TickCount", ves_icall_System_Environment_get_TickCount},
6306 {"get_UserName", ves_icall_System_Environment_get_UserName},
6307 {"internalGetEnvironmentVariable", ves_icall_System_Environment_GetEnvironmentVariable},
6308 {"internalGetGacPath", ves_icall_System_Environment_GetGacPath},
6309 {"internalGetHome", ves_icall_System_Environment_InternalGetHome},
6310 {"set_ExitCode", mono_environment_exitcode_set}
6313 static const IcallEntry cultureinfo_icalls [] = {
6314 {"construct_compareinfo(object,string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo},
6315 {"construct_datetime_format", ves_icall_System_Globalization_CultureInfo_construct_datetime_format},
6316 {"construct_internal_locale(string)", ves_icall_System_Globalization_CultureInfo_construct_internal_locale},
6317 {"construct_internal_locale_from_current_locale", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_current_locale},
6318 {"construct_internal_locale_from_lcid", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid},
6319 {"construct_internal_locale_from_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name},
6320 {"construct_internal_locale_from_specific_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specific_name},
6321 {"construct_number_format", ves_icall_System_Globalization_CultureInfo_construct_number_format},
6322 {"internal_get_cultures", ves_icall_System_Globalization_CultureInfo_internal_get_cultures},
6323 {"internal_is_lcid_neutral", ves_icall_System_Globalization_CultureInfo_internal_is_lcid_neutral}
6326 static const IcallEntry compareinfo_icalls [] = {
6327 {"assign_sortkey(object,string,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_assign_sortkey},
6328 {"construct_compareinfo(string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo},
6329 {"free_internal_collator()", ves_icall_System_Globalization_CompareInfo_free_internal_collator},
6330 {"internal_compare(string,int,int,string,int,int,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_internal_compare},
6331 {"internal_index(string,int,int,char,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index_char},
6332 {"internal_index(string,int,int,string,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index}
6335 static const IcallEntry gc_icalls [] = {
6336 {"GetTotalMemory", ves_icall_System_GC_GetTotalMemory},
6337 {"InternalCollect", ves_icall_System_GC_InternalCollect},
6338 {"KeepAlive", ves_icall_System_GC_KeepAlive},
6339 {"ReRegisterForFinalize", ves_icall_System_GC_ReRegisterForFinalize},
6340 {"SuppressFinalize", ves_icall_System_GC_SuppressFinalize},
6341 {"WaitForPendingFinalizers", ves_icall_System_GC_WaitForPendingFinalizers}
6344 static const IcallEntry famwatcher_icalls [] = {
6345 {"InternalFAMNextEvent", ves_icall_System_IO_FAMW_InternalFAMNextEvent}
6348 static const IcallEntry filewatcher_icalls [] = {
6349 {"InternalCloseDirectory", ves_icall_System_IO_FSW_CloseDirectory},
6350 {"InternalOpenDirectory", ves_icall_System_IO_FSW_OpenDirectory},
6351 {"InternalReadDirectoryChanges", ves_icall_System_IO_FSW_ReadDirectoryChanges},
6352 {"InternalSupportsFSW", ves_icall_System_IO_FSW_SupportsFSW}
6355 static const IcallEntry path_icalls [] = {
6356 {"get_temp_path", ves_icall_System_IO_get_temp_path}
6359 static const IcallEntry monoio_icalls [] = {
6360 {"Close(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Close},
6361 {"CopyFile(string,string,bool,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_CopyFile},
6362 {"CreateDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_CreateDirectory},
6363 {"CreatePipe(intptr&,intptr&)", ves_icall_System_IO_MonoIO_CreatePipe},
6364 {"DeleteFile(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_DeleteFile},
6365 {"FindClose(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_FindClose},
6366 {"FindFirstFile(string,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_FindFirstFile},
6367 {"FindNextFile(intptr,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_FindNextFile},
6368 {"Flush(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Flush},
6369 {"GetCurrentDirectory(System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetCurrentDirectory},
6370 {"GetFileAttributes(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileAttributes},
6371 {"GetFileStat(string,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileStat},
6372 {"GetFileType(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileType},
6373 {"GetLength(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetLength},
6374 {"GetTempPath(string&)", ves_icall_System_IO_MonoIO_GetTempPath},
6375 {"Lock(intptr,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Lock},
6376 {"MoveFile(string,string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_MoveFile},
6377 {"Open(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,bool,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Open},
6378 {"Read(intptr,byte[],int,int,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Read},
6379 {"RemoveDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_RemoveDirectory},
6380 {"Seek(intptr,long,System.IO.SeekOrigin,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Seek},
6381 {"SetCurrentDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetCurrentDirectory},
6382 {"SetFileAttributes(string,System.IO.FileAttributes,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetFileAttributes},
6383 {"SetFileTime(intptr,long,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetFileTime},
6384 {"SetLength(intptr,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetLength},
6385 {"Unlock(intptr,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Unlock},
6386 {"Write(intptr,byte[],int,int,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Write},
6387 {"get_AltDirectorySeparatorChar", ves_icall_System_IO_MonoIO_get_AltDirectorySeparatorChar},
6388 {"get_ConsoleError", ves_icall_System_IO_MonoIO_get_ConsoleError},
6389 {"get_ConsoleInput", ves_icall_System_IO_MonoIO_get_ConsoleInput},
6390 {"get_ConsoleOutput", ves_icall_System_IO_MonoIO_get_ConsoleOutput},
6391 {"get_DirectorySeparatorChar", ves_icall_System_IO_MonoIO_get_DirectorySeparatorChar},
6392 {"get_InvalidPathChars", ves_icall_System_IO_MonoIO_get_InvalidPathChars},
6393 {"get_PathSeparator", ves_icall_System_IO_MonoIO_get_PathSeparator},
6394 {"get_VolumeSeparatorChar", ves_icall_System_IO_MonoIO_get_VolumeSeparatorChar}
6397 static const IcallEntry math_icalls [] = {
6398 {"Acos", ves_icall_System_Math_Acos},
6399 {"Asin", ves_icall_System_Math_Asin},
6400 {"Atan", ves_icall_System_Math_Atan},
6401 {"Atan2", ves_icall_System_Math_Atan2},
6402 {"Cos", ves_icall_System_Math_Cos},
6403 {"Cosh", ves_icall_System_Math_Cosh},
6404 {"Exp", ves_icall_System_Math_Exp},
6405 {"Floor", ves_icall_System_Math_Floor},
6406 {"Log", ves_icall_System_Math_Log},
6407 {"Log10", ves_icall_System_Math_Log10},
6408 {"Pow", ves_icall_System_Math_Pow},
6409 {"Round", ves_icall_System_Math_Round},
6410 {"Round2", ves_icall_System_Math_Round2},
6411 {"Sin", ves_icall_System_Math_Sin},
6412 {"Sinh", ves_icall_System_Math_Sinh},
6413 {"Sqrt", ves_icall_System_Math_Sqrt},
6414 {"Tan", ves_icall_System_Math_Tan},
6415 {"Tanh", ves_icall_System_Math_Tanh}
6418 static const IcallEntry customattrs_icalls [] = {
6419 {"GetCustomAttributesDataInternal", mono_reflection_get_custom_attrs_data},
6420 {"GetCustomAttributesInternal", mono_reflection_get_custom_attrs},
6421 {"IsDefinedInternal", custom_attrs_defined_internal}
6424 static const IcallEntry enuminfo_icalls [] = {
6425 {"get_enum_info", ves_icall_get_enum_info}
6428 static const IcallEntry fieldinfo_icalls [] = {
6429 {"GetUnmanagedMarshal", ves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal},
6430 {"internal_from_handle", ves_icall_System_Reflection_FieldInfo_internal_from_handle}
6433 static const IcallEntry memberinfo_icalls [] = {
6434 {"get_MetadataToken", mono_reflection_get_token}
6437 static const IcallEntry monotype_icalls [] = {
6438 {"GetArrayRank", ves_icall_MonoType_GetArrayRank},
6439 {"GetConstructors", ves_icall_Type_GetConstructors_internal},
6440 {"GetConstructors_internal", ves_icall_Type_GetConstructors_internal},
6441 {"GetCorrespondingInflatedConstructor", ves_icall_MonoType_GetCorrespondingInflatedMethod},
6442 {"GetCorrespondingInflatedMethod", ves_icall_MonoType_GetCorrespondingInflatedMethod},
6443 {"GetElementType", ves_icall_MonoType_GetElementType},
6444 {"GetEvents_internal", ves_icall_Type_GetEvents_internal},
6445 {"GetField", ves_icall_Type_GetField},
6446 {"GetFields_internal", ves_icall_Type_GetFields_internal},
6447 {"GetGenericArguments", ves_icall_MonoType_GetGenericArguments},
6448 {"GetInterfaces", ves_icall_Type_GetInterfaces},
6449 {"GetMethodsByName", ves_icall_Type_GetMethodsByName},
6450 {"GetNestedType", ves_icall_Type_GetNestedType},
6451 {"GetNestedTypes", ves_icall_Type_GetNestedTypes},
6452 {"GetPropertiesByName", ves_icall_Type_GetPropertiesByName},
6453 {"InternalGetEvent", ves_icall_MonoType_GetEvent},
6454 {"IsByRefImpl", ves_icall_type_isbyref},
6455 {"IsPointerImpl", ves_icall_type_ispointer},
6456 {"IsPrimitiveImpl", ves_icall_type_isprimitive},
6457 {"getFullName", ves_icall_System_MonoType_getFullName},
6458 {"get_Assembly", ves_icall_MonoType_get_Assembly},
6459 {"get_BaseType", ves_icall_get_type_parent},
6460 {"get_DeclaringMethod", ves_icall_MonoType_get_DeclaringMethod},
6461 {"get_DeclaringType", ves_icall_MonoType_get_DeclaringType},
6462 {"get_HasGenericArguments", ves_icall_MonoType_get_HasGenericArguments},
6463 {"get_IsGenericParameter", ves_icall_MonoType_get_IsGenericParameter},
6464 {"get_Module", ves_icall_MonoType_get_Module},
6465 {"get_Name", ves_icall_MonoType_get_Name},
6466 {"get_Namespace", ves_icall_MonoType_get_Namespace},
6467 {"get_UnderlyingSystemType", ves_icall_MonoType_get_UnderlyingSystemType},
6468 {"get_attributes", ves_icall_get_attributes},
6469 {"type_from_obj", mono_type_type_from_obj}
6472 static const IcallEntry assembly_icalls [] = {
6473 {"FillName", ves_icall_System_Reflection_Assembly_FillName},
6474 {"GetCallingAssembly", ves_icall_System_Reflection_Assembly_GetCallingAssembly},
6475 {"GetEntryAssembly", ves_icall_System_Reflection_Assembly_GetEntryAssembly},
6476 {"GetExecutingAssembly", ves_icall_System_Reflection_Assembly_GetExecutingAssembly},
6477 {"GetFilesInternal", ves_icall_System_Reflection_Assembly_GetFilesInternal},
6478 {"GetManifestResourceInfoInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal},
6479 {"GetManifestResourceInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInternal},
6480 {"GetManifestResourceNames", ves_icall_System_Reflection_Assembly_GetManifestResourceNames},
6481 {"GetModulesInternal", ves_icall_System_Reflection_Assembly_GetModulesInternal},
6482 {"GetNamespaces", ves_icall_System_Reflection_Assembly_GetNamespaces},
6483 {"GetReferencedAssemblies", ves_icall_System_Reflection_Assembly_GetReferencedAssemblies},
6484 {"GetTypes", ves_icall_System_Reflection_Assembly_GetTypes},
6485 {"InternalGetAssemblyName", ves_icall_System_Reflection_Assembly_InternalGetAssemblyName},
6486 {"InternalGetType", ves_icall_System_Reflection_Assembly_InternalGetType},
6487 {"InternalImageRuntimeVersion", ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion},
6488 {"LoadFrom", ves_icall_System_Reflection_Assembly_LoadFrom},
6489 {"LoadPermissions", ves_icall_System_Reflection_Assembly_LoadPermissions},
6491 * Private icalls for the Mono Debugger
6493 {"MonoDebugger_CheckRuntimeVersion", ves_icall_MonoDebugger_check_runtime_version},
6494 {"MonoDebugger_GetLocalTypeFromSignature", ves_icall_MonoDebugger_GetLocalTypeFromSignature},
6495 {"MonoDebugger_GetMethod", ves_icall_MonoDebugger_GetMethod},
6496 {"MonoDebugger_GetMethodIndex", ves_icall_MonoDebugger_GetMethodIndex},
6497 {"MonoDebugger_GetMethodToken", ves_icall_MonoDebugger_GetMethodToken},
6498 {"MonoDebugger_GetType", ves_icall_MonoDebugger_GetType},
6499 {"MonoDebugger_GetTypeToken", ves_icall_MonoDebugger_GetTypeToken},
6500 {"MonoDebugger_MakeArrayType", ves_icall_MonoDebugger_MakeArrayType},
6502 /* normal icalls again */
6503 {"get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint},
6504 {"get_ManifestModule", ves_icall_System_Reflection_Assembly_get_ManifestModule},
6505 {"get_MetadataToken", mono_reflection_get_token},
6506 {"get_ReflectionOnly", ves_icall_System_Reflection_Assembly_get_ReflectionOnly},
6507 {"get_code_base", ves_icall_System_Reflection_Assembly_get_code_base},
6508 {"get_global_assembly_cache", ves_icall_System_Reflection_Assembly_get_global_assembly_cache},
6509 {"get_location", ves_icall_System_Reflection_Assembly_get_location},
6510 {"load_with_partial_name", ves_icall_System_Reflection_Assembly_load_with_partial_name}
6513 static const IcallEntry methodbase_icalls [] = {
6514 {"GetCurrentMethod", ves_icall_GetCurrentMethod},
6515 {"GetMethodBodyInternal", ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal},
6516 {"GetMethodFromHandleInternal", ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal}
6519 static const IcallEntry module_icalls [] = {
6520 {"Close", ves_icall_System_Reflection_Module_Close},
6521 {"GetGlobalType", ves_icall_System_Reflection_Module_GetGlobalType},
6522 {"GetGuidInternal", ves_icall_System_Reflection_Module_GetGuidInternal},
6523 {"GetPEKind", ves_icall_System_Reflection_Module_GetPEKind},
6524 {"InternalGetTypes", ves_icall_System_Reflection_Module_InternalGetTypes},
6525 {"ResolveFieldToken", ves_icall_System_Reflection_Module_ResolveFieldToken},
6526 {"ResolveMemberToken", ves_icall_System_Reflection_Module_ResolveMemberToken},
6527 {"ResolveMethodToken", ves_icall_System_Reflection_Module_ResolveMethodToken},
6528 {"ResolveStringToken", ves_icall_System_Reflection_Module_ResolveStringToken},
6529 {"ResolveTypeToken", ves_icall_System_Reflection_Module_ResolveTypeToken},
6530 {"get_MetadataToken", mono_reflection_get_token}
6533 static const IcallEntry monocmethod_icalls [] = {
6534 {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
6535 {"InternalInvoke", ves_icall_InternalInvoke},
6536 {"get_Mono_IsInflatedMethod", ves_icall_MonoMethod_get_Mono_IsInflatedMethod}
6539 static const IcallEntry monoeventinfo_icalls [] = {
6540 {"get_event_info", ves_icall_get_event_info}
6543 static const IcallEntry monofield_icalls [] = {
6544 {"GetFieldOffset", ves_icall_MonoField_GetFieldOffset},
6545 {"GetParentType", ves_icall_MonoField_GetParentType},
6546 {"GetValueInternal", ves_icall_MonoField_GetValueInternal},
6547 {"Mono_GetGenericFieldDefinition", ves_icall_MonoField_Mono_GetGenericFieldDefinition},
6548 {"SetValueInternal", ves_icall_FieldInfo_SetValueInternal}
6551 static const IcallEntry monogenericclass_icalls [] = {
6552 {"GetConstructors_internal", ves_icall_MonoGenericClass_GetConstructors},
6553 {"GetCorrespondingInflatedConstructor", ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor},
6554 {"GetCorrespondingInflatedField", ves_icall_MonoGenericClass_GetCorrespondingInflatedField},
6555 {"GetCorrespondingInflatedMethod", ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod},
6556 {"GetEvents_internal", ves_icall_MonoGenericClass_GetEvents},
6557 {"GetFields_internal", ves_icall_MonoGenericClass_GetFields},
6558 {"GetInterfaces_internal", ves_icall_MonoGenericClass_GetInterfaces},
6559 {"GetMethods_internal", ves_icall_MonoGenericClass_GetMethods},
6560 {"GetParentType", ves_icall_MonoGenericClass_GetParentType},
6561 {"GetProperties_internal", ves_icall_MonoGenericClass_GetProperties},
6562 {"initialize", mono_reflection_generic_class_initialize}
6565 static const IcallEntry monogenericmethod_icalls [] = {
6566 {"get_ReflectedType", ves_icall_MonoGenericMethod_get_ReflectedType}
6569 static const IcallEntry generictypeparambuilder_icalls [] = {
6570 {"initialize", mono_reflection_initialize_generic_parameter}
6573 static const IcallEntry monomethod_icalls [] = {
6574 {"BindGenericParameters", mono_reflection_bind_generic_method_parameters},
6575 {"GetDllImportAttribute", ves_icall_MonoMethod_GetDllImportAttribute},
6576 {"GetGenericArguments", ves_icall_MonoMethod_GetGenericArguments},
6577 {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
6578 {"InternalInvoke", ves_icall_InternalInvoke},
6579 {"get_HasGenericParameters", ves_icall_MonoMethod_get_HasGenericParameters},
6580 {"get_IsGenericMethodDefinition", ves_icall_MonoMethod_get_IsGenericMethodDefinition},
6581 {"get_Mono_IsInflatedMethod", ves_icall_MonoMethod_get_Mono_IsInflatedMethod},
6582 {"get_base_definition", ves_icall_MonoMethod_get_base_definition}
6585 static const IcallEntry monomethodinfo_icalls [] = {
6586 {"get_method_info", ves_icall_get_method_info},
6587 {"get_parameter_info", ves_icall_get_parameter_info}
6590 static const IcallEntry monopropertyinfo_icalls [] = {
6591 {"get_property_info", ves_icall_get_property_info}
6594 static const IcallEntry parameterinfo_icalls [] = {
6595 {"get_MetadataToken", mono_reflection_get_token}
6598 static const IcallEntry dns_icalls [] = {
6599 {"GetHostByAddr_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByAddr_internal},
6600 {"GetHostByName_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByName_internal},
6601 {"GetHostName_internal(string&)", ves_icall_System_Net_Dns_GetHostName_internal}
6604 static const IcallEntry socket_icalls [] = {
6605 {"Accept_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Accept_internal},
6606 {"Available_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Available_internal},
6607 {"Bind_internal(intptr,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_Bind_internal},
6608 {"Blocking_internal(intptr,bool,int&)", ves_icall_System_Net_Sockets_Socket_Blocking_internal},
6609 {"Close_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Close_internal},
6610 {"Connect_internal(intptr,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_Connect_internal},
6611 {"GetSocketOption_arr_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,byte[]&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal},
6612 {"GetSocketOption_obj_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal},
6613 {"Listen_internal(intptr,int,int&)", ves_icall_System_Net_Sockets_Socket_Listen_internal},
6614 {"LocalEndPoint_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal},
6615 {"Poll_internal", ves_icall_System_Net_Sockets_Socket_Poll_internal},
6616 {"Receive_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Receive_internal},
6617 {"RecvFrom_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&,int&)", ves_icall_System_Net_Sockets_Socket_RecvFrom_internal},
6618 {"RemoteEndPoint_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal},
6619 {"Select_internal(System.Net.Sockets.Socket[]&,int,int&)", ves_icall_System_Net_Sockets_Socket_Select_internal},
6620 {"SendTo_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_SendTo_internal},
6621 {"Send_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Send_internal},
6622 {"SetSocketOption_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object,byte[],int,int&)", ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal},
6623 {"Shutdown_internal(intptr,System.Net.Sockets.SocketShutdown,int&)", ves_icall_System_Net_Sockets_Socket_Shutdown_internal},
6624 {"Socket_internal(System.Net.Sockets.AddressFamily,System.Net.Sockets.SocketType,System.Net.Sockets.ProtocolType,int&)", ves_icall_System_Net_Sockets_Socket_Socket_internal},
6625 {"WSAIoctl(intptr,int,byte[],byte[],int&)", ves_icall_System_Net_Sockets_Socket_WSAIoctl}
6628 static const IcallEntry socketex_icalls [] = {
6629 {"WSAGetLastError_internal", ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal}
6632 static const IcallEntry object_icalls [] = {
6633 {"GetType", ves_icall_System_Object_GetType},
6634 {"InternalGetHashCode", ves_icall_System_Object_GetHashCode},
6635 {"MemberwiseClone", ves_icall_System_Object_MemberwiseClone},
6636 {"obj_address", ves_icall_System_Object_obj_address}
6639 static const IcallEntry assemblybuilder_icalls[] = {
6640 {"InternalAddModule", mono_image_load_module},
6641 {"basic_init", mono_image_basic_init}
6644 static const IcallEntry customattrbuilder_icalls [] = {
6645 {"GetBlob", mono_reflection_get_custom_attrs_blob}
6648 static const IcallEntry dynamicmethod_icalls [] = {
6649 {"create_dynamic_method", mono_reflection_create_dynamic_method}
6652 static const IcallEntry methodbuilder_icalls [] = {
6653 {"BindGenericParameters", mono_reflection_bind_generic_method_parameters}
6656 static const IcallEntry modulebuilder_icalls [] = {
6657 {"WriteToFile", ves_icall_ModuleBuilder_WriteToFile},
6658 {"basic_init", mono_image_module_basic_init},
6659 {"build_metadata", ves_icall_ModuleBuilder_build_metadata},
6660 {"create_modified_type", ves_icall_ModuleBuilder_create_modified_type},
6661 {"getMethodToken", ves_icall_ModuleBuilder_getMethodToken},
6662 {"getToken", ves_icall_ModuleBuilder_getToken},
6663 {"getUSIndex", mono_image_insert_string}
6666 static const IcallEntry signaturehelper_icalls [] = {
6667 {"get_signature_field", mono_reflection_sighelper_get_signature_field},
6668 {"get_signature_local", mono_reflection_sighelper_get_signature_local}
6671 static const IcallEntry typebuilder_icalls [] = {
6672 {"create_generic_class", mono_reflection_create_generic_class},
6673 {"create_internal_class", mono_reflection_create_internal_class},
6674 {"create_runtime_class", mono_reflection_create_runtime_class},
6675 {"get_IsGenericParameter", ves_icall_TypeBuilder_get_IsGenericParameter},
6676 {"get_event_info", mono_reflection_event_builder_get_event_info},
6677 {"setup_generic_class", mono_reflection_setup_generic_class},
6678 {"setup_internal_class", mono_reflection_setup_internal_class}
6681 static const IcallEntry enumbuilder_icalls [] = {
6682 {"setup_enum_type", ves_icall_EnumBuilder_setup_enum_type}
6685 static const IcallEntry runtimehelpers_icalls [] = {
6686 {"GetObjectValue", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue},
6687 /* REMOVEME: no longer needed, just so we dont break things when not needed */
6688 {"GetOffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData},
6689 {"InitializeArray", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray},
6690 {"RunClassConstructor", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor},
6691 {"get_OffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData}
6694 static const IcallEntry gchandle_icalls [] = {
6695 {"CheckCurrentDomain", GCHandle_CheckCurrentDomain},
6696 {"FreeHandle", ves_icall_System_GCHandle_FreeHandle},
6697 {"GetAddrOfPinnedObject", ves_icall_System_GCHandle_GetAddrOfPinnedObject},
6698 {"GetTarget", ves_icall_System_GCHandle_GetTarget},
6699 {"GetTargetHandle", ves_icall_System_GCHandle_GetTargetHandle}
6702 static const IcallEntry marshal_icalls [] = {
6703 {"AllocCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_AllocCoTaskMem},
6704 {"AllocHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_AllocHGlobal},
6705 {"DestroyStructure", ves_icall_System_Runtime_InteropServices_Marshal_DestroyStructure},
6706 {"FreeCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_FreeCoTaskMem},
6707 {"FreeHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_FreeHGlobal},
6708 {"GetDelegateForFunctionPointerInternal", ves_icall_System_Runtime_InteropServices_Marshal_GetDelegateForFunctionPointerInternal},
6709 {"GetFunctionPointerForDelegateInternal", mono_delegate_to_ftnptr},
6710 {"GetLastWin32Error", ves_icall_System_Runtime_InteropServices_Marshal_GetLastWin32Error},
6711 {"OffsetOf", ves_icall_System_Runtime_InteropServices_Marshal_OffsetOf},
6712 {"Prelink", ves_icall_System_Runtime_InteropServices_Marshal_Prelink},
6713 {"PrelinkAll", ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll},
6714 {"PtrToStringAnsi(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi},
6715 {"PtrToStringAnsi(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len},
6716 {"PtrToStringAuto(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi},
6717 {"PtrToStringAuto(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len},
6718 {"PtrToStringBSTR", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringBSTR},
6719 {"PtrToStringUni(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni},
6720 {"PtrToStringUni(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni_len},
6721 {"PtrToStructure(intptr,System.Type)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure_type},
6722 {"PtrToStructure(intptr,object)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure},
6723 {"ReAllocHGlobal", mono_marshal_realloc},
6724 {"ReadByte", ves_icall_System_Runtime_InteropServices_Marshal_ReadByte},
6725 {"ReadInt16", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt16},
6726 {"ReadInt32", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt32},
6727 {"ReadInt64", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt64},
6728 {"ReadIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_ReadIntPtr},
6729 {"SizeOf", ves_icall_System_Runtime_InteropServices_Marshal_SizeOf},
6730 {"StringToHGlobalAnsi", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi},
6731 {"StringToHGlobalAuto", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi},
6732 {"StringToHGlobalUni", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalUni},
6733 {"StructureToPtr", ves_icall_System_Runtime_InteropServices_Marshal_StructureToPtr},
6734 {"UnsafeAddrOfPinnedArrayElement", ves_icall_System_Runtime_InteropServices_Marshal_UnsafeAddrOfPinnedArrayElement},
6735 {"WriteByte", ves_icall_System_Runtime_InteropServices_Marshal_WriteByte},
6736 {"WriteInt16", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt16},
6737 {"WriteInt32", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt32},
6738 {"WriteInt64", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt64},
6739 {"WriteIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_WriteIntPtr},
6740 {"copy_from_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged},
6741 {"copy_to_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_to_unmanaged}
6744 static const IcallEntry activationservices_icalls [] = {
6745 {"AllocateUninitializedClassInstance", ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance},
6746 {"EnableProxyActivation", ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation}
6749 static const IcallEntry monomethodmessage_icalls [] = {
6750 {"InitMessage", ves_icall_MonoMethodMessage_InitMessage}
6753 static const IcallEntry realproxy_icalls [] = {
6754 {"InternalGetProxyType", ves_icall_Remoting_RealProxy_InternalGetProxyType},
6755 {"InternalGetTransparentProxy", ves_icall_Remoting_RealProxy_GetTransparentProxy}
6758 static const IcallEntry remotingservices_icalls [] = {
6759 {"InternalExecute", ves_icall_InternalExecute},
6760 {"IsTransparentProxy", ves_icall_IsTransparentProxy}
6763 static const IcallEntry rng_icalls [] = {
6764 {"RngClose", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose},
6765 {"RngGetBytes", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngGetBytes},
6766 {"RngInitialize", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize},
6767 {"RngOpen", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen}
6770 static const IcallEntry methodhandle_icalls [] = {
6771 {"GetFunctionPointer", ves_icall_RuntimeMethod_GetFunctionPointer}
6774 static const IcallEntry string_icalls [] = {
6775 {".ctor(char*)", ves_icall_System_String_ctor_charp},
6776 {".ctor(char*,int,int)", ves_icall_System_String_ctor_charp_int_int},
6777 {".ctor(char,int)", ves_icall_System_String_ctor_char_int},
6778 {".ctor(char[])", ves_icall_System_String_ctor_chara},
6779 {".ctor(char[],int,int)", ves_icall_System_String_ctor_chara_int_int},
6780 {".ctor(sbyte*)", ves_icall_System_String_ctor_sbytep},
6781 {".ctor(sbyte*,int,int)", ves_icall_System_String_ctor_sbytep_int_int},
6782 {".ctor(sbyte*,int,int,System.Text.Encoding)", ves_icall_System_String_ctor_encoding},
6783 {"InternalAllocateStr", ves_icall_System_String_InternalAllocateStr},
6784 {"InternalCharCopy", ves_icall_System_String_InternalCharCopy},
6785 {"InternalCopyTo", ves_icall_System_String_InternalCopyTo},
6786 {"InternalIndexOfAny", ves_icall_System_String_InternalIndexOfAny},
6787 {"InternalInsert", ves_icall_System_String_InternalInsert},
6788 {"InternalIntern", ves_icall_System_String_InternalIntern},
6789 {"InternalIsInterned", ves_icall_System_String_InternalIsInterned},
6790 {"InternalJoin", ves_icall_System_String_InternalJoin},
6791 {"InternalLastIndexOfAny", ves_icall_System_String_InternalLastIndexOfAny},
6792 {"InternalPad", ves_icall_System_String_InternalPad},
6793 {"InternalRemove", ves_icall_System_String_InternalRemove},
6794 {"InternalReplace(char,char)", ves_icall_System_String_InternalReplace_Char},
6795 {"InternalReplace(string,string,System.Globalization.CompareInfo)", ves_icall_System_String_InternalReplace_Str_Comp},
6796 {"InternalSplit", ves_icall_System_String_InternalSplit},
6797 {"InternalStrcpy(string,int,char[])", ves_icall_System_String_InternalStrcpy_Chars},
6798 {"InternalStrcpy(string,int,char[],int,int)", ves_icall_System_String_InternalStrcpy_CharsN},
6799 {"InternalStrcpy(string,int,string)", ves_icall_System_String_InternalStrcpy_Str},
6800 {"InternalStrcpy(string,int,string,int,int)", ves_icall_System_String_InternalStrcpy_StrN},
6801 {"InternalTrim", ves_icall_System_String_InternalTrim},
6802 {"get_Chars", ves_icall_System_String_get_Chars}
6805 static const IcallEntry encoding_icalls [] = {
6806 {"InternalCodePage", ves_icall_System_Text_Encoding_InternalCodePage}
6809 static const IcallEntry monitor_icalls [] = {
6810 {"Monitor_exit", ves_icall_System_Threading_Monitor_Monitor_exit},
6811 {"Monitor_pulse", ves_icall_System_Threading_Monitor_Monitor_pulse},
6812 {"Monitor_pulse_all", ves_icall_System_Threading_Monitor_Monitor_pulse_all},
6813 {"Monitor_test_owner", ves_icall_System_Threading_Monitor_Monitor_test_owner},
6814 {"Monitor_test_synchronised", ves_icall_System_Threading_Monitor_Monitor_test_synchronised},
6815 {"Monitor_try_enter", ves_icall_System_Threading_Monitor_Monitor_try_enter},
6816 {"Monitor_wait", ves_icall_System_Threading_Monitor_Monitor_wait}
6819 static const IcallEntry interlocked_icalls [] = {
6820 {"Add(int&,int)", ves_icall_System_Threading_Interlocked_Add_Int},
6821 {"Add(long&,long)", ves_icall_System_Threading_Interlocked_Add_Long},
6822 {"CompareExchange(double&,double,double)", ves_icall_System_Threading_Interlocked_CompareExchange_Double},
6823 {"CompareExchange(int&,int,int)", ves_icall_System_Threading_Interlocked_CompareExchange_Int},
6824 {"CompareExchange(intptr&,intptr,intptr)", ves_icall_System_Threading_Interlocked_CompareExchange_Object},
6825 {"CompareExchange(long&,long,long)", ves_icall_System_Threading_Interlocked_CompareExchange_Long},
6826 {"CompareExchange(object&,object,object)", ves_icall_System_Threading_Interlocked_CompareExchange_Object},
6827 {"CompareExchange(single&,single,single)", ves_icall_System_Threading_Interlocked_CompareExchange_Single},
6828 {"Decrement(int&)", ves_icall_System_Threading_Interlocked_Decrement_Int},
6829 {"Decrement(long&)", ves_icall_System_Threading_Interlocked_Decrement_Long},
6830 {"Exchange(double&,double)", ves_icall_System_Threading_Interlocked_Exchange_Double},
6831 {"Exchange(int&,int)", ves_icall_System_Threading_Interlocked_Exchange_Int},
6832 {"Exchange(intptr&,intptr)", ves_icall_System_Threading_Interlocked_Exchange_Object},
6833 {"Exchange(long&,long)", ves_icall_System_Threading_Interlocked_Exchange_Long},
6834 {"Exchange(object&,object)", ves_icall_System_Threading_Interlocked_Exchange_Object},
6835 {"Exchange(single&,single)", ves_icall_System_Threading_Interlocked_Exchange_Single},
6836 {"Increment(int&)", ves_icall_System_Threading_Interlocked_Increment_Int},
6837 {"Increment(long&)", ves_icall_System_Threading_Interlocked_Increment_Long},
6838 {"Read(long&)", ves_icall_System_Threading_Interlocked_Read_Long}
6841 static const IcallEntry mutex_icalls [] = {
6842 {"CreateMutex_internal(bool,string,bool&)", ves_icall_System_Threading_Mutex_CreateMutex_internal},
6843 {"ReleaseMutex_internal(intptr)", ves_icall_System_Threading_Mutex_ReleaseMutex_internal}
6846 static const IcallEntry nativeevents_icalls [] = {
6847 {"CloseEvent_internal", ves_icall_System_Threading_Events_CloseEvent_internal},
6848 {"CreateEvent_internal", ves_icall_System_Threading_Events_CreateEvent_internal},
6849 {"ResetEvent_internal", ves_icall_System_Threading_Events_ResetEvent_internal},
6850 {"SetEvent_internal", ves_icall_System_Threading_Events_SetEvent_internal}
6853 static const IcallEntry thread_icalls [] = {
6854 {"Abort_internal(object)", ves_icall_System_Threading_Thread_Abort},
6855 {"ClrState", ves_icall_System_Threading_Thread_ClrState},
6856 {"CurrentThread_internal", mono_thread_current},
6857 {"GetCachedCurrentCulture", ves_icall_System_Threading_Thread_GetCachedCurrentCulture},
6858 {"GetCachedCurrentUICulture", ves_icall_System_Threading_Thread_GetCachedCurrentUICulture},
6859 {"GetDomainID", ves_icall_System_Threading_Thread_GetDomainID},
6860 {"GetName_internal", ves_icall_System_Threading_Thread_GetName_internal},
6861 {"GetSerializedCurrentCulture", ves_icall_System_Threading_Thread_GetSerializedCurrentCulture},
6862 {"GetSerializedCurrentUICulture", ves_icall_System_Threading_Thread_GetSerializedCurrentUICulture},
6863 {"GetState", ves_icall_System_Threading_Thread_GetState},
6864 {"Join_internal", ves_icall_System_Threading_Thread_Join_internal},
6865 {"ResetAbort_internal()", ves_icall_System_Threading_Thread_ResetAbort},
6866 {"Resume_internal()", ves_icall_System_Threading_Thread_Resume},
6867 {"SetCachedCurrentCulture", ves_icall_System_Threading_Thread_SetCachedCurrentCulture},
6868 {"SetCachedCurrentUICulture", ves_icall_System_Threading_Thread_SetCachedCurrentUICulture},
6869 {"SetName_internal", ves_icall_System_Threading_Thread_SetName_internal},
6870 {"SetSerializedCurrentCulture", ves_icall_System_Threading_Thread_SetSerializedCurrentCulture},
6871 {"SetSerializedCurrentUICulture", ves_icall_System_Threading_Thread_SetSerializedCurrentUICulture},
6872 {"SetState", ves_icall_System_Threading_Thread_SetState},
6873 {"Sleep_internal", ves_icall_System_Threading_Thread_Sleep_internal},
6874 {"Suspend_internal", ves_icall_System_Threading_Thread_Suspend},
6875 {"Thread_free_internal", ves_icall_System_Threading_Thread_Thread_free_internal},
6876 {"Thread_internal", ves_icall_System_Threading_Thread_Thread_internal},
6877 {"VolatileRead(byte&)", ves_icall_System_Threading_Thread_VolatileRead1},
6878 {"VolatileRead(double&)", ves_icall_System_Threading_Thread_VolatileRead8},
6879 {"VolatileRead(int&)", ves_icall_System_Threading_Thread_VolatileRead4},
6880 {"VolatileRead(int16&)", ves_icall_System_Threading_Thread_VolatileRead2},
6881 {"VolatileRead(intptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
6882 {"VolatileRead(long&)", ves_icall_System_Threading_Thread_VolatileRead8},
6883 {"VolatileRead(object&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
6884 {"VolatileRead(sbyte&)", ves_icall_System_Threading_Thread_VolatileRead1},
6885 {"VolatileRead(single&)", ves_icall_System_Threading_Thread_VolatileRead4},
6886 {"VolatileRead(uint&)", ves_icall_System_Threading_Thread_VolatileRead2},
6887 {"VolatileRead(uint16&)", ves_icall_System_Threading_Thread_VolatileRead2},
6888 {"VolatileRead(uintptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
6889 {"VolatileRead(ulong&)", ves_icall_System_Threading_Thread_VolatileRead8},
6890 {"VolatileWrite(byte&,byte)", ves_icall_System_Threading_Thread_VolatileWrite1},
6891 {"VolatileWrite(double&,double)", ves_icall_System_Threading_Thread_VolatileWrite8},
6892 {"VolatileWrite(int&,int)", ves_icall_System_Threading_Thread_VolatileWrite4},
6893 {"VolatileWrite(int16&,int16)", ves_icall_System_Threading_Thread_VolatileWrite2},
6894 {"VolatileWrite(intptr&,intptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
6895 {"VolatileWrite(long&,long)", ves_icall_System_Threading_Thread_VolatileWrite8},
6896 {"VolatileWrite(object&,object)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
6897 {"VolatileWrite(sbyte&,sbyte)", ves_icall_System_Threading_Thread_VolatileWrite1},
6898 {"VolatileWrite(single&,single)", ves_icall_System_Threading_Thread_VolatileWrite4},
6899 {"VolatileWrite(uint&,uint)", ves_icall_System_Threading_Thread_VolatileWrite2},
6900 {"VolatileWrite(uint16&,uint16)", ves_icall_System_Threading_Thread_VolatileWrite2},
6901 {"VolatileWrite(uintptr&,uintptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
6902 {"VolatileWrite(ulong&,ulong)", ves_icall_System_Threading_Thread_VolatileWrite8},
6903 {"current_lcid()", ves_icall_System_Threading_Thread_current_lcid}
6906 static const IcallEntry threadpool_icalls [] = {
6907 {"GetAvailableThreads", ves_icall_System_Threading_ThreadPool_GetAvailableThreads},
6908 {"GetMaxThreads", ves_icall_System_Threading_ThreadPool_GetMaxThreads},
6909 {"GetMinThreads", ves_icall_System_Threading_ThreadPool_GetMinThreads},
6910 {"SetMinThreads", ves_icall_System_Threading_ThreadPool_SetMinThreads}
6913 static const IcallEntry waithandle_icalls [] = {
6914 {"WaitAll_internal", ves_icall_System_Threading_WaitHandle_WaitAll_internal},
6915 {"WaitAny_internal", ves_icall_System_Threading_WaitHandle_WaitAny_internal},
6916 {"WaitOne_internal", ves_icall_System_Threading_WaitHandle_WaitOne_internal}
6919 static const IcallEntry type_icalls [] = {
6920 {"BindGenericParameters", ves_icall_Type_BindGenericParameters},
6921 {"Equals", ves_icall_type_Equals},
6922 {"GetGenericParameterAttributes", ves_icall_Type_GetGenericParameterAttributes},
6923 {"GetGenericParameterConstraints_impl", ves_icall_Type_GetGenericParameterConstraints},
6924 {"GetGenericParameterPosition", ves_icall_Type_GetGenericParameterPosition},
6925 {"GetGenericTypeDefinition_impl", ves_icall_Type_GetGenericTypeDefinition_impl},
6926 {"GetInterfaceMapData", ves_icall_Type_GetInterfaceMapData},
6927 {"GetPacking", ves_icall_Type_GetPacking},
6928 {"GetTypeCode", ves_icall_type_GetTypeCodeInternal},
6929 {"GetTypeCodeInternal", ves_icall_type_GetTypeCodeInternal},
6930 {"IsArrayImpl", ves_icall_Type_IsArrayImpl},
6931 {"IsInstanceOfType", ves_icall_type_IsInstanceOfType},
6932 {"MakePointerType", ves_icall_Type_MakePointerType},
6933 {"get_IsGenericInstance", ves_icall_Type_get_IsGenericInstance},
6934 {"get_IsGenericTypeDefinition", ves_icall_Type_get_IsGenericTypeDefinition},
6935 {"internal_from_handle", ves_icall_type_from_handle},
6936 {"internal_from_name", ves_icall_type_from_name},
6937 {"make_array_type", ves_icall_Type_make_array_type},
6938 {"make_byref_type", ves_icall_Type_make_byref_type},
6939 {"type_is_assignable_from", ves_icall_type_is_assignable_from},
6940 {"type_is_subtype_of", ves_icall_type_is_subtype_of}
6943 static const IcallEntry typedref_icalls [] = {
6944 {"ToObject", mono_TypedReference_ToObject},
6945 {"ToObjectInternal", mono_TypedReference_ToObjectInternal}
6948 static const IcallEntry valuetype_icalls [] = {
6949 {"InternalEquals", ves_icall_System_ValueType_Equals},
6950 {"InternalGetHashCode", ves_icall_System_ValueType_InternalGetHashCode}
6953 static const IcallEntry web_icalls [] = {
6954 {"GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path},
6955 {"GetMachineInstallDirectory", ves_icall_System_Web_Util_ICalls_get_machine_install_dir}
6958 static const IcallEntry identity_icalls [] = {
6959 {"GetCurrentToken", ves_icall_System_Security_Principal_WindowsIdentity_GetCurrentToken},
6960 {"GetTokenName", ves_icall_System_Security_Principal_WindowsIdentity_GetTokenName},
6961 {"GetUserToken", ves_icall_System_Security_Principal_WindowsIdentity_GetUserToken},
6962 {"_GetRoles", ves_icall_System_Security_Principal_WindowsIdentity_GetRoles}
6965 static const IcallEntry impersonation_icalls [] = {
6966 {"CloseToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_CloseToken},
6967 {"DuplicateToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_DuplicateToken},
6968 {"RevertToSelf", ves_icall_System_Security_Principal_WindowsImpersonationContext_RevertToSelf},
6969 {"SetCurrentToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_SetCurrentToken}
6972 static const IcallEntry principal_icalls [] = {
6973 {"IsMemberOfGroupId", ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupId},
6974 {"IsMemberOfGroupName", ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupName}
6977 static const IcallEntry keypair_icalls [] = {
6978 {"_CanSecure", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_CanSecure},
6979 {"_IsMachineProtected", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsMachineProtected},
6980 {"_IsUserProtected", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsUserProtected},
6981 {"_ProtectMachine", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectMachine},
6982 {"_ProtectUser", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectUser}
6985 static const IcallEntry evidence_icalls [] = {
6986 {"IsAuthenticodePresent", ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent}
6989 static const IcallEntry securitymanager_icalls [] = {
6990 {"GetLinkDemandSecurity", ves_icall_System_Security_SecurityManager_GetLinkDemandSecurity},
6991 {"get_CheckExecutionRights", ves_icall_System_Security_SecurityManager_get_CheckExecutionRights},
6992 {"get_SecurityEnabled", ves_icall_System_Security_SecurityManager_get_SecurityEnabled},
6993 {"set_CheckExecutionRights", ves_icall_System_Security_SecurityManager_set_CheckExecutionRights},
6994 {"set_SecurityEnabled", ves_icall_System_Security_SecurityManager_set_SecurityEnabled}
6997 static const IcallEntry generic_array_icalls [] = {
6998 {"GetGenericValueImpl", ves_icall_System_Array_InternalArray_GetGenericValueImpl}
7002 static const IcallEntry array_icalls [] = {
7007 /* keep the entries all sorted */
7008 static const IcallMap icall_entries [] = {
7009 {"Mono.Runtime", runtime_icalls, G_N_ELEMENTS (runtime_icalls)},
7010 {"Mono.Security.Cryptography.KeyPairPersistence", keypair_icalls, G_N_ELEMENTS (keypair_icalls)},
7011 {"System.Activator", activator_icalls, G_N_ELEMENTS (activator_icalls)},
7012 {"System.AppDomain", appdomain_icalls, G_N_ELEMENTS (appdomain_icalls)},
7013 {"System.ArgIterator", argiterator_icalls, G_N_ELEMENTS (argiterator_icalls)},
7014 {"System.Array", array_icalls, G_N_ELEMENTS (array_icalls)},
7015 {"System.Array/InternalArray`1", generic_array_icalls, G_N_ELEMENTS (generic_array_icalls)},
7016 {"System.Buffer", buffer_icalls, G_N_ELEMENTS (buffer_icalls)},
7017 {"System.Char", char_icalls, G_N_ELEMENTS (char_icalls)},
7018 {"System.Configuration.DefaultConfig", defaultconf_icalls, G_N_ELEMENTS (defaultconf_icalls)},
7019 {"System.ConsoleDriver", consoledriver_icalls, G_N_ELEMENTS (consoledriver_icalls)},
7020 {"System.Convert", convert_icalls, G_N_ELEMENTS (convert_icalls)},
7021 {"System.CurrentTimeZone", timezone_icalls, G_N_ELEMENTS (timezone_icalls)},
7022 {"System.DateTime", datetime_icalls, G_N_ELEMENTS (datetime_icalls)},
7023 #ifndef DISABLE_DECIMAL
7024 {"System.Decimal", decimal_icalls, G_N_ELEMENTS (decimal_icalls)},
7026 {"System.Delegate", delegate_icalls, G_N_ELEMENTS (delegate_icalls)},
7027 {"System.Diagnostics.DefaultTraceListener", tracelist_icalls, G_N_ELEMENTS (tracelist_icalls)},
7028 {"System.Diagnostics.FileVersionInfo", fileversion_icalls, G_N_ELEMENTS (fileversion_icalls)},
7029 {"System.Diagnostics.Process", process_icalls, G_N_ELEMENTS (process_icalls)},
7030 {"System.Double", double_icalls, G_N_ELEMENTS (double_icalls)},
7031 {"System.Enum", enum_icalls, G_N_ELEMENTS (enum_icalls)},
7032 {"System.Environment", environment_icalls, G_N_ELEMENTS (environment_icalls)},
7033 {"System.GC", gc_icalls, G_N_ELEMENTS (gc_icalls)},
7034 {"System.Globalization.CompareInfo", compareinfo_icalls, G_N_ELEMENTS (compareinfo_icalls)},
7035 {"System.Globalization.CultureInfo", cultureinfo_icalls, G_N_ELEMENTS (cultureinfo_icalls)},
7036 {"System.IO.FAMWatcher", famwatcher_icalls, G_N_ELEMENTS (famwatcher_icalls)},
7037 {"System.IO.FileSystemWatcher", filewatcher_icalls, G_N_ELEMENTS (filewatcher_icalls)},
7038 {"System.IO.MonoIO", monoio_icalls, G_N_ELEMENTS (monoio_icalls)},
7039 {"System.IO.Path", path_icalls, G_N_ELEMENTS (path_icalls)},
7040 {"System.Math", math_icalls, G_N_ELEMENTS (math_icalls)},
7041 {"System.MonoCustomAttrs", customattrs_icalls, G_N_ELEMENTS (customattrs_icalls)},
7042 {"System.MonoEnumInfo", enuminfo_icalls, G_N_ELEMENTS (enuminfo_icalls)},
7043 {"System.MonoType", monotype_icalls, G_N_ELEMENTS (monotype_icalls)},
7044 {"System.Net.Dns", dns_icalls, G_N_ELEMENTS (dns_icalls)},
7045 {"System.Net.Sockets.Socket", socket_icalls, G_N_ELEMENTS (socket_icalls)},
7046 {"System.Net.Sockets.SocketException", socketex_icalls, G_N_ELEMENTS (socketex_icalls)},
7047 {"System.Object", object_icalls, G_N_ELEMENTS (object_icalls)},
7048 {"System.Reflection.Assembly", assembly_icalls, G_N_ELEMENTS (assembly_icalls)},
7049 {"System.Reflection.Emit.AssemblyBuilder", assemblybuilder_icalls, G_N_ELEMENTS (assemblybuilder_icalls)},
7050 {"System.Reflection.Emit.CustomAttributeBuilder", customattrbuilder_icalls, G_N_ELEMENTS (customattrbuilder_icalls)},
7051 {"System.Reflection.Emit.DynamicMethod", dynamicmethod_icalls, G_N_ELEMENTS (dynamicmethod_icalls)},
7052 {"System.Reflection.Emit.EnumBuilder", enumbuilder_icalls, G_N_ELEMENTS (enumbuilder_icalls)},
7053 {"System.Reflection.Emit.GenericTypeParameterBuilder", generictypeparambuilder_icalls, G_N_ELEMENTS (generictypeparambuilder_icalls)},
7054 {"System.Reflection.Emit.MethodBuilder", methodbuilder_icalls, G_N_ELEMENTS (methodbuilder_icalls)},
7055 {"System.Reflection.Emit.ModuleBuilder", modulebuilder_icalls, G_N_ELEMENTS (modulebuilder_icalls)},
7056 {"System.Reflection.Emit.SignatureHelper", signaturehelper_icalls, G_N_ELEMENTS (signaturehelper_icalls)},
7057 {"System.Reflection.Emit.TypeBuilder", typebuilder_icalls, G_N_ELEMENTS (typebuilder_icalls)},
7058 {"System.Reflection.FieldInfo", fieldinfo_icalls, G_N_ELEMENTS (fieldinfo_icalls)},
7059 {"System.Reflection.MemberInfo", memberinfo_icalls, G_N_ELEMENTS (memberinfo_icalls)},
7060 {"System.Reflection.MethodBase", methodbase_icalls, G_N_ELEMENTS (methodbase_icalls)},
7061 {"System.Reflection.Module", module_icalls, G_N_ELEMENTS (module_icalls)},
7062 {"System.Reflection.MonoCMethod", monocmethod_icalls, G_N_ELEMENTS (monocmethod_icalls)},
7063 {"System.Reflection.MonoEventInfo", monoeventinfo_icalls, G_N_ELEMENTS (monoeventinfo_icalls)},
7064 {"System.Reflection.MonoField", monofield_icalls, G_N_ELEMENTS (monofield_icalls)},
7065 {"System.Reflection.MonoGenericCMethod", monogenericmethod_icalls, G_N_ELEMENTS (monogenericmethod_icalls)},
7066 {"System.Reflection.MonoGenericClass", monogenericclass_icalls, G_N_ELEMENTS (monogenericclass_icalls)},
7067 {"System.Reflection.MonoGenericMethod", monogenericmethod_icalls, G_N_ELEMENTS (monogenericmethod_icalls)},
7068 {"System.Reflection.MonoMethod", monomethod_icalls, G_N_ELEMENTS (monomethod_icalls)},
7069 {"System.Reflection.MonoMethodInfo", monomethodinfo_icalls, G_N_ELEMENTS (monomethodinfo_icalls)},
7070 {"System.Reflection.MonoPropertyInfo", monopropertyinfo_icalls, G_N_ELEMENTS (monopropertyinfo_icalls)},
7071 {"System.Reflection.ParameterInfo", parameterinfo_icalls, G_N_ELEMENTS (parameterinfo_icalls)},
7072 {"System.Runtime.CompilerServices.RuntimeHelpers", runtimehelpers_icalls, G_N_ELEMENTS (runtimehelpers_icalls)},
7073 {"System.Runtime.InteropServices.GCHandle", gchandle_icalls, G_N_ELEMENTS (gchandle_icalls)},
7074 {"System.Runtime.InteropServices.Marshal", marshal_icalls, G_N_ELEMENTS (marshal_icalls)},
7075 {"System.Runtime.Remoting.Activation.ActivationServices", activationservices_icalls, G_N_ELEMENTS (activationservices_icalls)},
7076 {"System.Runtime.Remoting.Messaging.MonoMethodMessage", monomethodmessage_icalls, G_N_ELEMENTS (monomethodmessage_icalls)},
7077 {"System.Runtime.Remoting.Proxies.RealProxy", realproxy_icalls, G_N_ELEMENTS (realproxy_icalls)},
7078 {"System.Runtime.Remoting.RemotingServices", remotingservices_icalls, G_N_ELEMENTS (remotingservices_icalls)},
7079 {"System.RuntimeMethodHandle", methodhandle_icalls, G_N_ELEMENTS (methodhandle_icalls)},
7080 {"System.Security.Cryptography.RNGCryptoServiceProvider", rng_icalls, G_N_ELEMENTS (rng_icalls)},
7081 {"System.Security.Policy.Evidence", evidence_icalls, G_N_ELEMENTS (evidence_icalls)},
7082 {"System.Security.Principal.WindowsIdentity", identity_icalls, G_N_ELEMENTS (identity_icalls)},
7083 {"System.Security.Principal.WindowsImpersonationContext", impersonation_icalls, G_N_ELEMENTS (impersonation_icalls)},
7084 {"System.Security.Principal.WindowsPrincipal", principal_icalls, G_N_ELEMENTS (principal_icalls)},
7085 {"System.Security.SecurityManager", securitymanager_icalls, G_N_ELEMENTS (securitymanager_icalls)},
7086 {"System.String", string_icalls, G_N_ELEMENTS (string_icalls)},
7087 {"System.Text.Encoding", encoding_icalls, G_N_ELEMENTS (encoding_icalls)},
7088 {"System.Threading.Interlocked", interlocked_icalls, G_N_ELEMENTS (interlocked_icalls)},
7089 {"System.Threading.Monitor", monitor_icalls, G_N_ELEMENTS (monitor_icalls)},
7090 {"System.Threading.Mutex", mutex_icalls, G_N_ELEMENTS (mutex_icalls)},
7091 {"System.Threading.NativeEventCalls", nativeevents_icalls, G_N_ELEMENTS (nativeevents_icalls)},
7092 {"System.Threading.Thread", thread_icalls, G_N_ELEMENTS (thread_icalls)},
7093 {"System.Threading.ThreadPool", threadpool_icalls, G_N_ELEMENTS (threadpool_icalls)},
7094 {"System.Threading.WaitHandle", waithandle_icalls, G_N_ELEMENTS (waithandle_icalls)},
7095 {"System.Type", type_icalls, G_N_ELEMENTS (type_icalls)},
7096 {"System.TypedReference", typedref_icalls, G_N_ELEMENTS (typedref_icalls)},
7097 {"System.ValueType", valuetype_icalls, G_N_ELEMENTS (valuetype_icalls)},
7098 {"System.Web.Util.ICalls", web_icalls, G_N_ELEMENTS (web_icalls)}
7101 static GHashTable *icall_hash = NULL;
7102 static GHashTable *jit_icall_hash_name = NULL;
7103 static GHashTable *jit_icall_hash_addr = NULL;
7106 mono_icall_init (void)
7110 /* check that tables are sorted: disable in release */
7113 const IcallMap *imap;
7114 const IcallEntry *ientry;
7115 const char *prev_class = NULL;
7116 const char *prev_method;
7118 for (i = 0; i < G_N_ELEMENTS (icall_entries); ++i) {
7119 imap = &icall_entries [i];
7121 if (prev_class && strcmp (prev_class, imap->klass) >= 0)
7122 g_print ("class %s should come before class %s\n", imap->klass, prev_class);
7123 prev_class = imap->klass;
7124 for (j = 0; j < imap->size; ++j) {
7125 ientry = &imap->icalls [j];
7126 if (prev_method && strcmp (prev_method, ientry->method) >= 0)
7127 g_print ("method %s should come before method %s\n", ientry->method, prev_method);
7128 prev_method = ientry->method;
7133 icall_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
7137 mono_icall_cleanup (void)
7139 g_hash_table_destroy (icall_hash);
7140 g_hash_table_destroy (jit_icall_hash_name);
7141 g_hash_table_destroy (jit_icall_hash_addr);
7145 mono_add_internal_call (const char *name, gconstpointer method)
7147 mono_loader_lock ();
7149 g_hash_table_insert (icall_hash, g_strdup (name), (gpointer) method);
7151 mono_loader_unlock ();
7155 compare_class_imap (const void *key, const void *elem)
7157 const IcallMap* imap = (const IcallMap*)elem;
7158 return strcmp (key, imap->klass);
7161 static const IcallMap*
7162 find_class_icalls (const char *name)
7164 return (const IcallMap*) bsearch (name, icall_entries, G_N_ELEMENTS (icall_entries), sizeof (IcallMap), compare_class_imap);
7168 compare_method_imap (const void *key, const void *elem)
7170 const IcallEntry* ientry = (const IcallEntry*)elem;
7171 return strcmp (key, ientry->method);
7175 find_method_icall (const IcallMap *imap, const char *name)
7177 const IcallEntry *ientry = (const IcallEntry*) bsearch (name, imap->icalls, imap->size, sizeof (IcallEntry), compare_method_imap);
7179 return (void*)ientry->func;
7184 * we should probably export this as an helper (handle nested types).
7185 * Returns the number of chars written in buf.
7188 concat_class_name (char *buf, int bufsize, MonoClass *klass)
7190 int nspacelen, cnamelen;
7191 nspacelen = strlen (klass->name_space);
7192 cnamelen = strlen (klass->name);
7193 if (nspacelen + cnamelen + 2 > bufsize)
7196 memcpy (buf, klass->name_space, nspacelen);
7197 buf [nspacelen ++] = '.';
7199 memcpy (buf + nspacelen, klass->name, cnamelen);
7200 buf [nspacelen + cnamelen] = 0;
7201 return nspacelen + cnamelen;
7205 mono_lookup_internal_call (MonoMethod *method)
7210 int typelen = 0, mlen, siglen;
7212 const IcallMap *imap;
7214 g_assert (method != NULL);
7216 if (method->klass->nested_in) {
7217 int pos = concat_class_name (mname, sizeof (mname)-2, method->klass->nested_in);
7221 mname [pos++] = '/';
7224 typelen = concat_class_name (mname+pos, sizeof (mname)-pos-1, method->klass);
7230 typelen = concat_class_name (mname, sizeof (mname), method->klass);
7235 imap = find_class_icalls (mname);
7237 mname [typelen] = ':';
7238 mname [typelen + 1] = ':';
7240 mlen = strlen (method->name);
7241 memcpy (mname + typelen + 2, method->name, mlen);
7242 sigstart = mname + typelen + 2 + mlen;
7245 tmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE);
7246 siglen = strlen (tmpsig);
7247 if (typelen + mlen + siglen + 6 > sizeof (mname))
7250 memcpy (sigstart + 1, tmpsig, siglen);
7251 sigstart [siglen + 1] = ')';
7252 sigstart [siglen + 2] = 0;
7255 mono_loader_lock ();
7257 res = g_hash_table_lookup (icall_hash, mname);
7259 mono_loader_unlock ();
7262 /* try without signature */
7264 res = g_hash_table_lookup (icall_hash, mname);
7266 mono_loader_unlock ();
7270 /* it wasn't found in the static call tables */
7272 mono_loader_unlock ();
7275 res = find_method_icall (imap, sigstart - mlen);
7277 mono_loader_unlock ();
7280 /* try _with_ signature */
7282 res = find_method_icall (imap, sigstart - mlen);
7284 mono_loader_unlock ();
7288 g_warning ("cant resolve internal call to \"%s\" (tested without signature also)", mname);
7289 g_print ("\nYour mono runtime and class libraries are out of sync.\n");
7290 g_print ("The out of sync library is: %s\n", method->klass->image->name);
7291 g_print ("\nWhen you update one from cvs you need to update, compile and install\nthe other too.\n");
7292 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");
7293 g_print ("If you see other errors or faults after this message they are probably related\n");
7294 g_print ("and you need to fix your mono install first.\n");
7296 mono_loader_unlock ();
7302 type_from_typename (char *typename)
7304 MonoClass *klass = NULL; /* assignment to shut GCC warning up */
7306 if (!strcmp (typename, "int"))
7307 klass = mono_defaults.int_class;
7308 else if (!strcmp (typename, "ptr"))
7309 klass = mono_defaults.int_class;
7310 else if (!strcmp (typename, "void"))
7311 klass = mono_defaults.void_class;
7312 else if (!strcmp (typename, "int32"))
7313 klass = mono_defaults.int32_class;
7314 else if (!strcmp (typename, "uint32"))
7315 klass = mono_defaults.uint32_class;
7316 else if (!strcmp (typename, "long"))
7317 klass = mono_defaults.int64_class;
7318 else if (!strcmp (typename, "ulong"))
7319 klass = mono_defaults.uint64_class;
7320 else if (!strcmp (typename, "float"))
7321 klass = mono_defaults.single_class;
7322 else if (!strcmp (typename, "double"))
7323 klass = mono_defaults.double_class;
7324 else if (!strcmp (typename, "object"))
7325 klass = mono_defaults.object_class;
7326 else if (!strcmp (typename, "obj"))
7327 klass = mono_defaults.object_class;
7330 g_assert_not_reached ();
7332 return &klass->byval_arg;
7335 MonoMethodSignature*
7336 mono_create_icall_signature (const char *sigstr)
7341 MonoMethodSignature *res;
7343 mono_loader_lock ();
7344 res = g_hash_table_lookup (mono_defaults.corlib->helper_signatures, sigstr);
7346 mono_loader_unlock ();
7350 parts = g_strsplit (sigstr, " ", 256);
7359 res = mono_metadata_signature_alloc (mono_defaults.corlib, len - 1);
7362 #ifdef PLATFORM_WIN32
7364 * Under windows, the default pinvoke calling convention is STDCALL but
7367 res->call_convention = MONO_CALL_C;
7370 res->ret = type_from_typename (parts [0]);
7371 for (i = 1; i < len; ++i) {
7372 res->params [i - 1] = type_from_typename (parts [i]);
7377 g_hash_table_insert (mono_defaults.corlib->helper_signatures, (gpointer)sigstr, res);
7379 mono_loader_unlock ();
7385 mono_find_jit_icall_by_name (const char *name)
7387 MonoJitICallInfo *info;
7388 g_assert (jit_icall_hash_name);
7390 mono_loader_lock ();
7391 info = g_hash_table_lookup (jit_icall_hash_name, name);
7392 mono_loader_unlock ();
7397 mono_find_jit_icall_by_addr (gconstpointer addr)
7399 MonoJitICallInfo *info;
7400 g_assert (jit_icall_hash_addr);
7402 mono_loader_lock ();
7403 info = g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);
7404 mono_loader_unlock ();
7410 mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)
7412 mono_loader_lock ();
7413 g_hash_table_insert (jit_icall_hash_addr, (gpointer)info->wrapper, info);
7414 mono_loader_unlock ();
7418 mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save)
7420 MonoJitICallInfo *info;
7425 mono_loader_lock ();
7427 if (!jit_icall_hash_name) {
7428 jit_icall_hash_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
7429 jit_icall_hash_addr = g_hash_table_new (NULL, NULL);
7432 if (g_hash_table_lookup (jit_icall_hash_name, name)) {
7433 g_warning ("jit icall already defined \"%s\"\n", name);
7434 g_assert_not_reached ();
7437 info = g_new (MonoJitICallInfo, 1);
7444 info->wrapper = func;
7446 info->wrapper = NULL;
7449 g_hash_table_insert (jit_icall_hash_name, (gpointer)info->name, info);
7450 g_hash_table_insert (jit_icall_hash_addr, (gpointer)func, info);
7452 mono_loader_unlock ();