5 * Dietmar Maurer (dietmar@ximian.com)
7 * (C) 2001 Ximian, Inc.
17 #include <mono/metadata/object.h>
18 #include <mono/metadata/threads.h>
19 #include <mono/metadata/reflection.h>
20 #include <mono/metadata/assembly.h>
21 #include <mono/metadata/tabledefs.h>
22 #include <mono/metadata/exception.h>
23 #include <mono/metadata/file-io.h>
24 #include <mono/metadata/socket-io.h>
25 #include <mono/metadata/mono-endian.h>
26 #include <mono/metadata/tokentype.h>
27 #include <mono/metadata/unicode.h>
28 #include <mono/metadata/appdomain.h>
29 #include <mono/io-layer/io-layer.h>
33 ves_icall_System_Array_GetValue (MonoObject *this, MonoObject *idxs)
37 gint32 i, pos, *ind, esize;
40 io = (MonoArray *)idxs;
41 ic = (MonoClass *)io->obj.vtable->klass;
43 ao = (MonoArray *)this;
44 ac = (MonoClass *)ao->obj.vtable->klass;
46 g_assert (ic->rank == 1);
47 g_assert (io->bounds [0].length == ac->rank);
49 ind = (guint32 *)io->vector;
51 pos = ind [0] - ao->bounds [0].lower_bound;
52 for (i = 1; i < ac->rank; i++)
53 pos = pos*ao->bounds [i].length + ind [i] -
54 ao->bounds [i].lower_bound;
56 esize = mono_array_element_size (ac);
57 ea = (gpointer*)((char*)ao->vector + (pos * esize));
59 if (ac->element_class->valuetype)
60 return mono_value_box (this->vtable->domain, ac->element_class, ea);
67 ves_icall_System_Array_SetValue (MonoObject *this, MonoObject *value,
70 MonoArray *ao, *io, *vo;
71 MonoClass *ac, *ic, *vc;
72 gint32 i, pos, *ind, esize;
75 vo = (MonoArray *)value;
76 vc = (MonoClass *)vo->obj.vtable->klass;
78 io = (MonoArray *)idxs;
79 ic = (MonoClass *)io->obj.vtable->klass;
81 ao = (MonoArray *)this;
82 ac = (MonoClass *)ao->obj.vtable->klass;
84 g_assert (ic->rank == 1);
85 g_assert (io->bounds [0].length == ac->rank);
86 if (!mono_object_isinst (value, ac->element_class)) {
87 g_error ("Array not compatible: %s <= %s", ac->element_class->name, vc->name);
90 ind = (guint32 *)io->vector;
92 pos = ind [0] - ao->bounds [0].lower_bound;
93 for (i = 1; i < ac->rank; i++)
94 pos = pos*ao->bounds [i].length + ind [i] -
95 ao->bounds [i].lower_bound;
97 esize = mono_array_element_size (ac);
98 ea = (gpointer*)((char*)ao->vector + (pos * esize));
100 if (ac->element_class->valuetype) {
101 g_assert (vc->valuetype);
103 memcpy (ea, (char *)vo + sizeof (MonoObject), esize);
110 ves_icall_System_Array_CreateInstance ()
112 g_warning ("not implemented");
113 g_assert_not_reached ();
118 ves_icall_System_Array_GetRank (MonoObject *this)
120 return this->vtable->klass->rank;
124 ves_icall_System_Array_GetLength (MonoArray *this, gint32 dimension)
126 return this->bounds [dimension].length;
130 ves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension)
132 return this->bounds [dimension].lower_bound;
136 ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length)
138 int element_size = mono_array_element_size (source->obj.vtable->klass);
139 void * dest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);
140 void * source_addr = mono_array_addr_with_size (source, element_size, dest_idx);
142 memcpy (dest_addr, source_addr, element_size * length);
146 ves_icall_InitializeArray (MonoArray *array, MonoClassField *field_handle)
148 MonoClass *klass = array->obj.vtable->klass;
149 guint32 size = mono_array_element_size (klass);
152 for (i = 0; i < klass->rank; ++i)
153 size *= array->bounds [i].length;
155 memcpy (mono_array_addr (array, char, 0), field_handle->data, size);
157 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
161 guint ## n *data = (guint ## n *) mono_array_addr (array, char, 0); \
163 for (i = 0; i < size; i += n/8, data++) { \
164 tmp = read ## n (data); \
169 printf ("Initialize array with elements of %s type\n", klass->element_class->name);
171 switch (klass->element_class->byval_arg.type) {
191 ves_icall_System_Object_MemberwiseClone (MonoObject *this)
193 return mono_object_clone (this);
197 mono_type_type_from_obj (MonoReflectionType *mtype, MonoObject *obj)
199 mtype->type = &obj->vtable->klass->byval_arg;
200 g_assert (mtype->type->type);
204 ves_icall_get_data_chunk (MonoReflectionAssemblyBuilder *assb, gint32 type, MonoArray *buf)
208 if (type == 0) { /* get the header */
209 count = mono_image_get_header (assb, (char*)buf->vector, buf->bounds->length);
213 MonoDynamicAssembly *ass = assb->dynamic_assembly;
214 char *p = mono_array_addr (buf, char, 0);
215 count = ass->code.index + ass->meta_size;
216 if (count > buf->bounds->length)
218 memcpy (p, ass->code.data, ass->code.index);
219 memcpy (p + ass->code.index, ass->assembly.image->raw_metadata, ass->meta_size);
226 static MonoReflectionType*
227 ves_icall_type_from_name (MonoString *name)
229 MonoDomain *domain = mono_domain_get ();
232 MonoTypeNameParse info;
235 str = mono_string_to_utf8 (name);
236 /*g_print ("requested type %s\n", str);*/
237 if (!mono_reflection_parse_type (str, &info)) {
243 image = mono_image_loaded (info.assembly);
244 /* do we need to load if it's not already loaded? */
250 image = mono_defaults.corlib;
251 if (info.nest_name) {
252 klass = mono_class_from_name (image, info.nest_name_space, info.nest_name);
255 mono_class_init (klass);
256 nested = klass->nested_classes;
258 klass = nested->data;
259 if (strcmp (klass->name, info.nest_name) == 0 &&
260 strcmp (klass->name_space, info.nest_name_space) == 0)
266 klass = mono_class_from_name (image, info.name_space, info.name);
271 mono_class_init (klass);
273 klass = mono_array_class_get (klass, info.rank);
275 if (info.isbyref || info.ispointer) /* hack */
276 return mono_type_get_object (domain, &klass->this_arg);
278 return mono_type_get_object (domain, &klass->byval_arg);
281 static MonoReflectionType*
282 ves_icall_type_from_handle (MonoType *handle)
284 MonoDomain *domain = mono_domain_get ();
286 mono_class_init (handle->data.klass);
287 return mono_type_get_object (domain, handle);
291 ves_icall_type_Equals (MonoReflectionType *type, MonoReflectionType *c)
293 if (type->type && c->type)
294 return mono_metadata_type_equal (type->type, c->type);
295 g_print ("type equals\n");
300 ves_icall_type_is_subtype_of (MonoReflectionType *type, MonoReflectionType *c)
306 g_assert (type != NULL);
308 domain = ((MonoObject *)type)->vtable->domain;
310 if (!c) /* FIXME: dont know what do do here */
313 while (!type->type) { /* FIXME: hack for TypeBuilder */
314 MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *)type;
318 while (!c->type) { /* FIXME: hack for TypeBuilder */
319 MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *)c;
323 klass = mono_class_from_mono_type (type->type);
324 klassc = mono_class_from_mono_type (c->type);
326 /* cut&paste from mono_object_isinst (): keep in sync */
327 if (klassc->flags & TYPE_ATTRIBUTE_INTERFACE) {
328 MonoVTable *klass_vt = mono_class_vtable (domain, klass);
329 if ((klassc->interface_id <= klass->max_interface_id) &&
330 klass_vt->interface_offsets [klassc->interface_id])
333 if ((klass->baseval - klassc->baseval) <= klassc->diffval)
340 ves_icall_get_attributes (MonoReflectionType *type)
342 MonoClass *klass = mono_class_from_mono_type (type->type);
348 ves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info)
350 MonoDomain *domain = mono_domain_get ();
352 info->parent = mono_type_get_object (domain, &method->klass->byval_arg);
353 info->ret = mono_type_get_object (domain, method->signature->ret);
354 info->name = mono_string_new (domain, method->name);
355 info->attrs = method->flags;
356 info->implattrs = method->iflags;
360 ves_icall_get_parameter_info (MonoMethod *method)
362 MonoDomain *domain = mono_domain_get ();
364 static MonoClass *System_Reflection_ParameterInfo;
365 MonoReflectionParameter** args;
368 args = mono_param_get_objects (domain, method);
369 if (!System_Reflection_ParameterInfo)
370 System_Reflection_ParameterInfo = mono_class_from_name (
371 mono_defaults.corlib, "System.Reflection", "ParameterInfo");
372 res = mono_array_new (domain, System_Reflection_ParameterInfo, method->signature->param_count);
373 for (i = 0; i < method->signature->param_count; ++i) {
374 mono_array_set (res, gpointer, i, args [i]);
380 ves_icall_get_field_info (MonoReflectionField *field, MonoFieldInfo *info)
382 MonoDomain *domain = mono_domain_get ();
384 info->parent = mono_type_get_object (domain, &field->klass->byval_arg);
385 info->type = mono_type_get_object (domain, field->field->type);
386 info->name = mono_string_new (domain, field->field->name);
387 info->attrs = field->field->type->attrs;
391 ves_icall_get_property_info (MonoReflectionProperty *property, MonoPropertyInfo *info)
393 MonoDomain *domain = mono_domain_get ();
395 info->parent = mono_type_get_object (domain, &property->klass->byval_arg);
396 info->name = mono_string_new (domain, property->property->name);
397 info->attrs = property->property->attrs;
398 info->get = property->property->get ? mono_method_get_object (domain, property->property->get): NULL;
399 info->set = property->property->set ? mono_method_get_object (domain, property->property->set): NULL;
401 * There may be other methods defined for properties, though, it seems they are not exposed
402 * in the reflection API
407 ves_icall_get_type_info (MonoType *type, MonoTypeInfo *info)
409 MonoDomain *domain = mono_domain_get ();
410 MonoClass *class = mono_class_from_mono_type (type);
415 info->parent = class->parent ? mono_type_get_object (domain, &class->parent->byval_arg): NULL;
416 info->name = mono_string_new (domain, class->name);
417 info->name_space = mono_string_new (domain, class->name_space);
418 info->attrs = class->flags;
419 info->rank = class->rank;
420 info->assembly = NULL; /* FIXME */
422 info->etype = mono_type_get_object (domain, class->enum_basetype);
423 else if (class->element_class)
424 info->etype = mono_type_get_object (domain, &class->element_class->byval_arg);
429 for (parent = class; parent; parent = parent->parent) {
430 ninterf += parent->interface_count;
432 intf = mono_array_new (domain, mono_defaults.monotype_class, ninterf);
434 for (parent = class; parent; parent = parent->parent) {
435 for (i = 0; i < parent->interface_count; ++i) {
436 mono_array_set (intf, gpointer, ninterf, mono_type_get_object (domain, &parent->interfaces [i]->byval_arg));
440 info->interfaces = intf;
444 ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoArray *params) {
445 MonoMethodSignature *sig = method->method->signature;
448 * Do we need to copy the values so that the called method can't change them?
455 ves_icall_System_Enum_ToObject (MonoReflectionType *type, MonoObject *obj)
457 MonoDomain *domain = mono_domain_get ();
462 MONO_CHECK_ARG_NULL (domain, type);
463 MONO_CHECK_ARG_NULL (domain, obj);
465 enumc = mono_class_from_mono_type (type->type);
467 MONO_CHECK_ARG (domain, obj, enumc->enumtype == TRUE);
468 MONO_CHECK_ARG (domain, obj, obj->vtable->klass->byval_arg.type >= MONO_TYPE_I1 &&
469 obj->vtable->klass->byval_arg.type <= MONO_TYPE_U8);
472 s1 = mono_class_value_size (enumc, NULL);
473 s2 = mono_class_value_size (obj->vtable->klass, NULL);
475 res = mono_object_new (domain, enumc);
477 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
478 memcpy ((gpointer)res + sizeof (MonoObject), (gpointer)obj + sizeof (MonoObject), MIN (s1, s2));
480 memcpy ((gpointer)res + sizeof (MonoObject) + (s1 > s2 ? s1 - s2 : 0),
481 (gpointer)obj + sizeof (MonoObject) + (s2 > s1 ? s2 - s1 : 0),
488 ves_icall_System_Enum_get_value (MonoObject *this)
490 MonoDomain *domain = mono_domain_get ();
500 g_assert (this->vtable->klass->enumtype);
502 enumc = mono_class_from_mono_type (this->vtable->klass->enum_basetype);
503 res = mono_object_new (domain, enumc);
504 dst = (gpointer)res + sizeof (MonoObject);
505 src = (gpointer)this + sizeof (MonoObject);
506 size = mono_class_value_size (enumc, NULL);
508 memcpy (dst, src, size);
514 ves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)
516 MonoDomain *domain = mono_domain_get ();
517 MonoClass *enumc = mono_class_from_mono_type (type->type);
518 guint i, j, nvalues, crow;
519 MonoClassField *field;
521 info->utype = mono_type_get_object (domain, enumc->enum_basetype);
522 nvalues = enumc->field.count - 1;
523 info->names = mono_array_new (domain, mono_defaults.string_class, nvalues);
524 info->values = mono_array_new (domain, mono_class_from_mono_type (enumc->enum_basetype), nvalues);
526 for (i = 0, j = 0; i < enumc->field.count; ++i) {
527 field = &enumc->fields [i];
528 if (strcmp ("value__", field->name) == 0)
530 mono_array_set (info->names, gpointer, j, mono_string_new (domain, field->name));
532 crow = mono_metadata_get_constant_index (enumc->image, MONO_TOKEN_FIELD_DEF | (i+enumc->field.first+1));
533 crow = mono_metadata_decode_row_col (&enumc->image->tables [MONO_TABLE_CONSTANT], crow-1, MONO_CONSTANT_VALUE);
534 /* 1 is the length of the blob */
535 field->data = 1 + mono_metadata_blob_heap (enumc->image, crow);
537 switch (enumc->enum_basetype->type) {
540 mono_array_set (info->values, gchar, j, *field->data);
545 mono_array_set (info->values, gint16, j, read16 (field->data));
549 mono_array_set (info->values, gint32, j, read32 (field->data));
553 mono_array_set (info->values, gint64, j, read64 (field->data));
556 g_error ("Implement type 0x%02x in get_enum_info", enumc->enum_basetype->type);
563 search_method (MonoReflectionType *type, char *name, guint32 flags, MonoArray *args)
567 MonoReflectionType *paramt;
570 klass = mono_class_from_mono_type (type->type);
572 for (i = 0; i < klass->method.count; ++i) {
573 m = klass->methods [i];
574 if (!((m->flags & flags) == flags))
576 if (strcmp(m->name, name))
578 if (m->signature->param_count != mono_array_length (args))
580 for (j = 0; j < m->signature->param_count; ++j) {
581 paramt = mono_array_get (args, MonoReflectionType*, j);
582 if (!mono_metadata_type_equal (paramt->type, m->signature->params [j]))
585 if (j == m->signature->param_count)
588 klass = klass->parent;
590 g_print ("Method %s::%s (%d) not found\n", klass->name, name, mono_array_length (args));
594 static MonoReflectionMethod*
595 ves_icall_get_constructor (MonoReflectionType *type, MonoArray *args)
597 MonoDomain *domain = mono_domain_get ();
600 m = search_method (type, ".ctor", METHOD_ATTRIBUTE_RT_SPECIAL_NAME, args);
602 return mono_method_get_object (domain, m);
606 static MonoReflectionMethod*
607 ves_icall_get_method (MonoReflectionType *type, MonoString *name, MonoArray *args)
609 MonoDomain *domain = mono_domain_get ();
611 char *n = mono_string_to_utf8 (name);
613 m = search_method (type, n, 0, args);
616 return mono_method_get_object (domain, m);
621 search_property (MonoClass *klass, char* name, MonoArray *args) {
625 /* FIXME: handle args */
626 for (i = 0; i < klass->property.count; ++i) {
627 p = &klass->properties [i];
628 if (strcmp (p->name, name) == 0)
634 static MonoReflectionProperty*
635 ves_icall_get_property (MonoReflectionType *type, MonoString *name, MonoArray *args)
637 MonoDomain *domain = mono_domain_get ();
639 MonoClass *class = mono_class_from_mono_type (type->type);
640 char *n = mono_string_to_utf8 (name);
642 p = search_property (class, n, args);
645 return mono_property_get_object (domain, class, p);
650 BFLAGS_IgnoreCase = 1,
651 BFLAGS_DeclaredOnly = 2,
654 BFLAGS_Public = 0x10,
655 BFLAGS_NonPublic = 0x20,
656 BFLAGS_InvokeMethod = 0x100,
657 BFLAGS_CreateInstance = 0x200,
658 BFLAGS_GetField = 0x400,
659 BFLAGS_SetField = 0x800,
660 BFLAGS_GetProperty = 0x1000,
661 BFLAGS_SetProperty = 0x2000,
662 BFLAGS_ExactBinding = 0x10000,
663 BFLAGS_SuppressChangeType = 0x20000,
664 BFLAGS_OptionalParamBinding = 0x40000
669 * Note: the filter is applied from within corlib.
672 ves_icall_type_find_members (MonoReflectionType *type, guint32 membertypes, guint32 bflags)
675 GSList *l = NULL, *tmp;
676 static MonoClass *System_Reflection_MemberInfo;
677 MonoClass *startklass, *klass;
681 int i, is_ctor, len, match;
683 domain = ((MonoObject *)type)->vtable->domain;
684 klass = startklass = mono_class_from_mono_type (type->type);
686 /* FIXME: check the bindingflags */
688 if (membertypes & (1|8)) { /* constructors and methods */
689 for (i = 0; i < klass->method.count; ++i) {
691 method = klass->methods [i];
692 if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC) {
693 if (bflags & BFLAGS_Public)
696 if (bflags & BFLAGS_NonPublic)
699 if (method->flags & METHOD_ATTRIBUTE_STATIC) {
700 if (bflags & BFLAGS_Static)
703 if (bflags & BFLAGS_Instance)
709 member = (MonoObject*)mono_method_get_object (domain, method);
711 is_ctor = strcmp (method->name, ".ctor") == 0 ||
712 strcmp (method->name, ".cctor") == 0;
713 if (is_ctor && (membertypes & 1)) {
714 l = g_slist_prepend (l, member);
717 if (!is_ctor && (membertypes & 8)) {
718 l = g_slist_prepend (l, member);
722 if (membertypes & 4) { /* fields */
723 MonoClassField *field;
724 for (i = 0; i < klass->field.count; ++i) {
726 field = &klass->fields [i];
727 if ((field->type->attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) == FIELD_ATTRIBUTE_PUBLIC) {
728 if (bflags & BFLAGS_Public)
731 if (bflags & BFLAGS_NonPublic)
734 if (field->type->attrs & FIELD_ATTRIBUTE_STATIC) {
735 if (bflags & BFLAGS_Static)
738 if (bflags & BFLAGS_Instance)
744 member = (MonoObject*)mono_field_get_object (domain, klass, field);
745 l = g_slist_prepend (l, member);
748 if (membertypes & 16) { /* properties */
750 for (i = 0; i < klass->property.count; ++i) {
752 prop = &klass->properties [i];
753 /* FIXME: handle bflags */
754 l = g_slist_prepend (l, mono_property_get_object (domain, klass, prop));
757 if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
759 len = g_slist_length (l);
760 if (!System_Reflection_MemberInfo)
761 System_Reflection_MemberInfo = mono_class_from_name (
762 mono_defaults.corlib, "System.Reflection", "MemberInfo");
763 res = mono_array_new (domain, System_Reflection_MemberInfo, len);
766 for (; tmp; tmp = tmp->next, ++i)
767 mono_array_set (res, gpointer, i, tmp->data);
773 ves_icall_System_Runtime_InteropServices_Marshal_ReadIntPtr (gpointer ptr)
775 return (gpointer)(*(int *)ptr);
779 ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAuto (gpointer ptr)
781 MonoDomain *domain = mono_domain_get ();
783 return mono_string_new (domain, (char *)ptr);
786 static guint32 ves_icall_System_Runtime_InteropServices_Marshal_GetLastWin32Error(void)
788 return(GetLastError());
791 static MonoReflectionType*
792 ves_icall_System_Reflection_Assembly_GetType (MonoReflectionAssembly *assembly, MonoString *type, MonoBoolean throwOnError, MonoBoolean ignoreCase)
794 MonoDomain *domain = mono_domain_get ();
795 /* FIXME : use ignoreCase */
796 gchar *name, *namespace, *str;
797 char *byref, *isarray, *ispointer;
801 str = namespace = mono_string_to_utf8 (type);
802 /*g_print ("requested type %s in %s\n", str, assembly->assembly->name);*/
804 name = strrchr (str, '.');
805 byref = strrchr (str, '&');
806 ispointer = strrchr (str, '*');
811 isarray = strrchr (str, '[');
832 klass = mono_class_from_name (assembly->assembly->image, namespace, name);
836 mono_raise_exception (mono_get_exception_type_load ());
840 mono_class_init (klass);
843 klass = mono_array_class_get (klass, rank);
844 mono_class_init (klass);
845 /*g_print ("got array class %s [%d] (0x%x)\n", klass->element_class->name, klass->rank, klass->this_arg.type);*/
848 if (byref || ispointer)
849 return mono_type_get_object (domain, &klass->this_arg);
851 return mono_type_get_object (domain, &klass->byval_arg);
855 ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly)
857 MonoDomain *domain = mono_domain_get ();
859 char *name = g_strconcat (
860 "file://", assembly->assembly->image->name, NULL);
862 res = mono_string_new (domain, name);
868 ves_icall_System_MonoType_assQualifiedName (MonoReflectionType *object)
870 MonoDomain *domain = mono_domain_get ();
871 /* FIXME : real rules are more complicated (internal classes,
872 reference types, array types, etc. */
878 switch (object->type->type) {
879 case MONO_TYPE_SZARRAY:
880 klass = object->type->data.type->data.klass;
884 klass = object->type->data.klass;
888 fullname = g_strconcat (klass->name_space, ".",
890 klass->image->assembly_name, append, NULL);
891 res = mono_string_new (domain, fullname);
898 ves_icall_System_PAL_GetCurrentDirectory (MonoObject *object)
900 MonoDomain *domain = mono_domain_get ();
902 gchar *path = g_get_current_dir ();
903 res = mono_string_new (domain, path);
909 * Magic number to convert a time which is relative to
910 * Jan 1, 1970 into a value which is relative to Jan 1, 0001.
912 #define EPOCH_ADJUST ((gint64)62135596800L)
915 ves_icall_System_DateTime_GetNow ()
920 if (gettimeofday (&tv, NULL) == 0) {
921 res = (((gint64)tv.tv_sec + EPOCH_ADJUST)* 1000000 + tv.tv_usec)*10;
925 /* fixme: raise exception */
929 static gpointer icall_map [] = {
933 "System.Array::GetValue", ves_icall_System_Array_GetValue,
934 "System.Array::SetValue", ves_icall_System_Array_SetValue,
935 "System.Array::GetRank", ves_icall_System_Array_GetRank,
936 "System.Array::GetLength", ves_icall_System_Array_GetLength,
937 "System.Array::GetLowerBound", ves_icall_System_Array_GetLowerBound,
938 "System.Array::CreateInstance", ves_icall_System_Array_CreateInstance,
939 "System.Array::FastCopy", ves_icall_System_Array_FastCopy,
940 "System.Array::Clone", mono_array_clone,
945 "System.Object::MemberwiseClone", ves_icall_System_Object_MemberwiseClone,
950 "System.String::IsInterned", mono_string_is_interned,
951 "System.String::Intern", mono_string_intern,
956 "System.AppDomain::createDomain", ves_icall_System_AppDomain_createDomain,
957 "System.AppDomain::getCurDomain", ves_icall_System_AppDomain_getCurDomain,
958 "System.AppDomain::GetData", ves_icall_System_AppDomain_GetData,
959 "System.AppDomain::SetData", ves_icall_System_AppDomain_SetData,
960 "System.AppDomain::getSetup", ves_icall_System_AppDomain_getSetup,
961 "System.AppDomain::getFriendlyName", ves_icall_System_AppDomain_getFriendlyName,
962 "System.AppDomain::GetAssemblies", ves_icall_System_AppDomain_GetAssemblies,
963 "System.AppDomain::LoadAssembly", ves_icall_System_AppDomain_LoadAssembly,
964 "System.AppDomain::Unload", ves_icall_System_AppDomain_Unload,
965 "System.AppDomain::ExecuteAssembly", ves_icall_System_AppDomain_ExecuteAssembly,
968 * System.AppDomainSetup
970 "System.AppDomainSetup::InitAppDomainSetup", ves_icall_System_AppDomainSetup_InitAppDomainSetup,
975 "System.Decimal::decimal2UInt64", mono_decimal2UInt64,
976 "System.Decimal::decimal2Int64", mono_decimal2Int64,
977 "System.Decimal::double2decimal", mono_double2decimal, /* FIXME: wrong signature. */
978 "System.Decimal::decimalIncr", mono_decimalIncr,
979 "System.Decimal::decimalSetExponent", mono_decimalSetExponent,
980 "System.Decimal::decimal2double", mono_decimal2double,
981 "System.Decimal::decimalFloorAndTrunc", mono_decimalFloorAndTrunc,
982 "System.Decimal::decimalRound", mono_decimalRound,
983 "System.Decimal::decimalMult", mono_decimalMult,
984 "System.Decimal::decimalDiv", mono_decimalDiv,
985 "System.Decimal::decimalIntDiv", mono_decimalIntDiv,
986 "System.Decimal::decimalCompare", mono_decimalCompare,
987 "System.Decimal::string2decimal", mono_string2decimal,
988 "System.Decimal::decimal2string", mono_decimal2string,
997 "System.Reflection.Emit.AssemblyBuilder::getDataChunk", ves_icall_get_data_chunk,
998 "System.Reflection.Emit.AssemblyBuilder::getUSIndex", mono_image_insert_string,
999 "System.Reflection.Emit.AssemblyBuilder::getToken", mono_image_create_token,
1004 "System.Reflection.MonoMethodInfo::get_method_info", ves_icall_get_method_info,
1005 "System.Reflection.MonoMethodInfo::get_parameter_info", ves_icall_get_parameter_info,
1006 "System.Reflection.MonoFieldInfo::get_field_info", ves_icall_get_field_info,
1007 "System.Reflection.MonoPropertyInfo::get_property_info", ves_icall_get_property_info,
1008 "System.Reflection.MonoMethod::InternalInvoke", ves_icall_InternalInvoke,
1012 "System.MonoEnumInfo::get_enum_info", ves_icall_get_enum_info,
1013 "System.Enum::get_value", ves_icall_System_Enum_get_value,
1014 "System.Enum::ToObject", ves_icall_System_Enum_ToObject,
1027 "System.Type::internal_from_name", ves_icall_type_from_name,
1028 "System.Type::internal_from_handle", ves_icall_type_from_handle,
1029 "System.Type::get_constructor", ves_icall_get_constructor,
1030 "System.Type::get_property", ves_icall_get_property,
1031 "System.Type::get_method", ves_icall_get_method,
1032 "System.MonoType::get_attributes", ves_icall_get_attributes,
1033 "System.Type::type_is_subtype_of", ves_icall_type_is_subtype_of,
1034 "System.Type::Equals", ves_icall_type_Equals,
1035 "System.Type::FindMembers", ves_icall_type_find_members,
1038 * System.Runtime.CompilerServices.RuntimeHelpers
1040 "System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray", ves_icall_InitializeArray,
1045 "System.Threading.Thread::Thread_internal", ves_icall_System_Threading_Thread_Thread_internal,
1046 "System.Threading.Thread::Start_internal", ves_icall_System_Threading_Thread_Start_internal,
1047 "System.Threading.Thread::Sleep_internal", ves_icall_System_Threading_Thread_Sleep_internal,
1048 "System.Threading.Thread::CurrentThread_internal", ves_icall_System_Threading_Thread_CurrentThread_internal,
1049 "System.Threading.Thread::Join_internal", ves_icall_System_Threading_Thread_Join_internal,
1050 "System.Threading.Thread::SlotHash_lookup", ves_icall_System_Threading_Thread_SlotHash_lookup,
1051 "System.Threading.Thread::SlotHash_store", ves_icall_System_Threading_Thread_SlotHash_store,
1052 "System.Threading.Monitor::Monitor_exit", ves_icall_System_Threading_Monitor_Monitor_exit,
1053 "System.Threading.Monitor::Monitor_test_owner", ves_icall_System_Threading_Monitor_Monitor_test_owner,
1054 "System.Threading.Monitor::Monitor_test_synchronised", ves_icall_System_Threading_Monitor_Monitor_test_synchronised,
1055 "System.Threading.Monitor::Monitor_pulse", ves_icall_System_Threading_Monitor_Monitor_pulse,
1056 "System.Threading.Monitor::Monitor_pulse_all", ves_icall_System_Threading_Monitor_Monitor_pulse_all,
1057 "System.Threading.Monitor::Monitor_try_enter", ves_icall_System_Threading_Monitor_Monitor_try_enter,
1058 "System.Threading.Monitor::Monitor_wait", ves_icall_System_Threading_Monitor_Monitor_wait,
1059 "System.Threading.Mutex::CreateMutex_internal", ves_icall_System_Threading_Mutex_CreateMutex_internal,
1060 "System.Threading.Mutex::ReleaseMutex_internal", ves_icall_System_Threading_Mutex_ReleaseMutex_internal,
1061 "System.Threading.NativeEventCalls::CreateEvent_internal", ves_icall_System_Threading_Events_CreateEvent_internal,
1062 "System.Threading.NativeEventCalls::SetEvent_internal", ves_icall_System_Threading_Events_SetEvent_internal,
1063 "System.Threading.NativeEventCalls::ResetEvent_internal", ves_icall_System_Threading_Events_ResetEvent_internal,
1066 * System.Threading.WaitHandle
1068 "System.Threading.WaitHandle::WaitAll_internal", ves_icall_System_Threading_WaitHandle_WaitAll_internal,
1069 "System.Threading.WaitHandle::WaitAny_internal", ves_icall_System_Threading_WaitHandle_WaitAny_internal,
1070 "System.Threading.WaitHandle::WaitOne_internal", ves_icall_System_Threading_WaitHandle_WaitOne_internal,
1072 "System.Runtime.InteropServices.Marshal::ReadIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_ReadIntPtr,
1073 "System.Runtime.InteropServices.Marshal::PtrToStringAuto", ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAuto,
1074 "System.Runtime.InteropServices.Marshal::GetLastWin32Error", ves_icall_System_Runtime_InteropServices_Marshal_GetLastWin32Error,
1076 "System.Reflection.Assembly::GetType", ves_icall_System_Reflection_Assembly_GetType,
1077 "System.Reflection.Assembly::get_code_base", ves_icall_System_Reflection_Assembly_get_code_base,
1082 "System.MonoType::assQualifiedName", ves_icall_System_MonoType_assQualifiedName,
1083 "System.MonoType::type_from_obj", mono_type_type_from_obj,
1084 "System.MonoType::get_type_info", ves_icall_get_type_info,
1086 "System.PAL.OpSys::GetCurrentDirectory", ves_icall_System_PAL_GetCurrentDirectory,
1089 * System.PAL.OpSys I/O Services
1091 "System.PAL.OpSys::GetStdHandle", ves_icall_System_PAL_OpSys_GetStdHandle,
1092 "System.PAL.OpSys::ReadFile", ves_icall_System_PAL_OpSys_ReadFile,
1093 "System.PAL.OpSys::WriteFile", ves_icall_System_PAL_OpSys_WriteFile,
1094 "System.PAL.OpSys::SetLengthFile", ves_icall_System_PAL_OpSys_SetLengthFile,
1095 "System.PAL.OpSys::OpenFile", ves_icall_System_PAL_OpSys_OpenFile,
1096 "System.PAL.OpSys::CloseFile", ves_icall_System_PAL_OpSys_CloseFile,
1097 "System.PAL.OpSys::SeekFile", ves_icall_System_PAL_OpSys_SeekFile,
1098 "System.PAL.OpSys::DeleteFile", ves_icall_System_PAL_OpSys_DeleteFile,
1099 "System.PAL.OpSys::ExistsFile", ves_icall_System_PAL_OpSys_ExistsFile,
1100 "System.PAL.OpSys::GetFileTime", ves_icall_System_PAL_OpSys_GetFileTime,
1101 "System.PAL.OpSys::SetFileTime", ves_icall_System_PAL_OpSys_SetFileTime,
1104 * System.Net.Sockets I/O Services
1106 "System.Net.Sockets.Socket::Socket_internal", ves_icall_System_Net_Sockets_Socket_Socket_internal,
1107 "System.Net.Sockets.Socket::Close_internal", ves_icall_System_Net_Sockets_Socket_Close_internal,
1108 "System.Net.Sockets.SocketException::WSAGetLastError_internal", ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal,
1109 "System.Net.Sockets.Socket::Available_internal", ves_icall_System_Net_Sockets_Socket_Available_internal,
1110 "System.Net.Sockets.Socket::Blocking_internal", ves_icall_System_Net_Sockets_Socket_Blocking_internal,
1111 "System.Net.Sockets.Socket::Accept_internal", ves_icall_System_Net_Sockets_Socket_Accept_internal,
1112 "System.Net.Sockets.Socket::Listen_internal", ves_icall_System_Net_Sockets_Socket_Listen_internal,
1113 "System.Net.Sockets.Socket::LocalEndPoint_internal", ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal,
1114 "System.Net.Sockets.Socket::RemoteEndPoint_internal", ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal,
1115 "System.Net.Sockets.Socket::Bind_internal", ves_icall_System_Net_Sockets_Socket_Bind_internal,
1116 "System.Net.Sockets.Socket::Connect_internal", ves_icall_System_Net_Sockets_Socket_Connect_internal,
1117 "System.Net.Sockets.Socket::Receive_internal", ves_icall_System_Net_Sockets_Socket_Receive_internal,
1118 "System.Net.Sockets.Socket::RecvFrom_internal", ves_icall_System_Net_Sockets_Socket_RecvFrom_internal,
1119 "System.Net.Sockets.Socket::Send_internal", ves_icall_System_Net_Sockets_Socket_Send_internal,
1120 "System.Net.Sockets.Socket::SendTo_internal", ves_icall_System_Net_Sockets_Socket_SendTo_internal,
1121 "System.Net.Sockets.Socket::Select_internal", ves_icall_System_Net_Sockets_Socket_Select_internal,
1122 "System.Net.Sockets.Socket::Shutdown_internal", ves_icall_System_Net_Sockets_Socket_Shutdown_internal,
1123 "System.Net.Sockets.Socket::GetSocketOption_obj_internal", ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal,
1124 "System.Net.Sockets.Socket::GetSocketOption_arr_internal", ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal,
1125 "System.Net.Sockets.Socket::SetSocketOption_internal", ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal,
1126 "System.Net.Dns::GetHostByName_internal", ves_icall_System_Net_Dns_GetHostByName_internal,
1127 "System.Net.Dns::GetHostByAddr_internal", ves_icall_System_Net_Dns_GetHostByAddr_internal,
1132 "System.Char::GetNumericValue", ves_icall_System_Char_GetNumericValue,
1133 "System.Char::GetUnicodeCategory", ves_icall_System_Char_GetUnicodeCategory,
1134 "System.Char::IsControl", ves_icall_System_Char_IsControl,
1135 "System.Char::IsDigit", ves_icall_System_Char_IsDigit,
1136 "System.Char::IsLetter", ves_icall_System_Char_IsLetter,
1137 "System.Char::IsLower", ves_icall_System_Char_IsLower,
1138 "System.Char::IsUpper", ves_icall_System_Char_IsUpper,
1139 "System.Char::IsNumber", ves_icall_System_Char_IsNumber,
1140 "System.Char::IsPunctuation", ves_icall_System_Char_IsPunctuation,
1141 "System.Char::IsSeparator", ves_icall_System_Char_IsSeparator,
1142 "System.Char::IsSurrogate", ves_icall_System_Char_IsSurrogate,
1143 "System.Char::IsSymbol", ves_icall_System_Char_IsSymbol,
1144 "System.Char::IsWhiteSpace", ves_icall_System_Char_IsWhiteSpace,
1145 "System.Char::ToLower", ves_icall_System_Char_ToLower,
1146 "System.Char::ToUpper", ves_icall_System_Char_ToUpper,
1148 "System.Text.Encoding::IConvNewEncoder", ves_icall_iconv_new_encoder,
1149 "System.Text.Encoding::IConvNewDecoder", ves_icall_iconv_new_decoder,
1150 "System.Text.Encoding::IConvReset", ves_icall_iconv_reset,
1151 "System.Text.Encoding::IConvGetByteCount", ves_icall_iconv_get_byte_count,
1152 "System.Text.Encoding::IConvGetBytes", ves_icall_iconv_get_bytes,
1153 "System.Text.Encoding::IConvGetCharCount", ves_icall_iconv_get_char_count,
1154 "System.Text.Encoding::IConvGetChars", ves_icall_iconv_get_chars,
1156 "System.DateTime::GetNow", ves_icall_System_DateTime_GetNow,
1158 * add other internal calls here
1169 while ((n = icall_map [i])) {
1170 mono_add_internal_call (n, icall_map [i+1]);