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, double *result)
83 *result = strtod (ptr, &endptr);
86 *result = bsd_strtod (ptr, &endptr);
89 if (!*ptr || (endptr && *endptr))
96 ves_icall_System_Double_AssertEndianity (double *value)
100 MONO_DOUBLE_ASSERT_ENDIANITY (value);
104 ves_icall_System_Array_GetValueImpl (MonoObject *this, guint32 pos)
113 ao = (MonoArray *)this;
114 ac = (MonoClass *)ao->obj.vtable->klass;
116 esize = mono_array_element_size (ac);
117 ea = (gpointer*)((char*)ao->vector + (pos * esize));
119 if (ac->element_class->valuetype)
120 return mono_value_box (this->vtable->domain, ac->element_class, ea);
126 ves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs)
134 MONO_CHECK_ARG_NULL (idxs);
136 io = (MonoArray *)idxs;
137 ic = (MonoClass *)io->obj.vtable->klass;
139 ao = (MonoArray *)this;
140 ac = (MonoClass *)ao->obj.vtable->klass;
142 g_assert (ic->rank == 1);
143 if (io->bounds != NULL || io->max_length != ac->rank)
144 mono_raise_exception (mono_get_exception_argument (NULL, NULL));
146 ind = (gint32 *)io->vector;
148 if (ao->bounds == NULL) {
149 if (*ind < 0 || *ind >= ao->max_length)
150 mono_raise_exception (mono_get_exception_index_out_of_range ());
152 return ves_icall_System_Array_GetValueImpl (this, *ind);
155 for (i = 0; i < ac->rank; i++)
156 if ((ind [i] < ao->bounds [i].lower_bound) ||
157 (ind [i] >= ao->bounds [i].length + ao->bounds [i].lower_bound))
158 mono_raise_exception (mono_get_exception_index_out_of_range ());
160 pos = ind [0] - ao->bounds [0].lower_bound;
161 for (i = 1; i < ac->rank; i++)
162 pos = pos*ao->bounds [i].length + ind [i] -
163 ao->bounds [i].lower_bound;
165 return ves_icall_System_Array_GetValueImpl (this, pos);
169 ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 pos)
171 MonoClass *ac, *vc, *ec;
182 vc = value->vtable->klass;
186 ac = this->obj.vtable->klass;
187 ec = ac->element_class;
189 esize = mono_array_element_size (ac);
190 ea = (gpointer*)((char*)this->vector + (pos * esize));
191 va = (gpointer*)((char*)value + sizeof (MonoObject));
194 memset (ea, 0, esize);
198 #define NO_WIDENING_CONVERSION G_STMT_START{\
199 mono_raise_exception (mono_get_exception_argument ( \
200 "value", "not a widening conversion")); \
203 #define CHECK_WIDENING_CONVERSION(extra) G_STMT_START{\
204 if (esize < vsize + (extra)) \
205 mono_raise_exception (mono_get_exception_argument ( \
206 "value", "not a widening conversion")); \
209 #define INVALID_CAST G_STMT_START{\
210 mono_raise_exception (mono_get_exception_invalid_cast ()); \
213 /* Check element (destination) type. */
214 switch (ec->byval_arg.type) {
215 case MONO_TYPE_STRING:
216 switch (vc->byval_arg.type) {
217 case MONO_TYPE_STRING:
223 case MONO_TYPE_BOOLEAN:
224 switch (vc->byval_arg.type) {
225 case MONO_TYPE_BOOLEAN:
238 NO_WIDENING_CONVERSION;
245 if (!ec->valuetype) {
246 if (!mono_object_isinst (value, ec))
248 *ea = (gpointer)value;
252 if (mono_object_isinst (value, ec)) {
253 memcpy (ea, (char *)value + sizeof (MonoObject), esize);
260 vsize = mono_class_instance_size (vc) - sizeof (MonoObject);
262 #define ASSIGN_UNSIGNED(etype) G_STMT_START{\
263 switch (vc->byval_arg.type) { \
268 case MONO_TYPE_CHAR: \
269 CHECK_WIDENING_CONVERSION(0); \
270 *(etype *) ea = (etype) u64; \
272 /* You can't assign a signed value to an unsigned array. */ \
277 /* You can't assign a floating point number to an integer array. */ \
280 NO_WIDENING_CONVERSION; \
284 #define ASSIGN_SIGNED(etype) G_STMT_START{\
285 switch (vc->byval_arg.type) { \
290 CHECK_WIDENING_CONVERSION(0); \
291 *(etype *) ea = (etype) i64; \
293 /* You can assign an unsigned value to a signed array if the array's */ \
294 /* element size is larger than the value size. */ \
299 case MONO_TYPE_CHAR: \
300 CHECK_WIDENING_CONVERSION(1); \
301 *(etype *) ea = (etype) u64; \
303 /* You can't assign a floating point number to an integer array. */ \
306 NO_WIDENING_CONVERSION; \
310 #define ASSIGN_REAL(etype) G_STMT_START{\
311 switch (vc->byval_arg.type) { \
314 CHECK_WIDENING_CONVERSION(0); \
315 *(etype *) ea = (etype) r64; \
317 /* All integer values fit into a floating point array, so we don't */ \
318 /* need to CHECK_WIDENING_CONVERSION here. */ \
323 *(etype *) ea = (etype) i64; \
329 case MONO_TYPE_CHAR: \
330 *(etype *) ea = (etype) u64; \
335 switch (vc->byval_arg.type) {
337 u64 = *(guint8 *) va;
340 u64 = *(guint16 *) va;
343 u64 = *(guint32 *) va;
346 u64 = *(guint64 *) va;
352 i64 = *(gint16 *) va;
355 i64 = *(gint32 *) va;
358 i64 = *(gint64 *) va;
361 r64 = *(gfloat *) va;
364 r64 = *(gdouble *) va;
367 u64 = *(guint16 *) va;
369 case MONO_TYPE_BOOLEAN:
370 /* Boolean is only compatible with itself. */
371 switch (ec->byval_arg.type) {
383 NO_WIDENING_CONVERSION;
390 /* If we can't do a direct copy, let's try a widening conversion. */
391 switch (ec->byval_arg.type) {
393 ASSIGN_UNSIGNED (guint16);
395 ASSIGN_UNSIGNED (guint8);
397 ASSIGN_UNSIGNED (guint16);
399 ASSIGN_UNSIGNED (guint32);
401 ASSIGN_UNSIGNED (guint64);
403 ASSIGN_SIGNED (gint8);
405 ASSIGN_SIGNED (gint16);
407 ASSIGN_SIGNED (gint32);
409 ASSIGN_SIGNED (gint64);
411 ASSIGN_REAL (gfloat);
413 ASSIGN_REAL (gdouble);
417 /* Not reached, INVALID_CAST does not return. Just to avoid a compiler warning ... */
421 #undef NO_WIDENING_CONVERSION
422 #undef CHECK_WIDENING_CONVERSION
423 #undef ASSIGN_UNSIGNED
429 ves_icall_System_Array_SetValue (MonoArray *this, MonoObject *value,
437 MONO_CHECK_ARG_NULL (idxs);
439 ic = idxs->obj.vtable->klass;
440 ac = this->obj.vtable->klass;
442 g_assert (ic->rank == 1);
443 if (idxs->bounds != NULL || idxs->max_length != ac->rank)
444 mono_raise_exception (mono_get_exception_argument (NULL, NULL));
446 ind = (gint32 *)idxs->vector;
448 if (this->bounds == NULL) {
449 if (*ind < 0 || *ind >= this->max_length)
450 mono_raise_exception (mono_get_exception_index_out_of_range ());
452 ves_icall_System_Array_SetValueImpl (this, value, *ind);
456 for (i = 0; i < ac->rank; i++)
457 if ((ind [i] < this->bounds [i].lower_bound) ||
458 (ind [i] >= this->bounds [i].length + this->bounds [i].lower_bound))
459 mono_raise_exception (mono_get_exception_index_out_of_range ());
461 pos = ind [0] - this->bounds [0].lower_bound;
462 for (i = 1; i < ac->rank; i++)
463 pos = pos * this->bounds [i].length + ind [i] -
464 this->bounds [i].lower_bound;
466 ves_icall_System_Array_SetValueImpl (this, value, pos);
470 ves_icall_System_Array_CreateInstanceImpl (MonoReflectionType *type, MonoArray *lengths, MonoArray *bounds)
475 gboolean bounded = FALSE;
479 MONO_CHECK_ARG_NULL (type);
480 MONO_CHECK_ARG_NULL (lengths);
482 MONO_CHECK_ARG (lengths, mono_array_length (lengths) > 0);
484 MONO_CHECK_ARG (bounds, mono_array_length (lengths) == mono_array_length (bounds));
486 for (i = 0; i < mono_array_length (lengths); i++)
487 if (mono_array_get (lengths, gint32, i) < 0)
488 mono_raise_exception (mono_get_exception_argument_out_of_range (NULL));
490 if (bounds && (mono_array_length (bounds) == 1) && (mono_array_get (bounds, gint32, 0) != 0))
491 /* vectors are not the same as one dimensional arrays with no-zero bounds */
496 aklass = mono_bounded_array_class_get (mono_class_from_mono_type (type->type), mono_array_length (lengths), bounded);
498 sizes = alloca (aklass->rank * sizeof(guint32) * 2);
499 for (i = 0; i < aklass->rank; ++i) {
500 sizes [i] = mono_array_get (lengths, guint32, i);
502 sizes [i + aklass->rank] = mono_array_get (bounds, guint32, i);
504 sizes [i + aklass->rank] = 0;
507 array = mono_array_new_full (mono_object_domain (type), aklass, sizes, sizes + aklass->rank);
513 ves_icall_System_Array_GetRank (MonoObject *this)
517 return this->vtable->klass->rank;
521 ves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension)
523 gint32 rank = ((MonoObject *)this)->vtable->klass->rank;
527 if ((dimension < 0) || (dimension >= rank))
528 mono_raise_exception (mono_get_exception_index_out_of_range ());
530 if (this->bounds == NULL)
531 return this->max_length;
533 return this->bounds [dimension].length;
537 ves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension)
539 gint32 rank = ((MonoObject *)this)->vtable->klass->rank;
543 if ((dimension < 0) || (dimension >= rank))
544 mono_raise_exception (mono_get_exception_index_out_of_range ());
546 if (this->bounds == NULL)
549 return this->bounds [dimension].lower_bound;
553 ves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length)
555 int sz = mono_array_element_size (mono_object_class (arr));
556 memset (mono_array_addr_with_size (arr, idx, sz), 0, length * sz);
560 ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length)
565 MonoClass *src_class;
566 MonoClass *dest_class;
571 if (source->obj.vtable->klass->rank != dest->obj.vtable->klass->rank)
574 if (source->bounds || dest->bounds)
577 if ((dest_idx + length > mono_array_length (dest)) ||
578 (source_idx + length > mono_array_length (source)))
581 element_size = mono_array_element_size (source->obj.vtable->klass);
582 dest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);
583 source_addr = mono_array_addr_with_size (source, element_size, source_idx);
585 src_class = source->obj.vtable->klass->element_class;
586 dest_class = dest->obj.vtable->klass->element_class;
589 * Handle common cases.
592 /* Case1: object[] -> valuetype[] (ArrayList::ToArray) */
593 if (src_class == mono_defaults.object_class && dest_class->valuetype) {
594 for (i = source_idx; i < source_idx + length; ++i) {
595 MonoObject *elem = mono_array_get (source, MonoObject*, i);
596 if (elem && !mono_object_isinst (elem, dest_class))
600 element_size = mono_array_element_size (dest->obj.vtable->klass);
601 for (i = 0; i < length; ++i) {
602 MonoObject *elem = mono_array_get (source, MonoObject*, source_idx + i);
603 void *addr = mono_array_addr_with_size (dest, element_size, dest_idx + i);
605 memset (addr, 0, element_size);
607 memcpy (addr, (char *)elem + sizeof (MonoObject), element_size);
612 /* Check if we're copying a char[] <==> (u)short[] */
613 if (src_class != dest_class) {
614 if (dest_class->valuetype || dest_class->enumtype || src_class->valuetype || src_class->enumtype)
617 if (mono_class_is_subclass_of (src_class, dest_class, FALSE))
619 /* Case2: object[] -> reftype[] (ArrayList::ToArray) */
620 else if (mono_class_is_subclass_of (dest_class, src_class, FALSE))
621 for (i = source_idx; i < source_idx + length; ++i) {
622 MonoObject *elem = mono_array_get (source, MonoObject*, i);
623 if (elem && !mono_object_isinst (elem, dest_class))
630 memmove (dest_addr, source_addr, element_size * length);
636 ves_icall_System_Array_InternalArray_GetGenericValueImpl (MonoObject *this, guint32 pos,
646 ao = (MonoArray *)this;
647 ac = (MonoClass *)ao->obj.vtable->klass;
649 esize = mono_array_element_size (ac);
650 ea = (gpointer*)((char*)ao->vector + (pos * esize));
652 memcpy (value, ea, esize);
656 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray (MonoArray *array, MonoClassField *field_handle)
658 MonoClass *klass = array->obj.vtable->klass;
659 guint32 size = mono_array_element_size (klass);
664 if (array->bounds == NULL)
665 size *= array->max_length;
667 for (i = 0; i < klass->rank; ++i)
668 size *= array->bounds [i].length;
670 memcpy (mono_array_addr (array, char, 0), field_handle->data, size);
672 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
676 guint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \
678 for (i = 0; i < size; i += n/8, data++) { \
679 tmp = read ## n (data); \
684 /* printf ("Initialize array with elements of %s type\n", klass->element_class->name); */
686 switch (mono_type_get_underlying_type (&klass->element_class->byval_arg)->type) {
706 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData (void)
710 return offsetof (MonoString, chars);
714 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue (MonoObject *obj)
718 if ((obj == NULL) || (! (obj->vtable->klass->valuetype)))
721 return mono_object_clone (obj);
725 ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (MonoType *handle)
731 MONO_CHECK_ARG_NULL (handle);
733 klass = mono_class_from_mono_type (handle);
734 MONO_CHECK_ARG (handle, klass);
736 /* This will call the type constructor */
737 if (! (klass->flags & TYPE_ATTRIBUTE_INTERFACE))
738 mono_runtime_class_init (mono_class_vtable (mono_domain_get (), klass));
742 ves_icall_System_Object_MemberwiseClone (MonoObject *this)
746 return mono_object_clone (this);
749 #define MONO_OBJECT_ALIGNMENT_SHIFT 3
752 * Return hashcode based on object address. This function will need to be
753 * smarter in the presence of a moving garbage collector, which will cache
754 * the address hash before relocating the object.
756 * Wang's address-based hash function:
757 * http://www.concentric.net/~Ttwang/tech/addrhash.htm
760 ves_icall_System_Object_GetHashCode (MonoObject *this)
764 return (GPOINTER_TO_UINT (this) >> MONO_OBJECT_ALIGNMENT_SHIFT) * 2654435761u;
768 ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fields)
771 MonoObject **values = NULL;
775 MonoClassField* field;
780 klass = mono_object_class (this);
782 if (mono_class_num_fields (klass) == 0)
783 return ves_icall_System_Object_GetHashCode (this);
786 * Compute the starting value of the hashcode for fields of primitive
787 * types, and return the remaining fields in an array to the managed side.
788 * This way, we can avoid costly reflection operations in managed code.
791 while ((field = mono_class_get_fields (klass, &iter))) {
792 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)
794 if (mono_field_is_deleted (field))
796 /* FIXME: Add more types */
797 switch (field->type->type) {
799 result ^= *(gint32*)((guint8*)this + field->offset);
801 case MONO_TYPE_STRING: {
803 s = *(MonoString**)((guint8*)this + field->offset);
805 result ^= mono_string_hash (s);
810 values = g_newa (MonoObject*, mono_class_num_fields (klass));
811 o = mono_field_get_value_object (mono_object_domain (this), field, this);
812 values [count++] = o;
817 *fields = mono_array_new (mono_domain_get (), mono_defaults.object_class, count);
818 memcpy (mono_array_addr (*fields, MonoObject*, 0), values, count * sizeof (MonoObject*));
826 ves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray **fields)
829 MonoObject **values = NULL;
831 MonoClassField* field;
837 MONO_CHECK_ARG_NULL (that);
839 if (this->vtable != that->vtable)
842 klass = mono_object_class (this);
845 * Do the comparison for fields of primitive type and return a result if
846 * possible. Otherwise, return the remaining fields in an array to the
847 * managed side. This way, we can avoid costly reflection operations in
852 while ((field = mono_class_get_fields (klass, &iter))) {
853 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)
855 if (mono_field_is_deleted (field))
857 /* FIXME: Add more types */
858 switch (field->type->type) {
860 if (*(gint32*)((guint8*)this + field->offset) != *(gint32*)((guint8*)that + field->offset))
863 case MONO_TYPE_STRING: {
865 guint32 s1len, s2len;
866 s1 = *(MonoString**)((guint8*)this + field->offset);
867 s2 = *(MonoString**)((guint8*)that + field->offset);
870 if ((s1 == NULL) || (s2 == NULL))
872 s1len = mono_string_length (s1);
873 s2len = mono_string_length (s2);
877 if (memcmp (mono_string_chars (s1), mono_string_chars (s2), s1len * sizeof (gunichar2)) != 0)
883 values = g_newa (MonoObject*, mono_class_num_fields (klass) * 2);
884 o = mono_field_get_value_object (mono_object_domain (this), field, this);
885 values [count++] = o;
886 o = mono_field_get_value_object (mono_object_domain (this), field, that);
887 values [count++] = o;
892 *fields = mono_array_new (mono_domain_get (), mono_defaults.object_class, count);
893 memcpy (mono_array_addr (*fields, MonoObject*, 0), values, count * sizeof (MonoObject*));
901 static MonoReflectionType *
902 ves_icall_System_Object_GetType (MonoObject *obj)
906 if (obj->vtable->klass != mono_defaults.transparent_proxy_class)
907 return mono_type_get_object (mono_object_domain (obj), &obj->vtable->klass->byval_arg);
909 return mono_type_get_object (mono_object_domain (obj), &((MonoTransparentProxy*)obj)->remote_class->proxy_class->byval_arg);
913 mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)
917 mtype->type = &obj->vtable->klass->byval_arg;
918 g_assert (mtype->type->type);
922 ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilder *mb, MonoObject *obj)
926 MONO_CHECK_ARG_NULL (obj);
928 return mono_image_create_token (mb->dynamic_image, obj, TRUE);
932 ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilder *mb,
933 MonoReflectionMethod *method,
934 MonoArray *opt_param_types)
938 MONO_CHECK_ARG_NULL (method);
940 return mono_image_create_method_token (
941 mb->dynamic_image, (MonoObject *) method, opt_param_types);
945 ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file)
949 mono_image_create_pefile (mb, file);
953 ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)
957 mono_image_build_metadata (mb);
961 get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
963 MonoMethod **dest = data;
965 /* skip unmanaged frames */
980 static MonoReflectionType *
981 type_from_name (const char *str, MonoBoolean ignoreCase)
983 MonoType *type = NULL;
984 MonoAssembly *assembly = NULL;
985 MonoTypeNameParse info;
986 char *temp_str = g_strdup (str);
987 gboolean type_resolve = FALSE;
991 /* mono_reflection_parse_type() mangles the string */
992 if (!mono_reflection_parse_type (temp_str, &info)) {
993 g_list_free (info.modifiers);
994 g_list_free (info.nested);
999 if (info.assembly.name) {
1000 assembly = mono_assembly_load (&info.assembly, NULL, NULL);
1002 MonoMethod *m = mono_method_get_last_managed ();
1003 MonoMethod *dest = m;
1005 mono_stack_walk_no_il (get_caller, &dest);
1010 * FIXME: mono_method_get_last_managed() sometimes returns NULL, thus
1011 * causing ves_icall_System_Reflection_Assembly_GetCallingAssembly()
1012 * to crash. This only seems to happen in some strange remoting
1013 * scenarios and I was unable to figure out what's happening there.
1014 * Dec 10, 2005 - Martin.
1018 assembly = dest->klass->image->assembly;
1020 g_warning (G_STRLOC);
1025 type = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);
1027 if (!info.assembly.name && !type) /* try mscorlib */
1028 type = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve);
1030 g_list_free (info.modifiers);
1031 g_list_free (info.nested);
1037 return mono_type_get_object (mono_domain_get (), type);
1041 MonoReflectionType *
1042 mono_type_get (const char *str)
1044 char *copy = g_strdup (str);
1045 MonoReflectionType *type = type_from_name (copy, FALSE);
1052 static MonoReflectionType*
1053 ves_icall_type_from_name (MonoString *name,
1054 MonoBoolean throwOnError,
1055 MonoBoolean ignoreCase)
1057 char *str = mono_string_to_utf8 (name);
1058 MonoReflectionType *type;
1060 type = type_from_name (str, ignoreCase);
1064 mono_raise_exception (mono_get_exception_type_load (name, NULL));
1071 static MonoReflectionType*
1072 ves_icall_type_from_handle (MonoType *handle)
1074 MonoDomain *domain = mono_domain_get ();
1075 MonoClass *klass = mono_class_from_mono_type (handle);
1077 MONO_ARCH_SAVE_REGS;
1079 mono_class_init (klass);
1080 return mono_type_get_object (domain, handle);
1084 ves_icall_type_Equals (MonoReflectionType *type, MonoReflectionType *c)
1086 MONO_ARCH_SAVE_REGS;
1088 if (type->type && c->type)
1089 return mono_metadata_type_equal (type->type, c->type);
1094 /* System.TypeCode */
1113 TYPECODE_STRING = 18
1117 ves_icall_type_GetTypeCodeInternal (MonoReflectionType *type)
1119 int t = type->type->type;
1121 MONO_ARCH_SAVE_REGS;
1123 if (type->type->byref)
1124 return TYPECODE_OBJECT;
1128 case MONO_TYPE_VOID:
1129 return TYPECODE_OBJECT;
1130 case MONO_TYPE_BOOLEAN:
1131 return TYPECODE_BOOLEAN;
1133 return TYPECODE_BYTE;
1135 return TYPECODE_SBYTE;
1137 return TYPECODE_UINT16;
1139 return TYPECODE_INT16;
1140 case MONO_TYPE_CHAR:
1141 return TYPECODE_CHAR;
1145 return TYPECODE_OBJECT;
1147 return TYPECODE_UINT32;
1149 return TYPECODE_INT32;
1151 return TYPECODE_UINT64;
1153 return TYPECODE_INT64;
1155 return TYPECODE_SINGLE;
1157 return TYPECODE_DOUBLE;
1158 case MONO_TYPE_VALUETYPE:
1159 if (type->type->data.klass->enumtype) {
1160 t = type->type->data.klass->enum_basetype->type;
1163 MonoClass *k = type->type->data.klass;
1164 if (strcmp (k->name_space, "System") == 0) {
1165 if (strcmp (k->name, "Decimal") == 0)
1166 return TYPECODE_DECIMAL;
1167 else if (strcmp (k->name, "DateTime") == 0)
1168 return TYPECODE_DATETIME;
1171 return TYPECODE_OBJECT;
1172 case MONO_TYPE_STRING:
1173 return TYPECODE_STRING;
1174 case MONO_TYPE_SZARRAY:
1175 case MONO_TYPE_ARRAY:
1176 case MONO_TYPE_OBJECT:
1178 case MONO_TYPE_MVAR:
1179 return TYPECODE_OBJECT;
1180 case MONO_TYPE_CLASS:
1182 MonoClass *k = type->type->data.klass;
1183 if (strcmp (k->name_space, "System") == 0) {
1184 if (strcmp (k->name, "DBNull") == 0)
1185 return TYPECODE_DBNULL;
1188 return TYPECODE_OBJECT;
1189 case MONO_TYPE_GENERICINST:
1190 return TYPECODE_OBJECT;
1192 g_error ("type 0x%02x not handled in GetTypeCode()", t);
1198 ves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c, MonoBoolean check_interfaces)
1204 MONO_ARCH_SAVE_REGS;
1206 g_assert (type != NULL);
1208 domain = ((MonoObject *)type)->vtable->domain;
1210 if (!c) /* FIXME: dont know what do do here */
1213 klass = mono_class_from_mono_type (type->type);
1214 klassc = mono_class_from_mono_type (c->type);
1216 if (type->type->byref)
1217 return klassc == mono_defaults.object_class;
1219 return mono_class_is_subclass_of (klass, klassc, check_interfaces);
1223 ves_icall_type_is_assignable_from (MonoReflectionType *type, MonoReflectionType *c)
1229 MONO_ARCH_SAVE_REGS;
1231 g_assert (type != NULL);
1233 domain = ((MonoObject *)type)->vtable->domain;
1235 klass = mono_class_from_mono_type (type->type);
1236 klassc = mono_class_from_mono_type (c->type);
1238 if (type->type->byref && !c->type->byref)
1241 return mono_class_is_assignable_from (klass, klassc);
1245 ves_icall_type_IsInstanceOfType (MonoReflectionType *type, MonoObject *obj)
1247 MonoClass *klass = mono_class_from_mono_type (type->type);
1248 return mono_object_isinst (obj, klass) != NULL;
1252 ves_icall_get_attributes (MonoReflectionType *type)
1254 MonoClass *klass = mono_class_from_mono_type (type->type);
1256 MONO_ARCH_SAVE_REGS;
1258 return klass->flags;
1261 static MonoReflectionMarshal*
1262 ves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal (MonoReflectionField *field)
1264 MonoClass *klass = field->field->parent;
1265 MonoMarshalType *info;
1268 if (klass->generic_container ||
1269 (klass->generic_class && klass->generic_class->inst->is_open))
1272 info = mono_marshal_load_type_info (klass);
1274 for (i = 0; i < info->num_fields; ++i) {
1275 if (info->fields [i].field == field->field) {
1276 if (!info->fields [i].mspec)
1279 return mono_reflection_marshal_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);
1286 static MonoReflectionField*
1287 ves_icall_System_Reflection_FieldInfo_internal_from_handle (MonoClassField *handle)
1289 MONO_ARCH_SAVE_REGS;
1293 return mono_field_get_object (mono_domain_get (), handle->parent, handle);
1297 ves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info)
1299 MonoDomain *domain = mono_domain_get ();
1300 MonoMethodSignature* sig;
1301 MONO_ARCH_SAVE_REGS;
1303 if (method->is_inflated)
1304 method = mono_get_inflated_method (method);
1306 sig = mono_method_signature (method);
1308 info->parent = mono_type_get_object (domain, &method->klass->byval_arg);
1309 info->ret = mono_type_get_object (domain, sig->ret);
1310 info->attrs = method->flags;
1311 info->implattrs = method->iflags;
1312 if (sig->call_convention == MONO_CALL_DEFAULT)
1315 if (sig->call_convention == MONO_CALL_VARARG)
1320 info->callconv |= (sig->hasthis << 5) | (sig->explicit_this << 6);
1324 ves_icall_get_parameter_info (MonoMethod *method)
1326 MonoDomain *domain = mono_domain_get ();
1328 MONO_ARCH_SAVE_REGS;
1330 if (method->is_inflated)
1331 method = mono_get_inflated_method (method);
1333 return mono_param_get_objects (domain, method);
1337 ves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)
1339 return field->field->offset - sizeof (MonoObject);
1342 static MonoReflectionType*
1343 ves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)
1346 MONO_ARCH_SAVE_REGS;
1348 parent = declaring? field->field->parent: field->klass;
1350 return mono_type_get_object (mono_object_domain (field), &parent->byval_arg);
1354 ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *obj)
1357 MonoClassField *cf = field->field;
1361 MonoDomain *domain = mono_object_domain (field);
1363 gboolean is_static = FALSE;
1364 gboolean is_ref = FALSE;
1366 MONO_ARCH_SAVE_REGS;
1368 if (field->klass->image->assembly->ref_only)
1369 mono_raise_exception (mono_get_exception_invalid_operation (
1370 "It is illegal to get the value on a field on a type loaded using the ReflectionOnly methods."));
1372 mono_class_init (field->klass);
1374 t = mono_type_get_underlying_type (cf->type);
1376 case MONO_TYPE_STRING:
1377 case MONO_TYPE_OBJECT:
1378 case MONO_TYPE_CLASS:
1379 case MONO_TYPE_ARRAY:
1380 case MONO_TYPE_SZARRAY:
1385 case MONO_TYPE_BOOLEAN:
1388 case MONO_TYPE_CHAR:
1397 case MONO_TYPE_VALUETYPE:
1401 g_error ("type 0x%x not handled in "
1402 "ves_icall_Monofield_GetValue", t->type);
1407 if (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {
1409 vtable = mono_class_vtable (domain, field->klass);
1410 if (!vtable->initialized && !(cf->type->attrs & FIELD_ATTRIBUTE_LITERAL))
1411 mono_runtime_class_init (vtable);
1416 mono_field_static_get_value (vtable, cf, &o);
1418 mono_field_get_value (obj, cf, &o);
1423 if (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {
1424 MonoClass *nklass = mono_class_from_mono_type (cf->type);
1427 /* Convert the Nullable structure into a boxed vtype */
1429 buf = (char*)vtable->data + cf->offset;
1431 buf = (char*)obj + cf->offset;
1433 return mono_nullable_box (buf, nklass);
1436 /* boxed value type */
1437 klass = mono_class_from_mono_type (cf->type);
1438 o = mono_object_new (domain, klass);
1439 v = ((gchar *) o) + sizeof (MonoObject);
1441 mono_field_static_get_value (vtable, cf, v);
1443 mono_field_get_value (obj, cf, v);
1450 ves_icall_FieldInfo_SetValueInternal (MonoReflectionField *field, MonoObject *obj, MonoObject *value)
1452 MonoClassField *cf = field->field;
1455 MONO_ARCH_SAVE_REGS;
1457 if (field->klass->image->assembly->ref_only)
1458 mono_raise_exception (mono_get_exception_invalid_operation (
1459 "It is illegal to set the value on a field on a type loaded using the ReflectionOnly methods."));
1461 v = (gchar *) value;
1462 if (!cf->type->byref) {
1463 switch (cf->type->type) {
1466 case MONO_TYPE_BOOLEAN:
1469 case MONO_TYPE_CHAR:
1478 case MONO_TYPE_VALUETYPE:
1480 v += sizeof (MonoObject);
1482 case MONO_TYPE_STRING:
1483 case MONO_TYPE_OBJECT:
1484 case MONO_TYPE_CLASS:
1485 case MONO_TYPE_ARRAY:
1486 case MONO_TYPE_SZARRAY:
1489 case MONO_TYPE_GENERICINST: {
1490 MonoGenericClass *gclass = cf->type->data.generic_class;
1491 g_assert (!gclass->inst->is_open);
1493 if (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {
1494 MonoClass *nklass = mono_class_from_mono_type (cf->type);
1498 * Convert the boxed vtype into a Nullable structure.
1499 * This is complicated by the fact that Nullables have
1500 * a variable structure.
1502 /* Allocate using alloca so it gets GC tracking */
1503 buf = alloca (nklass->instance_size);
1505 mono_nullable_init (buf, value, nklass);
1510 if (gclass->container_class->valuetype && (v != NULL))
1511 v += sizeof (MonoObject);
1515 g_error ("type 0x%x not handled in "
1516 "ves_icall_FieldInfo_SetValueInternal", cf->type->type);
1521 if (cf->type->attrs & FIELD_ATTRIBUTE_STATIC) {
1522 MonoVTable *vtable = mono_class_vtable (mono_object_domain (field), field->klass);
1523 if (!vtable->initialized)
1524 mono_runtime_class_init (vtable);
1525 mono_field_static_set_value (vtable, cf, v);
1527 mono_field_set_value (obj, cf, v);
1531 static MonoReflectionField*
1532 ves_icall_MonoField_Mono_GetGenericFieldDefinition (MonoReflectionField *field)
1534 MONO_ARCH_SAVE_REGS;
1536 if (field->field->generic_info && field->field->generic_info->reflection_info)
1537 return field->field->generic_info->reflection_info;
1542 static MonoReflectionType*
1543 ves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)
1545 MonoMethod *method = mono_get_inflated_method (rmethod->method.method);
1547 return mono_type_get_object (mono_object_domain (rmethod), &method->klass->byval_arg);
1550 /* From MonoProperty.cs */
1552 PInfo_Attributes = 1,
1553 PInfo_GetMethod = 1 << 1,
1554 PInfo_SetMethod = 1 << 2,
1555 PInfo_ReflectedType = 1 << 3,
1556 PInfo_DeclaringType = 1 << 4,
1561 ves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo *info, PInfo req_info)
1563 MonoDomain *domain = mono_object_domain (property);
1565 MONO_ARCH_SAVE_REGS;
1567 if ((req_info & PInfo_ReflectedType) != 0)
1568 info->parent = mono_type_get_object (domain, &property->klass->byval_arg);
1569 else if ((req_info & PInfo_DeclaringType) != 0)
1570 info->parent = mono_type_get_object (domain, &property->property->parent->byval_arg);
1572 if ((req_info & PInfo_Name) != 0)
1573 info->name = mono_string_new (domain, property->property->name);
1575 if ((req_info & PInfo_Attributes) != 0)
1576 info->attrs = property->property->attrs;
1578 if ((req_info & PInfo_GetMethod) != 0)
1579 info->get = property->property->get ?
1580 mono_method_get_object (domain, property->property->get, NULL): NULL;
1582 if ((req_info & PInfo_SetMethod) != 0)
1583 info->set = property->property->set ?
1584 mono_method_get_object (domain, property->property->set, NULL): NULL;
1586 * There may be other methods defined for properties, though, it seems they are not exposed
1587 * in the reflection API
1592 ves_icall_get_event_info (MonoReflectionEvent *event, MonoEventInfo *info)
1594 MonoDomain *domain = mono_object_domain (event);
1596 MONO_ARCH_SAVE_REGS;
1598 info->reflected_type = mono_type_get_object (domain, &event->klass->byval_arg);
1599 info->declaring_type = mono_type_get_object (domain, &event->event->parent->byval_arg);
1601 info->name = mono_string_new (domain, event->event->name);
1602 info->attrs = event->event->attrs;
1603 info->add_method = event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL;
1604 info->remove_method = event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL;
1605 info->raise_method = event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL;
1607 if (event->event->other) {
1609 while (event->event->other [n])
1611 info->other_methods = mono_array_new (domain, mono_defaults.method_info_class, n);
1613 for (i = 0; i < n; i++)
1614 mono_array_set (info->other_methods, gpointer, i,
1615 mono_method_get_object (domain, event->event->other [i], NULL));
1620 ves_icall_Type_GetInterfaces (MonoReflectionType* type)
1622 MonoDomain *domain = mono_object_domain (type);
1624 GPtrArray *ifaces = NULL;
1626 MonoClass *class = mono_class_from_mono_type (type->type);
1628 MonoBitSet *slots = mono_bitset_new (class->max_interface_id + 1, 0);
1630 MONO_ARCH_SAVE_REGS;
1633 /* GetInterfaces() returns an empty array in MS.NET (this may be a bug) */
1634 mono_bitset_free (slots);
1635 return mono_array_new (domain, mono_defaults.monotype_class, 0);
1638 for (parent = class; parent; parent = parent->parent) {
1639 GPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent);
1641 for (i = 0; i < tmp_ifaces->len; ++i) {
1642 MonoClass *ic = g_ptr_array_index (tmp_ifaces, i);
1644 if (mono_bitset_test (slots, ic->interface_id))
1647 mono_bitset_set (slots, ic->interface_id);
1649 ifaces = g_ptr_array_new ();
1650 g_ptr_array_add (ifaces, ic);
1652 g_ptr_array_free (tmp_ifaces, TRUE);
1655 mono_bitset_free (slots);
1658 return mono_array_new (domain, mono_defaults.monotype_class, 0);
1660 intf = mono_array_new (domain, mono_defaults.monotype_class, ifaces->len);
1661 for (i = 0; i < ifaces->len; ++i) {
1662 MonoClass *ic = g_ptr_array_index (ifaces, i);
1664 mono_array_set (intf, gpointer, i,
1665 mono_type_get_object (domain, &ic->byval_arg));
1667 g_ptr_array_free (ifaces, TRUE);
1673 ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType *iface, MonoArray **targets, MonoArray **methods)
1675 MonoClass *class = mono_class_from_mono_type (type->type);
1676 MonoClass *iclass = mono_class_from_mono_type (iface->type);
1677 MonoReflectionMethod *member;
1680 int i = 0, len, ioffset;
1683 MONO_ARCH_SAVE_REGS;
1685 /* type doesn't implement iface: the exception is thrown in managed code */
1686 if ((iclass->interface_id > class->max_interface_id) || !class->interface_offsets [iclass->interface_id])
1689 len = mono_class_num_methods (iclass);
1690 ioffset = class->interface_offsets [iclass->interface_id];
1691 domain = mono_object_domain (type);
1692 *targets = mono_array_new (domain, mono_defaults.method_info_class, len);
1693 *methods = mono_array_new (domain, mono_defaults.method_info_class, len);
1696 while ((method = mono_class_get_methods (iclass, &iter))) {
1697 member = mono_method_get_object (domain, method, iclass);
1698 mono_array_set (*methods, gpointer, i, member);
1699 member = mono_method_get_object (domain, class->vtable [i + ioffset], class);
1700 mono_array_set (*targets, gpointer, i, member);
1707 ves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)
1709 MonoClass *klass = mono_class_from_mono_type (type->type);
1711 g_assert (!klass->image->dynamic);
1713 mono_metadata_packing_from_typedef (klass->image, klass->type_token, packing, size);
1716 static MonoReflectionType*
1717 ves_icall_MonoType_GetElementType (MonoReflectionType *type)
1719 MonoClass *class = mono_class_from_mono_type (type->type);
1721 MONO_ARCH_SAVE_REGS;
1723 // GelElementType should only return a type for:
1724 // Array Pointer PassedByRef
1725 if (type->type->byref)
1726 return mono_type_get_object (mono_object_domain (type), &class->byval_arg);
1727 if (class->enumtype && class->enum_basetype) /* types that are modifierd typebuilkders may not have enum_basetype set */
1728 return mono_type_get_object (mono_object_domain (type), class->enum_basetype);
1729 else if (class->element_class && MONO_CLASS_IS_ARRAY (class))
1730 return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
1731 else if (class->element_class && type->type->type == MONO_TYPE_PTR)
1732 return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
1737 static MonoReflectionType*
1738 ves_icall_get_type_parent (MonoReflectionType *type)
1740 MonoClass *class = mono_class_from_mono_type (type->type);
1742 MONO_ARCH_SAVE_REGS;
1744 return class->parent ? mono_type_get_object (mono_object_domain (type), &class->parent->byval_arg): NULL;
1748 ves_icall_type_ispointer (MonoReflectionType *type)
1750 MONO_ARCH_SAVE_REGS;
1752 return type->type->type == MONO_TYPE_PTR;
1756 ves_icall_type_isprimitive (MonoReflectionType *type)
1758 MONO_ARCH_SAVE_REGS;
1760 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)));
1764 ves_icall_type_isbyref (MonoReflectionType *type)
1766 MONO_ARCH_SAVE_REGS;
1768 return type->type->byref;
1771 static MonoReflectionModule*
1772 ves_icall_MonoType_get_Module (MonoReflectionType *type)
1774 MonoClass *class = mono_class_from_mono_type (type->type);
1776 MONO_ARCH_SAVE_REGS;
1778 return mono_module_get_object (mono_object_domain (type), class->image);
1781 static MonoReflectionAssembly*
1782 ves_icall_MonoType_get_Assembly (MonoReflectionType *type)
1784 MonoDomain *domain = mono_domain_get ();
1785 MonoClass *class = mono_class_from_mono_type (type->type);
1787 MONO_ARCH_SAVE_REGS;
1789 return mono_assembly_get_object (domain, class->image->assembly);
1792 static MonoReflectionType*
1793 ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)
1795 MonoDomain *domain = mono_domain_get ();
1798 MONO_ARCH_SAVE_REGS;
1800 if (type->type->type == MONO_TYPE_VAR)
1801 class = type->type->data.generic_param->owner->klass;
1802 else if (type->type->type == MONO_TYPE_MVAR)
1803 class = type->type->data.generic_param->method->klass;
1805 class = mono_class_from_mono_type (type->type)->nested_in;
1807 return class ? mono_type_get_object (domain, &class->byval_arg) : NULL;
1810 static MonoReflectionType*
1811 ves_icall_MonoType_get_UnderlyingSystemType (MonoReflectionType *type)
1813 MonoDomain *domain = mono_domain_get ();
1814 MonoClass *class = mono_class_from_mono_type (type->type);
1816 MONO_ARCH_SAVE_REGS;
1818 if (class->enumtype && class->enum_basetype) /* types that are modified typebuilders may not have enum_basetype set */
1819 return mono_type_get_object (domain, class->enum_basetype);
1820 else if (class->element_class)
1821 return mono_type_get_object (domain, &class->element_class->byval_arg);
1827 ves_icall_MonoType_get_Name (MonoReflectionType *type)
1829 MonoDomain *domain = mono_domain_get ();
1830 MonoClass *class = mono_class_from_mono_type (type->type);
1832 MONO_ARCH_SAVE_REGS;
1834 return mono_string_new (domain, class->name);
1838 ves_icall_MonoType_get_Namespace (MonoReflectionType *type)
1840 MonoDomain *domain = mono_domain_get ();
1841 MonoClass *class = mono_class_from_mono_type (type->type);
1843 MONO_ARCH_SAVE_REGS;
1845 while (class->nested_in)
1846 class = class->nested_in;
1848 if (class->name_space [0] == '\0')
1851 return mono_string_new (domain, class->name_space);
1855 ves_icall_MonoType_GetArrayRank (MonoReflectionType *type)
1857 MonoClass *class = mono_class_from_mono_type (type->type);
1859 MONO_ARCH_SAVE_REGS;
1865 ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)
1868 MonoClass *klass, *pklass;
1870 MONO_ARCH_SAVE_REGS;
1872 klass = mono_class_from_mono_type (type->type);
1874 if (klass->generic_container) {
1875 MonoGenericContainer *container = klass->generic_container;
1876 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, container->type_argc);
1877 for (i = 0; i < container->type_argc; ++i) {
1878 pklass = mono_class_from_generic_parameter (&container->type_params [i], klass->image, FALSE);
1879 mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), &pklass->byval_arg));
1881 } else if (klass->generic_class) {
1882 MonoGenericInst *inst = klass->generic_class->inst;
1883 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, inst->type_argc);
1884 for (i = 0; i < inst->type_argc; ++i) {
1885 mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), inst->type_argv [i]));
1888 res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, 0);
1894 ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)
1897 MONO_ARCH_SAVE_REGS;
1899 klass = mono_class_from_mono_type (type->type);
1901 return klass->generic_container != NULL;
1904 static MonoReflectionType*
1905 ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
1908 MONO_ARCH_SAVE_REGS;
1910 klass = mono_class_from_mono_type (type->type);
1911 if (klass->generic_container) {
1912 return type; /* check this one */
1914 if (klass->generic_class) {
1915 MonoClass *generic_class = klass->generic_class->container_class;
1917 if (generic_class->wastypebuilder && generic_class->reflection_info)
1918 return generic_class->reflection_info;
1920 return mono_type_get_object (mono_object_domain (type), &generic_class->byval_arg);
1925 static MonoReflectionType*
1926 ves_icall_Type_MakeGenericType (MonoReflectionType *type, MonoArray *type_array)
1928 MonoType *geninst, **types;
1931 MONO_ARCH_SAVE_REGS;
1933 count = mono_array_length (type_array);
1934 types = g_new0 (MonoType *, count);
1936 for (i = 0; i < count; i++) {
1937 MonoReflectionType *t = mono_array_get (type_array, gpointer, i);
1938 types [i] = t->type;
1941 geninst = mono_reflection_bind_generic_parameters (type, count, types);
1945 return mono_type_get_object (mono_object_domain (type), geninst);
1949 ves_icall_Type_get_IsGenericInstance (MonoReflectionType *type)
1952 MONO_ARCH_SAVE_REGS;
1954 klass = mono_class_from_mono_type (type->type);
1955 return klass->generic_class != NULL;
1959 ves_icall_Type_get_IsGenericType (MonoReflectionType *type)
1962 MONO_ARCH_SAVE_REGS;
1964 klass = mono_class_from_mono_type (type->type);
1965 return klass->generic_class != NULL || klass->generic_container != NULL;
1969 ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)
1971 MONO_ARCH_SAVE_REGS;
1973 if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
1974 return type->type->data.generic_param->num;
1978 static GenericParameterAttributes
1979 ves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)
1981 MONO_ARCH_SAVE_REGS;
1982 return type->type->data.generic_param->flags;
1986 ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)
1988 MonoGenericParam *param;
1994 MONO_ARCH_SAVE_REGS;
1996 domain = mono_object_domain (type);
1997 param = type->type->data.generic_param;
1998 for (count = 0, ptr = param->constraints; ptr && *ptr; ptr++, count++)
2001 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2002 for (i = 0; i < count; i++)
2003 mono_array_set (res, gpointer, i,
2004 mono_type_get_object (domain, ¶m->constraints [i]->byval_arg));
2011 ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)
2013 MONO_ARCH_SAVE_REGS;
2015 if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
2021 ves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)
2023 MONO_ARCH_SAVE_REGS;
2025 if (tb->type.type->type == MONO_TYPE_VAR || tb->type.type->type == MONO_TYPE_MVAR)
2031 ves_icall_EnumBuilder_setup_enum_type (MonoReflectionType *enumtype,
2032 MonoReflectionType *t)
2034 enumtype->type = t->type;
2037 static MonoReflectionType*
2038 ves_icall_MonoGenericClass_GetParentType (MonoReflectionGenericClass *type)
2040 MonoDynamicGenericClass *gclass;
2043 MONO_ARCH_SAVE_REGS;
2045 g_assert (type->type.type->data.generic_class->is_dynamic);
2046 gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class;
2048 if (!gclass->parent || (gclass->parent->type != MONO_TYPE_GENERICINST))
2051 klass = mono_class_from_mono_type (gclass->parent);
2052 if (!klass->generic_class && !klass->generic_container)
2055 return mono_type_get_object (mono_object_domain (type), gclass->parent);
2059 ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type)
2061 static MonoClass *System_Reflection_MonoGenericClass;
2062 MonoDynamicGenericClass *gclass;
2063 MonoReflectionTypeBuilder *tb = NULL;
2064 MonoClass *klass = NULL;
2069 MONO_ARCH_SAVE_REGS;
2071 if (!System_Reflection_MonoGenericClass) {
2072 System_Reflection_MonoGenericClass = mono_class_from_name (
2073 mono_defaults.corlib, "System.Reflection", "MonoGenericClass");
2074 g_assert (System_Reflection_MonoGenericClass);
2077 domain = mono_object_domain (type);
2079 g_assert (type->type.type->data.generic_class->is_dynamic);
2080 gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class;
2082 if (!strcmp (type->generic_type->object.vtable->klass->name, "TypeBuilder")) {
2083 tb = (MonoReflectionTypeBuilder *) type->generic_type;
2084 icount = tb->interfaces ? mono_array_length (tb->interfaces) : 0;
2086 klass = gclass->generic_class.generic_class.container_class;
2087 mono_class_init (klass);
2088 icount = klass->interface_count;
2091 res = mono_array_new (domain, System_Reflection_MonoGenericClass, icount);
2093 for (i = 0; i < icount; i++) {
2094 MonoReflectionType *iface;
2098 iface = mono_array_get (tb->interfaces, MonoReflectionType *, i);
2101 it = &klass->interfaces [i]->byval_arg;
2103 it = mono_class_inflate_generic_type (
2104 it, gclass->generic_class.generic_class.context);
2106 iface = mono_type_get_object (domain, it);
2107 mono_array_set (res, gpointer, i, iface);
2113 static MonoReflectionMethod*
2114 ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod (MonoReflectionGenericClass *type,
2115 MonoReflectionMethod* generic)
2117 MonoGenericClass *gclass;
2118 MonoDynamicGenericClass *dgclass;
2122 MONO_ARCH_SAVE_REGS;
2124 gclass = type->type.type->data.generic_class;
2125 g_assert (gclass->is_dynamic);
2127 dgclass = (MonoDynamicGenericClass *) gclass;
2129 domain = mono_object_domain (type);
2131 for (i = 0; i < dgclass->count_methods; i++)
2132 if (generic->method->token == dgclass->methods [i]->token)
2133 return mono_method_get_object (domain, dgclass->methods [i], NULL);
2138 static MonoReflectionMethod*
2139 ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor (MonoReflectionGenericClass *type,
2140 MonoReflectionMethod* generic)
2142 MonoGenericClass *gclass;
2143 MonoDynamicGenericClass *dgclass;
2147 MONO_ARCH_SAVE_REGS;
2149 gclass = type->type.type->data.generic_class;
2150 g_assert (gclass->is_dynamic);
2152 dgclass = (MonoDynamicGenericClass *) gclass;
2154 domain = mono_object_domain (type);
2156 for (i = 0; i < dgclass->count_ctors; i++)
2157 if (generic->method->token == dgclass->ctors [i]->token)
2158 return mono_method_get_object (domain, dgclass->ctors [i], NULL);
2164 static MonoReflectionField*
2165 ves_icall_MonoGenericClass_GetCorrespondingInflatedField (MonoReflectionGenericClass *type,
2166 MonoString* generic_name)
2168 MonoGenericClass *gclass;
2169 MonoDynamicGenericClass *dgclass;
2171 MonoClass *refclass;
2172 char *utf8_name = mono_string_to_utf8 (generic_name);
2175 MONO_ARCH_SAVE_REGS;
2177 gclass = type->type.type->data.generic_class;
2178 g_assert (gclass->is_dynamic);
2180 dgclass = (MonoDynamicGenericClass *) gclass;
2182 refclass = mono_class_from_mono_type (type->type.type);
2184 domain = mono_object_domain (type);
2186 for (i = 0; i < dgclass->count_fields; i++)
2187 if (strcmp (utf8_name, dgclass->fields [i].name) == 0) {
2189 return mono_field_get_object (domain, refclass, &dgclass->fields [i]);
2198 static MonoReflectionMethod*
2199 ves_icall_MonoType_GetCorrespondingInflatedMethod (MonoReflectionType *type,
2200 MonoReflectionMethod* generic)
2207 MONO_ARCH_SAVE_REGS;
2209 domain = ((MonoObject *)type)->vtable->domain;
2211 klass = mono_class_from_mono_type (type->type);
2214 while ((method = mono_class_get_methods (klass, &iter))) {
2215 if (method->token == generic->method->token)
2216 return mono_method_get_object (domain, method, klass);
2223 ves_icall_MonoGenericClass_GetMethods (MonoReflectionGenericClass *type,
2224 MonoReflectionType *reflected_type)
2226 MonoGenericClass *gclass;
2227 MonoDynamicGenericClass *dgclass;
2229 MonoClass *refclass;
2233 MONO_ARCH_SAVE_REGS;
2235 gclass = type->type.type->data.generic_class;
2236 g_assert (gclass->is_dynamic);
2237 dgclass = (MonoDynamicGenericClass *) gclass;
2239 refclass = mono_class_from_mono_type (reflected_type->type);
2241 domain = mono_object_domain (type);
2242 res = mono_array_new (domain, mono_defaults.method_info_class, dgclass->count_methods);
2244 for (i = 0; i < dgclass->count_methods; i++)
2245 mono_array_set (res, gpointer, i,
2246 mono_method_get_object (domain, dgclass->methods [i], refclass));
2252 ves_icall_MonoGenericClass_GetConstructors (MonoReflectionGenericClass *type,
2253 MonoReflectionType *reflected_type)
2255 static MonoClass *System_Reflection_ConstructorInfo;
2256 MonoGenericClass *gclass;
2257 MonoDynamicGenericClass *dgclass;
2259 MonoClass *refclass;
2263 MONO_ARCH_SAVE_REGS;
2265 if (!System_Reflection_ConstructorInfo)
2266 System_Reflection_ConstructorInfo = mono_class_from_name (
2267 mono_defaults.corlib, "System.Reflection", "ConstructorInfo");
2269 gclass = type->type.type->data.generic_class;
2270 g_assert (gclass->is_dynamic);
2271 dgclass = (MonoDynamicGenericClass *) gclass;
2273 refclass = mono_class_from_mono_type (reflected_type->type);
2275 domain = mono_object_domain (type);
2276 res = mono_array_new (domain, System_Reflection_ConstructorInfo, dgclass->count_ctors);
2278 for (i = 0; i < dgclass->count_ctors; i++)
2279 mono_array_set (res, gpointer, i,
2280 mono_method_get_object (domain, dgclass->ctors [i], refclass));
2286 ves_icall_MonoGenericClass_GetFields (MonoReflectionGenericClass *type,
2287 MonoReflectionType *reflected_type)
2289 MonoGenericClass *gclass;
2290 MonoDynamicGenericClass *dgclass;
2292 MonoClass *refclass;
2296 MONO_ARCH_SAVE_REGS;
2298 gclass = type->type.type->data.generic_class;
2299 g_assert (gclass->is_dynamic);
2300 dgclass = (MonoDynamicGenericClass *) gclass;
2302 refclass = mono_class_from_mono_type (reflected_type->type);
2304 domain = mono_object_domain (type);
2305 res = mono_array_new (domain, mono_defaults.field_info_class, dgclass->count_fields);
2307 for (i = 0; i < dgclass->count_fields; i++)
2308 mono_array_set (res, gpointer, i,
2309 mono_field_get_object (domain, refclass, &dgclass->fields [i]));
2315 ves_icall_MonoGenericClass_GetProperties (MonoReflectionGenericClass *type,
2316 MonoReflectionType *reflected_type)
2318 static MonoClass *System_Reflection_PropertyInfo;
2319 MonoGenericClass *gclass;
2320 MonoDynamicGenericClass *dgclass;
2322 MonoClass *refclass;
2326 MONO_ARCH_SAVE_REGS;
2328 if (!System_Reflection_PropertyInfo)
2329 System_Reflection_PropertyInfo = mono_class_from_name (
2330 mono_defaults.corlib, "System.Reflection", "PropertyInfo");
2332 gclass = type->type.type->data.generic_class;
2333 g_assert (gclass->is_dynamic);
2334 dgclass = (MonoDynamicGenericClass *) gclass;
2336 refclass = mono_class_from_mono_type (reflected_type->type);
2338 domain = mono_object_domain (type);
2339 res = mono_array_new (domain, System_Reflection_PropertyInfo, dgclass->count_properties);
2341 for (i = 0; i < dgclass->count_properties; i++)
2342 mono_array_set (res, gpointer, i,
2343 mono_property_get_object (domain, refclass, &dgclass->properties [i]));
2349 ves_icall_MonoGenericClass_GetEvents (MonoReflectionGenericClass *type,
2350 MonoReflectionType *reflected_type)
2352 static MonoClass *System_Reflection_EventInfo;
2353 MonoGenericClass *gclass;
2354 MonoDynamicGenericClass *dgclass;
2356 MonoClass *refclass;
2360 MONO_ARCH_SAVE_REGS;
2362 if (!System_Reflection_EventInfo)
2363 System_Reflection_EventInfo = mono_class_from_name (
2364 mono_defaults.corlib, "System.Reflection", "EventInfo");
2366 gclass = type->type.type->data.generic_class;
2367 g_assert (gclass->is_dynamic);
2368 dgclass = (MonoDynamicGenericClass *) gclass;
2370 refclass = mono_class_from_mono_type (reflected_type->type);
2372 domain = mono_object_domain (type);
2373 res = mono_array_new (domain, System_Reflection_EventInfo, dgclass->count_events);
2375 for (i = 0; i < dgclass->count_events; i++)
2376 mono_array_set (res, gpointer, i,
2377 mono_event_get_object (domain, refclass, &dgclass->events [i]));
2382 static MonoReflectionMethod *
2383 ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *type)
2388 MONO_ARCH_SAVE_REGS;
2390 if (type->type->type != MONO_TYPE_MVAR)
2393 method = type->type->data.generic_param->method;
2395 klass = mono_class_from_mono_type (type->type);
2396 return mono_method_get_object (mono_object_domain (type), method, klass);
2399 static MonoReflectionDllImportAttribute*
2400 ves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)
2402 static MonoClass *DllImportAttributeClass = NULL;
2403 MonoDomain *domain = mono_domain_get ();
2404 MonoReflectionDllImportAttribute *attr;
2405 MonoImage *image = method->klass->image;
2406 MonoMethodPInvoke *piinfo = (MonoMethodPInvoke *)method;
2407 MonoTableInfo *tables = image->tables;
2408 MonoTableInfo *im = &tables [MONO_TABLE_IMPLMAP];
2409 MonoTableInfo *mr = &tables [MONO_TABLE_MODULEREF];
2410 guint32 im_cols [MONO_IMPLMAP_SIZE];
2411 guint32 scope_token;
2412 const char *import = NULL;
2413 const char *scope = NULL;
2416 if (!method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)
2419 if (!DllImportAttributeClass) {
2420 DllImportAttributeClass =
2421 mono_class_from_name (mono_defaults.corlib,
2422 "System.Runtime.InteropServices", "DllImportAttribute");
2423 g_assert (DllImportAttributeClass);
2426 if (method->klass->image->dynamic) {
2427 MonoReflectionMethodAux *method_aux =
2428 g_hash_table_lookup (
2429 ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method);
2431 import = method_aux->dllentry;
2432 scope = method_aux->dll;
2436 if (piinfo->implmap_idx) {
2437 mono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE);
2439 piinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS];
2440 import = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]);
2441 scope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME);
2442 scope = mono_metadata_string_heap (image, scope_token);
2445 flags = piinfo->piflags;
2447 attr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);
2449 attr->dll = mono_string_new (domain, scope);
2450 attr->entry_point = mono_string_new (domain, import);
2451 attr->call_conv = (flags & 0x700) >> 8;
2452 attr->charset = ((flags & 0x6) >> 1) + 1;
2453 if (attr->charset == 1)
2455 attr->exact_spelling = (flags & 0x1) != 0;
2456 attr->set_last_error = (flags & 0x40) != 0;
2457 attr->best_fit_mapping = (flags & 0x30) == 0x10;
2458 attr->throw_on_unmappable = (flags & 0x3000) == 0x1000;
2459 attr->preserve_sig = FALSE;
2464 static MonoReflectionMethod *
2465 ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
2467 MonoMethodInflated *imethod;
2469 MONO_ARCH_SAVE_REGS;
2471 if (!method->method->is_inflated) {
2472 if (mono_method_signature (method->method)->generic_param_count)
2478 imethod = (MonoMethodInflated *) method->method;
2479 if (imethod->context->gmethod && imethod->context->gmethod->reflection_info)
2480 return imethod->context->gmethod->reflection_info;
2482 return mono_method_get_object (
2483 mono_object_domain (method), imethod->declaring, NULL);
2487 ves_icall_MonoMethod_get_HasGenericParameters (MonoReflectionMethod *method)
2489 MONO_ARCH_SAVE_REGS;
2491 return mono_method_signature (method->method)->generic_param_count != 0;
2495 ves_icall_MonoMethod_get_Mono_IsInflatedMethod (MonoReflectionMethod *method)
2497 MONO_ARCH_SAVE_REGS;
2499 return method->method->is_inflated;
2503 ves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method)
2505 MONO_ARCH_SAVE_REGS;
2507 return mono_method_signature (method->method)->generic_param_count != 0;
2511 ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
2516 MONO_ARCH_SAVE_REGS;
2518 domain = mono_object_domain (method);
2520 if (method->method->is_inflated) {
2521 MonoMethodInflated *imethod = (MonoMethodInflated *) method->method;
2522 MonoGenericMethod *gmethod = imethod->context->gmethod;
2525 count = gmethod->inst->type_argc;
2526 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2528 for (i = 0; i < count; i++) {
2529 MonoType *t = gmethod->inst->type_argv [i];
2530 /* Ensure that our dummy null-owner types don't leak into userspace. */
2531 g_assert ((t->type != MONO_TYPE_VAR && t->type != MONO_TYPE_MVAR) || t->data.generic_param->owner);
2533 res, gpointer, i, mono_type_get_object (domain, t));
2540 count = mono_method_signature (method->method)->generic_param_count;
2541 res = mono_array_new (domain, mono_defaults.monotype_class, count);
2543 for (i = 0; i < count; i++) {
2544 MonoGenericParam *param = &method->method->generic_container->type_params [i];
2545 MonoClass *pklass = mono_class_from_generic_parameter (
2546 param, method->method->klass->image, TRUE);
2547 mono_array_set (res, gpointer, i,
2548 mono_type_get_object (domain, &pklass->byval_arg));
2555 ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params)
2558 * Invoke from reflection is supposed to always be a virtual call (the API
2559 * is stupid), mono_runtime_invoke_*() calls the provided method, allowing
2560 * greater flexibility.
2562 MonoMethod *m = mono_get_inflated_method (method->method);
2566 MONO_ARCH_SAVE_REGS;
2568 if (!(m->flags & METHOD_ATTRIBUTE_STATIC)) {
2570 if (!mono_object_isinst (this, m->klass))
2571 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetException"));
2572 m = mono_object_get_virtual_method (this, m);
2573 /* must pass the pointer to the value for valuetype methods */
2574 if (m->klass->valuetype)
2575 obj = mono_object_unbox (this);
2576 } else if (strcmp (m->name, ".ctor") && !m->wrapper_type)
2577 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetException"));
2580 pcount = params? mono_array_length (params): 0;
2581 if (pcount != mono_method_signature (m)->param_count)
2582 mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetParameterCountException"));
2584 if ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, ".ctor"))
2585 mono_raise_exception (mono_exception_from_name_msg (mono_defaults.corlib, "System", "MethodAccessException", "Cannot invoke constructor of an abstract class."));
2587 if (m->klass->image->assembly->ref_only)
2588 mono_raise_exception (mono_get_exception_invalid_operation ("It is illegal to invoke a method on a type loaded using the ReflectionOnly api."));
2590 if (m->klass->rank && !strcmp (m->name, ".ctor")) {
2593 guint32 *lower_bounds;
2594 pcount = mono_array_length (params);
2595 lengths = alloca (sizeof (guint32) * pcount);
2596 for (i = 0; i < pcount; ++i)
2597 lengths [i] = *(gint32*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));
2599 if (m->klass->rank == pcount) {
2600 /* Only lengths provided. */
2601 lower_bounds = NULL;
2603 g_assert (pcount == (m->klass->rank * 2));
2604 /* lower bounds are first. */
2605 lower_bounds = lengths;
2606 lengths += m->klass->rank;
2609 return (MonoObject*)mono_array_new_full (mono_object_domain (params), m->klass, lengths, lower_bounds);
2611 return mono_runtime_invoke_array (m, obj, params, NULL);
2615 ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoArray *params, MonoArray **outArgs)
2617 MonoDomain *domain = mono_object_domain (method);
2618 MonoMethod *m = method->method;
2619 MonoMethodSignature *sig = mono_method_signature (m);
2620 MonoArray *out_args;
2622 int i, j, outarg_count = 0;
2624 MONO_ARCH_SAVE_REGS;
2626 if (m->klass == mono_defaults.object_class) {
2628 if (!strcmp (m->name, "FieldGetter")) {
2629 MonoClass *k = this->vtable->klass;
2633 /* If this is a proxy, then it must be a CBO */
2634 if (k == mono_defaults.transparent_proxy_class) {
2635 MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
2636 this = tp->rp->unwrapped_server;
2638 k = this->vtable->klass;
2641 name = mono_array_get (params, MonoString *, 1);
2642 str = mono_string_to_utf8 (name);
2645 MonoClassField* field = mono_class_get_field_from_name (k, str);
2647 MonoClass *field_klass = mono_class_from_mono_type (field->type);
2648 if (field_klass->valuetype)
2649 result = mono_value_box (domain, field_klass, (char *)this + field->offset);
2651 result = *((gpointer *)((char *)this + field->offset));
2653 out_args = mono_array_new (domain, mono_defaults.object_class, 1);
2654 *outArgs = out_args;
2655 mono_array_set (out_args, gpointer, 0, result);
2663 g_assert_not_reached ();
2665 } else if (!strcmp (m->name, "FieldSetter")) {
2666 MonoClass *k = this->vtable->klass;
2671 /* If this is a proxy, then it must be a CBO */
2672 if (k == mono_defaults.transparent_proxy_class) {
2673 MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
2674 this = tp->rp->unwrapped_server;
2676 k = this->vtable->klass;
2679 name = mono_array_get (params, MonoString *, 1);
2680 str = mono_string_to_utf8 (name);
2683 MonoClassField* field = mono_class_get_field_from_name (k, str);
2685 MonoClass *field_klass = mono_class_from_mono_type (field->type);
2686 MonoObject *val = mono_array_get (params, gpointer, 2);
2688 if (field_klass->valuetype) {
2689 size = mono_type_size (field->type, &align);
2690 memcpy ((char *)this + field->offset,
2691 ((char *)val) + sizeof (MonoObject), size);
2693 *(MonoObject**)((char *)this + field->offset) = val;
2695 out_args = mono_array_new (domain, mono_defaults.object_class, 0);
2696 *outArgs = out_args;
2706 g_assert_not_reached ();
2711 for (i = 0; i < mono_array_length (params); i++) {
2712 if (sig->params [i]->byref)
2716 out_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);
2718 /* handle constructors only for objects already allocated */
2719 if (!strcmp (method->method->name, ".ctor"))
2722 /* This can be called only on MBR objects, so no need to unbox for valuetypes. */
2723 g_assert (!method->method->klass->valuetype);
2724 result = mono_runtime_invoke_array (method->method, this, params, NULL);
2726 for (i = 0, j = 0; i < mono_array_length (params); i++) {
2727 if (sig->params [i]->byref) {
2729 arg = mono_array_get (params, gpointer, i);
2730 mono_array_set (out_args, gpointer, j, arg);
2735 *outArgs = out_args;
2741 read_enum_value (char *mem, int type)
2745 return *(guint8*)mem;
2747 return *(gint8*)mem;
2749 return *(guint16*)mem;
2751 return *(gint16*)mem;
2753 return *(guint32*)mem;
2755 return *(gint32*)mem;
2757 return *(guint64*)mem;
2759 return *(gint64*)mem;
2761 g_assert_not_reached ();
2767 write_enum_value (char *mem, int type, guint64 value)
2771 case MONO_TYPE_I1: {
2777 case MONO_TYPE_I2: {
2778 guint16 *p = (void*)mem;
2783 case MONO_TYPE_I4: {
2784 guint32 *p = (void*)mem;
2789 case MONO_TYPE_I8: {
2790 guint64 *p = (void*)mem;
2795 g_assert_not_reached ();
2801 ves_icall_System_Enum_ToObject (MonoReflectionType *type, MonoObject *obj)
2804 MonoClass *enumc, *objc;
2808 MONO_ARCH_SAVE_REGS;
2810 MONO_CHECK_ARG_NULL (type);
2811 MONO_CHECK_ARG_NULL (obj);
2813 domain = mono_object_domain (type);
2814 enumc = mono_class_from_mono_type (type->type);
2815 objc = obj->vtable->klass;
2817 MONO_CHECK_ARG (obj, enumc->enumtype == TRUE);
2818 MONO_CHECK_ARG (obj, (objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 &&
2819 objc->byval_arg.type <= MONO_TYPE_U8));
2821 res = mono_object_new (domain, enumc);
2822 val = read_enum_value ((char *)obj + sizeof (MonoObject), objc->enumtype? objc->enum_basetype->type: objc->byval_arg.type);
2823 write_enum_value ((char *)res + sizeof (MonoObject), enumc->enum_basetype->type, val);
2829 ves_icall_System_Enum_get_value (MonoObject *this)
2837 MONO_ARCH_SAVE_REGS;
2842 g_assert (this->vtable->klass->enumtype);
2844 enumc = mono_class_from_mono_type (this->vtable->klass->enum_basetype);
2845 res = mono_object_new (mono_object_domain (this), enumc);
2846 dst = (char *)res + sizeof (MonoObject);
2847 src = (char *)this + sizeof (MonoObject);
2848 size = mono_class_value_size (enumc, NULL);
2850 memcpy (dst, src, size);
2856 ves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)
2858 MonoDomain *domain = mono_object_domain (type);
2859 MonoClass *enumc = mono_class_from_mono_type (type->type);
2860 guint j = 0, nvalues, crow;
2862 MonoClassField *field;
2864 MONO_ARCH_SAVE_REGS;
2866 info->utype = mono_type_get_object (domain, enumc->enum_basetype);
2867 nvalues = mono_class_num_fields (enumc) ? mono_class_num_fields (enumc) - 1 : 0;
2868 info->names = mono_array_new (domain, mono_defaults.string_class, nvalues);
2869 info->values = mono_array_new (domain, enumc, nvalues);
2873 while ((field = mono_class_get_fields (enumc, &iter))) {
2877 if (strcmp ("value__", field->name) == 0)
2879 if (mono_field_is_deleted (field))
2881 mono_array_set (info->names, gpointer, j, mono_string_new (domain, field->name));
2884 crow = mono_metadata_get_constant_index (enumc->image, mono_class_get_field_token (field), crow + 1);
2885 field->def_type = mono_metadata_decode_row_col (&enumc->image->tables [MONO_TABLE_CONSTANT], crow-1, MONO_CONSTANT_TYPE);
2886 crow = mono_metadata_decode_row_col (&enumc->image->tables [MONO_TABLE_CONSTANT], crow-1, MONO_CONSTANT_VALUE);
2887 field->data = (gpointer)mono_metadata_blob_heap (enumc->image, crow);
2891 len = mono_metadata_decode_blob_size (p, &p);
2892 switch (enumc->enum_basetype->type) {
2895 mono_array_set (info->values, gchar, j, *p);
2897 case MONO_TYPE_CHAR:
2900 mono_array_set (info->values, gint16, j, read16 (p));
2904 mono_array_set (info->values, gint32, j, read32 (p));
2908 mono_array_set (info->values, gint64, j, read64 (p));
2911 g_error ("Implement type 0x%02x in get_enum_info", enumc->enum_basetype->type);
2918 BFLAGS_IgnoreCase = 1,
2919 BFLAGS_DeclaredOnly = 2,
2920 BFLAGS_Instance = 4,
2922 BFLAGS_Public = 0x10,
2923 BFLAGS_NonPublic = 0x20,
2924 BFLAGS_FlattenHierarchy = 0x40,
2925 BFLAGS_InvokeMethod = 0x100,
2926 BFLAGS_CreateInstance = 0x200,
2927 BFLAGS_GetField = 0x400,
2928 BFLAGS_SetField = 0x800,
2929 BFLAGS_GetProperty = 0x1000,
2930 BFLAGS_SetProperty = 0x2000,
2931 BFLAGS_ExactBinding = 0x10000,
2932 BFLAGS_SuppressChangeType = 0x20000,
2933 BFLAGS_OptionalParamBinding = 0x40000
2936 static MonoReflectionField *
2937 ves_icall_Type_GetField (MonoReflectionType *type, MonoString *name, guint32 bflags)
2940 MonoClass *startklass, *klass;
2942 MonoClassField *field;
2945 int (*compare_func) (const char *s1, const char *s2) = NULL;
2946 domain = ((MonoObject *)type)->vtable->domain;
2947 klass = startklass = mono_class_from_mono_type (type->type);
2949 MONO_ARCH_SAVE_REGS;
2952 mono_raise_exception (mono_get_exception_argument_null ("name"));
2953 if (type->type->byref)
2956 compare_func = (bflags & BFLAGS_IgnoreCase) ? g_strcasecmp : strcmp;
2960 while ((field = mono_class_get_fields (klass, &iter))) {
2962 if (mono_field_is_deleted (field))
2964 if ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {
2965 if (bflags & BFLAGS_Public)
2968 if (bflags & BFLAGS_NonPublic)
2974 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
2975 if (bflags & BFLAGS_Static)
2976 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
2979 if (bflags & BFLAGS_Instance)
2986 utf8_name = mono_string_to_utf8 (name);
2988 if (compare_func (field->name, utf8_name)) {
2994 return mono_field_get_object (domain, klass, field);
2996 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3003 ves_icall_Type_GetFields_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3006 GSList *l = NULL, *tmp;
3007 MonoClass *startklass, *klass, *refklass;
3012 MonoClassField *field;
3014 MONO_ARCH_SAVE_REGS;
3016 domain = ((MonoObject *)type)->vtable->domain;
3017 if (type->type->byref)
3018 return mono_array_new (domain, mono_defaults.method_info_class, 0);
3019 klass = startklass = mono_class_from_mono_type (type->type);
3020 refklass = mono_class_from_mono_type (reftype->type);
3024 while ((field = mono_class_get_fields (klass, &iter))) {
3026 if (mono_field_is_deleted (field))
3028 if ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {
3029 if (bflags & BFLAGS_Public)
3032 if (bflags & BFLAGS_NonPublic)
3038 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
3039 if (bflags & BFLAGS_Static)
3040 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3043 if (bflags & BFLAGS_Instance)
3049 member = (MonoObject*)mono_field_get_object (domain, refklass, field);
3050 l = g_slist_prepend (l, member);
3052 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3054 len = g_slist_length (l);
3055 res = mono_array_new (domain, mono_defaults.field_info_class, len);
3057 tmp = l = g_slist_reverse (l);
3058 for (; tmp; tmp = tmp->next, ++i)
3059 mono_array_set (res, gpointer, i, tmp->data);
3065 ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
3068 GSList *l = NULL, *tmp;
3069 MonoClass *startklass, *klass, *refklass;
3075 guint32 method_slots_default [8];
3076 guint32 *method_slots;
3077 gchar *mname = NULL;
3078 int (*compare_func) (const char *s1, const char *s2) = NULL;
3080 MONO_ARCH_SAVE_REGS;
3082 domain = ((MonoObject *)type)->vtable->domain;
3083 if (type->type->byref)
3084 return mono_array_new (domain, mono_defaults.method_info_class, 0);
3085 klass = startklass = mono_class_from_mono_type (type->type);
3086 refklass = mono_class_from_mono_type (reftype->type);
3089 mname = mono_string_to_utf8 (name);
3090 compare_func = (ignore_case) ? g_strcasecmp : strcmp;
3093 mono_class_setup_vtable (klass);
3095 if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
3096 method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
3098 method_slots = method_slots_default;
3099 memset (method_slots, 0, sizeof (method_slots_default));
3102 mono_class_setup_vtable (klass);
3104 while ((method = mono_class_get_methods (klass, &iter))) {
3106 if (method->name [0] == '.' && (strcmp (method->name, ".ctor") == 0 || strcmp (method->name, ".cctor") == 0))
3108 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3109 if (bflags & BFLAGS_Public)
3112 if (bflags & BFLAGS_NonPublic)
3118 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3119 if (bflags & BFLAGS_Static)
3120 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3123 if (bflags & BFLAGS_Instance)
3131 if (compare_func (mname, method->name))
3136 if (method->slot != -1) {
3137 if (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))
3139 method_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);
3142 member = (MonoObject*)mono_method_get_object (domain, method, refklass);
3144 l = g_slist_prepend (l, member);
3147 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3151 res = mono_array_new (domain, mono_defaults.method_info_class, len);
3154 tmp = l = g_slist_reverse (l);
3156 for (; tmp; tmp = tmp->next, ++i)
3157 mono_array_set (res, gpointer, i, tmp->data);
3159 if (method_slots != method_slots_default)
3160 g_free (method_slots);
3165 ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3168 GSList *l = NULL, *tmp;
3169 static MonoClass *System_Reflection_ConstructorInfo;
3170 MonoClass *startklass, *klass, *refklass;
3175 gpointer iter = NULL;
3177 MONO_ARCH_SAVE_REGS;
3179 domain = ((MonoObject *)type)->vtable->domain;
3180 if (type->type->byref)
3181 return mono_array_new (domain, mono_defaults.method_info_class, 0);
3182 klass = startklass = mono_class_from_mono_type (type->type);
3183 refklass = mono_class_from_mono_type (reftype->type);
3186 while ((method = mono_class_get_methods (klass, &iter))) {
3188 if (strcmp (method->name, ".ctor") && strcmp (method->name, ".cctor"))
3190 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3191 if (bflags & BFLAGS_Public)
3194 if (bflags & BFLAGS_NonPublic)
3200 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3201 if (bflags & BFLAGS_Static)
3202 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3205 if (bflags & BFLAGS_Instance)
3211 member = (MonoObject*)mono_method_get_object (domain, method, refklass);
3213 l = g_slist_prepend (l, member);
3215 len = g_slist_length (l);
3216 if (!System_Reflection_ConstructorInfo)
3217 System_Reflection_ConstructorInfo = mono_class_from_name (
3218 mono_defaults.corlib, "System.Reflection", "ConstructorInfo");
3219 res = mono_array_new (domain, System_Reflection_ConstructorInfo, len);
3221 tmp = l = g_slist_reverse (l);
3222 for (; tmp; tmp = tmp->next, ++i)
3223 mono_array_set (res, gpointer, i, tmp->data);
3229 ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name, guint32 bflags, MonoBoolean ignore_case, MonoReflectionType *reftype)
3232 GSList *l = NULL, *tmp;
3233 static MonoClass *System_Reflection_PropertyInfo;
3234 MonoClass *startklass, *klass;
3241 guint32 method_slots_default [8];
3242 guint32 *method_slots;
3243 gchar *propname = NULL;
3244 int (*compare_func) (const char *s1, const char *s2) = NULL;
3247 MONO_ARCH_SAVE_REGS;
3249 if (!System_Reflection_PropertyInfo)
3250 System_Reflection_PropertyInfo = mono_class_from_name (
3251 mono_defaults.corlib, "System.Reflection", "PropertyInfo");
3253 domain = ((MonoObject *)type)->vtable->domain;
3254 if (type->type->byref)
3255 return mono_array_new (domain, System_Reflection_PropertyInfo, 0);
3256 klass = startklass = mono_class_from_mono_type (type->type);
3258 propname = mono_string_to_utf8 (name);
3259 compare_func = (ignore_case) ? g_strcasecmp : strcmp;
3262 if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
3263 method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
3265 method_slots = method_slots_default;
3266 memset (method_slots, 0, sizeof (method_slots_default));
3269 mono_class_setup_vtable (klass);
3271 while ((prop = mono_class_get_properties (klass, &iter))) {
3277 flags = method->flags;
3280 if ((prop->get && ((prop->get->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)) ||
3281 (prop->set && ((prop->set->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC))) {
3282 if (bflags & BFLAGS_Public)
3285 if (bflags & BFLAGS_NonPublic)
3291 if (flags & METHOD_ATTRIBUTE_STATIC) {
3292 if (bflags & BFLAGS_Static)
3293 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3296 if (bflags & BFLAGS_Instance)
3305 if (compare_func (propname, prop->name))
3309 if (prop->get && prop->get->slot != -1) {
3310 if (method_slots [prop->get->slot >> 5] & (1 << (prop->get->slot & 0x1f)))
3312 method_slots [prop->get->slot >> 5] |= 1 << (prop->get->slot & 0x1f);
3314 if (prop->set && prop->set->slot != -1) {
3315 if (method_slots [prop->set->slot >> 5] & (1 << (prop->set->slot & 0x1f)))
3317 method_slots [prop->set->slot >> 5] |= 1 << (prop->set->slot & 0x1f);
3320 l = g_slist_prepend (l, mono_property_get_object (domain, startklass, prop));
3323 if ((!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent)))
3327 res = mono_array_new (domain, System_Reflection_PropertyInfo, len);
3330 tmp = l = g_slist_reverse (l);
3332 for (; tmp; tmp = tmp->next, ++i)
3333 mono_array_set (res, gpointer, i, tmp->data);
3335 if (method_slots != method_slots_default)
3336 g_free (method_slots);
3340 static MonoReflectionEvent *
3341 ves_icall_MonoType_GetEvent (MonoReflectionType *type, MonoString *name, guint32 bflags)
3344 MonoClass *klass, *startklass;
3350 MONO_ARCH_SAVE_REGS;
3352 event_name = mono_string_to_utf8 (name);
3353 if (type->type->byref)
3355 klass = startklass = mono_class_from_mono_type (type->type);
3356 domain = mono_object_domain (type);
3360 while ((event = mono_class_get_events (klass, &iter))) {
3361 if (strcmp (event->name, event_name))
3364 method = event->add;
3366 method = event->remove;
3368 method = event->raise;
3370 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3371 if (!(bflags & BFLAGS_Public))
3374 if (!(bflags & BFLAGS_NonPublic))
3379 if (!(bflags & BFLAGS_NonPublic))
3382 g_free (event_name);
3383 return mono_event_get_object (domain, startklass, event);
3386 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3389 g_free (event_name);
3394 ves_icall_Type_GetEvents_internal (MonoReflectionType *type, guint32 bflags, MonoReflectionType *reftype)
3397 GSList *l = NULL, *tmp;
3398 static MonoClass *System_Reflection_EventInfo;
3399 MonoClass *startklass, *klass;
3406 MONO_ARCH_SAVE_REGS;
3408 if (!System_Reflection_EventInfo)
3409 System_Reflection_EventInfo = mono_class_from_name (
3410 mono_defaults.corlib, "System.Reflection", "EventInfo");
3412 domain = mono_object_domain (type);
3413 if (type->type->byref)
3414 return mono_array_new (domain, System_Reflection_EventInfo, 0);
3415 klass = startklass = mono_class_from_mono_type (type->type);
3419 while ((event = mono_class_get_events (klass, &iter))) {
3421 method = event->add;
3423 method = event->remove;
3425 method = event->raise;
3427 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
3428 if (bflags & BFLAGS_Public)
3431 if (bflags & BFLAGS_NonPublic)
3436 if (bflags & BFLAGS_NonPublic)
3442 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
3443 if (bflags & BFLAGS_Static)
3444 if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
3447 if (bflags & BFLAGS_Instance)
3452 if (bflags & BFLAGS_Instance)
3457 l = g_slist_prepend (l, mono_event_get_object (domain, startklass, event));
3459 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3461 len = g_slist_length (l);
3462 res = mono_array_new (domain, System_Reflection_EventInfo, len);
3465 tmp = l = g_slist_reverse (l);
3467 for (; tmp; tmp = tmp->next, ++i)
3468 mono_array_set (res, gpointer, i, tmp->data);
3473 static MonoReflectionType *
3474 ves_icall_Type_GetNestedType (MonoReflectionType *type, MonoString *name, guint32 bflags)
3477 MonoClass *startklass, *klass;
3482 MONO_ARCH_SAVE_REGS;
3484 domain = ((MonoObject *)type)->vtable->domain;
3485 if (type->type->byref)
3487 klass = startklass = mono_class_from_mono_type (type->type);
3488 str = mono_string_to_utf8 (name);
3491 for (tmpn = klass->nested_classes; tmpn; tmpn = tmpn->next) {
3493 nested = tmpn->data;
3494 if ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
3495 if (bflags & BFLAGS_Public)
3498 if (bflags & BFLAGS_NonPublic)
3503 if (strcmp (nested->name, str) == 0){
3505 return mono_type_get_object (domain, &nested->byval_arg);
3508 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
3515 ves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags)
3518 GSList *l = NULL, *tmp;
3520 MonoClass *startklass, *klass;
3526 MONO_ARCH_SAVE_REGS;
3528 domain = ((MonoObject *)type)->vtable->domain;
3529 if (type->type->byref)
3530 return mono_array_new (domain, mono_defaults.monotype_class, 0);
3531 klass = startklass = mono_class_from_mono_type (type->type);
3533 for (tmpn = klass->nested_classes; tmpn; tmpn = tmpn->next) {
3535 nested = tmpn->data;
3536 if ((nested->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_NESTED_PUBLIC) {
3537 if (bflags & BFLAGS_Public)
3540 if (bflags & BFLAGS_NonPublic)
3545 member = (MonoObject*)mono_type_get_object (domain, &nested->byval_arg);
3546 l = g_slist_prepend (l, member);
3548 len = g_slist_length (l);
3549 res = mono_array_new (domain, mono_defaults.monotype_class, len);
3551 tmp = l = g_slist_reverse (l);
3552 for (; tmp; tmp = tmp->next, ++i)
3553 mono_array_set (res, gpointer, i, tmp->data);
3558 static MonoReflectionType*
3559 ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *assembly, MonoReflectionModule *module, MonoString *name, MonoBoolean throwOnError, MonoBoolean ignoreCase)
3562 MonoType *type = NULL;
3563 MonoTypeNameParse info;
3564 gboolean type_resolve;
3566 MONO_ARCH_SAVE_REGS;
3568 /* On MS.NET, this does not fire a TypeResolve event */
3569 type_resolve = TRUE;
3570 str = mono_string_to_utf8 (name);
3571 /*g_print ("requested type %s in %s\n", str, assembly->assembly->aname.name);*/
3572 if (!mono_reflection_parse_type (str, &info)) {
3574 g_list_free (info.modifiers);
3575 g_list_free (info.nested);
3576 if (throwOnError) /* uhm: this is a parse error, though... */
3577 mono_raise_exception (mono_get_exception_type_load (name, NULL));
3578 /*g_print ("failed parse\n");*/
3582 if (module != NULL) {
3584 type = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve);
3589 if (assembly->assembly->dynamic) {
3590 /* Enumerate all modules */
3591 MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
3595 if (abuilder->modules) {
3596 for (i = 0; i < mono_array_length (abuilder->modules); ++i) {
3597 MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
3598 type = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve);
3604 if (!type && abuilder->loaded_modules) {
3605 for (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {
3606 MonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
3607 type = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve);
3614 type = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve);
3616 g_list_free (info.modifiers);
3617 g_list_free (info.nested);
3620 mono_raise_exception (mono_get_exception_type_load (name, NULL));
3621 /* g_print ("failed find\n"); */
3625 if (type->type == MONO_TYPE_CLASS) {
3626 MonoClass *klass = mono_type_get_class (type);
3627 /* need to report exceptions ? */
3628 if (throwOnError && klass->exception_type) {
3629 /* report SecurityException (or others) that occured when loading the assembly */
3630 MonoException *exc = mono_class_get_exception_for_failure (klass);
3631 mono_raise_exception (exc);
3632 } else if (klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) {
3637 /* g_print ("got it\n"); */
3638 return mono_type_get_object (mono_object_domain (assembly), type);
3642 ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly, MonoBoolean escaped)
3644 MonoDomain *domain = mono_object_domain (assembly);
3645 MonoAssembly *mass = assembly->assembly;
3646 MonoString *res = NULL;
3650 MONO_ARCH_SAVE_REGS;
3652 absolute = g_build_filename (mass->basedir, mass->image->module_name, NULL);
3654 uri = g_filename_to_uri (absolute, NULL, NULL);
3656 uri = g_strconcat ("file://", absolute, NULL);
3660 res = mono_string_new (domain, uri);
3668 ves_icall_System_Reflection_Assembly_get_global_assembly_cache (MonoReflectionAssembly *assembly)
3670 MonoAssembly *mass = assembly->assembly;
3672 MONO_ARCH_SAVE_REGS;
3674 return mass->in_gac;
3677 static MonoReflectionAssembly*
3678 ves_icall_System_Reflection_Assembly_load_with_partial_name (MonoString *mname, MonoObject *evidence)
3682 MonoImageOpenStatus status;
3684 MONO_ARCH_SAVE_REGS;
3686 name = mono_string_to_utf8 (mname);
3687 res = mono_assembly_load_with_partial_name (name, &status);
3693 return mono_assembly_get_object (mono_domain_get (), res);
3697 ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assembly)
3699 MonoDomain *domain = mono_object_domain (assembly);
3702 MONO_ARCH_SAVE_REGS;
3704 res = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image));
3710 ves_icall_System_Reflection_Assembly_get_ReflectionOnly (MonoReflectionAssembly *assembly)
3712 MONO_ARCH_SAVE_REGS;
3714 return assembly->assembly->ref_only;
3718 ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion (MonoReflectionAssembly *assembly)
3720 MonoDomain *domain = mono_object_domain (assembly);
3722 MONO_ARCH_SAVE_REGS;
3724 return mono_string_new (domain, assembly->assembly->image->version);
3727 static MonoReflectionMethod*
3728 ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *assembly)
3730 guint32 token = mono_image_get_entry_point (assembly->assembly->image);
3732 MONO_ARCH_SAVE_REGS;
3736 return mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL);
3739 static MonoReflectionModule*
3740 ves_icall_System_Reflection_Assembly_get_ManifestModule (MonoReflectionAssembly *assembly)
3742 return mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);
3746 ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly)
3748 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3749 MonoArray *result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, table->rows);
3753 MONO_ARCH_SAVE_REGS;
3755 for (i = 0; i < table->rows; ++i) {
3756 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));
3757 mono_array_set (result, gpointer, i, mono_string_new (mono_object_domain (assembly), val));
3763 create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision)
3765 static MonoClass *System_Version = NULL;
3766 static MonoMethod *create_version = NULL;
3770 if (!System_Version) {
3771 System_Version = mono_class_from_name (mono_defaults.corlib, "System", "Version");
3772 g_assert (System_Version);
3775 if (!create_version) {
3776 MonoMethodDesc *desc = mono_method_desc_new (":.ctor(int,int,int,int)", FALSE);
3777 create_version = mono_method_desc_search_in_class (desc, System_Version);
3778 g_assert (create_version);
3779 mono_method_desc_free (desc);
3785 args [3] = &revision;
3786 result = mono_object_new (domain, System_Version);
3787 mono_runtime_invoke (create_version, result, args, NULL);
3793 ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly)
3795 static MonoClass *System_Reflection_AssemblyName;
3797 MonoDomain *domain = mono_object_domain (assembly);
3799 static MonoMethod *create_culture = NULL;
3800 MonoImage *image = assembly->assembly->image;
3803 MONO_ARCH_SAVE_REGS;
3805 if (!System_Reflection_AssemblyName)
3806 System_Reflection_AssemblyName = mono_class_from_name (
3807 mono_defaults.corlib, "System.Reflection", "AssemblyName");
3809 t = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];
3812 result = mono_array_new (domain, System_Reflection_AssemblyName, count);
3815 MonoMethodDesc *desc = mono_method_desc_new (
3816 "System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
3817 create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
3818 g_assert (create_culture);
3819 mono_method_desc_free (desc);
3822 for (i = 0; i < count; i++) {
3823 MonoReflectionAssemblyName *aname;
3824 guint32 cols [MONO_ASSEMBLYREF_SIZE];
3826 mono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);
3828 aname = (MonoReflectionAssemblyName *) mono_object_new (
3829 domain, System_Reflection_AssemblyName);
3831 aname->name = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME]));
3833 aname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION];
3834 aname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION];
3835 aname->build = cols [MONO_ASSEMBLYREF_BUILD_NUMBER];
3836 aname->revision = cols [MONO_ASSEMBLYREF_REV_NUMBER];
3837 aname->flags = cols [MONO_ASSEMBLYREF_FLAGS];
3838 aname->versioncompat = 1; /* SameMachine (default) */
3839 aname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */
3840 aname->version = create_version (domain, aname->major, aname->minor, aname->build, aname->revision);
3842 if (create_culture) {
3844 args [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));
3845 aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL);
3848 if (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {
3849 const gchar *pkey_ptr = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLYREF_PUBLIC_KEY]);
3850 guint32 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
3852 if ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {
3853 /* public key token isn't copied - the class library will
3854 automatically generate it from the public key if required */
3855 aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
3856 memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
3858 aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
3859 memcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len);
3863 /* note: this function doesn't return the codebase on purpose (i.e. it can
3864 be used under partial trust as path information isn't present). */
3866 mono_array_set (result, gpointer, i, aname);
3877 foreach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)
3879 MonoString *name = mono_string_new (mono_object_domain (info->res), key);
3881 mono_array_set (info->res, gpointer, info->idx, name);
3886 ves_icall_System_Reflection_Assembly_GetNamespaces (MonoReflectionAssembly *assembly)
3888 MonoImage *img = assembly->assembly->image;
3892 MONO_ARCH_SAVE_REGS;
3894 res = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, g_hash_table_size (img->name_cache));
3897 g_hash_table_foreach (img->name_cache, (GHFunc)foreach_namespace, &info);
3902 /* move this in some file in mono/util/ */
3904 g_concat_dir_and_file (const char *dir, const char *file)
3906 g_return_val_if_fail (dir != NULL, NULL);
3907 g_return_val_if_fail (file != NULL, NULL);
3910 * If the directory name doesn't have a / on the end, we need
3911 * to add one so we get a proper path to the file
3913 if (dir [strlen(dir) - 1] != G_DIR_SEPARATOR)
3914 return g_strconcat (dir, G_DIR_SEPARATOR_S, file, NULL);
3916 return g_strconcat (dir, file, NULL);
3920 ves_icall_System_Reflection_Assembly_GetManifestResourceInternal (MonoReflectionAssembly *assembly, MonoString *name, gint32 *size, MonoReflectionModule **ref_module)
3922 char *n = mono_string_to_utf8 (name);
3923 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3925 guint32 cols [MONO_MANIFEST_SIZE];
3926 guint32 impl, file_idx;
3930 MONO_ARCH_SAVE_REGS;
3932 for (i = 0; i < table->rows; ++i) {
3933 mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);
3934 val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);
3935 if (strcmp (val, n) == 0)
3939 if (i == table->rows)
3942 impl = cols [MONO_MANIFEST_IMPLEMENTATION];
3945 * this code should only be called after obtaining the
3946 * ResourceInfo and handling the other cases.
3948 g_assert ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_FILE);
3949 file_idx = impl >> MONO_IMPLEMENTATION_BITS;
3951 module = mono_image_load_file_for_image (assembly->assembly->image, file_idx);
3956 module = assembly->assembly->image;
3958 *ref_module = mono_module_get_object (mono_domain_get (), module);
3960 return (void*)mono_image_get_resource (module, cols [MONO_MANIFEST_OFFSET], (guint32*)size);
3964 ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoManifestResourceInfo *info)
3966 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_MANIFESTRESOURCE];
3968 guint32 cols [MONO_MANIFEST_SIZE];
3969 guint32 file_cols [MONO_FILE_SIZE];
3973 MONO_ARCH_SAVE_REGS;
3975 n = mono_string_to_utf8 (name);
3976 for (i = 0; i < table->rows; ++i) {
3977 mono_metadata_decode_row (table, i, cols, MONO_MANIFEST_SIZE);
3978 val = mono_metadata_string_heap (assembly->assembly->image, cols [MONO_MANIFEST_NAME]);
3979 if (strcmp (val, n) == 0)
3983 if (i == table->rows)
3986 if (!cols [MONO_MANIFEST_IMPLEMENTATION]) {
3987 info->location = RESOURCE_LOCATION_EMBEDDED | RESOURCE_LOCATION_IN_MANIFEST;
3990 switch (cols [MONO_MANIFEST_IMPLEMENTATION] & MONO_IMPLEMENTATION_MASK) {
3991 case MONO_IMPLEMENTATION_FILE:
3992 i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
3993 table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
3994 mono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);
3995 val = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);
3996 info->filename = mono_string_new (mono_object_domain (assembly), val);
3997 if (file_cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)
4000 info->location = RESOURCE_LOCATION_EMBEDDED;
4003 case MONO_IMPLEMENTATION_ASSEMBLYREF:
4004 i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
4005 mono_assembly_load_reference (assembly->assembly->image, i - 1);
4006 if (assembly->assembly->image->references [i - 1] == (gpointer)-1) {
4007 char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i - 1, assembly->assembly->image->name);
4008 MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);
4010 mono_raise_exception (ex);
4012 info->assembly = mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]);
4014 /* Obtain info recursively */
4015 ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);
4016 info->location |= RESOURCE_LOCATION_ANOTHER_ASSEMBLY;
4019 case MONO_IMPLEMENTATION_EXP_TYPE:
4020 g_assert_not_reached ();
4029 ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *assembly, MonoString *name, MonoBoolean resource_modules)
4031 MonoTableInfo *table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
4032 MonoArray *result = NULL;
4037 MONO_ARCH_SAVE_REGS;
4039 /* check hash if needed */
4041 n = mono_string_to_utf8 (name);
4042 for (i = 0; i < table->rows; ++i) {
4043 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
4044 if (strcmp (val, n) == 0) {
4047 n = g_concat_dir_and_file (assembly->assembly->basedir, val);
4048 fn = mono_string_new (mono_object_domain (assembly), n);
4050 return (MonoObject*)fn;
4058 for (i = 0; i < table->rows; ++i) {
4059 if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA))
4063 result = mono_array_new (mono_object_domain (assembly), mono_defaults.string_class, count);
4066 for (i = 0; i < table->rows; ++i) {
4067 if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
4068 val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
4069 n = g_concat_dir_and_file (assembly->assembly->basedir, val);
4070 mono_array_set (result, gpointer, count, mono_string_new (mono_object_domain (assembly), n));
4075 return (MonoObject*)result;
4079 ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly *assembly)
4081 MonoDomain *domain = mono_domain_get();
4084 int i, j, file_count = 0;
4085 MonoImage **modules;
4086 guint32 module_count, real_module_count;
4087 MonoTableInfo *table;
4089 g_assert (assembly->assembly->image != NULL);
4091 if (assembly->assembly->dynamic) {
4092 MonoReflectionAssemblyBuilder *assemblyb = (MonoReflectionAssemblyBuilder*)assembly;
4094 if (assemblyb->modules)
4095 module_count = mono_array_length (assemblyb->modules);
4098 real_module_count = module_count;
4100 modules = g_new0 (MonoImage*, module_count);
4101 if (assemblyb->modules) {
4102 for (i = 0; i < mono_array_length (assemblyb->modules); ++i) {
4104 mono_array_get (assemblyb->modules, MonoReflectionModuleBuilder*, i)->module.image;
4109 table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
4110 file_count = table->rows;
4112 modules = assembly->assembly->image->modules;
4113 module_count = assembly->assembly->image->module_count;
4115 real_module_count = 0;
4116 for (i = 0; i < module_count; ++i)
4118 real_module_count ++;
4121 klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Module");
4122 res = mono_array_new (domain, klass, 1 + real_module_count + file_count);
4124 mono_array_set (res, gpointer, 0, mono_module_get_object (domain, assembly->assembly->image));
4126 for (i = 0; i < module_count; ++i)
4128 mono_array_set (res, gpointer, j, mono_module_get_object (domain, modules[i]));
4132 for (i = 0; i < file_count; ++i, ++j)
4133 mono_array_set (res, gpointer, j, mono_module_file_get_object (domain, assembly->assembly->image, i));
4135 if (assembly->assembly->dynamic)
4141 static MonoReflectionMethod*
4142 ves_icall_GetCurrentMethod (void)
4144 MonoMethod *m = mono_method_get_last_managed ();
4146 MONO_ARCH_SAVE_REGS;
4148 return mono_method_get_object (mono_domain_get (), m, NULL);
4151 static MonoReflectionMethod*
4152 ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal (MonoMethod *method)
4154 return mono_method_get_object (mono_domain_get (), method, NULL);
4157 static MonoReflectionMethodBody*
4158 ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)
4160 return mono_method_body_get_object (mono_domain_get (), method);
4163 static MonoReflectionAssembly*
4164 ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
4166 MonoMethod *m = mono_method_get_last_managed ();
4168 MONO_ARCH_SAVE_REGS;
4170 return mono_assembly_get_object (mono_domain_get (), m->klass->image->assembly);
4174 static MonoReflectionAssembly*
4175 ves_icall_System_Reflection_Assembly_GetEntryAssembly (void)
4177 MonoDomain* domain = mono_domain_get ();
4179 MONO_ARCH_SAVE_REGS;
4181 if (!domain->entry_assembly)
4184 return mono_assembly_get_object (domain, domain->entry_assembly);
4187 static MonoReflectionAssembly*
4188 ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
4190 MonoMethod *m = mono_method_get_last_managed ();
4191 MonoMethod *dest = m;
4193 MONO_ARCH_SAVE_REGS;
4195 mono_stack_walk_no_il (get_caller, &dest);
4198 return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
4202 ves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full_name,
4203 gboolean assembly_qualified)
4205 MonoDomain *domain = mono_object_domain (object);
4206 MonoTypeNameFormat format;
4210 MONO_ARCH_SAVE_REGS;
4212 format = assembly_qualified ?
4213 MONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED :
4214 MONO_TYPE_NAME_FORMAT_FULL_NAME;
4216 format = MONO_TYPE_NAME_FORMAT_REFLECTION;
4218 name = mono_type_get_name_full (object->type, format);
4222 if (full_name && (object->type->type == MONO_TYPE_VAR || object->type->type == MONO_TYPE_MVAR))
4225 res = mono_string_new (domain, name);
4232 fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute, gboolean by_default_version)
4234 static MonoMethod *create_culture = NULL;
4237 const char *pkey_ptr;
4240 MONO_ARCH_SAVE_REGS;
4242 aname->name = mono_string_new (domain, name->name);
4243 aname->major = name->major;
4244 aname->minor = name->minor;
4245 aname->build = name->build;
4246 aname->revision = name->revision;
4247 aname->hashalg = name->hash_alg;
4248 if (by_default_version)
4249 aname->version = create_version (domain, name->major, name->minor, name->build, name->revision);
4251 codebase = g_filename_to_uri (absolute, NULL, NULL);
4253 aname->codebase = mono_string_new (domain, codebase);
4257 if (!create_culture) {
4258 MonoMethodDesc *desc = mono_method_desc_new ("System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
4259 create_culture = mono_method_desc_search_in_image (desc, mono_defaults.corlib);
4260 g_assert (create_culture);
4261 mono_method_desc_free (desc);
4264 if (name->culture) {
4265 args [0] = mono_string_new (domain, name->culture);
4266 aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL);
4269 if (name->public_key) {
4270 pkey_ptr = (char*)name->public_key;
4271 pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
4273 aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
4274 memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
4277 /* MonoAssemblyName keeps the public key token as an hexadecimal string */
4278 if (name->public_key_token [0]) {
4282 aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, 8);
4283 p = mono_array_addr (aname->keyToken, char, 0);
4285 for (i = 0, j = 0; i < 8; i++) {
4286 *p = g_ascii_xdigit_value (name->public_key_token [j++]) << 4;
4287 *p |= g_ascii_xdigit_value (name->public_key_token [j++]);
4294 ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)
4298 MONO_ARCH_SAVE_REGS;
4300 absolute = g_build_filename (assembly->assembly->basedir, assembly->assembly->image->module_name, NULL);
4302 fill_reflection_assembly_name (mono_object_domain (assembly), aname,
4303 &assembly->assembly->aname, absolute, TRUE);
4309 ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)
4312 MonoImageOpenStatus status = MONO_IMAGE_OK;
4315 MonoAssemblyName name;
4317 MONO_ARCH_SAVE_REGS;
4319 filename = mono_string_to_utf8 (fname);
4321 image = mono_image_open (filename, &status);
4327 exc = mono_get_exception_file_not_found (fname);
4328 mono_raise_exception (exc);
4331 res = mono_assembly_fill_assembly_name (image, &name);
4333 mono_image_close (image);
4335 mono_raise_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest"));
4338 fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename, TRUE);
4341 mono_image_close (image);
4345 ves_icall_System_Reflection_Assembly_LoadPermissions (MonoReflectionAssembly *assembly,
4346 char **minimum, guint32 *minLength, char **optional, guint32 *optLength, char **refused, guint32 *refLength)
4348 MonoBoolean result = FALSE;
4349 MonoDeclSecurityEntry entry;
4351 /* SecurityAction.RequestMinimum */
4352 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQMIN, &entry)) {
4353 *minimum = entry.blob;
4354 *minLength = entry.size;
4357 /* SecurityAction.RequestOptional */
4358 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQOPT, &entry)) {
4359 *optional = entry.blob;
4360 *optLength = entry.size;
4363 /* SecurityAction.RequestRefuse */
4364 if (mono_declsec_get_assembly_action (assembly->assembly, SECURITY_ACTION_REQREFUSE, &entry)) {
4365 *refused = entry.blob;
4366 *refLength = entry.size;
4374 mono_module_get_types (MonoDomain *domain, MonoImage *image,
4375 MonoBoolean exportedOnly)
4379 MonoTableInfo *tdef = &image->tables [MONO_TABLE_TYPEDEF];
4381 guint32 attrs, visibility;
4383 /* we start the count from 1 because we skip the special type <Module> */
4386 for (i = 1; i < tdef->rows; ++i) {
4387 attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);
4388 visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;
4389 if (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)
4393 count = tdef->rows - 1;
4395 res = mono_array_new (domain, mono_defaults.monotype_class, count);
4397 for (i = 1; i < tdef->rows; ++i) {
4398 attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS);
4399 visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;
4400 if (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) {
4401 klass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF);
4402 mono_array_set (res, gpointer, count, mono_type_get_object (domain, &klass->byval_arg));
4411 ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)
4413 MonoArray *res = NULL;
4414 MonoImage *image = NULL;
4415 MonoTableInfo *table = NULL;
4419 MONO_ARCH_SAVE_REGS;
4421 domain = mono_object_domain (assembly);
4423 if (assembly->assembly->dynamic) {
4424 MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
4425 if (abuilder->modules) {
4426 for (i = 0; i < mono_array_length(abuilder->modules); i++) {
4427 MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
4431 MonoArray *append = mb->types;
4432 if (mono_array_length (append) > 0) {
4435 len1 = mono_array_length (res);
4436 len2 = mono_array_length (append);
4437 new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4438 memcpy (mono_array_addr (new, MonoReflectionType*, 0),
4439 mono_array_addr (res, MonoReflectionType*, 0),
4440 len1 * sizeof (MonoReflectionType*));
4441 memcpy (mono_array_addr (new, MonoReflectionType*, len1),
4442 mono_array_addr (append, MonoReflectionType*, 0),
4443 len2 * sizeof (MonoReflectionType*));
4450 * Replace TypeBuilders with the created types to be compatible
4454 for (i = 0; i < mono_array_length (res); ++i) {
4455 MonoReflectionTypeBuilder *tb = mono_array_get (res, MonoReflectionTypeBuilder*, i);
4457 mono_array_set (res, MonoReflectionType*, i, tb->created);
4462 if (abuilder->loaded_modules)
4463 for (i = 0; i < mono_array_length(abuilder->loaded_modules); i++) {
4464 MonoReflectionModule *rm = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
4466 res = mono_module_get_types (domain, rm->image, exportedOnly);
4468 MonoArray *append = mono_module_get_types (domain, rm->image, exportedOnly);
4469 if (mono_array_length (append) > 0) {
4472 len1 = mono_array_length (res);
4473 len2 = mono_array_length (append);
4474 new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4475 memcpy (mono_array_addr (new, MonoReflectionType*, 0),
4476 mono_array_addr (res, MonoReflectionType*, 0),
4477 len1 * sizeof (MonoReflectionType*));
4478 memcpy (mono_array_addr (new, MonoReflectionType*, len1),
4479 mono_array_addr (append, MonoReflectionType*, 0),
4480 len2 * sizeof (MonoReflectionType*));
4487 image = assembly->assembly->image;
4488 table = &image->tables [MONO_TABLE_FILE];
4489 res = mono_module_get_types (domain, image, exportedOnly);
4491 /* Append data from all modules in the assembly */
4492 for (i = 0; i < table->rows; ++i) {
4493 if (!(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
4494 MonoImage *loaded_image = mono_assembly_load_module (image->assembly, i + 1);
4496 MonoArray *res2 = mono_module_get_types (domain, loaded_image, exportedOnly);
4497 /* Append the new types to the end of the array */
4498 if (mono_array_length (res2) > 0) {
4502 len1 = mono_array_length (res);
4503 len2 = mono_array_length (res2);
4504 res3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
4505 memcpy (mono_array_addr (res3, MonoReflectionType*, 0),
4506 mono_array_addr (res, MonoReflectionType*, 0),
4507 len1 * sizeof (MonoReflectionType*));
4508 memcpy (mono_array_addr (res3, MonoReflectionType*, len1),
4509 mono_array_addr (res2, MonoReflectionType*, 0),
4510 len2 * sizeof (MonoReflectionType*));
4517 if (mono_is_security_manager_active ()) {
4518 /* the ReflectionTypeLoadException must have all the types (Types property),
4519 * NULL replacing types which throws an exception. The LoaderException must
4520 * contains all exceptions for NULL items.
4523 guint32 len = mono_array_length (res);
4526 for (i = 0; i < len; i++) {
4527 MonoReflectionType *t = mono_array_get (res, gpointer, i);
4528 MonoClass *klass = mono_type_get_class (t->type);
4529 if ((klass != NULL) && klass->exception_type) {
4530 /* keep the class in the list */
4531 list = g_list_append (list, klass);
4532 /* and replace Type with NULL */
4533 mono_array_set (res, gpointer, i, NULL);
4539 MonoException *exc = NULL;
4540 int length = g_list_length (list);
4542 MonoArray *exl = mono_array_new (domain, mono_defaults.exception_class, length);
4543 for (i = 0, tmp = list; i < length; i++, tmp = tmp->next) {
4544 MonoException *exc = mono_class_get_exception_for_failure (tmp->data);
4545 mono_array_set (exl, gpointer, i, exc);
4550 exc = mono_get_exception_reflection_type_load (res, exl);
4551 mono_raise_exception (exc);
4559 ves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName *name, MonoString *assname)
4561 MonoAssemblyName aname;
4562 MonoDomain *domain = mono_object_domain (name);
4564 gboolean is_version_defined;
4566 val = mono_string_to_utf8 (assname);
4567 if (!mono_assembly_name_parse_full (val, &aname, TRUE, &is_version_defined))
4570 fill_reflection_assembly_name (domain, name, &aname, "", is_version_defined);
4572 mono_assembly_name_free (&aname);
4573 g_free ((guint8*) aname.public_key);
4579 static MonoReflectionType*
4580 ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)
4582 MonoDomain *domain = mono_object_domain (module);
4585 MONO_ARCH_SAVE_REGS;
4587 g_assert (module->image);
4589 if (module->image->dynamic && ((MonoDynamicImage*)(module->image))->initial_image)
4590 /* These images do not have a global type */
4593 klass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF);
4594 return mono_type_get_object (domain, &klass->byval_arg);
4598 ves_icall_System_Reflection_Module_Close (MonoReflectionModule *module)
4600 /*if (module->image)
4601 mono_image_close (module->image);*/
4605 ves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module)
4607 MonoDomain *domain = mono_object_domain (module);
4609 MONO_ARCH_SAVE_REGS;
4611 g_assert (module->image);
4612 return mono_string_new (domain, module->image->guid);
4616 ves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)
4618 if (image->dynamic) {
4619 MonoDynamicImage *dyn = (MonoDynamicImage*)image;
4620 *pe_kind = dyn->pe_kind;
4621 *machine = dyn->machine;
4624 *pe_kind = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags & 0x3;
4625 *machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;
4630 ves_icall_System_Reflection_Module_get_MDStreamVersion (MonoReflectionModule *module)
4632 MonoImage *image = module->image;
4635 mono_raise_exception (mono_get_exception_not_supported (""));
4637 return (image->md_version_major << 16) | (image->md_version_minor);
4641 ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)
4643 MONO_ARCH_SAVE_REGS;
4646 return mono_array_new (mono_object_domain (module), mono_defaults.monotype_class, 0);
4648 return mono_module_get_types (mono_object_domain (module), module->image, FALSE);
4652 mono_metadata_memberref_is_method (MonoImage *image, guint32 token)
4654 guint32 cols [MONO_MEMBERREF_SIZE];
4656 mono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], mono_metadata_token_index (token) - 1, cols, MONO_MEMBERREF_SIZE);
4657 sig = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);
4658 mono_metadata_decode_blob_size (sig, &sig);
4659 return (*sig != 0x6);
4663 ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4666 int table = mono_metadata_token_table (token);
4667 int index = mono_metadata_token_index (token);
4669 *error = ResolveTokenError_Other;
4671 /* Validate token */
4672 if ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) &&
4673 (table != MONO_TABLE_TYPESPEC)) {
4674 *error = ResolveTokenError_BadTable;
4679 return mono_lookup_dynamic_token (image, token);
4681 if ((index <= 0) || (index > image->tables [table].rows)) {
4682 *error = ResolveTokenError_OutOfRange;
4686 klass = mono_class_get (image, token);
4688 return &klass->byval_arg;
4694 ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4696 int table = mono_metadata_token_table (token);
4697 int index = mono_metadata_token_index (token);
4699 *error = ResolveTokenError_Other;
4701 /* Validate token */
4702 if ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) &&
4703 (table != MONO_TABLE_MEMBERREF)) {
4704 *error = ResolveTokenError_BadTable;
4709 /* FIXME: validate memberref token type */
4710 return mono_lookup_dynamic_token (image, token);
4712 if ((index <= 0) || (index > image->tables [table].rows)) {
4713 *error = ResolveTokenError_OutOfRange;
4716 if ((table == MONO_TABLE_MEMBERREF) && (!mono_metadata_memberref_is_method (image, token))) {
4717 *error = ResolveTokenError_BadTable;
4721 return mono_get_method (image, token, NULL);
4725 ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4727 int index = mono_metadata_token_index (token);
4729 *error = ResolveTokenError_Other;
4731 /* Validate token */
4732 if (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {
4733 *error = ResolveTokenError_BadTable;
4738 return mono_lookup_dynamic_token (image, token);
4740 if ((index <= 0) || (index >= image->heap_us.size)) {
4741 *error = ResolveTokenError_OutOfRange;
4745 /* FIXME: What to do if the index points into the middle of a string ? */
4747 return mono_ldstr (mono_domain_get (), image, index);
4750 static MonoClassField*
4751 ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4754 int table = mono_metadata_token_table (token);
4755 int index = mono_metadata_token_index (token);
4757 *error = ResolveTokenError_Other;
4759 /* Validate token */
4760 if ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {
4761 *error = ResolveTokenError_BadTable;
4766 /* FIXME: validate memberref token type */
4767 return mono_lookup_dynamic_token (image, token);
4769 if ((index <= 0) || (index > image->tables [table].rows)) {
4770 *error = ResolveTokenError_OutOfRange;
4773 if ((table == MONO_TABLE_MEMBERREF) && (mono_metadata_memberref_is_method (image, token))) {
4774 *error = ResolveTokenError_BadTable;
4778 return mono_field_from_token (image, token, &klass, NULL);
4783 ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
4785 int table = mono_metadata_token_table (token);
4787 *error = ResolveTokenError_Other;
4790 case MONO_TABLE_TYPEDEF:
4791 case MONO_TABLE_TYPEREF:
4792 case MONO_TABLE_TYPESPEC: {
4793 MonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, error);
4795 return (MonoObject*)mono_type_get_object (mono_domain_get (), t);
4799 case MONO_TABLE_METHOD:
4800 case MONO_TABLE_METHODSPEC: {
4801 MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
4803 return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
4807 case MONO_TABLE_FIELD: {
4808 MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
4810 return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
4814 case MONO_TABLE_MEMBERREF:
4815 if (mono_metadata_memberref_is_method (image, token)) {
4816 MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
4818 return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
4823 MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
4825 return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
4832 *error = ResolveTokenError_BadTable;
4838 static MonoReflectionType*
4839 ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, MonoString *smodifiers)
4842 int isbyref = 0, rank;
4843 char *str = mono_string_to_utf8 (smodifiers);
4846 MONO_ARCH_SAVE_REGS;
4848 klass = mono_class_from_mono_type (tb->type.type);
4850 /* logic taken from mono_reflection_parse_type(): keep in sync */
4854 if (isbyref) { /* only one level allowed by the spec */
4861 return mono_type_get_object (mono_object_domain (tb), &klass->this_arg);
4864 klass = mono_ptr_class_get (&klass->byval_arg);
4865 mono_class_init (klass);
4876 else if (*p != '*') { /* '*' means unknown lower bound */
4887 klass = mono_array_class_get (klass, rank);
4888 mono_class_init (klass);
4895 return mono_type_get_object (mono_object_domain (tb), &klass->byval_arg);
4899 ves_icall_Type_IsArrayImpl (MonoReflectionType *t)
4904 MONO_ARCH_SAVE_REGS;
4907 res = !type->byref && (type->type == MONO_TYPE_ARRAY || type->type == MONO_TYPE_SZARRAY);
4912 static MonoReflectionType *
4913 ves_icall_Type_make_array_type (MonoReflectionType *type, int rank)
4915 MonoClass *klass, *aklass;
4917 MONO_ARCH_SAVE_REGS;
4919 klass = mono_class_from_mono_type (type->type);
4920 aklass = mono_array_class_get (klass, rank);
4922 return mono_type_get_object (mono_object_domain (type), &aklass->byval_arg);
4925 static MonoReflectionType *
4926 ves_icall_Type_make_byref_type (MonoReflectionType *type)
4930 MONO_ARCH_SAVE_REGS;
4932 klass = mono_class_from_mono_type (type->type);
4934 return mono_type_get_object (mono_object_domain (type), &klass->this_arg);
4937 static MonoReflectionType *
4938 ves_icall_Type_MakePointerType (MonoReflectionType *type)
4942 MONO_ARCH_SAVE_REGS;
4944 pklass = mono_ptr_class_get (type->type);
4946 return mono_type_get_object (mono_object_domain (type), &pklass->byval_arg);
4950 ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target,
4951 MonoReflectionMethod *info)
4953 MonoClass *delegate_class = mono_class_from_mono_type (type->type);
4954 MonoObject *delegate;
4957 MONO_ARCH_SAVE_REGS;
4959 mono_assert (delegate_class->parent == mono_defaults.multicastdelegate_class);
4961 delegate = mono_object_new (mono_object_domain (type), delegate_class);
4963 func = mono_compile_method (info->method);
4965 mono_delegate_ctor (delegate, target, func);
4971 ves_icall_System_Delegate_FreeTrampoline (MonoDelegate *this)
4974 Delegates have a finalizer only when needed, now.
4975 mono_delegate_free_ftnptr (this);*/
4979 * Magic number to convert a time which is relative to
4980 * Jan 1, 1970 into a value which is relative to Jan 1, 0001.
4982 #define EPOCH_ADJUST ((guint64)62135596800LL)
4985 * Magic number to convert FILETIME base Jan 1, 1601 to DateTime - base Jan, 1, 0001
4987 #define FILETIME_ADJUST ((guint64)504911232000000000LL)
4990 * This returns Now in UTC
4993 ves_icall_System_DateTime_GetNow (void)
4995 #ifdef PLATFORM_WIN32
4999 GetSystemTime (&st);
5000 SystemTimeToFileTime (&st, &ft);
5001 return (gint64) FILETIME_ADJUST + ((((gint64)ft.dwHighDateTime)<<32) | ft.dwLowDateTime);
5003 /* FIXME: put this in io-layer and call it GetLocalTime */
5007 MONO_ARCH_SAVE_REGS;
5009 if (gettimeofday (&tv, NULL) == 0) {
5010 res = (((gint64)tv.tv_sec + EPOCH_ADJUST)* 1000000 + tv.tv_usec)*10;
5013 /* fixme: raise exception */
5018 #ifdef PLATFORM_WIN32
5019 /* convert a SYSTEMTIME which is of the form "last thursday in october" to a real date */
5021 convert_to_absolute_date(SYSTEMTIME *date)
5023 #define IS_LEAP(y) ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0))
5024 static int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
5025 static int leap_days_in_month[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
5026 /* from the calendar FAQ */
5027 int a = (14 - date->wMonth) / 12;
5028 int y = date->wYear - a;
5029 int m = date->wMonth + 12 * a - 2;
5030 int d = (1 + y + y/4 - y/100 + y/400 + (31*m)/12) % 7;
5032 /* d is now the day of the week for the first of the month (0 == Sunday) */
5034 int day_of_week = date->wDayOfWeek;
5036 /* set day_in_month to the first day in the month which falls on day_of_week */
5037 int day_in_month = 1 + (day_of_week - d);
5038 if (day_in_month <= 0)
5041 /* wDay is 1 for first weekday in month, 2 for 2nd ... 5 means last - so work that out allowing for days in the month */
5042 date->wDay = day_in_month + (date->wDay - 1) * 7;
5043 if (date->wDay > (IS_LEAP(date->wYear) ? leap_days_in_month[date->wMonth - 1] : days_in_month[date->wMonth - 1]))
5048 #ifndef PLATFORM_WIN32
5050 * Return's the offset from GMT of a local time.
5052 * tm is a local time
5053 * t is the same local time as seconds.
5056 gmt_offset(struct tm *tm, time_t t)
5058 #if defined (HAVE_TM_GMTOFF)
5059 return tm->tm_gmtoff;
5064 g.tm_isdst = tm->tm_isdst;
5066 return (int)difftime(t, t2);
5071 * This is heavily based on zdump.c from glibc 2.2.
5073 * * data[0]: start of daylight saving time (in DateTime ticks).
5074 * * data[1]: end of daylight saving time (in DateTime ticks).
5075 * * data[2]: utcoffset (in TimeSpan ticks).
5076 * * data[3]: additional offset when daylight saving (in TimeSpan ticks).
5077 * * name[0]: name of this timezone when not daylight saving.
5078 * * name[1]: name of this timezone when daylight saving.
5080 * FIXME: This only works with "standard" Unix dates (years between 1900 and 2100) while
5081 * the class library allows years between 1 and 9999.
5083 * Returns true on success and zero on failure.
5086 ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)
5088 #ifndef PLATFORM_WIN32
5089 MonoDomain *domain = mono_domain_get ();
5090 struct tm start, tt;
5094 int is_daylight = 0, day;
5097 MONO_ARCH_SAVE_REGS;
5099 MONO_CHECK_ARG_NULL (data);
5100 MONO_CHECK_ARG_NULL (names);
5102 (*data) = mono_array_new (domain, mono_defaults.int64_class, 4);
5103 (*names) = mono_array_new (domain, mono_defaults.string_class, 2);
5106 * no info is better than crashing: we'll need our own tz data
5107 * to make this work properly, anyway. The range is probably
5108 * reduced to 1970 .. 2037 because that is what mktime is
5109 * guaranteed to support (we get into an infinite loop
5113 memset (&start, 0, sizeof (start));
5116 start.tm_year = year-1900;
5118 t = mktime (&start);
5120 if ((year < 1970) || (year > 2037) || (t == -1)) {
5122 tt = *localtime (&t);
5123 strftime (tzone, sizeof (tzone), "%Z", &tt);
5124 mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
5125 mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
5129 gmtoff = gmt_offset (&start, t);
5131 /* For each day of the year, calculate the tm_gmtoff. */
5132 for (day = 0; day < 365; day++) {
5135 tt = *localtime (&t);
5137 /* Daylight saving starts or ends here. */
5138 if (gmt_offset (&tt, t) != gmtoff) {
5142 /* Try to find the exact hour when daylight saving starts/ends. */
5146 tt1 = *localtime (&t1);
5147 } while (gmt_offset (&tt1, t1) != gmtoff);
5149 /* Try to find the exact minute when daylight saving starts/ends. */
5152 tt1 = *localtime (&t1);
5153 } while (gmt_offset (&tt1, t1) == gmtoff);
5155 strftime (tzone, sizeof (tzone), "%Z", &tt);
5157 /* Write data, if we're already in daylight saving, we're done. */
5159 mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
5160 mono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
5163 mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
5164 mono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
5168 /* This is only set once when we enter daylight saving. */
5169 mono_array_set ((*data), gint64, 2, (gint64)gmtoff * 10000000L);
5170 mono_array_set ((*data), gint64, 3, (gint64)(gmt_offset (&tt, t) - gmtoff) * 10000000L);
5172 gmtoff = gmt_offset (&tt, t);
5177 strftime (tzone, sizeof (tzone), "%Z", &tt);
5178 mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
5179 mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
5180 mono_array_set ((*data), gint64, 0, 0);
5181 mono_array_set ((*data), gint64, 1, 0);
5182 mono_array_set ((*data), gint64, 2, (gint64) gmtoff * 10000000L);
5183 mono_array_set ((*data), gint64, 3, 0);
5188 MonoDomain *domain = mono_domain_get ();
5189 TIME_ZONE_INFORMATION tz_info;
5194 tz_id = GetTimeZoneInformation (&tz_info);
5195 if (tz_id == TIME_ZONE_ID_INVALID)
5198 MONO_CHECK_ARG_NULL (data);
5199 MONO_CHECK_ARG_NULL (names);
5201 (*data) = mono_array_new (domain, mono_defaults.int64_class, 4);
5202 (*names) = mono_array_new (domain, mono_defaults.string_class, 2);
5204 for (i = 0; i < 32; ++i)
5205 if (!tz_info.DaylightName [i])
5207 mono_array_set ((*names), gpointer, 1, mono_string_new_utf16 (domain, tz_info.DaylightName, i));
5208 for (i = 0; i < 32; ++i)
5209 if (!tz_info.StandardName [i])
5211 mono_array_set ((*names), gpointer, 0, mono_string_new_utf16 (domain, tz_info.StandardName, i));
5213 if ((year <= 1601) || (year > 30827)) {
5215 * According to MSDN, the MS time functions can't handle dates outside
5221 /* even if the timezone has no daylight savings it may have Bias (e.g. GMT+13 it seems) */
5222 if (tz_id != TIME_ZONE_ID_UNKNOWN) {
5223 tz_info.StandardDate.wYear = year;
5224 convert_to_absolute_date(&tz_info.StandardDate);
5225 err = SystemTimeToFileTime (&tz_info.StandardDate, &ft);
5227 mono_array_set ((*data), gint64, 1, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));
5228 tz_info.DaylightDate.wYear = year;
5229 convert_to_absolute_date(&tz_info.DaylightDate);
5230 err = SystemTimeToFileTime (&tz_info.DaylightDate, &ft);
5232 mono_array_set ((*data), gint64, 0, FILETIME_ADJUST + (((guint64)ft.dwHighDateTime<<32) | ft.dwLowDateTime));
5234 mono_array_set ((*data), gint64, 2, (tz_info.Bias + tz_info.StandardBias) * -600000000LL);
5235 mono_array_set ((*data), gint64, 3, (tz_info.DaylightBias - tz_info.StandardBias) * -600000000LL);
5242 ves_icall_System_Object_obj_address (MonoObject *this)
5244 MONO_ARCH_SAVE_REGS;
5251 static inline gint32
5252 mono_array_get_byte_length (MonoArray *array)
5258 klass = array->obj.vtable->klass;
5260 if (array->bounds == NULL)
5261 length = array->max_length;
5264 for (i = 0; i < klass->rank; ++ i)
5265 length *= array->bounds [i].length;
5268 switch (klass->element_class->byval_arg.type) {
5271 case MONO_TYPE_BOOLEAN:
5275 case MONO_TYPE_CHAR:
5283 return length * sizeof (gpointer);
5294 ves_icall_System_Buffer_ByteLengthInternal (MonoArray *array)
5296 MONO_ARCH_SAVE_REGS;
5298 return mono_array_get_byte_length (array);
5302 ves_icall_System_Buffer_GetByteInternal (MonoArray *array, gint32 idx)
5304 MONO_ARCH_SAVE_REGS;
5306 return mono_array_get (array, gint8, idx);
5310 ves_icall_System_Buffer_SetByteInternal (MonoArray *array, gint32 idx, gint8 value)
5312 MONO_ARCH_SAVE_REGS;
5314 mono_array_set (array, gint8, idx, value);
5318 ves_icall_System_Buffer_BlockCopyInternal (MonoArray *src, gint32 src_offset, MonoArray *dest, gint32 dest_offset, gint32 count)
5320 guint8 *src_buf, *dest_buf;
5322 MONO_ARCH_SAVE_REGS;
5324 /* watch out for integer overflow */
5325 if ((src_offset > mono_array_get_byte_length (src) - count) || (dest_offset > mono_array_get_byte_length (dest) - count))
5328 src_buf = (guint8 *)src->vector + src_offset;
5329 dest_buf = (guint8 *)dest->vector + dest_offset;
5332 memcpy (dest_buf, src_buf, count);
5334 memmove (dest_buf, src_buf, count); /* Source and dest are the same array */
5340 ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString *class_name)
5342 MonoDomain *domain = mono_object_domain (this);
5344 MonoRealProxy *rp = ((MonoRealProxy *)this);
5345 MonoTransparentProxy *tp;
5349 MONO_ARCH_SAVE_REGS;
5351 res = mono_object_new (domain, mono_defaults.transparent_proxy_class);
5352 tp = (MonoTransparentProxy*) res;
5355 type = ((MonoReflectionType *)rp->class_to_proxy)->type;
5356 klass = mono_class_from_mono_type (type);
5358 tp->custom_type_info = (mono_object_isinst (this, mono_defaults.iremotingtypeinfo_class) != NULL);
5359 tp->remote_class = mono_remote_class (domain, class_name, klass);
5361 res->vtable = mono_remote_class_vtable (domain, tp->remote_class, rp);
5365 static MonoReflectionType *
5366 ves_icall_Remoting_RealProxy_InternalGetProxyType (MonoTransparentProxy *tp)
5368 return mono_type_get_object (mono_object_domain (tp), &tp->remote_class->proxy_class->byval_arg);
5371 /* System.Environment */
5374 ves_icall_System_Environment_get_MachineName (void)
5376 #if defined (PLATFORM_WIN32)
5381 len = MAX_COMPUTERNAME_LENGTH + 1;
5382 buf = g_new (gunichar2, len);
5385 if (GetComputerName (buf, (PDWORD) &len))
5386 result = mono_string_new_utf16 (mono_domain_get (), buf, len);
5395 MONO_ARCH_SAVE_REGS;
5398 buf = g_new (gchar, len);
5401 if (gethostname (buf, len) == 0)
5402 result = mono_string_new (mono_domain_get (), buf);
5410 ves_icall_System_Environment_get_Platform (void)
5412 MONO_ARCH_SAVE_REGS;
5414 #if defined (PLATFORM_WIN32)
5424 ves_icall_System_Environment_get_NewLine (void)
5426 MONO_ARCH_SAVE_REGS;
5428 #if defined (PLATFORM_WIN32)
5429 return mono_string_new (mono_domain_get (), "\r\n");
5431 return mono_string_new (mono_domain_get (), "\n");
5436 ves_icall_System_Environment_GetEnvironmentVariable (MonoString *name)
5441 MONO_ARCH_SAVE_REGS;
5446 utf8_name = mono_string_to_utf8 (name); /* FIXME: this should be ascii */
5447 value = g_getenv (utf8_name);
5453 return mono_string_new (mono_domain_get (), value);
5457 * There is no standard way to get at environ.
5465 ves_icall_System_Environment_GetEnvironmentVariableNames (void)
5473 MONO_ARCH_SAVE_REGS;
5476 for (e = environ; *e != 0; ++ e)
5479 domain = mono_domain_get ();
5480 names = mono_array_new (domain, mono_defaults.string_class, n);
5483 for (e = environ; *e != 0; ++ e) {
5484 parts = g_strsplit (*e, "=", 2);
5486 str = mono_string_new (domain, *parts);
5487 mono_array_set (names, MonoString *, n, str);
5499 * Returns: the number of milliseconds elapsed since the system started.
5502 ves_icall_System_Environment_get_TickCount (void)
5504 return GetTickCount ();
5509 ves_icall_System_Environment_Exit (int result)
5511 MONO_ARCH_SAVE_REGS;
5513 mono_runtime_set_shutting_down ();
5515 /* Suspend all managed threads since the runtime is going away */
5516 mono_thread_suspend_all_other_threads ();
5518 mono_runtime_quit ();
5520 /* we may need to do some cleanup here... */
5525 ves_icall_System_Environment_GetGacPath (void)
5527 return mono_string_new (mono_domain_get (), mono_assembly_getrootdir ());
5531 ves_icall_System_Environment_GetWindowsFolderPath (int folder)
5533 #if defined (PLATFORM_WIN32)
5534 #ifndef CSIDL_FLAG_CREATE
5535 #define CSIDL_FLAG_CREATE 0x8000
5538 WCHAR path [MAX_PATH];
5539 /* Create directory if no existing */
5540 if (SUCCEEDED (SHGetFolderPathW (NULL, folder | CSIDL_FLAG_CREATE, NULL, 0, path))) {
5544 return mono_string_new_utf16 (mono_domain_get (), path, len);
5547 g_warning ("ves_icall_System_Environment_GetWindowsFolderPath should only be called on Windows!");
5549 return mono_string_new (mono_domain_get (), "");
5553 ves_icall_System_Environment_GetLogicalDrives (void)
5555 gunichar2 buf [128], *ptr, *dname;
5557 gint initial_size = 127, size = 128;
5560 MonoString *drivestr;
5561 MonoDomain *domain = mono_domain_get ();
5564 MONO_ARCH_SAVE_REGS;
5569 while (size > initial_size) {
5570 size = GetLogicalDriveStrings (initial_size, ptr);
5571 if (size > initial_size) {
5574 ptr = g_malloc0 ((size + 1) * sizeof (gunichar2));
5575 initial_size = size;
5589 result = mono_array_new (domain, mono_defaults.string_class, ndrives);
5594 while (*u16) { u16++; len ++; }
5595 drivestr = mono_string_new_utf16 (domain, dname, len);
5596 mono_array_set (result, gpointer, ndrives++, drivestr);
5607 ves_icall_System_Environment_InternalGetHome (void)
5609 MONO_ARCH_SAVE_REGS;
5611 return mono_string_new (mono_domain_get (), g_get_home_dir ());
5614 static const char *encodings [] = {
5616 "ascii", "us_ascii", "us", "ansi_x3.4_1968",
5617 "ansi_x3.4_1986", "cp367", "csascii", "ibm367",
5618 "iso_ir_6", "iso646_us", "iso_646.irv:1991",
5620 "utf_7", "csunicode11utf7", "unicode_1_1_utf_7",
5621 "unicode_2_0_utf_7", "x_unicode_1_1_utf_7",
5622 "x_unicode_2_0_utf_7",
5624 "utf_8", "unicode_1_1_utf_8", "unicode_2_0_utf_8",
5625 "x_unicode_1_1_utf_8", "x_unicode_2_0_utf_8",
5627 "utf_16", "UTF_16LE", "ucs_2", "unicode",
5630 "unicodefffe", "utf_16be",
5637 * Returns the internal codepage, if the value of "int_code_page" is
5638 * 1 at entry, and we can not compute a suitable code page number,
5639 * returns the code page as a string
5642 ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page)
5647 char *codepage = NULL;
5649 int want_name = *int_code_page;
5652 *int_code_page = -1;
5653 MONO_ARCH_SAVE_REGS;
5655 g_get_charset (&cset);
5656 c = codepage = strdup (cset);
5657 for (c = codepage; *c; c++){
5658 if (isascii (*c) && isalpha (*c))
5663 /* g_print ("charset: %s\n", cset); */
5665 /* handle some common aliases */
5668 for (i = 0; p != 0; ){
5669 if ((gssize) p < 7){
5671 p = encodings [++i];
5674 if (strcmp (p, codepage) == 0){
5675 *int_code_page = code;
5678 p = encodings [++i];
5681 if (strstr (codepage, "utf_8") != NULL)
5682 *int_code_page |= 0x10000000;
5685 if (want_name && *int_code_page == -1)
5686 return mono_string_new (mono_domain_get (), cset);
5692 ves_icall_System_Environment_get_HasShutdownStarted (void)
5694 if (mono_runtime_is_shutting_down ())
5697 if (mono_domain_is_unloading (mono_domain_get ()))
5704 ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this,
5705 MonoReflectionMethod *method,
5706 MonoArray *out_args)
5708 MONO_ARCH_SAVE_REGS;
5710 mono_message_init (mono_object_domain (this), this, method, out_args);
5714 ves_icall_IsTransparentProxy (MonoObject *proxy)
5716 MONO_ARCH_SAVE_REGS;
5721 if (proxy->vtable->klass == mono_defaults.transparent_proxy_class)
5728 ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation (MonoReflectionType *type, MonoBoolean enable)
5733 MONO_ARCH_SAVE_REGS;
5735 klass = mono_class_from_mono_type (type->type);
5736 vtable = mono_class_vtable (mono_domain_get (), klass);
5738 if (enable) vtable->remote = 1;
5739 else vtable->remote = 0;
5743 ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance (MonoReflectionType *type)
5748 MONO_ARCH_SAVE_REGS;
5750 domain = mono_object_domain (type);
5751 klass = mono_class_from_mono_type (type->type);
5753 if (klass->rank >= 1) {
5754 g_assert (klass->rank == 1);
5755 return (MonoObject *) mono_array_new (domain, klass->element_class, 0);
5757 /* Bypass remoting object creation check */
5758 return mono_object_new_alloc_specific (mono_class_vtable (domain, klass));
5763 ves_icall_System_IO_get_temp_path (void)
5765 MONO_ARCH_SAVE_REGS;
5767 return mono_string_new (mono_domain_get (), g_get_tmp_dir ());
5771 ves_icall_RuntimeMethod_GetFunctionPointer (MonoMethod *method)
5773 MONO_ARCH_SAVE_REGS;
5775 return mono_compile_method (method);
5779 ves_icall_System_Configuration_DefaultConfig_get_machine_config_path (void)
5784 MONO_ARCH_SAVE_REGS;
5786 path = g_build_path (G_DIR_SEPARATOR_S, mono_get_config_dir (), "mono", mono_get_runtime_info ()->framework_version, "machine.config", NULL);
5788 #if defined (PLATFORM_WIN32)
5789 /* Avoid mixing '/' and '\\' */
5792 for (i = strlen (path) - 1; i >= 0; i--)
5793 if (path [i] == '/')
5797 mcpath = mono_string_new (mono_domain_get (), path);
5804 ves_icall_System_Web_Util_ICalls_get_machine_install_dir (void)
5809 MONO_ARCH_SAVE_REGS;
5811 path = g_path_get_dirname (mono_get_config_dir ());
5813 #if defined (PLATFORM_WIN32)
5814 /* Avoid mixing '/' and '\\' */
5817 for (i = strlen (path) - 1; i >= 0; i--)
5818 if (path [i] == '/')
5822 ipath = mono_string_new (mono_domain_get (), path);
5829 ves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString (MonoString *message)
5831 #if defined (PLATFORM_WIN32)
5832 static void (*output_debug) (gunichar2 *);
5833 static gboolean tried_loading = FALSE;
5835 MONO_ARCH_SAVE_REGS;
5837 if (!tried_loading && output_debug == NULL) {
5840 tried_loading = TRUE;
5841 k32 = g_module_open ("kernel32", G_MODULE_BIND_LAZY);
5843 gchar *error = g_strdup (g_module_error ());
5844 g_warning ("Failed to load kernel32.dll: %s\n", error);
5849 g_module_symbol (k32, "OutputDebugStringW", (gpointer *) &output_debug);
5850 if (!output_debug) {
5851 gchar *error = g_strdup (g_module_error ());
5852 g_warning ("Failed to load OutputDebugStringW: %s\n", error);
5858 if (output_debug == NULL)
5861 output_debug (mono_string_chars (message));
5863 g_warning ("WriteWindowsDebugString called and PLATFORM_WIN32 not defined!\n");
5867 /* Only used for value types */
5869 ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type)
5874 MONO_ARCH_SAVE_REGS;
5876 domain = mono_object_domain (type);
5877 klass = mono_class_from_mono_type (type->type);
5879 if (mono_class_is_nullable (klass))
5880 /* No arguments -> null */
5883 return mono_object_new (domain, klass);
5886 static MonoReflectionMethod *
5887 ves_icall_MonoMethod_get_base_definition (MonoReflectionMethod *m)
5890 MonoMethod *method = m->method;
5891 MonoMethod *result = NULL;
5893 MONO_ARCH_SAVE_REGS;
5895 if (!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) ||
5896 MONO_CLASS_IS_INTERFACE (method->klass) ||
5897 method->flags & METHOD_ATTRIBUTE_NEW_SLOT)
5900 if (method->klass == NULL || (klass = method->klass->parent) == NULL)
5903 if (klass->generic_class)
5904 klass = klass->generic_class->container_class;
5906 mono_class_setup_vtable (klass);
5907 mono_class_setup_vtable (method->klass);
5908 while (result == NULL && klass != NULL && (klass->vtable_size > method->slot))
5910 mono_class_setup_vtable (klass);
5912 result = klass->vtable [method->slot];
5913 if (result == NULL) {
5915 gpointer iter = NULL;
5916 /* It is an abstract method */
5917 while ((m = mono_class_get_methods (klass, &iter))) {
5918 if (m->slot == method->slot) {
5924 klass = klass->parent;
5930 return mono_method_get_object (mono_domain_get (), result, NULL);
5934 mono_ArgIterator_Setup (MonoArgIterator *iter, char* argsp, char* start)
5936 MONO_ARCH_SAVE_REGS;
5938 iter->sig = *(MonoMethodSignature**)argsp;
5940 g_assert (iter->sig->sentinelpos <= iter->sig->param_count);
5941 g_assert (iter->sig->call_convention == MONO_CALL_VARARG);
5944 /* FIXME: it's not documented what start is exactly... */
5948 int i, align, arg_size;
5949 iter->args = argsp + sizeof (gpointer);
5950 #ifndef MONO_ARCH_REGPARMS
5951 for (i = 0; i < iter->sig->sentinelpos; ++i) {
5952 arg_size = mono_type_stack_size (iter->sig->params [i], &align);
5953 iter->args = (char*)iter->args + arg_size;
5957 iter->num_args = iter->sig->param_count - iter->sig->sentinelpos;
5959 /* g_print ("sig %p, param_count: %d, sent: %d\n", iter->sig, iter->sig->param_count, iter->sig->sentinelpos); */
5963 mono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)
5965 gint i, align, arg_size;
5967 MONO_ARCH_SAVE_REGS;
5969 i = iter->sig->sentinelpos + iter->next_arg;
5971 g_assert (i < iter->sig->param_count);
5973 res.type = iter->sig->params [i];
5974 res.klass = mono_class_from_mono_type (res.type);
5975 /* FIXME: endianess issue... */
5976 res.value = iter->args;
5977 arg_size = mono_type_stack_size (res.type, &align);
5978 iter->args = (char*)iter->args + arg_size;
5981 /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
5987 mono_ArgIterator_IntGetNextArgT (MonoArgIterator *iter, MonoType *type)
5989 gint i, align, arg_size;
5991 MONO_ARCH_SAVE_REGS;
5993 i = iter->sig->sentinelpos + iter->next_arg;
5995 g_assert (i < iter->sig->param_count);
5997 while (i < iter->sig->param_count) {
5998 if (!mono_metadata_type_equal (type, iter->sig->params [i]))
6000 res.type = iter->sig->params [i];
6001 res.klass = mono_class_from_mono_type (res.type);
6002 /* FIXME: endianess issue... */
6003 res.value = iter->args;
6004 arg_size = mono_type_stack_size (res.type, &align);
6005 iter->args = (char*)iter->args + arg_size;
6007 /* g_print ("returning arg %d, type 0x%02x of size %d at %p\n", i, res.type->type, arg_size, res.value); */
6010 /* g_print ("arg type 0x%02x not found\n", res.type->type); */
6019 mono_ArgIterator_IntGetNextArgType (MonoArgIterator *iter)
6022 MONO_ARCH_SAVE_REGS;
6024 i = iter->sig->sentinelpos + iter->next_arg;
6026 g_assert (i < iter->sig->param_count);
6028 return iter->sig->params [i];
6032 mono_TypedReference_ToObject (MonoTypedRef tref)
6034 MONO_ARCH_SAVE_REGS;
6036 if (MONO_TYPE_IS_REFERENCE (tref.type)) {
6037 MonoObject** objp = tref.value;
6041 return mono_value_box (mono_domain_get (), tref.klass, tref.value);
6045 mono_TypedReference_ToObjectInternal (MonoType *type, gpointer value, MonoClass *klass)
6047 MONO_ARCH_SAVE_REGS;
6049 if (MONO_TYPE_IS_REFERENCE (type)) {
6050 MonoObject** objp = value;
6054 return mono_value_box (mono_domain_get (), klass, value);
6058 prelink_method (MonoMethod *method)
6060 const char *exc_class, *exc_arg;
6061 if (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
6063 mono_lookup_pinvoke_call (method, &exc_class, &exc_arg);
6065 mono_raise_exception(
6066 mono_exception_from_name_msg (mono_defaults.corlib, "System", exc_class, exc_arg ) );
6068 /* create the wrapper, too? */
6072 ves_icall_System_Runtime_InteropServices_Marshal_Prelink (MonoReflectionMethod *method)
6074 MONO_ARCH_SAVE_REGS;
6075 prelink_method (method->method);
6079 ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType *type)
6081 MonoClass *klass = mono_class_from_mono_type (type->type);
6083 gpointer iter = NULL;
6084 MONO_ARCH_SAVE_REGS;
6086 while ((m = mono_class_get_methods (klass, &iter)))
6090 /* These parameters are "readonly" in corlib/System/Char.cs */
6092 ves_icall_System_Char_GetDataTablePointers (guint8 const **category_data,
6093 guint8 const **numeric_data,
6094 gdouble const **numeric_data_values,
6095 guint16 const **to_lower_data_low,
6096 guint16 const **to_lower_data_high,
6097 guint16 const **to_upper_data_low,
6098 guint16 const **to_upper_data_high)
6100 *category_data = CategoryData;
6101 *numeric_data = NumericData;
6102 *numeric_data_values = NumericDataValues;
6103 *to_lower_data_low = ToLowerDataLow;
6104 *to_lower_data_high = ToLowerDataHigh;
6105 *to_upper_data_low = ToUpperDataLow;
6106 *to_upper_data_high = ToUpperDataHigh;
6110 ves_icall_MonoDebugger_GetMethodToken (MonoReflectionMethod *method)
6112 return method->method->token;
6116 custom_attrs_defined_internal (MonoObject *obj, MonoReflectionType *attr_type)
6118 MonoCustomAttrInfo *cinfo;
6121 cinfo = mono_reflection_get_custom_attrs_info (obj);
6124 found = mono_custom_attrs_has_attr (cinfo, mono_class_from_mono_type (attr_type->type));
6126 mono_custom_attrs_free (cinfo);
6131 custom_attrs_get_by_type (MonoObject *obj, MonoReflectionType *attr_type)
6133 return mono_reflection_get_custom_attrs_by_type (obj, attr_type ? mono_class_from_mono_type (attr_type->type) : NULL);
6137 GCHandle_CheckCurrentDomain (guint32 gchandle)
6139 return mono_gchandle_is_in_domain (gchandle, mono_domain_get ());
6143 ves_icall_Mono_Runtime_GetDisplayName (void)
6145 char *display_name_str = g_strdup_printf ("Mono %s", VERSION);
6146 MonoString *display_name = mono_string_new (mono_domain_get (), display_name_str);
6147 g_free (display_name_str);
6148 return display_name;
6151 static guchar dbase64 [] = {
6152 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
6153 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
6154 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63,
6155 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 0, 128, 128,
6156 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
6157 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128,
6158 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
6159 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
6163 base64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespaceOnly)
6168 gunichar2 last, prev_last;
6176 last = prev_last = 0;
6177 for (i = 0; i < ilength; i++) {
6179 if (c >= sizeof (dbase64)) {
6180 exc = mono_exception_from_name_msg (mono_get_corlib (),
6181 "System", "FormatException",
6182 "Invalid character found.");
6183 mono_raise_exception (exc);
6184 } else if (isspace (c)) {
6192 olength = ilength - ignored;
6194 if (allowWhitespaceOnly && olength == 0) {
6195 return mono_array_new (mono_domain_get (), mono_defaults.byte_class, 0);
6198 if ((olength & 3) != 0 || olength <= 0) {
6199 exc = mono_exception_from_name_msg (mono_get_corlib (), "System",
6200 "FormatException", "Invalid length.");
6201 mono_raise_exception (exc);
6204 olength = (olength * 3) / 4;
6208 if (prev_last == '=')
6211 result = mono_array_new (mono_domain_get (), mono_defaults.byte_class, olength);
6212 res_ptr = mono_array_addr (result, guchar, 0);
6213 for (i = 0; i < ilength; ) {
6216 for (k = 0; k < 4 && i < ilength;) {
6222 if (((b [k] = dbase64 [c]) & 0x80) != 0) {
6223 exc = mono_exception_from_name_msg (mono_get_corlib (),
6224 "System", "FormatException",
6225 "Invalid character found.");
6226 mono_raise_exception (exc);
6231 *res_ptr++ = (b [0] << 2) | (b [1] >> 4);
6233 *res_ptr++ = (b [1] << 4) | (b [2] >> 2);
6235 *res_ptr++ = (b [2] << 6) | b [3];
6237 while (i < ilength && isspace (start [i]))
6245 InternalFromBase64String (MonoString *str, MonoBoolean allowWhitespaceOnly)
6247 MONO_ARCH_SAVE_REGS;
6249 return base64_to_byte_array (mono_string_chars (str),
6250 mono_string_length (str), allowWhitespaceOnly);
6254 InternalFromBase64CharArray (MonoArray *input, gint offset, gint length)
6256 MONO_ARCH_SAVE_REGS;
6258 return base64_to_byte_array (mono_array_addr (input, gunichar2, offset),
6270 const IcallEntry *icalls;
6274 static const IcallEntry runtime_icalls [] = {
6275 {"GetDisplayName", ves_icall_Mono_Runtime_GetDisplayName}
6278 static const IcallEntry activator_icalls [] = {
6279 {"CreateInstanceInternal", ves_icall_System_Activator_CreateInstanceInternal}
6281 static const IcallEntry appdomain_icalls [] = {
6282 {"ExecuteAssembly", ves_icall_System_AppDomain_ExecuteAssembly},
6283 {"GetAssemblies", ves_icall_System_AppDomain_GetAssemblies},
6284 {"GetData", ves_icall_System_AppDomain_GetData},
6285 {"InternalGetContext", ves_icall_System_AppDomain_InternalGetContext},
6286 {"InternalGetDefaultContext", ves_icall_System_AppDomain_InternalGetDefaultContext},
6287 {"InternalGetProcessGuid", ves_icall_System_AppDomain_InternalGetProcessGuid},
6288 {"InternalIsFinalizingForUnload", ves_icall_System_AppDomain_InternalIsFinalizingForUnload},
6289 {"InternalPopDomainRef", ves_icall_System_AppDomain_InternalPopDomainRef},
6290 {"InternalPushDomainRef", ves_icall_System_AppDomain_InternalPushDomainRef},
6291 {"InternalPushDomainRefByID", ves_icall_System_AppDomain_InternalPushDomainRefByID},
6292 {"InternalSetContext", ves_icall_System_AppDomain_InternalSetContext},
6293 {"InternalSetDomain", ves_icall_System_AppDomain_InternalSetDomain},
6294 {"InternalSetDomainByID", ves_icall_System_AppDomain_InternalSetDomainByID},
6295 {"InternalUnload", ves_icall_System_AppDomain_InternalUnload},
6296 {"LoadAssembly", ves_icall_System_AppDomain_LoadAssembly},
6297 {"LoadAssemblyRaw", ves_icall_System_AppDomain_LoadAssemblyRaw},
6298 {"SetData", ves_icall_System_AppDomain_SetData},
6299 {"createDomain", ves_icall_System_AppDomain_createDomain},
6300 {"getCurDomain", ves_icall_System_AppDomain_getCurDomain},
6301 {"getFriendlyName", ves_icall_System_AppDomain_getFriendlyName},
6302 {"getRootDomain", ves_icall_System_AppDomain_getRootDomain},
6303 {"getSetup", ves_icall_System_AppDomain_getSetup}
6306 static const IcallEntry argiterator_icalls [] = {
6307 {"IntGetNextArg()", mono_ArgIterator_IntGetNextArg},
6308 {"IntGetNextArg(intptr)", mono_ArgIterator_IntGetNextArgT},
6309 {"IntGetNextArgType", mono_ArgIterator_IntGetNextArgType},
6310 {"Setup", mono_ArgIterator_Setup}
6313 static const IcallEntry array_icalls [] = {
6314 {"ClearInternal", ves_icall_System_Array_ClearInternal},
6315 {"Clone", mono_array_clone},
6316 {"CreateInstanceImpl", ves_icall_System_Array_CreateInstanceImpl},
6317 {"FastCopy", ves_icall_System_Array_FastCopy},
6318 {"GetLength", ves_icall_System_Array_GetLength},
6319 {"GetLowerBound", ves_icall_System_Array_GetLowerBound},
6320 {"GetRank", ves_icall_System_Array_GetRank},
6321 {"GetValue", ves_icall_System_Array_GetValue},
6322 {"GetValueImpl", ves_icall_System_Array_GetValueImpl},
6323 {"SetValue", ves_icall_System_Array_SetValue},
6324 {"SetValueImpl", ves_icall_System_Array_SetValueImpl}
6327 static const IcallEntry buffer_icalls [] = {
6328 {"BlockCopyInternal", ves_icall_System_Buffer_BlockCopyInternal},
6329 {"ByteLengthInternal", ves_icall_System_Buffer_ByteLengthInternal},
6330 {"GetByteInternal", ves_icall_System_Buffer_GetByteInternal},
6331 {"SetByteInternal", ves_icall_System_Buffer_SetByteInternal}
6334 static const IcallEntry char_icalls [] = {
6335 {"GetDataTablePointers", ves_icall_System_Char_GetDataTablePointers}
6338 static const IcallEntry defaultconf_icalls [] = {
6339 {"get_machine_config_path", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path}
6342 static const IcallEntry consoledriver_icalls [] = {
6343 {"InternalKeyAvailable", ves_icall_System_ConsoleDriver_InternalKeyAvailable },
6344 {"Isatty", ves_icall_System_ConsoleDriver_Isatty },
6345 {"SetBreak", ves_icall_System_ConsoleDriver_SetBreak },
6346 {"SetEcho", ves_icall_System_ConsoleDriver_SetEcho },
6347 {"TtySetup", ves_icall_System_ConsoleDriver_TtySetup }
6350 static const IcallEntry convert_icalls [] = {
6351 {"InternalFromBase64CharArray", InternalFromBase64CharArray },
6352 {"InternalFromBase64String", InternalFromBase64String }
6355 static const IcallEntry timezone_icalls [] = {
6356 {"GetTimeZoneData", ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData}
6359 static const IcallEntry datetime_icalls [] = {
6360 {"GetNow", ves_icall_System_DateTime_GetNow}
6363 #ifndef DISABLE_DECIMAL
6364 static const IcallEntry decimal_icalls [] = {
6365 {"decimal2Int64", mono_decimal2Int64},
6366 {"decimal2UInt64", mono_decimal2UInt64},
6367 {"decimal2double", mono_decimal2double},
6368 {"decimal2string", mono_decimal2string},
6369 {"decimalCompare", mono_decimalCompare},
6370 {"decimalDiv", mono_decimalDiv},
6371 {"decimalFloorAndTrunc", mono_decimalFloorAndTrunc},
6372 {"decimalIncr", mono_decimalIncr},
6373 {"decimalIntDiv", mono_decimalIntDiv},
6374 {"decimalMult", mono_decimalMult},
6375 {"decimalRound", mono_decimalRound},
6376 {"decimalSetExponent", mono_decimalSetExponent},
6377 {"double2decimal", mono_double2decimal}, /* FIXME: wrong signature. */
6378 {"string2decimal", mono_string2decimal}
6382 static const IcallEntry delegate_icalls [] = {
6383 {"CreateDelegate_internal", ves_icall_System_Delegate_CreateDelegate_internal},
6384 {"FreeTrampoline", ves_icall_System_Delegate_FreeTrampoline}
6387 static const IcallEntry tracelist_icalls [] = {
6388 {"WriteWindowsDebugString", ves_icall_System_Diagnostics_DefaultTraceListener_WriteWindowsDebugString}
6391 static const IcallEntry fileversion_icalls [] = {
6392 {"GetVersionInfo_internal(string)", ves_icall_System_Diagnostics_FileVersionInfo_GetVersionInfo_internal}
6395 static const IcallEntry process_icalls [] = {
6396 {"CreateProcess_internal(System.Diagnostics.ProcessStartInfo,intptr,intptr,intptr,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_CreateProcess_internal},
6397 {"ExitCode_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitCode_internal},
6398 {"ExitTime_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitTime_internal},
6399 {"GetModules_internal()", ves_icall_System_Diagnostics_Process_GetModules_internal},
6400 {"GetPid_internal()", ves_icall_System_Diagnostics_Process_GetPid_internal},
6401 {"GetProcess_internal(int)", ves_icall_System_Diagnostics_Process_GetProcess_internal},
6402 {"GetProcesses_internal()", ves_icall_System_Diagnostics_Process_GetProcesses_internal},
6403 {"GetWorkingSet_internal(intptr,int&,int&)", ves_icall_System_Diagnostics_Process_GetWorkingSet_internal},
6404 {"Kill_internal", ves_icall_System_Diagnostics_Process_Kill_internal},
6405 {"ProcessName_internal(intptr)", ves_icall_System_Diagnostics_Process_ProcessName_internal},
6406 {"Process_free_internal(intptr)", ves_icall_System_Diagnostics_Process_Process_free_internal},
6407 {"SetWorkingSet_internal(intptr,int,int,bool)", ves_icall_System_Diagnostics_Process_SetWorkingSet_internal},
6408 {"ShellExecuteEx_internal(System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_ShellExecuteEx_internal},
6409 {"StartTime_internal(intptr)", ves_icall_System_Diagnostics_Process_StartTime_internal},
6410 {"WaitForExit_internal(intptr,int)", ves_icall_System_Diagnostics_Process_WaitForExit_internal}
6413 static const IcallEntry double_icalls [] = {
6414 {"AssertEndianity", ves_icall_System_Double_AssertEndianity},
6415 {"ParseImpl", mono_double_ParseImpl}
6418 static const IcallEntry enum_icalls [] = {
6419 {"ToObject", ves_icall_System_Enum_ToObject},
6420 {"get_value", ves_icall_System_Enum_get_value}
6423 static const IcallEntry environment_icalls [] = {
6424 {"Exit", ves_icall_System_Environment_Exit},
6425 {"GetCommandLineArgs", mono_runtime_get_main_args},
6426 {"GetEnvironmentVariableNames", ves_icall_System_Environment_GetEnvironmentVariableNames},
6427 {"GetLogicalDrivesInternal", ves_icall_System_Environment_GetLogicalDrives },
6428 {"GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path},
6429 {"GetOSVersionString", ves_icall_System_Environment_GetOSVersionString},
6430 {"GetWindowsFolderPath", ves_icall_System_Environment_GetWindowsFolderPath},
6431 {"get_ExitCode", mono_environment_exitcode_get},
6432 {"get_HasShutdownStarted", ves_icall_System_Environment_get_HasShutdownStarted},
6433 {"get_MachineName", ves_icall_System_Environment_get_MachineName},
6434 {"get_NewLine", ves_icall_System_Environment_get_NewLine},
6435 {"get_Platform", ves_icall_System_Environment_get_Platform},
6436 {"get_TickCount", ves_icall_System_Environment_get_TickCount},
6437 {"get_UserName", ves_icall_System_Environment_get_UserName},
6438 {"internalGetEnvironmentVariable", ves_icall_System_Environment_GetEnvironmentVariable},
6439 {"internalGetGacPath", ves_icall_System_Environment_GetGacPath},
6440 {"internalGetHome", ves_icall_System_Environment_InternalGetHome},
6441 {"set_ExitCode", mono_environment_exitcode_set}
6444 static const IcallEntry cultureinfo_icalls [] = {
6445 {"construct_compareinfo(object,string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo},
6446 {"construct_datetime_format", ves_icall_System_Globalization_CultureInfo_construct_datetime_format},
6447 {"construct_internal_locale(string)", ves_icall_System_Globalization_CultureInfo_construct_internal_locale},
6448 {"construct_internal_locale_from_current_locale", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_current_locale},
6449 {"construct_internal_locale_from_lcid", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_lcid},
6450 {"construct_internal_locale_from_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_name},
6451 {"construct_internal_locale_from_specific_name", ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_specific_name},
6452 {"construct_number_format", ves_icall_System_Globalization_CultureInfo_construct_number_format},
6453 {"internal_get_cultures", ves_icall_System_Globalization_CultureInfo_internal_get_cultures},
6454 {"internal_is_lcid_neutral", ves_icall_System_Globalization_CultureInfo_internal_is_lcid_neutral}
6457 static const IcallEntry regioninfo_icalls [] = {
6458 {"construct_internal_region_from_lcid", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_lcid},
6459 {"construct_internal_region_from_name", ves_icall_System_Globalization_RegionInfo_construct_internal_region_from_name}
6462 static const IcallEntry compareinfo_icalls [] = {
6463 {"assign_sortkey(object,string,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_assign_sortkey},
6464 {"construct_compareinfo(string)", ves_icall_System_Globalization_CompareInfo_construct_compareinfo},
6465 {"free_internal_collator()", ves_icall_System_Globalization_CompareInfo_free_internal_collator},
6466 {"internal_compare(string,int,int,string,int,int,System.Globalization.CompareOptions)", ves_icall_System_Globalization_CompareInfo_internal_compare},
6467 {"internal_index(string,int,int,char,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index_char},
6468 {"internal_index(string,int,int,string,System.Globalization.CompareOptions,bool)", ves_icall_System_Globalization_CompareInfo_internal_index}
6471 static const IcallEntry gc_icalls [] = {
6472 {"GetTotalMemory", ves_icall_System_GC_GetTotalMemory},
6473 {"InternalCollect", ves_icall_System_GC_InternalCollect},
6474 {"KeepAlive", ves_icall_System_GC_KeepAlive},
6475 {"ReRegisterForFinalize", ves_icall_System_GC_ReRegisterForFinalize},
6476 {"SuppressFinalize", ves_icall_System_GC_SuppressFinalize},
6477 {"WaitForPendingFinalizers", ves_icall_System_GC_WaitForPendingFinalizers}
6480 static const IcallEntry famwatcher_icalls [] = {
6481 {"InternalFAMNextEvent", ves_icall_System_IO_FAMW_InternalFAMNextEvent}
6484 static const IcallEntry filewatcher_icalls [] = {
6485 {"InternalCloseDirectory", ves_icall_System_IO_FSW_CloseDirectory},
6486 {"InternalOpenDirectory", ves_icall_System_IO_FSW_OpenDirectory},
6487 {"InternalReadDirectoryChanges", ves_icall_System_IO_FSW_ReadDirectoryChanges},
6488 {"InternalSupportsFSW", ves_icall_System_IO_FSW_SupportsFSW}
6491 static const IcallEntry path_icalls [] = {
6492 {"get_temp_path", ves_icall_System_IO_get_temp_path}
6495 static const IcallEntry monoio_icalls [] = {
6496 {"Close(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Close},
6497 {"CopyFile(string,string,bool,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_CopyFile},
6498 {"CreateDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_CreateDirectory},
6499 {"CreatePipe(intptr&,intptr&)", ves_icall_System_IO_MonoIO_CreatePipe},
6500 {"DeleteFile(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_DeleteFile},
6501 {"Flush(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Flush},
6502 {"GetCurrentDirectory(System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetCurrentDirectory},
6503 {"GetFileAttributes(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileAttributes},
6504 {"GetFileStat(string,System.IO.MonoIOStat&,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileStat},
6505 {"GetFileSystemEntries", ves_icall_System_IO_MonoIO_GetFileSystemEntries},
6506 {"GetFileType(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetFileType},
6507 {"GetLength(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_GetLength},
6508 {"GetTempPath(string&)", ves_icall_System_IO_MonoIO_GetTempPath},
6509 {"Lock(intptr,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Lock},
6510 {"MoveFile(string,string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_MoveFile},
6511 {"Open(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,bool,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Open},
6512 {"Read(intptr,byte[],int,int,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Read},
6513 {"RemoveDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_RemoveDirectory},
6514 {"Seek(intptr,long,System.IO.SeekOrigin,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Seek},
6515 {"SetCurrentDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetCurrentDirectory},
6516 {"SetFileAttributes(string,System.IO.FileAttributes,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetFileAttributes},
6517 {"SetFileTime(intptr,long,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetFileTime},
6518 {"SetLength(intptr,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_SetLength},
6519 {"Unlock(intptr,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Unlock},
6520 {"Write(intptr,byte[],int,int,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Write},
6521 {"get_AltDirectorySeparatorChar", ves_icall_System_IO_MonoIO_get_AltDirectorySeparatorChar},
6522 {"get_ConsoleError", ves_icall_System_IO_MonoIO_get_ConsoleError},
6523 {"get_ConsoleInput", ves_icall_System_IO_MonoIO_get_ConsoleInput},
6524 {"get_ConsoleOutput", ves_icall_System_IO_MonoIO_get_ConsoleOutput},
6525 {"get_DirectorySeparatorChar", ves_icall_System_IO_MonoIO_get_DirectorySeparatorChar},
6526 {"get_InvalidPathChars", ves_icall_System_IO_MonoIO_get_InvalidPathChars},
6527 {"get_PathSeparator", ves_icall_System_IO_MonoIO_get_PathSeparator},
6528 {"get_VolumeSeparatorChar", ves_icall_System_IO_MonoIO_get_VolumeSeparatorChar}
6531 static const IcallEntry math_icalls [] = {
6532 {"Acos", ves_icall_System_Math_Acos},
6533 {"Asin", ves_icall_System_Math_Asin},
6534 {"Atan", ves_icall_System_Math_Atan},
6535 {"Atan2", ves_icall_System_Math_Atan2},
6536 {"Cos", ves_icall_System_Math_Cos},
6537 {"Cosh", ves_icall_System_Math_Cosh},
6538 {"Exp", ves_icall_System_Math_Exp},
6539 {"Floor", ves_icall_System_Math_Floor},
6540 {"Log", ves_icall_System_Math_Log},
6541 {"Log10", ves_icall_System_Math_Log10},
6542 {"Pow", ves_icall_System_Math_Pow},
6543 {"Round", ves_icall_System_Math_Round},
6544 {"Round2", ves_icall_System_Math_Round2},
6545 {"Sin", ves_icall_System_Math_Sin},
6546 {"Sinh", ves_icall_System_Math_Sinh},
6547 {"Sqrt", ves_icall_System_Math_Sqrt},
6548 {"Tan", ves_icall_System_Math_Tan},
6549 {"Tanh", ves_icall_System_Math_Tanh}
6552 static const IcallEntry customattrs_icalls [] = {
6553 {"GetCustomAttributesDataInternal", mono_reflection_get_custom_attrs_data},
6554 {"GetCustomAttributesInternal", custom_attrs_get_by_type},
6555 {"IsDefinedInternal", custom_attrs_defined_internal}
6558 static const IcallEntry enuminfo_icalls [] = {
6559 {"get_enum_info", ves_icall_get_enum_info}
6562 static const IcallEntry fieldinfo_icalls [] = {
6563 {"GetUnmanagedMarshal", ves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal},
6564 {"internal_from_handle", ves_icall_System_Reflection_FieldInfo_internal_from_handle}
6567 static const IcallEntry memberinfo_icalls [] = {
6568 {"get_MetadataToken", mono_reflection_get_token}
6571 static const IcallEntry monotype_icalls [] = {
6572 {"GetArrayRank", ves_icall_MonoType_GetArrayRank},
6573 {"GetConstructors", ves_icall_Type_GetConstructors_internal},
6574 {"GetConstructors_internal", ves_icall_Type_GetConstructors_internal},
6575 {"GetCorrespondingInflatedConstructor", ves_icall_MonoType_GetCorrespondingInflatedMethod},
6576 {"GetCorrespondingInflatedMethod", ves_icall_MonoType_GetCorrespondingInflatedMethod},
6577 {"GetElementType", ves_icall_MonoType_GetElementType},
6578 {"GetEvents_internal", ves_icall_Type_GetEvents_internal},
6579 {"GetField", ves_icall_Type_GetField},
6580 {"GetFields_internal", ves_icall_Type_GetFields_internal},
6581 {"GetGenericArguments", ves_icall_MonoType_GetGenericArguments},
6582 {"GetInterfaces", ves_icall_Type_GetInterfaces},
6583 {"GetMethodsByName", ves_icall_Type_GetMethodsByName},
6584 {"GetNestedType", ves_icall_Type_GetNestedType},
6585 {"GetNestedTypes", ves_icall_Type_GetNestedTypes},
6586 {"GetPropertiesByName", ves_icall_Type_GetPropertiesByName},
6587 {"InternalGetEvent", ves_icall_MonoType_GetEvent},
6588 {"IsByRefImpl", ves_icall_type_isbyref},
6589 {"IsPointerImpl", ves_icall_type_ispointer},
6590 {"IsPrimitiveImpl", ves_icall_type_isprimitive},
6591 {"getFullName", ves_icall_System_MonoType_getFullName},
6592 {"get_Assembly", ves_icall_MonoType_get_Assembly},
6593 {"get_BaseType", ves_icall_get_type_parent},
6594 {"get_DeclaringMethod", ves_icall_MonoType_get_DeclaringMethod},
6595 {"get_DeclaringType", ves_icall_MonoType_get_DeclaringType},
6596 {"get_IsGenericParameter", ves_icall_MonoType_get_IsGenericParameter},
6597 {"get_Module", ves_icall_MonoType_get_Module},
6598 {"get_Name", ves_icall_MonoType_get_Name},
6599 {"get_Namespace", ves_icall_MonoType_get_Namespace},
6600 {"get_UnderlyingSystemType", ves_icall_MonoType_get_UnderlyingSystemType},
6601 {"get_attributes", ves_icall_get_attributes},
6602 {"type_from_obj", mono_type_type_from_obj}
6605 static const IcallEntry assembly_icalls [] = {
6606 {"FillName", ves_icall_System_Reflection_Assembly_FillName},
6607 {"GetCallingAssembly", ves_icall_System_Reflection_Assembly_GetCallingAssembly},
6608 {"GetEntryAssembly", ves_icall_System_Reflection_Assembly_GetEntryAssembly},
6609 {"GetExecutingAssembly", ves_icall_System_Reflection_Assembly_GetExecutingAssembly},
6610 {"GetFilesInternal", ves_icall_System_Reflection_Assembly_GetFilesInternal},
6611 {"GetManifestResourceInfoInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal},
6612 {"GetManifestResourceInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInternal},
6613 {"GetManifestResourceNames", ves_icall_System_Reflection_Assembly_GetManifestResourceNames},
6614 {"GetModulesInternal", ves_icall_System_Reflection_Assembly_GetModulesInternal},
6615 {"GetNamespaces", ves_icall_System_Reflection_Assembly_GetNamespaces},
6616 {"GetReferencedAssemblies", ves_icall_System_Reflection_Assembly_GetReferencedAssemblies},
6617 {"GetTypes", ves_icall_System_Reflection_Assembly_GetTypes},
6618 {"InternalGetAssemblyName", ves_icall_System_Reflection_Assembly_InternalGetAssemblyName},
6619 {"InternalGetType", ves_icall_System_Reflection_Assembly_InternalGetType},
6620 {"InternalImageRuntimeVersion", ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion},
6621 {"LoadFrom", ves_icall_System_Reflection_Assembly_LoadFrom},
6622 {"LoadPermissions", ves_icall_System_Reflection_Assembly_LoadPermissions},
6624 * Private icalls for the Mono Debugger
6626 {"MonoDebugger_GetMethodToken", ves_icall_MonoDebugger_GetMethodToken},
6628 /* normal icalls again */
6629 {"get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint},
6630 {"get_ManifestModule", ves_icall_System_Reflection_Assembly_get_ManifestModule},
6631 {"get_ReflectionOnly", ves_icall_System_Reflection_Assembly_get_ReflectionOnly},
6632 {"get_code_base", ves_icall_System_Reflection_Assembly_get_code_base},
6633 {"get_global_assembly_cache", ves_icall_System_Reflection_Assembly_get_global_assembly_cache},
6634 {"get_location", ves_icall_System_Reflection_Assembly_get_location},
6635 {"load_with_partial_name", ves_icall_System_Reflection_Assembly_load_with_partial_name}
6638 static const IcallEntry assembly_name_icalls [] = {
6639 {"ParseName", ves_icall_System_Reflection_AssemblyName_ParseName}
6642 static const IcallEntry methodbase_icalls [] = {
6643 {"GetCurrentMethod", ves_icall_GetCurrentMethod},
6644 {"GetMethodBodyInternal", ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal},
6645 {"GetMethodFromHandleInternal", ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal}
6648 static const IcallEntry module_icalls [] = {
6649 {"Close", ves_icall_System_Reflection_Module_Close},
6650 {"GetGlobalType", ves_icall_System_Reflection_Module_GetGlobalType},
6651 {"GetGuidInternal", ves_icall_System_Reflection_Module_GetGuidInternal},
6652 {"GetPEKind", ves_icall_System_Reflection_Module_GetPEKind},
6653 {"InternalGetTypes", ves_icall_System_Reflection_Module_InternalGetTypes},
6654 {"ResolveFieldToken", ves_icall_System_Reflection_Module_ResolveFieldToken},
6655 {"ResolveMemberToken", ves_icall_System_Reflection_Module_ResolveMemberToken},
6656 {"ResolveMethodToken", ves_icall_System_Reflection_Module_ResolveMethodToken},
6657 {"ResolveStringToken", ves_icall_System_Reflection_Module_ResolveStringToken},
6658 {"ResolveTypeToken", ves_icall_System_Reflection_Module_ResolveTypeToken},
6659 {"get_MDStreamVersion", ves_icall_System_Reflection_Module_get_MDStreamVersion},
6660 {"get_MetadataToken", mono_reflection_get_token}
6663 static const IcallEntry monocmethod_icalls [] = {
6664 {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
6665 {"InternalInvoke", ves_icall_InternalInvoke},
6666 {"get_Mono_IsInflatedMethod", ves_icall_MonoMethod_get_Mono_IsInflatedMethod}
6669 static const IcallEntry monoeventinfo_icalls [] = {
6670 {"get_event_info", ves_icall_get_event_info}
6673 static const IcallEntry monofield_icalls [] = {
6674 {"GetFieldOffset", ves_icall_MonoField_GetFieldOffset},
6675 {"GetParentType", ves_icall_MonoField_GetParentType},
6676 {"GetValueInternal", ves_icall_MonoField_GetValueInternal},
6677 {"Mono_GetGenericFieldDefinition", ves_icall_MonoField_Mono_GetGenericFieldDefinition},
6678 {"SetValueInternal", ves_icall_FieldInfo_SetValueInternal}
6681 static const IcallEntry monogenericclass_icalls [] = {
6682 {"GetConstructors_internal", ves_icall_MonoGenericClass_GetConstructors},
6683 {"GetCorrespondingInflatedConstructor", ves_icall_MonoGenericClass_GetCorrespondingInflatedConstructor},
6684 {"GetCorrespondingInflatedField", ves_icall_MonoGenericClass_GetCorrespondingInflatedField},
6685 {"GetCorrespondingInflatedMethod", ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod},
6686 {"GetEvents_internal", ves_icall_MonoGenericClass_GetEvents},
6687 {"GetFields_internal", ves_icall_MonoGenericClass_GetFields},
6688 {"GetInterfaces_internal", ves_icall_MonoGenericClass_GetInterfaces},
6689 {"GetMethods_internal", ves_icall_MonoGenericClass_GetMethods},
6690 {"GetParentType", ves_icall_MonoGenericClass_GetParentType},
6691 {"GetProperties_internal", ves_icall_MonoGenericClass_GetProperties},
6692 {"initialize", mono_reflection_generic_class_initialize}
6695 static const IcallEntry monogenericmethod_icalls [] = {
6696 {"get_ReflectedType", ves_icall_MonoGenericMethod_get_ReflectedType}
6699 static const IcallEntry generictypeparambuilder_icalls [] = {
6700 {"initialize", mono_reflection_initialize_generic_parameter}
6703 static const IcallEntry monomethod_icalls [] = {
6704 {"GetDllImportAttribute", ves_icall_MonoMethod_GetDllImportAttribute},
6705 {"GetGenericArguments", ves_icall_MonoMethod_GetGenericArguments},
6706 {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
6707 {"InternalInvoke", ves_icall_InternalInvoke},
6708 {"MakeGenericMethod_impl", mono_reflection_bind_generic_method_parameters},
6709 {"get_HasGenericParameters", ves_icall_MonoMethod_get_HasGenericParameters},
6710 {"get_IsGenericMethodDefinition", ves_icall_MonoMethod_get_IsGenericMethodDefinition},
6711 {"get_Mono_IsInflatedMethod", ves_icall_MonoMethod_get_Mono_IsInflatedMethod},
6712 {"get_base_definition", ves_icall_MonoMethod_get_base_definition}
6715 static const IcallEntry monomethodinfo_icalls [] = {
6716 {"get_method_info", ves_icall_get_method_info},
6717 {"get_parameter_info", ves_icall_get_parameter_info}
6720 static const IcallEntry monopropertyinfo_icalls [] = {
6721 {"get_property_info", ves_icall_get_property_info}
6724 static const IcallEntry parameterinfo_icalls [] = {
6725 {"get_MetadataToken", mono_reflection_get_token}
6728 static const IcallEntry dns_icalls [] = {
6729 {"GetHostByAddr_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByAddr_internal},
6730 {"GetHostByName_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByName_internal},
6731 {"GetHostName_internal(string&)", ves_icall_System_Net_Dns_GetHostName_internal}
6734 static const IcallEntry socket_icalls [] = {
6735 {"Accept_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Accept_internal},
6736 {"Available_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Available_internal},
6737 {"Bind_internal(intptr,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_Bind_internal},
6738 {"Blocking_internal(intptr,bool,int&)", ves_icall_System_Net_Sockets_Socket_Blocking_internal},
6739 {"Close_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_Close_internal},
6740 {"Connect_internal(intptr,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_Connect_internal},
6741 {"GetSocketOption_arr_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,byte[]&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal},
6742 {"GetSocketOption_obj_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object&,int&)", ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal},
6743 {"Listen_internal(intptr,int,int&)", ves_icall_System_Net_Sockets_Socket_Listen_internal},
6744 {"LocalEndPoint_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal},
6745 {"Poll_internal", ves_icall_System_Net_Sockets_Socket_Poll_internal},
6746 {"Receive_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Receive_internal},
6747 {"RecvFrom_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress&,int&)", ves_icall_System_Net_Sockets_Socket_RecvFrom_internal},
6748 {"RemoteEndPoint_internal(intptr,int&)", ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal},
6749 {"Select_internal(System.Net.Sockets.Socket[]&,int,int&)", ves_icall_System_Net_Sockets_Socket_Select_internal},
6750 {"SendTo_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.SocketAddress,int&)", ves_icall_System_Net_Sockets_Socket_SendTo_internal},
6751 {"Send_internal(intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&)", ves_icall_System_Net_Sockets_Socket_Send_internal},
6752 {"SetSocketOption_internal(intptr,System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,object,byte[],int,int&)", ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal},
6753 {"Shutdown_internal(intptr,System.Net.Sockets.SocketShutdown,int&)", ves_icall_System_Net_Sockets_Socket_Shutdown_internal},
6754 {"Socket_internal(System.Net.Sockets.AddressFamily,System.Net.Sockets.SocketType,System.Net.Sockets.ProtocolType,int&)", ves_icall_System_Net_Sockets_Socket_Socket_internal},
6755 {"WSAIoctl(intptr,int,byte[],byte[],int&)", ves_icall_System_Net_Sockets_Socket_WSAIoctl}
6758 static const IcallEntry socketex_icalls [] = {
6759 {"WSAGetLastError_internal", ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal}
6762 static const IcallEntry object_icalls [] = {
6763 {"GetType", ves_icall_System_Object_GetType},
6764 {"InternalGetHashCode", ves_icall_System_Object_GetHashCode},
6765 {"MemberwiseClone", ves_icall_System_Object_MemberwiseClone},
6766 {"obj_address", ves_icall_System_Object_obj_address}
6769 static const IcallEntry assemblybuilder_icalls[] = {
6770 {"InternalAddModule", mono_image_load_module},
6771 {"basic_init", mono_image_basic_init}
6774 static const IcallEntry customattrbuilder_icalls [] = {
6775 {"GetBlob", mono_reflection_get_custom_attrs_blob}
6778 static const IcallEntry dynamicmethod_icalls [] = {
6779 {"create_dynamic_method", mono_reflection_create_dynamic_method}
6782 static const IcallEntry methodbuilder_icalls [] = {
6783 {"MakeGenericMethod", mono_reflection_bind_generic_method_parameters}
6786 static const IcallEntry modulebuilder_icalls [] = {
6787 {"WriteToFile", ves_icall_ModuleBuilder_WriteToFile},
6788 {"basic_init", mono_image_module_basic_init},
6789 {"build_metadata", ves_icall_ModuleBuilder_build_metadata},
6790 {"create_modified_type", ves_icall_ModuleBuilder_create_modified_type},
6791 {"getMethodToken", ves_icall_ModuleBuilder_getMethodToken},
6792 {"getToken", ves_icall_ModuleBuilder_getToken},
6793 {"getUSIndex", mono_image_insert_string}
6796 static const IcallEntry signaturehelper_icalls [] = {
6797 {"get_signature_field", mono_reflection_sighelper_get_signature_field},
6798 {"get_signature_local", mono_reflection_sighelper_get_signature_local}
6801 static const IcallEntry typebuilder_icalls [] = {
6802 {"create_generic_class", mono_reflection_create_generic_class},
6803 {"create_internal_class", mono_reflection_create_internal_class},
6804 {"create_runtime_class", mono_reflection_create_runtime_class},
6805 {"get_IsGenericParameter", ves_icall_TypeBuilder_get_IsGenericParameter},
6806 {"get_event_info", mono_reflection_event_builder_get_event_info},
6807 {"setup_generic_class", mono_reflection_setup_generic_class},
6808 {"setup_internal_class", mono_reflection_setup_internal_class}
6811 static const IcallEntry enumbuilder_icalls [] = {
6812 {"setup_enum_type", ves_icall_EnumBuilder_setup_enum_type}
6815 static const IcallEntry runtimehelpers_icalls [] = {
6816 {"GetObjectValue", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetObjectValue},
6817 /* REMOVEME: no longer needed, just so we dont break things when not needed */
6818 {"GetOffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData},
6819 {"InitializeArray", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_InitializeArray},
6820 {"RunClassConstructor", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor},
6821 {"get_OffsetToStringData", ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_GetOffsetToStringData}
6824 static const IcallEntry gchandle_icalls [] = {
6825 {"CheckCurrentDomain", GCHandle_CheckCurrentDomain},
6826 {"FreeHandle", ves_icall_System_GCHandle_FreeHandle},
6827 {"GetAddrOfPinnedObject", ves_icall_System_GCHandle_GetAddrOfPinnedObject},
6828 {"GetTarget", ves_icall_System_GCHandle_GetTarget},
6829 {"GetTargetHandle", ves_icall_System_GCHandle_GetTargetHandle}
6832 static const IcallEntry marshal_icalls [] = {
6833 {"AllocCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_AllocCoTaskMem},
6834 {"AllocHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_AllocHGlobal},
6835 {"DestroyStructure", ves_icall_System_Runtime_InteropServices_Marshal_DestroyStructure},
6836 {"FreeCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_FreeCoTaskMem},
6837 {"FreeHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_FreeHGlobal},
6838 {"GetDelegateForFunctionPointerInternal", ves_icall_System_Runtime_InteropServices_Marshal_GetDelegateForFunctionPointerInternal},
6839 {"GetFunctionPointerForDelegateInternal", mono_delegate_to_ftnptr},
6840 {"GetLastWin32Error", ves_icall_System_Runtime_InteropServices_Marshal_GetLastWin32Error},
6841 {"OffsetOf", ves_icall_System_Runtime_InteropServices_Marshal_OffsetOf},
6842 {"Prelink", ves_icall_System_Runtime_InteropServices_Marshal_Prelink},
6843 {"PrelinkAll", ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll},
6844 {"PtrToStringAnsi(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi},
6845 {"PtrToStringAnsi(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len},
6846 {"PtrToStringAuto(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi},
6847 {"PtrToStringAuto(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi_len},
6848 {"PtrToStringBSTR", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringBSTR},
6849 {"PtrToStringUni(intptr)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni},
6850 {"PtrToStringUni(intptr,int)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringUni_len},
6851 {"PtrToStructure(intptr,System.Type)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure_type},
6852 {"PtrToStructure(intptr,object)", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure},
6853 {"ReAllocHGlobal", mono_marshal_realloc},
6854 {"ReadByte", ves_icall_System_Runtime_InteropServices_Marshal_ReadByte},
6855 {"ReadInt16", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt16},
6856 {"ReadInt32", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt32},
6857 {"ReadInt64", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt64},
6858 {"ReadIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_ReadIntPtr},
6859 {"SizeOf", ves_icall_System_Runtime_InteropServices_Marshal_SizeOf},
6860 {"StringToHGlobalAnsi", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi},
6861 {"StringToHGlobalAuto", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalAnsi},
6862 {"StringToHGlobalUni", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalUni},
6863 {"StructureToPtr", ves_icall_System_Runtime_InteropServices_Marshal_StructureToPtr},
6864 {"UnsafeAddrOfPinnedArrayElement", ves_icall_System_Runtime_InteropServices_Marshal_UnsafeAddrOfPinnedArrayElement},
6865 {"WriteByte", ves_icall_System_Runtime_InteropServices_Marshal_WriteByte},
6866 {"WriteInt16", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt16},
6867 {"WriteInt32", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt32},
6868 {"WriteInt64", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt64},
6869 {"WriteIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_WriteIntPtr},
6870 {"copy_from_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged},
6871 {"copy_to_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_to_unmanaged}
6874 static const IcallEntry activationservices_icalls [] = {
6875 {"AllocateUninitializedClassInstance", ves_icall_System_Runtime_Activation_ActivationServices_AllocateUninitializedClassInstance},
6876 {"EnableProxyActivation", ves_icall_System_Runtime_Activation_ActivationServices_EnableProxyActivation}
6879 static const IcallEntry monomethodmessage_icalls [] = {
6880 {"InitMessage", ves_icall_MonoMethodMessage_InitMessage}
6883 static const IcallEntry realproxy_icalls [] = {
6884 {"InternalGetProxyType", ves_icall_Remoting_RealProxy_InternalGetProxyType},
6885 {"InternalGetTransparentProxy", ves_icall_Remoting_RealProxy_GetTransparentProxy}
6888 static const IcallEntry remotingservices_icalls [] = {
6889 {"InternalExecute", ves_icall_InternalExecute},
6890 {"IsTransparentProxy", ves_icall_IsTransparentProxy}
6893 static const IcallEntry rng_icalls [] = {
6894 {"RngClose", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose},
6895 {"RngGetBytes", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngGetBytes},
6896 {"RngInitialize", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngInitialize},
6897 {"RngOpen", ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen}
6900 static const IcallEntry methodhandle_icalls [] = {
6901 {"GetFunctionPointer", ves_icall_RuntimeMethod_GetFunctionPointer}
6904 static const IcallEntry string_icalls [] = {
6905 {".ctor(char*)", ves_icall_System_String_ctor_charp},
6906 {".ctor(char*,int,int)", ves_icall_System_String_ctor_charp_int_int},
6907 {".ctor(char,int)", ves_icall_System_String_ctor_char_int},
6908 {".ctor(char[])", ves_icall_System_String_ctor_chara},
6909 {".ctor(char[],int,int)", ves_icall_System_String_ctor_chara_int_int},
6910 {".ctor(sbyte*)", ves_icall_System_String_ctor_sbytep},
6911 {".ctor(sbyte*,int,int)", ves_icall_System_String_ctor_sbytep_int_int},
6912 {".ctor(sbyte*,int,int,System.Text.Encoding)", ves_icall_System_String_ctor_encoding},
6913 {"InternalAllocateStr", ves_icall_System_String_InternalAllocateStr},
6914 {"InternalCharCopy", ves_icall_System_String_InternalCharCopy},
6915 {"InternalCopyTo", ves_icall_System_String_InternalCopyTo},
6916 {"InternalIndexOfAny", ves_icall_System_String_InternalIndexOfAny},
6917 {"InternalInsert", ves_icall_System_String_InternalInsert},
6918 {"InternalIntern", ves_icall_System_String_InternalIntern},
6919 {"InternalIsInterned", ves_icall_System_String_InternalIsInterned},
6920 {"InternalJoin", ves_icall_System_String_InternalJoin},
6921 {"InternalLastIndexOfAny", ves_icall_System_String_InternalLastIndexOfAny},
6922 {"InternalPad", ves_icall_System_String_InternalPad},
6923 {"InternalRemove", ves_icall_System_String_InternalRemove},
6924 {"InternalReplace(char,char)", ves_icall_System_String_InternalReplace_Char},
6925 {"InternalReplace(string,string,System.Globalization.CompareInfo)", ves_icall_System_String_InternalReplace_Str_Comp},
6926 {"InternalSplit", ves_icall_System_String_InternalSplit},
6927 {"InternalStrcpy(string,int,char[])", ves_icall_System_String_InternalStrcpy_Chars},
6928 {"InternalStrcpy(string,int,char[],int,int)", ves_icall_System_String_InternalStrcpy_CharsN},
6929 {"InternalStrcpy(string,int,string)", ves_icall_System_String_InternalStrcpy_Str},
6930 {"InternalStrcpy(string,int,string,int,int)", ves_icall_System_String_InternalStrcpy_StrN},
6931 {"InternalTrim", ves_icall_System_String_InternalTrim},
6932 {"get_Chars", ves_icall_System_String_get_Chars}
6935 static const IcallEntry encoding_icalls [] = {
6936 {"InternalCodePage", ves_icall_System_Text_Encoding_InternalCodePage}
6939 static const IcallEntry monitor_icalls [] = {
6940 {"Monitor_exit", ves_icall_System_Threading_Monitor_Monitor_exit},
6941 {"Monitor_pulse", ves_icall_System_Threading_Monitor_Monitor_pulse},
6942 {"Monitor_pulse_all", ves_icall_System_Threading_Monitor_Monitor_pulse_all},
6943 {"Monitor_test_owner", ves_icall_System_Threading_Monitor_Monitor_test_owner},
6944 {"Monitor_test_synchronised", ves_icall_System_Threading_Monitor_Monitor_test_synchronised},
6945 {"Monitor_try_enter", ves_icall_System_Threading_Monitor_Monitor_try_enter},
6946 {"Monitor_wait", ves_icall_System_Threading_Monitor_Monitor_wait}
6949 static const IcallEntry interlocked_icalls [] = {
6950 {"Add(int&,int)", ves_icall_System_Threading_Interlocked_Add_Int},
6951 {"Add(long&,long)", ves_icall_System_Threading_Interlocked_Add_Long},
6952 {"CompareExchange(T&,T,T)", ves_icall_System_Threading_Interlocked_CompareExchange_T},
6953 {"CompareExchange(double&,double,double)", ves_icall_System_Threading_Interlocked_CompareExchange_Double},
6954 {"CompareExchange(int&,int,int)", ves_icall_System_Threading_Interlocked_CompareExchange_Int},
6955 {"CompareExchange(intptr&,intptr,intptr)", ves_icall_System_Threading_Interlocked_CompareExchange_Object},
6956 {"CompareExchange(long&,long,long)", ves_icall_System_Threading_Interlocked_CompareExchange_Long},
6957 {"CompareExchange(object&,object,object)", ves_icall_System_Threading_Interlocked_CompareExchange_Object},
6958 {"CompareExchange(single&,single,single)", ves_icall_System_Threading_Interlocked_CompareExchange_Single},
6959 {"Decrement(int&)", ves_icall_System_Threading_Interlocked_Decrement_Int},
6960 {"Decrement(long&)", ves_icall_System_Threading_Interlocked_Decrement_Long},
6961 {"Exchange(T&,T)", ves_icall_System_Threading_Interlocked_Exchange_T},
6962 {"Exchange(double&,double)", ves_icall_System_Threading_Interlocked_Exchange_Double},
6963 {"Exchange(int&,int)", ves_icall_System_Threading_Interlocked_Exchange_Int},
6964 {"Exchange(intptr&,intptr)", ves_icall_System_Threading_Interlocked_Exchange_Object},
6965 {"Exchange(long&,long)", ves_icall_System_Threading_Interlocked_Exchange_Long},
6966 {"Exchange(object&,object)", ves_icall_System_Threading_Interlocked_Exchange_Object},
6967 {"Exchange(single&,single)", ves_icall_System_Threading_Interlocked_Exchange_Single},
6968 {"Increment(int&)", ves_icall_System_Threading_Interlocked_Increment_Int},
6969 {"Increment(long&)", ves_icall_System_Threading_Interlocked_Increment_Long},
6970 {"Read(long&)", ves_icall_System_Threading_Interlocked_Read_Long}
6973 static const IcallEntry mutex_icalls [] = {
6974 {"CreateMutex_internal(bool,string,bool&)", ves_icall_System_Threading_Mutex_CreateMutex_internal},
6975 {"OpenMutex_internal(string,System.Security.AccessControl.MutexRights,System.IO.MonoIOError&)", ves_icall_System_Threading_Mutex_OpenMutex_internal},
6976 {"ReleaseMutex_internal(intptr)", ves_icall_System_Threading_Mutex_ReleaseMutex_internal}
6979 static const IcallEntry semaphore_icalls [] = {
6980 {"CreateSemaphore_internal(int,int,string,bool&)", ves_icall_System_Threading_Semaphore_CreateSemaphore_internal},
6981 {"OpenSemaphore_internal(string,System.Security.AccessControl.SemaphoreRights,System.IO.MonoIOError&)", ves_icall_System_Threading_Semaphore_OpenSemaphore_internal},
6982 {"ReleaseSemaphore_internal(intptr,int,bool&)", ves_icall_System_Threading_Semaphore_ReleaseSemaphore_internal}
6985 static const IcallEntry nativeevents_icalls [] = {
6986 {"CloseEvent_internal", ves_icall_System_Threading_Events_CloseEvent_internal},
6987 {"CreateEvent_internal(bool,bool,string,bool&)", ves_icall_System_Threading_Events_CreateEvent_internal},
6988 {"OpenEvent_internal(string,System.Security.AccessControl.EventWaitHandleRights,System.IO.MonoIOError&)", ves_icall_System_Threading_Events_OpenEvent_internal},
6989 {"ResetEvent_internal", ves_icall_System_Threading_Events_ResetEvent_internal},
6990 {"SetEvent_internal", ves_icall_System_Threading_Events_SetEvent_internal}
6993 static const IcallEntry thread_icalls [] = {
6994 {"Abort_internal(object)", ves_icall_System_Threading_Thread_Abort},
6995 {"ClrState", ves_icall_System_Threading_Thread_ClrState},
6996 {"CurrentThread_internal", mono_thread_current},
6997 {"GetCachedCurrentCulture", ves_icall_System_Threading_Thread_GetCachedCurrentCulture},
6998 {"GetCachedCurrentUICulture", ves_icall_System_Threading_Thread_GetCachedCurrentUICulture},
6999 {"GetDomainID", ves_icall_System_Threading_Thread_GetDomainID},
7000 {"GetName_internal", ves_icall_System_Threading_Thread_GetName_internal},
7001 {"GetSerializedCurrentCulture", ves_icall_System_Threading_Thread_GetSerializedCurrentCulture},
7002 {"GetSerializedCurrentUICulture", ves_icall_System_Threading_Thread_GetSerializedCurrentUICulture},
7003 {"GetState", ves_icall_System_Threading_Thread_GetState},
7004 {"Join_internal", ves_icall_System_Threading_Thread_Join_internal},
7005 {"MemoryBarrier", ves_icall_System_Threading_Thread_MemoryBarrier},
7006 {"ResetAbort_internal()", ves_icall_System_Threading_Thread_ResetAbort},
7007 {"Resume_internal()", ves_icall_System_Threading_Thread_Resume},
7008 {"SetCachedCurrentCulture", ves_icall_System_Threading_Thread_SetCachedCurrentCulture},
7009 {"SetCachedCurrentUICulture", ves_icall_System_Threading_Thread_SetCachedCurrentUICulture},
7010 {"SetName_internal", ves_icall_System_Threading_Thread_SetName_internal},
7011 {"SetSerializedCurrentCulture", ves_icall_System_Threading_Thread_SetSerializedCurrentCulture},
7012 {"SetSerializedCurrentUICulture", ves_icall_System_Threading_Thread_SetSerializedCurrentUICulture},
7013 {"SetState", ves_icall_System_Threading_Thread_SetState},
7014 {"Sleep_internal", ves_icall_System_Threading_Thread_Sleep_internal},
7015 {"Suspend_internal", ves_icall_System_Threading_Thread_Suspend},
7016 {"Thread_free_internal", ves_icall_System_Threading_Thread_Thread_free_internal},
7017 {"Thread_internal", ves_icall_System_Threading_Thread_Thread_internal},
7018 {"VolatileRead(byte&)", ves_icall_System_Threading_Thread_VolatileRead1},
7019 {"VolatileRead(double&)", ves_icall_System_Threading_Thread_VolatileRead8},
7020 {"VolatileRead(int&)", ves_icall_System_Threading_Thread_VolatileRead4},
7021 {"VolatileRead(int16&)", ves_icall_System_Threading_Thread_VolatileRead2},
7022 {"VolatileRead(intptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
7023 {"VolatileRead(long&)", ves_icall_System_Threading_Thread_VolatileRead8},
7024 {"VolatileRead(object&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
7025 {"VolatileRead(sbyte&)", ves_icall_System_Threading_Thread_VolatileRead1},
7026 {"VolatileRead(single&)", ves_icall_System_Threading_Thread_VolatileRead4},
7027 {"VolatileRead(uint&)", ves_icall_System_Threading_Thread_VolatileRead2},
7028 {"VolatileRead(uint16&)", ves_icall_System_Threading_Thread_VolatileRead2},
7029 {"VolatileRead(uintptr&)", ves_icall_System_Threading_Thread_VolatileReadIntPtr},
7030 {"VolatileRead(ulong&)", ves_icall_System_Threading_Thread_VolatileRead8},
7031 {"VolatileWrite(byte&,byte)", ves_icall_System_Threading_Thread_VolatileWrite1},
7032 {"VolatileWrite(double&,double)", ves_icall_System_Threading_Thread_VolatileWrite8},
7033 {"VolatileWrite(int&,int)", ves_icall_System_Threading_Thread_VolatileWrite4},
7034 {"VolatileWrite(int16&,int16)", ves_icall_System_Threading_Thread_VolatileWrite2},
7035 {"VolatileWrite(intptr&,intptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
7036 {"VolatileWrite(long&,long)", ves_icall_System_Threading_Thread_VolatileWrite8},
7037 {"VolatileWrite(object&,object)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
7038 {"VolatileWrite(sbyte&,sbyte)", ves_icall_System_Threading_Thread_VolatileWrite1},
7039 {"VolatileWrite(single&,single)", ves_icall_System_Threading_Thread_VolatileWrite4},
7040 {"VolatileWrite(uint&,uint)", ves_icall_System_Threading_Thread_VolatileWrite2},
7041 {"VolatileWrite(uint16&,uint16)", ves_icall_System_Threading_Thread_VolatileWrite2},
7042 {"VolatileWrite(uintptr&,uintptr)", ves_icall_System_Threading_Thread_VolatileWriteIntPtr},
7043 {"VolatileWrite(ulong&,ulong)", ves_icall_System_Threading_Thread_VolatileWrite8},
7044 {"current_lcid()", ves_icall_System_Threading_Thread_current_lcid}
7047 static const IcallEntry threadpool_icalls [] = {
7048 {"GetAvailableThreads", ves_icall_System_Threading_ThreadPool_GetAvailableThreads},
7049 {"GetMaxThreads", ves_icall_System_Threading_ThreadPool_GetMaxThreads},
7050 {"GetMinThreads", ves_icall_System_Threading_ThreadPool_GetMinThreads},
7051 {"SetMinThreads", ves_icall_System_Threading_ThreadPool_SetMinThreads}
7054 static const IcallEntry waithandle_icalls [] = {
7055 {"WaitAll_internal", ves_icall_System_Threading_WaitHandle_WaitAll_internal},
7056 {"WaitAny_internal", ves_icall_System_Threading_WaitHandle_WaitAny_internal},
7057 {"WaitOne_internal", ves_icall_System_Threading_WaitHandle_WaitOne_internal}
7060 static const IcallEntry type_icalls [] = {
7061 {"Equals", ves_icall_type_Equals},
7062 {"GetGenericParameterAttributes", ves_icall_Type_GetGenericParameterAttributes},
7063 {"GetGenericParameterConstraints_impl", ves_icall_Type_GetGenericParameterConstraints},
7064 {"GetGenericParameterPosition", ves_icall_Type_GetGenericParameterPosition},
7065 {"GetGenericTypeDefinition_impl", ves_icall_Type_GetGenericTypeDefinition_impl},
7066 {"GetInterfaceMapData", ves_icall_Type_GetInterfaceMapData},
7067 {"GetPacking", ves_icall_Type_GetPacking},
7068 {"GetTypeCode", ves_icall_type_GetTypeCodeInternal},
7069 {"GetTypeCodeInternal", ves_icall_type_GetTypeCodeInternal},
7070 {"IsArrayImpl", ves_icall_Type_IsArrayImpl},
7071 {"IsInstanceOfType", ves_icall_type_IsInstanceOfType},
7072 {"MakeGenericType", ves_icall_Type_MakeGenericType},
7073 {"MakePointerType", ves_icall_Type_MakePointerType},
7074 {"get_IsGenericInstance", ves_icall_Type_get_IsGenericInstance},
7075 {"get_IsGenericType", ves_icall_Type_get_IsGenericType},
7076 {"get_IsGenericTypeDefinition", ves_icall_Type_get_IsGenericTypeDefinition},
7077 {"internal_from_handle", ves_icall_type_from_handle},
7078 {"internal_from_name", ves_icall_type_from_name},
7079 {"make_array_type", ves_icall_Type_make_array_type},
7080 {"make_byref_type", ves_icall_Type_make_byref_type},
7081 {"type_is_assignable_from", ves_icall_type_is_assignable_from},
7082 {"type_is_subtype_of", ves_icall_type_is_subtype_of}
7085 static const IcallEntry typedref_icalls [] = {
7086 {"ToObject", mono_TypedReference_ToObject},
7087 {"ToObjectInternal", mono_TypedReference_ToObjectInternal}
7090 static const IcallEntry valuetype_icalls [] = {
7091 {"InternalEquals", ves_icall_System_ValueType_Equals},
7092 {"InternalGetHashCode", ves_icall_System_ValueType_InternalGetHashCode}
7095 static const IcallEntry web_icalls [] = {
7096 {"GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path},
7097 {"GetMachineInstallDirectory", ves_icall_System_Web_Util_ICalls_get_machine_install_dir}
7100 static const IcallEntry identity_icalls [] = {
7101 {"GetCurrentToken", ves_icall_System_Security_Principal_WindowsIdentity_GetCurrentToken},
7102 {"GetTokenName", ves_icall_System_Security_Principal_WindowsIdentity_GetTokenName},
7103 {"GetUserToken", ves_icall_System_Security_Principal_WindowsIdentity_GetUserToken},
7104 {"_GetRoles", ves_icall_System_Security_Principal_WindowsIdentity_GetRoles}
7107 static const IcallEntry impersonation_icalls [] = {
7108 {"CloseToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_CloseToken},
7109 {"DuplicateToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_DuplicateToken},
7110 {"RevertToSelf", ves_icall_System_Security_Principal_WindowsImpersonationContext_RevertToSelf},
7111 {"SetCurrentToken", ves_icall_System_Security_Principal_WindowsImpersonationContext_SetCurrentToken}
7114 static const IcallEntry principal_icalls [] = {
7115 {"IsMemberOfGroupId", ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupId},
7116 {"IsMemberOfGroupName", ves_icall_System_Security_Principal_WindowsPrincipal_IsMemberOfGroupName}
7119 static const IcallEntry keypair_icalls [] = {
7120 {"_CanSecure", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_CanSecure},
7121 {"_IsMachineProtected", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsMachineProtected},
7122 {"_IsUserProtected", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_IsUserProtected},
7123 {"_ProtectMachine", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectMachine},
7124 {"_ProtectUser", ves_icall_Mono_Security_Cryptography_KeyPairPersistence_ProtectUser}
7127 static const IcallEntry evidence_icalls [] = {
7128 {"IsAuthenticodePresent", ves_icall_System_Security_Policy_Evidence_IsAuthenticodePresent}
7131 static const IcallEntry securitymanager_icalls [] = {
7132 {"GetLinkDemandSecurity", ves_icall_System_Security_SecurityManager_GetLinkDemandSecurity},
7133 {"get_CheckExecutionRights", ves_icall_System_Security_SecurityManager_get_CheckExecutionRights},
7134 {"get_SecurityEnabled", ves_icall_System_Security_SecurityManager_get_SecurityEnabled},
7135 {"set_CheckExecutionRights", ves_icall_System_Security_SecurityManager_set_CheckExecutionRights},
7136 {"set_SecurityEnabled", ves_icall_System_Security_SecurityManager_set_SecurityEnabled}
7139 static const IcallEntry generic_array_icalls [] = {
7140 {"GetGenericValueImpl", ves_icall_System_Array_InternalArray_GetGenericValueImpl}
7144 static const IcallEntry array_icalls [] = {
7149 /* keep the entries all sorted */
7150 static const IcallMap icall_entries [] = {
7151 {"Mono.Runtime", runtime_icalls, G_N_ELEMENTS (runtime_icalls)},
7152 {"Mono.Security.Cryptography.KeyPairPersistence", keypair_icalls, G_N_ELEMENTS (keypair_icalls)},
7153 {"System.Activator", activator_icalls, G_N_ELEMENTS (activator_icalls)},
7154 {"System.AppDomain", appdomain_icalls, G_N_ELEMENTS (appdomain_icalls)},
7155 {"System.ArgIterator", argiterator_icalls, G_N_ELEMENTS (argiterator_icalls)},
7156 {"System.Array", array_icalls, G_N_ELEMENTS (array_icalls)},
7157 {"System.Array/InternalArray`1", generic_array_icalls, G_N_ELEMENTS (generic_array_icalls)},
7158 {"System.Buffer", buffer_icalls, G_N_ELEMENTS (buffer_icalls)},
7159 {"System.Char", char_icalls, G_N_ELEMENTS (char_icalls)},
7160 {"System.Configuration.DefaultConfig", defaultconf_icalls, G_N_ELEMENTS (defaultconf_icalls)},
7161 {"System.ConsoleDriver", consoledriver_icalls, G_N_ELEMENTS (consoledriver_icalls)},
7162 {"System.Convert", convert_icalls, G_N_ELEMENTS (convert_icalls)},
7163 {"System.CurrentSystemTimeZone", timezone_icalls, G_N_ELEMENTS (timezone_icalls)},
7164 {"System.DateTime", datetime_icalls, G_N_ELEMENTS (datetime_icalls)},
7165 #ifndef DISABLE_DECIMAL
7166 {"System.Decimal", decimal_icalls, G_N_ELEMENTS (decimal_icalls)},
7168 {"System.Delegate", delegate_icalls, G_N_ELEMENTS (delegate_icalls)},
7169 {"System.Diagnostics.DefaultTraceListener", tracelist_icalls, G_N_ELEMENTS (tracelist_icalls)},
7170 {"System.Diagnostics.FileVersionInfo", fileversion_icalls, G_N_ELEMENTS (fileversion_icalls)},
7171 {"System.Diagnostics.Process", process_icalls, G_N_ELEMENTS (process_icalls)},
7172 {"System.Double", double_icalls, G_N_ELEMENTS (double_icalls)},
7173 {"System.Enum", enum_icalls, G_N_ELEMENTS (enum_icalls)},
7174 {"System.Environment", environment_icalls, G_N_ELEMENTS (environment_icalls)},
7175 {"System.GC", gc_icalls, G_N_ELEMENTS (gc_icalls)},
7176 {"System.Globalization.CompareInfo", compareinfo_icalls, G_N_ELEMENTS (compareinfo_icalls)},
7177 {"System.Globalization.CultureInfo", cultureinfo_icalls, G_N_ELEMENTS (cultureinfo_icalls)},
7178 {"System.Globalization.RegionInfo", regioninfo_icalls, G_N_ELEMENTS (regioninfo_icalls)},
7179 {"System.IO.FAMWatcher", famwatcher_icalls, G_N_ELEMENTS (famwatcher_icalls)},
7180 {"System.IO.FileSystemWatcher", filewatcher_icalls, G_N_ELEMENTS (filewatcher_icalls)},
7181 {"System.IO.MonoIO", monoio_icalls, G_N_ELEMENTS (monoio_icalls)},
7182 {"System.IO.Path", path_icalls, G_N_ELEMENTS (path_icalls)},
7183 {"System.Math", math_icalls, G_N_ELEMENTS (math_icalls)},
7184 {"System.MonoCustomAttrs", customattrs_icalls, G_N_ELEMENTS (customattrs_icalls)},
7185 {"System.MonoEnumInfo", enuminfo_icalls, G_N_ELEMENTS (enuminfo_icalls)},
7186 {"System.MonoType", monotype_icalls, G_N_ELEMENTS (monotype_icalls)},
7187 {"System.Net.Dns", dns_icalls, G_N_ELEMENTS (dns_icalls)},
7188 {"System.Net.Sockets.Socket", socket_icalls, G_N_ELEMENTS (socket_icalls)},
7189 {"System.Net.Sockets.SocketException", socketex_icalls, G_N_ELEMENTS (socketex_icalls)},
7190 {"System.Object", object_icalls, G_N_ELEMENTS (object_icalls)},
7191 {"System.Reflection.Assembly", assembly_icalls, G_N_ELEMENTS (assembly_icalls)},
7192 {"System.Reflection.AssemblyName", assembly_name_icalls, G_N_ELEMENTS (assembly_name_icalls)},
7193 {"System.Reflection.Emit.AssemblyBuilder", assemblybuilder_icalls, G_N_ELEMENTS (assemblybuilder_icalls)},
7194 {"System.Reflection.Emit.CustomAttributeBuilder", customattrbuilder_icalls, G_N_ELEMENTS (customattrbuilder_icalls)},
7195 {"System.Reflection.Emit.DynamicMethod", dynamicmethod_icalls, G_N_ELEMENTS (dynamicmethod_icalls)},
7196 {"System.Reflection.Emit.EnumBuilder", enumbuilder_icalls, G_N_ELEMENTS (enumbuilder_icalls)},
7197 {"System.Reflection.Emit.GenericTypeParameterBuilder", generictypeparambuilder_icalls, G_N_ELEMENTS (generictypeparambuilder_icalls)},
7198 {"System.Reflection.Emit.MethodBuilder", methodbuilder_icalls, G_N_ELEMENTS (methodbuilder_icalls)},
7199 {"System.Reflection.Emit.ModuleBuilder", modulebuilder_icalls, G_N_ELEMENTS (modulebuilder_icalls)},
7200 {"System.Reflection.Emit.SignatureHelper", signaturehelper_icalls, G_N_ELEMENTS (signaturehelper_icalls)},
7201 {"System.Reflection.Emit.TypeBuilder", typebuilder_icalls, G_N_ELEMENTS (typebuilder_icalls)},
7202 {"System.Reflection.FieldInfo", fieldinfo_icalls, G_N_ELEMENTS (fieldinfo_icalls)},
7203 {"System.Reflection.MemberInfo", memberinfo_icalls, G_N_ELEMENTS (memberinfo_icalls)},
7204 {"System.Reflection.MethodBase", methodbase_icalls, G_N_ELEMENTS (methodbase_icalls)},
7205 {"System.Reflection.Module", module_icalls, G_N_ELEMENTS (module_icalls)},
7206 {"System.Reflection.MonoCMethod", monocmethod_icalls, G_N_ELEMENTS (monocmethod_icalls)},
7207 {"System.Reflection.MonoEventInfo", monoeventinfo_icalls, G_N_ELEMENTS (monoeventinfo_icalls)},
7208 {"System.Reflection.MonoField", monofield_icalls, G_N_ELEMENTS (monofield_icalls)},
7209 {"System.Reflection.MonoGenericCMethod", monogenericmethod_icalls, G_N_ELEMENTS (monogenericmethod_icalls)},
7210 {"System.Reflection.MonoGenericClass", monogenericclass_icalls, G_N_ELEMENTS (monogenericclass_icalls)},
7211 {"System.Reflection.MonoGenericMethod", monogenericmethod_icalls, G_N_ELEMENTS (monogenericmethod_icalls)},
7212 {"System.Reflection.MonoMethod", monomethod_icalls, G_N_ELEMENTS (monomethod_icalls)},
7213 {"System.Reflection.MonoMethodInfo", monomethodinfo_icalls, G_N_ELEMENTS (monomethodinfo_icalls)},
7214 {"System.Reflection.MonoPropertyInfo", monopropertyinfo_icalls, G_N_ELEMENTS (monopropertyinfo_icalls)},
7215 {"System.Reflection.ParameterInfo", parameterinfo_icalls, G_N_ELEMENTS (parameterinfo_icalls)},
7216 {"System.Runtime.CompilerServices.RuntimeHelpers", runtimehelpers_icalls, G_N_ELEMENTS (runtimehelpers_icalls)},
7217 {"System.Runtime.InteropServices.GCHandle", gchandle_icalls, G_N_ELEMENTS (gchandle_icalls)},
7218 {"System.Runtime.InteropServices.Marshal", marshal_icalls, G_N_ELEMENTS (marshal_icalls)},
7219 {"System.Runtime.Remoting.Activation.ActivationServices", activationservices_icalls, G_N_ELEMENTS (activationservices_icalls)},
7220 {"System.Runtime.Remoting.Messaging.MonoMethodMessage", monomethodmessage_icalls, G_N_ELEMENTS (monomethodmessage_icalls)},
7221 {"System.Runtime.Remoting.Proxies.RealProxy", realproxy_icalls, G_N_ELEMENTS (realproxy_icalls)},
7222 {"System.Runtime.Remoting.RemotingServices", remotingservices_icalls, G_N_ELEMENTS (remotingservices_icalls)},
7223 {"System.RuntimeMethodHandle", methodhandle_icalls, G_N_ELEMENTS (methodhandle_icalls)},
7224 {"System.Security.Cryptography.RNGCryptoServiceProvider", rng_icalls, G_N_ELEMENTS (rng_icalls)},
7225 {"System.Security.Policy.Evidence", evidence_icalls, G_N_ELEMENTS (evidence_icalls)},
7226 {"System.Security.Principal.WindowsIdentity", identity_icalls, G_N_ELEMENTS (identity_icalls)},
7227 {"System.Security.Principal.WindowsImpersonationContext", impersonation_icalls, G_N_ELEMENTS (impersonation_icalls)},
7228 {"System.Security.Principal.WindowsPrincipal", principal_icalls, G_N_ELEMENTS (principal_icalls)},
7229 {"System.Security.SecurityManager", securitymanager_icalls, G_N_ELEMENTS (securitymanager_icalls)},
7230 {"System.String", string_icalls, G_N_ELEMENTS (string_icalls)},
7231 {"System.Text.Encoding", encoding_icalls, G_N_ELEMENTS (encoding_icalls)},
7232 {"System.Threading.Interlocked", interlocked_icalls, G_N_ELEMENTS (interlocked_icalls)},
7233 {"System.Threading.Monitor", monitor_icalls, G_N_ELEMENTS (monitor_icalls)},
7234 {"System.Threading.Mutex", mutex_icalls, G_N_ELEMENTS (mutex_icalls)},
7235 {"System.Threading.NativeEventCalls", nativeevents_icalls, G_N_ELEMENTS (nativeevents_icalls)},
7236 {"System.Threading.Semaphore", semaphore_icalls, G_N_ELEMENTS (semaphore_icalls)},
7237 {"System.Threading.Thread", thread_icalls, G_N_ELEMENTS (thread_icalls)},
7238 {"System.Threading.ThreadPool", threadpool_icalls, G_N_ELEMENTS (threadpool_icalls)},
7239 {"System.Threading.WaitHandle", waithandle_icalls, G_N_ELEMENTS (waithandle_icalls)},
7240 {"System.Type", type_icalls, G_N_ELEMENTS (type_icalls)},
7241 {"System.TypedReference", typedref_icalls, G_N_ELEMENTS (typedref_icalls)},
7242 {"System.ValueType", valuetype_icalls, G_N_ELEMENTS (valuetype_icalls)},
7243 {"System.Web.Util.ICalls", web_icalls, G_N_ELEMENTS (web_icalls)}
7246 static GHashTable *icall_hash = NULL;
7247 static GHashTable *jit_icall_hash_name = NULL;
7248 static GHashTable *jit_icall_hash_addr = NULL;
7251 mono_icall_init (void)
7255 /* check that tables are sorted: disable in release */
7258 const IcallMap *imap;
7259 const IcallEntry *ientry;
7260 const char *prev_class = NULL;
7261 const char *prev_method;
7263 for (i = 0; i < G_N_ELEMENTS (icall_entries); ++i) {
7264 imap = &icall_entries [i];
7266 if (prev_class && strcmp (prev_class, imap->klass) >= 0)
7267 g_print ("class %s should come before class %s\n", imap->klass, prev_class);
7268 prev_class = imap->klass;
7269 for (j = 0; j < imap->size; ++j) {
7270 ientry = &imap->icalls [j];
7271 if (prev_method && strcmp (prev_method, ientry->method) >= 0)
7272 g_print ("method %s should come before method %s\n", ientry->method, prev_method);
7273 prev_method = ientry->method;
7278 icall_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
7282 mono_icall_cleanup (void)
7284 g_hash_table_destroy (icall_hash);
7285 g_hash_table_destroy (jit_icall_hash_name);
7286 g_hash_table_destroy (jit_icall_hash_addr);
7290 mono_add_internal_call (const char *name, gconstpointer method)
7292 mono_loader_lock ();
7294 g_hash_table_insert (icall_hash, g_strdup (name), (gpointer) method);
7296 mono_loader_unlock ();
7300 compare_class_imap (const void *key, const void *elem)
7302 const IcallMap* imap = (const IcallMap*)elem;
7303 return strcmp (key, imap->klass);
7306 static const IcallMap*
7307 find_class_icalls (const char *name)
7309 return (const IcallMap*) bsearch (name, icall_entries, G_N_ELEMENTS (icall_entries), sizeof (IcallMap), compare_class_imap);
7313 compare_method_imap (const void *key, const void *elem)
7315 const IcallEntry* ientry = (const IcallEntry*)elem;
7316 return strcmp (key, ientry->method);
7320 find_method_icall (const IcallMap *imap, const char *name)
7322 const IcallEntry *ientry = (const IcallEntry*) bsearch (name, imap->icalls, imap->size, sizeof (IcallEntry), compare_method_imap);
7324 return (void*)ientry->func;
7329 * we should probably export this as an helper (handle nested types).
7330 * Returns the number of chars written in buf.
7333 concat_class_name (char *buf, int bufsize, MonoClass *klass)
7335 int nspacelen, cnamelen;
7336 nspacelen = strlen (klass->name_space);
7337 cnamelen = strlen (klass->name);
7338 if (nspacelen + cnamelen + 2 > bufsize)
7341 memcpy (buf, klass->name_space, nspacelen);
7342 buf [nspacelen ++] = '.';
7344 memcpy (buf + nspacelen, klass->name, cnamelen);
7345 buf [nspacelen + cnamelen] = 0;
7346 return nspacelen + cnamelen;
7350 mono_lookup_internal_call (MonoMethod *method)
7355 int typelen = 0, mlen, siglen;
7357 const IcallMap *imap;
7359 g_assert (method != NULL);
7361 if (method->is_inflated)
7362 method = ((MonoMethodInflated *) method)->declaring;
7364 if (method->klass->nested_in) {
7365 int pos = concat_class_name (mname, sizeof (mname)-2, method->klass->nested_in);
7369 mname [pos++] = '/';
7372 typelen = concat_class_name (mname+pos, sizeof (mname)-pos-1, method->klass);
7378 typelen = concat_class_name (mname, sizeof (mname), method->klass);
7383 imap = find_class_icalls (mname);
7385 mname [typelen] = ':';
7386 mname [typelen + 1] = ':';
7388 mlen = strlen (method->name);
7389 memcpy (mname + typelen + 2, method->name, mlen);
7390 sigstart = mname + typelen + 2 + mlen;
7393 tmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE);
7394 siglen = strlen (tmpsig);
7395 if (typelen + mlen + siglen + 6 > sizeof (mname))
7398 memcpy (sigstart + 1, tmpsig, siglen);
7399 sigstart [siglen + 1] = ')';
7400 sigstart [siglen + 2] = 0;
7403 mono_loader_lock ();
7405 res = g_hash_table_lookup (icall_hash, mname);
7407 mono_loader_unlock ();
7410 /* try without signature */
7412 res = g_hash_table_lookup (icall_hash, mname);
7414 mono_loader_unlock ();
7418 /* it wasn't found in the static call tables */
7420 mono_loader_unlock ();
7423 res = find_method_icall (imap, sigstart - mlen);
7425 mono_loader_unlock ();
7428 /* try _with_ signature */
7430 res = find_method_icall (imap, sigstart - mlen);
7432 mono_loader_unlock ();
7436 g_warning ("cant resolve internal call to \"%s\" (tested without signature also)", mname);
7437 g_print ("\nYour mono runtime and class libraries are out of sync.\n");
7438 g_print ("The out of sync library is: %s\n", method->klass->image->name);
7439 g_print ("\nWhen you update one from cvs you need to update, compile and install\nthe other too.\n");
7440 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");
7441 g_print ("If you see other errors or faults after this message they are probably related\n");
7442 g_print ("and you need to fix your mono install first.\n");
7444 mono_loader_unlock ();
7450 type_from_typename (char *typename)
7452 MonoClass *klass = NULL; /* assignment to shut GCC warning up */
7454 if (!strcmp (typename, "int"))
7455 klass = mono_defaults.int_class;
7456 else if (!strcmp (typename, "ptr"))
7457 klass = mono_defaults.int_class;
7458 else if (!strcmp (typename, "void"))
7459 klass = mono_defaults.void_class;
7460 else if (!strcmp (typename, "int32"))
7461 klass = mono_defaults.int32_class;
7462 else if (!strcmp (typename, "uint32"))
7463 klass = mono_defaults.uint32_class;
7464 else if (!strcmp (typename, "long"))
7465 klass = mono_defaults.int64_class;
7466 else if (!strcmp (typename, "ulong"))
7467 klass = mono_defaults.uint64_class;
7468 else if (!strcmp (typename, "float"))
7469 klass = mono_defaults.single_class;
7470 else if (!strcmp (typename, "double"))
7471 klass = mono_defaults.double_class;
7472 else if (!strcmp (typename, "object"))
7473 klass = mono_defaults.object_class;
7474 else if (!strcmp (typename, "obj"))
7475 klass = mono_defaults.object_class;
7478 g_assert_not_reached ();
7480 return &klass->byval_arg;
7483 MonoMethodSignature*
7484 mono_create_icall_signature (const char *sigstr)
7489 MonoMethodSignature *res;
7491 mono_loader_lock ();
7492 res = g_hash_table_lookup (mono_defaults.corlib->helper_signatures, sigstr);
7494 mono_loader_unlock ();
7498 parts = g_strsplit (sigstr, " ", 256);
7507 res = mono_metadata_signature_alloc (mono_defaults.corlib, len - 1);
7510 #ifdef PLATFORM_WIN32
7512 * Under windows, the default pinvoke calling convention is STDCALL but
7515 res->call_convention = MONO_CALL_C;
7518 res->ret = type_from_typename (parts [0]);
7519 for (i = 1; i < len; ++i) {
7520 res->params [i - 1] = type_from_typename (parts [i]);
7525 g_hash_table_insert (mono_defaults.corlib->helper_signatures, (gpointer)sigstr, res);
7527 mono_loader_unlock ();
7533 mono_find_jit_icall_by_name (const char *name)
7535 MonoJitICallInfo *info;
7536 g_assert (jit_icall_hash_name);
7538 mono_loader_lock ();
7539 info = g_hash_table_lookup (jit_icall_hash_name, name);
7540 mono_loader_unlock ();
7545 mono_find_jit_icall_by_addr (gconstpointer addr)
7547 MonoJitICallInfo *info;
7548 g_assert (jit_icall_hash_addr);
7550 mono_loader_lock ();
7551 info = g_hash_table_lookup (jit_icall_hash_addr, (gpointer)addr);
7552 mono_loader_unlock ();
7558 mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)
7560 mono_loader_lock ();
7561 g_hash_table_insert (jit_icall_hash_addr, (gpointer)info->wrapper, info);
7562 mono_loader_unlock ();
7566 mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save)
7568 MonoJitICallInfo *info;
7573 mono_loader_lock ();
7575 if (!jit_icall_hash_name) {
7576 jit_icall_hash_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
7577 jit_icall_hash_addr = g_hash_table_new (NULL, NULL);
7580 if (g_hash_table_lookup (jit_icall_hash_name, name)) {
7581 g_warning ("jit icall already defined \"%s\"\n", name);
7582 g_assert_not_reached ();
7585 info = g_new (MonoJitICallInfo, 1);
7592 info->wrapper = func;
7594 info->wrapper = NULL;
7597 g_hash_table_insert (jit_icall_hash_name, (gpointer)info->name, info);
7598 g_hash_table_insert (jit_icall_hash_addr, (gpointer)func, info);
7600 mono_loader_unlock ();