2004-10-12 Martin Baulig <martin@ximian.com>
[mono.git] / mono / metadata / icall.c
index 0891bf68bc799f4793c186a174e17084bb5bad34..f9d71dbe17ebb2bb4001af0fa1b5d2b4e00e0cb0 100644 (file)
@@ -51,6 +51,7 @@
 #include <mono/metadata/char-conversions.h>
 #include <mono/metadata/security.h>
 #include <mono/metadata/mono-config.h>
+#include <mono/metadata/cil-coff.h>
 #include <mono/io-layer/io-layer.h>
 #include <mono/utils/strtod.h>
 #include <mono/utils/monobitset.h>
@@ -549,6 +550,13 @@ ves_icall_System_Array_GetLowerBound (MonoArray *this, gint32 dimension)
        return this->bounds [dimension].lower_bound;
 }
 
+static void
+ves_icall_System_Array_ClearInternal (MonoArray *arr, int idx, int length)
+{
+       int sz = mono_array_element_size (mono_object_class (arr));
+       memset (mono_array_addr_with_size (arr, idx, sz), 0, length * sz);
+}
+
 static gboolean
 ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* dest, int dest_idx, int length)
 {
@@ -950,12 +958,16 @@ type_from_name (const char *str, MonoBoolean ignoreCase)
        MonoType *type = NULL;
        MonoAssembly *assembly;
        MonoTypeNameParse info;
+       char *temp_str = g_strdup (str);
+       gboolean type_resolve = FALSE;
 
        MONO_ARCH_SAVE_REGS;
 
-       if (!mono_reflection_parse_type (str, &info)) {
+       /* mono_reflection_parse_type() mangles the string */
+       if (!mono_reflection_parse_type (temp_str, &info)) {
                g_list_free (info.modifiers);
                g_list_free (info.nested);
+               g_free (temp_str);
                return NULL;
        }
 
@@ -969,19 +981,22 @@ type_from_name (const char *str, MonoBoolean ignoreCase)
        }
 
        if (assembly)
-               type = mono_reflection_get_type (assembly->image, &info, ignoreCase);
+               type = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);
        
        if (!info.assembly.name && !type) /* try mscorlib */
-               type = mono_reflection_get_type (NULL, &info, ignoreCase);
+               type = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve);
 
        g_list_free (info.modifiers);
        g_list_free (info.nested);
+       g_free (temp_str);
+
        if (!type) 
                return NULL;
 
        return mono_type_get_object (mono_domain_get (), type);
 }
 
+#ifdef UNUSED
 MonoReflectionType *
 mono_type_get (const char *str)
 {
@@ -991,6 +1006,7 @@ mono_type_get (const char *str)
        g_free (copy);
        return type;
 }
+#endif
 
 static MonoReflectionType*
 ves_icall_type_from_name (MonoString *name,
@@ -1192,6 +1208,31 @@ ves_icall_get_attributes (MonoReflectionType *type)
        return klass->flags;
 }
 
+static MonoReflectionMarshal*
+ves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal (MonoReflectionField *field)
+{
+       MonoClass *klass = field->field->parent;
+       MonoMarshalType *info;
+       int i;
+
+       if (klass->generic_container ||
+           (klass->generic_inst && klass->generic_inst->is_open))
+               return NULL;
+
+       info = mono_marshal_load_type_info (klass);
+
+       for (i = 0; i < info->num_fields; ++i) {
+               if (info->fields [i].field == field->field) {
+                       if (!info->fields [i].mspec)
+                               return NULL;
+                       else
+                               return mono_reflection_marshal_from_marshal_spec (field->object.vtable->domain, klass, info->fields [i].mspec);
+               }
+       }
+
+       return NULL;
+}
+
 static MonoReflectionField*
 ves_icall_System_Reflection_FieldInfo_internal_from_handle (MonoClassField *handle)
 {
@@ -1234,6 +1275,12 @@ ves_icall_get_parameter_info (MonoMethod *method)
        return mono_param_get_objects (domain, method);
 }
 
+static gint32
+ves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)
+{
+       return field->field->offset - sizeof (MonoObject);
+}
+
 static MonoReflectionType*
 ves_icall_MonoField_GetParentType (MonoReflectionField *field, MonoBoolean declaring)
 {
@@ -1441,6 +1488,17 @@ ves_icall_get_event_info (MonoReflectionEvent *event, MonoEventInfo *info)
        info->add_method = event->event->add ? mono_method_get_object (domain, event->event->add, NULL): NULL;
        info->remove_method = event->event->remove ? mono_method_get_object (domain, event->event->remove, NULL): NULL;
        info->raise_method = event->event->raise ? mono_method_get_object (domain, event->event->raise, NULL): NULL;
+
+       if (event->event->other) {
+               int i, n = 0;
+               while (event->event->other [n])
+                       n++;
+               info->other_methods = mono_array_new (domain, mono_defaults.method_info_class, n);
+
+               for (i = 0; i < n; i++)
+                       mono_array_set (info->other_methods, gpointer, i,
+                                                       mono_method_get_object (domain, event->event->other [i], NULL));
+       }               
 }
 
 static MonoArray*
@@ -1448,7 +1506,8 @@ ves_icall_Type_GetInterfaces (MonoReflectionType* type)
 {
        MonoDomain *domain = mono_object_domain (type); 
        MonoArray *intf;
-       int ninterf, i;
+       GPtrArray *ifaces = NULL;
+       int i;
        MonoClass *class = mono_class_from_mono_type (type->type);
        MonoClass *parent;
        MonoBitSet *slots = mono_bitset_new (class->max_interface_id + 1, 0);
@@ -1461,32 +1520,37 @@ ves_icall_Type_GetInterfaces (MonoReflectionType* type)
                return mono_array_new (domain, mono_defaults.monotype_class, 0);
        }
 
-       ninterf = 0;
        for (parent = class; parent; parent = parent->parent) {
-               for (i = 0; i < parent->interface_count; ++i) {
-                       if (mono_bitset_test (slots, parent->interfaces [i]->interface_id))
-                               continue;
+               GPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent);
+               if (tmp_ifaces) {
+                       for (i = 0; i < tmp_ifaces->len; ++i) {
+                               MonoClass *ic = g_ptr_array_index (tmp_ifaces, i);
+
+                               if (mono_bitset_test (slots, ic->interface_id))
+                                       continue;
 
-                       mono_bitset_set (slots, parent->interfaces [i]->interface_id);
-                       ++ninterf;
+                               mono_bitset_set (slots, ic->interface_id);
+                               if (ifaces == NULL)
+                                       ifaces = g_ptr_array_new ();
+                               g_ptr_array_add (ifaces, ic);
+                       }
+                       g_ptr_array_free (tmp_ifaces, TRUE);
                }
        }
+       mono_bitset_free (slots);
 
-       intf = mono_array_new (domain, mono_defaults.monotype_class, ninterf);
-       ninterf = 0;
-       for (parent = class; parent; parent = parent->parent) {
-               for (i = 0; i < parent->interface_count; ++i) {
-                       if (!mono_bitset_test (slots, parent->interfaces [i]->interface_id))
-                               continue;
-
-                       mono_bitset_clear (slots, parent->interfaces [i]->interface_id);
-                       mono_array_set (intf, gpointer, ninterf,
-                                       mono_type_get_object (domain, &parent->interfaces [i]->byval_arg));
-                       ++ninterf;
-               }
+       if (!ifaces)
+               return mono_array_new (domain, mono_defaults.monotype_class, 0);
+               
+       intf = mono_array_new (domain, mono_defaults.monotype_class, ifaces->len);
+       for (i = 0; i < ifaces->len; ++i) {
+               MonoClass *ic = g_ptr_array_index (ifaces, i);
+               
+               mono_array_set (intf, gpointer, i,
+                                               mono_type_get_object (domain, &ic->byval_arg));
        }
+       g_ptr_array_free (ifaces, TRUE);
 
-       mono_bitset_free (slots);
        return intf;
 }
 
@@ -1518,6 +1582,16 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType
        }
 }
 
+static void
+ves_icall_Type_GetPacking (MonoReflectionType *type, guint32 *packing, guint32 *size)
+{
+       MonoClass *klass = mono_class_from_mono_type (type->type);
+
+       g_assert (!klass->image->dynamic);
+
+       mono_metadata_packing_from_typedef (klass->image, klass->type_token, packing, size);
+}
+
 static MonoReflectionType*
 ves_icall_MonoType_GetElementType (MonoReflectionType *type)
 {
@@ -1525,11 +1599,15 @@ ves_icall_MonoType_GetElementType (MonoReflectionType *type)
 
        MONO_ARCH_SAVE_REGS;
 
+       // GelElementType should only return a type for:
+       // Array Pointer PassedByRef
        if (type->type->byref)
                return mono_type_get_object (mono_object_domain (type), &class->byval_arg);
        if (class->enumtype && class->enum_basetype) /* types that are modifierd typebuilkders may not have enum_basetype set */
                return mono_type_get_object (mono_object_domain (type), class->enum_basetype);
-       else if (class->element_class)
+       else if (class->element_class && MONO_CLASS_IS_ARRAY (class))
+               return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
+       else if (class->element_class && type->type->type == MONO_TYPE_PTR)
                return mono_type_get_object (mono_object_domain (type), &class->element_class->byval_arg);
        else
                return NULL;
@@ -1639,7 +1717,10 @@ ves_icall_MonoType_get_Namespace (MonoReflectionType *type)
        while (class->nested_in)
                class = class->nested_in;
 
-       return mono_string_new (domain, class->name_space);
+       if (class->name_space [0] == '\0')
+               return NULL;
+       else
+               return mono_string_new (domain, class->name_space);
 }
 
 static gint32
@@ -1664,10 +1745,11 @@ ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)
 
        if (type->type->byref) {
                res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, 0);
-       } else if (klass->gen_params) {
-               res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, klass->num_gen_params);
-               for (i = 0; i < klass->num_gen_params; ++i) {
-                       pklass = mono_class_from_generic_parameter (&klass->gen_params [i], klass->image, FALSE);
+       } else if (klass->generic_container) {
+               MonoGenericContainer *container = klass->generic_container;
+               res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, container->type_argc);
+               for (i = 0; i < container->type_argc; ++i) {
+                       pklass = mono_class_from_generic_parameter (&container->type_params [i], klass->image, FALSE);
                        mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), &pklass->byval_arg));
                }
        } else if (klass->generic_inst) {
@@ -1692,7 +1774,7 @@ ves_icall_Type_get_IsGenericTypeDefinition (MonoReflectionType *type)
                return FALSE;
        klass = mono_class_from_mono_type (type->type);
 
-       return klass->gen_params != NULL;
+       return klass->generic_container != NULL;
 }
 
 static MonoReflectionType*
@@ -1704,7 +1786,7 @@ ves_icall_Type_GetGenericTypeDefinition_impl (MonoReflectionType *type)
        if (type->type->byref)
                return NULL;
        klass = mono_class_from_mono_type (type->type);
-       if (klass->gen_params) {
+       if (klass->generic_container) {
                return type; /* check this one */
        }
        if (klass->generic_inst) {
@@ -1767,6 +1849,38 @@ ves_icall_Type_GetGenericParameterPosition (MonoReflectionType *type)
        return -1;
 }
 
+static GenericParameterAttributes
+ves_icall_Type_GetGenericParameterAttributes (MonoReflectionType *type)
+{
+       MONO_ARCH_SAVE_REGS;
+       return type->type->data.generic_param->flags;
+}
+
+static MonoArray *
+ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)
+{
+       MonoGenericParam *param;
+       MonoDomain *domain;
+       MonoClass **ptr;
+       MonoArray *res;
+       int i, count;
+
+       MONO_ARCH_SAVE_REGS;
+
+       domain = mono_object_domain (type);
+       param = type->type->data.generic_param;
+       for (count = 0, ptr = param->constraints; ptr && *ptr; ptr++, count++)
+               ;
+
+       res = mono_array_new (domain, mono_defaults.monotype_class, count);
+       for (i = 0; i < count; i++)
+               mono_array_set (res, gpointer, i,
+                               mono_type_get_object (domain, &param->constraints [i]->byval_arg));
+
+
+       return res;
+}
+
 static MonoBoolean
 ves_icall_MonoType_get_HasGenericArguments (MonoReflectionType *type)
 {
@@ -1776,7 +1890,7 @@ ves_icall_MonoType_get_HasGenericArguments (MonoReflectionType *type)
        if (type->type->byref)
                return FALSE;
        klass = mono_class_from_mono_type (type->type);
-       if (klass->gen_params || klass->generic_inst)
+       if (klass->generic_container || klass->generic_inst)
                return TRUE;
        return FALSE;
 }
@@ -1825,7 +1939,7 @@ ves_icall_MonoGenericInst_GetParentType (MonoReflectionGenericInst *type)
                return NULL;
 
        klass = mono_class_from_mono_type (ginst->parent);
-       if (!klass->generic_inst && !klass->gen_params)
+       if (!klass->generic_inst && !klass->generic_container)
                return NULL;
 
        return mono_type_get_object (mono_object_domain (type), ginst->parent);
@@ -2042,6 +2156,71 @@ ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *type)
        return mono_method_get_object (mono_object_domain (type), method, klass);
 }
 
+static MonoReflectionDllImportAttribute*
+ves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)
+{
+       static MonoClass *DllImportAttributeClass = NULL;
+       MonoDomain *domain = mono_domain_get ();
+       MonoReflectionDllImportAttribute *attr;
+       MonoImage *image = method->klass->image;
+       MonoMethodPInvoke *piinfo = (MonoMethodPInvoke *)method;
+       MonoTableInfo *tables = image->tables;
+       MonoTableInfo *im = &tables [MONO_TABLE_IMPLMAP];
+       MonoTableInfo *mr = &tables [MONO_TABLE_MODULEREF];
+       guint32 im_cols [MONO_IMPLMAP_SIZE];
+       guint32 scope_token;
+       const char *import = NULL;
+       const char *scope = NULL;
+       guint32 flags;
+
+       if (!method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)
+               return NULL;
+
+       if (!DllImportAttributeClass) {
+               DllImportAttributeClass = 
+                       mono_class_from_name (mono_defaults.corlib,
+                                                                 "System.Runtime.InteropServices", "DllImportAttribute");
+               g_assert (DllImportAttributeClass);
+       }
+                                                                                                               
+       if (method->klass->image->dynamic) {
+               MonoReflectionMethodAux *method_aux = 
+                       mono_g_hash_table_lookup (
+                                                                         ((MonoDynamicImage*)method->klass->image)->method_aux_hash, method);
+               if (method_aux) {
+                       import = method_aux->dllentry;
+                       scope = method_aux->dll;
+               }
+       }
+       else {
+               if (piinfo->implmap_idx) {
+                       mono_metadata_decode_row (im, piinfo->implmap_idx - 1, im_cols, MONO_IMPLMAP_SIZE);
+                       
+                       piinfo->piflags = im_cols [MONO_IMPLMAP_FLAGS];
+                       import = mono_metadata_string_heap (image, im_cols [MONO_IMPLMAP_NAME]);
+                       scope_token = mono_metadata_decode_row_col (mr, im_cols [MONO_IMPLMAP_SCOPE] - 1, MONO_MODULEREF_NAME);
+                       scope = mono_metadata_string_heap (image, scope_token);
+               }
+       }
+       flags = piinfo->piflags;
+       
+       attr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);
+
+       attr->dll = mono_string_new (domain, scope);
+       attr->entry_point = mono_string_new (domain, import);
+       attr->call_conv = (flags & 0x700) >> 8;
+       attr->charset = ((flags & 0x6) >> 1) + 1;
+       if (attr->charset == 1)
+               attr->charset = 2;
+       attr->exact_spelling = (flags & 0x1) != 0;
+       attr->set_last_error = (flags & 0x4) != 0;
+       attr->best_fit_mapping = (flags & 0x10) != 0;
+       attr->throw_on_unmappable = (flags & 0x1000) != 0;
+       attr->preserve_sig = FALSE;
+
+       return attr;
+}
+
 static MonoReflectionMethod *
 ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
 {
@@ -2138,7 +2317,7 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
        res = mono_array_new (domain, mono_defaults.monotype_class, count);
 
        for (i = 0; i < count; i++) {
-               MonoGenericParam *param = &mn->gen_params [i];
+               MonoGenericParam *param = &mn->generic_container->type_params [i];
                MonoClass *pklass = mono_class_from_generic_parameter (
                        param, method->method->klass->image, TRUE);
                mono_array_set (res, gpointer, i,
@@ -2176,6 +2355,9 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoAr
        if (pcount != m->signature->param_count)
                mono_raise_exception (mono_exception_from_name (mono_defaults.corlib, "System.Reflection", "TargetParameterCountException"));
 
+       if ((m->klass->flags & TYPE_ATTRIBUTE_ABSTRACT) && !strcmp (m->name, ".ctor"))
+               mono_raise_exception (mono_exception_from_name_msg (mono_defaults.corlib, "System", "MethodAccessException", "Cannot invoke constructor of an abstract class."));
+
        if (m->klass->rank && !strcmp (m->name, ".ctor")) {
                int i;
                guint32 *lengths;
@@ -2216,6 +2398,15 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA
 
                if (!strcmp (m->name, "FieldGetter")) {
                        MonoClass *k = this->vtable->klass;
+                       
+                       /* If this is a proxy, then it must be a CBO */
+                       if (k == mono_defaults.transparent_proxy_class) {
+                               MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
+                               this = tp->rp->unwrapped_server;
+                               g_assert (this);
+                               k = this->vtable->klass;
+                       }
+                       
                        MonoString *name = mono_array_get (params, MonoString *, 1);
                        char *str;
 
@@ -2248,6 +2439,15 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA
 
                } else if (!strcmp (m->name, "FieldSetter")) {
                        MonoClass *k = this->vtable->klass;
+                       
+                       /* If this is a proxy, then it must be a CBO */
+                       if (k == mono_defaults.transparent_proxy_class) {
+                               MonoTransparentProxy *tp = (MonoTransparentProxy*) this;
+                               this = tp->rp->unwrapped_server;
+                               g_assert (this);
+                               k = this->vtable->klass;
+                       }
+                       
                        MonoString *name = mono_array_get (params, MonoString *, 1);
                        int size, align;
                        char *str;
@@ -2291,9 +2491,9 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA
 
        out_args = mono_array_new (domain, mono_defaults.object_class, outarg_count);
        
-       /* fixme: handle constructors? */
+       /* handle constructors only for objects already allocated */
        if (!strcmp (method->method->name, ".ctor"))
-               g_assert_not_reached ();
+               g_assert (this);
 
        /* This can be called only on MBR objects, so no need to unbox for valuetypes. */
        g_assert (!method->method->klass->valuetype);
@@ -3029,6 +3229,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
        gchar *str;
        MonoType *type = NULL;
        MonoTypeNameParse info;
+       gboolean type_resolve = FALSE;
 
        MONO_ARCH_SAVE_REGS;
 
@@ -3046,7 +3247,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
 
        if (module != NULL) {
                if (module->image)
-                       type = mono_reflection_get_type (module->image, &info, ignoreCase);
+                       type = mono_reflection_get_type (module->image, &info, ignoreCase, &type_resolve);
                else
                        type = NULL;
        }
@@ -3060,7 +3261,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
                        if (abuilder->modules) {
                                for (i = 0; i < mono_array_length (abuilder->modules); ++i) {
                                        MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
-                                       type = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase);
+                                       type = mono_reflection_get_type (&mb->dynamic_image->image, &info, ignoreCase, &type_resolve);
                                        if (type)
                                                break;
                                }
@@ -3069,14 +3270,14 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
                        if (!type && abuilder->loaded_modules) {
                                for (i = 0; i < mono_array_length (abuilder->loaded_modules); ++i) {
                                        MonoReflectionModule *mod = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
-                                       type = mono_reflection_get_type (mod->image, &info, ignoreCase);
+                                       type = mono_reflection_get_type (mod->image, &info, ignoreCase, &type_resolve);
                                        if (type)
                                                break;
                                }
                        }
                }
                else
-                       type = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase);
+                       type = mono_reflection_get_type (assembly->assembly->image, &info, ignoreCase, &type_resolve);
        g_free (str);
        g_list_free (info.modifiers);
        g_list_free (info.nested);
@@ -3144,14 +3345,11 @@ ves_icall_System_Reflection_Assembly_get_location (MonoReflectionAssembly *assem
 {
        MonoDomain *domain = mono_object_domain (assembly); 
        MonoString *res;
-       char *name = g_build_filename (
-               assembly->assembly->basedir,
-               assembly->assembly->image->module_name, NULL);
 
        MONO_ARCH_SAVE_REGS;
 
-       res = mono_string_new (domain, name);
-       g_free (name);
+       res = mono_string_new (domain, mono_image_get_filename (assembly->assembly->image));
+
        return res;
 }
 
@@ -3177,6 +3375,12 @@ ves_icall_System_Reflection_Assembly_get_EntryPoint (MonoReflectionAssembly *ass
        return mono_method_get_object (mono_object_domain (assembly), mono_get_method (assembly->assembly->image, token, NULL), NULL);
 }
 
+static MonoReflectionModule*
+ves_icall_System_Reflection_Assembly_get_ManifestModule (MonoReflectionAssembly *assembly) 
+{
+       return mono_module_get_object (mono_object_domain (assembly), assembly->assembly->image);
+}
+
 static MonoArray*
 ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAssembly *assembly) 
 {
@@ -3199,10 +3403,10 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
 {
        static MonoClass *System_Reflection_AssemblyName;
        MonoArray *result;
-       MonoAssembly **ptr;
        MonoDomain *domain = mono_object_domain (assembly);
        int i, count = 0;
        static MonoMethod *create_culture = NULL;
+       MonoTableInfo *t;
 
        MONO_ARCH_SAVE_REGS;
 
@@ -3210,8 +3414,8 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
                System_Reflection_AssemblyName = mono_class_from_name (
                        mono_defaults.corlib, "System.Reflection", "AssemblyName");
 
-       for (ptr = assembly->assembly->image->references; ptr && *ptr; ptr++)
-               count++;
+       t = &assembly->assembly->image->tables [MONO_TABLE_ASSEMBLYREF];
+       count = t->rows;
 
        result = mono_array_new (domain, System_Reflection_AssemblyName, count);
 
@@ -3224,10 +3428,21 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
        }
 
        for (i = 0; i < count; i++) {
-               MonoAssembly *assem = assembly->assembly->image->references [i];
+               MonoAssembly *assem;
                MonoReflectionAssemblyName *aname;
                char *codebase, *absolute;
 
+               /* FIXME: There is no need to load the assemblies themselves */
+               mono_assembly_load_reference (assembly->assembly->image, i);
+
+               assem = assembly->assembly->image->references [i];
+               if (assem == (gpointer)-1) {
+                       char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i, assembly->assembly->image->name);
+                       MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);
+                       g_free (msg);
+                       mono_raise_exception (ex);
+               }
+
                aname = (MonoReflectionAssemblyName *) mono_object_new (
                        domain, System_Reflection_AssemblyName);
 
@@ -3431,6 +3646,13 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec
 
                case MONO_IMPLEMENTATION_ASSEMBLYREF:
                        i = cols [MONO_MANIFEST_IMPLEMENTATION] >> MONO_IMPLEMENTATION_BITS;
+                       mono_assembly_load_reference (assembly->assembly->image, i - 1);
+                       if (assembly->assembly->image->references [i - 1] == (gpointer)-1) {
+                               char *msg = g_strdup_printf ("Assembly %d referenced from assembly %s not found ", i - 1, assembly->assembly->image->name);
+                               MonoException *ex = mono_get_exception_file_not_found2 (msg, NULL);
+                               g_free (msg);
+                               mono_raise_exception (ex);
+                       }
                        info->assembly = mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]);
 
                        /* Obtain info recursively */
@@ -3492,30 +3714,37 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly
        MonoDomain *domain = mono_domain_get();
        MonoArray *res;
        MonoClass *klass;
-       int i, module_count = 0, file_count = 0;
-       MonoImage **modules = assembly->assembly->image->modules;
+       int i, j, file_count = 0;
+       MonoImage **modules;
+       guint32 module_count, real_module_count;
        MonoTableInfo *table;
 
-       if (modules) {
-               while (modules[module_count])
-                       ++module_count;
-       }
+       g_assert (assembly->assembly->image != NULL);
 
        table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
        file_count = table->rows;
 
-       g_assert( assembly->assembly->image != NULL);
-       ++module_count;
+       modules = assembly->assembly->image->modules;
+       module_count = assembly->assembly->image->module_count;
 
-       klass = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "Module");
-       res = mono_array_new (domain, klass, module_count + file_count);
+       real_module_count = 0;
+       for (i = 0; i < module_count; ++i)
+               if (modules [i])
+                       real_module_count ++;
+
+       klass = mono_class_from_name (mono_defaults.corlib, "System.Reflection", "Module");
+       res = mono_array_new (domain, klass, 1 + real_module_count + file_count);
 
        mono_array_set (res, gpointer, 0, mono_module_get_object (domain, assembly->assembly->image));
-       for ( i = 1; i < module_count; ++i )
-               mono_array_set (res, gpointer, i, mono_module_get_object (domain, modules[i]));
+       j = 1;
+       for (i = 0; i < module_count; ++i)
+               if (modules [i]) {
+                       mono_array_set (res, gpointer, j, mono_module_get_object (domain, modules[i]));
+                       ++j;
+               }
 
-       for (i = 0; i < table->rows; ++i)
-               mono_array_set (res, gpointer, module_count + i, mono_module_file_get_object (domain, assembly->assembly->image, i));
+       for (i = 0; i < file_count; ++i, ++j)
+               mono_array_set (res, gpointer, j, mono_module_file_get_object (domain, assembly->assembly->image, i));
 
        return res;
 }
@@ -3530,6 +3759,18 @@ ves_icall_GetCurrentMethod (void)
        return mono_method_get_object (mono_domain_get (), m, NULL);
 }
 
+static MonoReflectionMethod*
+ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal (MonoMethod *method)
+{
+       return mono_method_get_object (mono_domain_get (), method, NULL);
+}
+
+static MonoReflectionMethodBody*
+ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method)
+{
+       return mono_method_body_get_object (mono_domain_get (), method);
+}
+
 static MonoReflectionAssembly*
 ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
 {
@@ -3583,7 +3824,7 @@ ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
 
        MONO_ARCH_SAVE_REGS;
 
-       mono_stack_walk (get_caller, &dest);
+       mono_stack_walk_no_il (get_caller, &dest);
        if (!dest)
                dest = m;
        return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
@@ -3743,15 +3984,82 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image,
 static MonoArray*
 ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, MonoBoolean exportedOnly)
 {
-       MonoArray *res;
-       MonoImage *image = assembly->assembly->image;
-       MonoTableInfo *table = &image->tables [MONO_TABLE_FILE];
+       MonoArray *res = NULL;
+       MonoImage *image = NULL;
+       MonoTableInfo *table = NULL;
        MonoDomain *domain;
        int i;
 
        MONO_ARCH_SAVE_REGS;
 
        domain = mono_object_domain (assembly);
+
+       if (assembly->assembly->dynamic) {
+               MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)assembly;
+               if (abuilder->modules) {
+                       for (i = 0; i < mono_array_length(abuilder->modules); i++) {
+                               MonoReflectionModuleBuilder *mb = mono_array_get (abuilder->modules, MonoReflectionModuleBuilder*, i);
+                               if (res == NULL)
+                                       res = mb->types;
+                               else {
+                                       MonoArray *append = mb->types;
+                                       if (mono_array_length (append) > 0) {
+                                               guint32 len1, len2;
+                                               MonoArray *new;
+                                               len1 = mono_array_length (res);
+                                               len2 = mono_array_length (append);
+                                               new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
+                                               memcpy (mono_array_addr (new, MonoReflectionType*, 0),
+                                                       mono_array_addr (res, MonoReflectionType*, 0),
+                                                       len1 * sizeof (MonoReflectionType*));
+                                               memcpy (mono_array_addr (new, MonoReflectionType*, len1),
+                                                       mono_array_addr (append, MonoReflectionType*, 0),
+                                                       len2 * sizeof (MonoReflectionType*));
+                                               res = new;
+                                       }
+                               }
+                       }
+
+                       /* 
+                        * Replace TypeBuilders with the created types to be compatible
+                        * with MS.NET.
+                        */
+                       if (res) {
+                               for (i = 0; i < mono_array_length (res); ++i) {
+                                       MonoReflectionTypeBuilder *tb = mono_array_get (res, MonoReflectionTypeBuilder*, i);
+                                       if (tb->created)
+                                               mono_array_set (res, MonoReflectionType*, i, tb->created);
+                               }
+                       }
+               }
+
+               if (abuilder->loaded_modules)
+                       for (i = 0; i < mono_array_length(abuilder->loaded_modules); i++) {
+                               MonoReflectionModule *rm = mono_array_get (abuilder->loaded_modules, MonoReflectionModule*, i);
+                               if (res == NULL)
+                                       res = mono_module_get_types (domain, rm->image, exportedOnly);
+                               else {
+                                       MonoArray *append = mono_module_get_types (domain, rm->image, exportedOnly);
+                                       if (mono_array_length (append) > 0) {
+                                               guint32 len1, len2;
+                                               MonoArray *new;
+                                               len1 = mono_array_length (res);
+                                               len2 = mono_array_length (append);
+                                               new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
+                                               memcpy (mono_array_addr (new, MonoReflectionType*, 0),
+                                                       mono_array_addr (res, MonoReflectionType*, 0),
+                                                       len1 * sizeof (MonoReflectionType*));
+                                               memcpy (mono_array_addr (new, MonoReflectionType*, len1),
+                                                       mono_array_addr (append, MonoReflectionType*, 0),
+                                                       len2 * sizeof (MonoReflectionType*));
+                                               res = new;
+                                       }
+                               }
+                       }
+               return res;
+       }
+       image = assembly->assembly->image;
+       table = &image->tables [MONO_TABLE_FILE];
        res = mono_module_get_types (domain, image, exportedOnly);
 
        /* Append data from all modules in the assembly */
@@ -3779,7 +4087,6 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                        }
                }
        }               
-
        return res;
 }
 
@@ -3792,6 +4099,11 @@ ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module)
        MONO_ARCH_SAVE_REGS;
 
        g_assert (module->image);
+
+       if (module->image->dynamic && ((MonoDynamicImage*)(module->image))->initial_image)
+               /* These images do not have a global type */
+               return NULL;
+
        klass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF);
        return mono_type_get_object (domain, &klass->byval_arg);
 }
@@ -3814,6 +4126,20 @@ ves_icall_System_Reflection_Module_GetGuidInternal (MonoReflectionModule *module
        return mono_string_new (domain, module->image->guid);
 }
 
+static void
+ves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind, gint32 *machine)
+{
+       if (image->dynamic) {
+               MonoDynamicImage *dyn = (MonoDynamicImage*)image;
+               *pe_kind = dyn->pe_kind;
+               *machine = dyn->machine;
+       }
+       else {
+               *pe_kind = ((MonoCLIImageInfo*)(image->image_info))->cli_cli_header.ch_flags & 0x3;
+               *machine = ((MonoCLIImageInfo*)(image->image_info))->cli_header.coff.coff_machine;
+       }
+}
+
 static MonoArray*
 ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)
 {
@@ -3825,6 +4151,193 @@ ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *modul
                return mono_module_get_types (mono_object_domain (module), module->image, FALSE);
 }
 
+static gboolean
+mono_metadata_memberref_is_method (MonoImage *image, guint32 token)
+{
+       guint32 cols [MONO_MEMBERREF_SIZE];
+       const char *sig;
+       mono_metadata_decode_row (&image->tables [MONO_TABLE_MEMBERREF], mono_metadata_token_index (token) - 1, cols, MONO_MEMBERREF_SIZE);
+       sig = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);
+       mono_metadata_decode_blob_size (sig, &sig);
+       return (*sig != 0x6);
+}
+
+static MonoType*
+ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
+{
+       MonoClass *klass;
+       int table = mono_metadata_token_table (token);
+       int index = mono_metadata_token_index (token);
+
+       *error = ResolveTokenError_Other;
+
+       /* Validate token */
+       if ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) && 
+               (table != MONO_TABLE_TYPESPEC)) {
+               *error = ResolveTokenError_BadTable;
+               return NULL;
+       }
+
+       if (image->dynamic)
+               return mono_lookup_dynamic_token (image, token);
+
+       if ((index <= 0) || (index > image->tables [table].rows)) {
+               *error = ResolveTokenError_OutOfRange;
+               return NULL;
+       }
+
+       klass = mono_class_get (image, token);
+       if (klass)
+               return &klass->byval_arg;
+       else
+               return NULL;
+}
+
+static MonoMethod*
+ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
+{
+       int table = mono_metadata_token_table (token);
+       int index = mono_metadata_token_index (token);
+
+       *error = ResolveTokenError_Other;
+
+       /* Validate token */
+       if ((table != MONO_TABLE_METHOD) && (table != MONO_TABLE_METHODSPEC) && 
+               (table != MONO_TABLE_MEMBERREF)) {
+               *error = ResolveTokenError_BadTable;
+               return NULL;
+       }
+
+       if (image->dynamic)
+               /* FIXME: validate memberref token type */
+               return mono_lookup_dynamic_token (image, token);
+
+       if ((index <= 0) || (index > image->tables [table].rows)) {
+               *error = ResolveTokenError_OutOfRange;
+               return NULL;
+       }
+       if ((table == MONO_TABLE_MEMBERREF) && (!mono_metadata_memberref_is_method (image, token))) {
+               *error = ResolveTokenError_BadTable;
+               return NULL;
+       }
+
+       return mono_get_method (image, token, NULL);
+}
+
+static MonoString*
+ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
+{
+       int index = mono_metadata_token_index (token);
+
+       *error = ResolveTokenError_Other;
+
+       /* Validate token */
+       if (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {
+               *error = ResolveTokenError_BadTable;
+               return NULL;
+       }
+
+       if (image->dynamic)
+               return mono_lookup_dynamic_token (image, token);
+
+       if ((index <= 0) || (index >= image->heap_us.size)) {
+               *error = ResolveTokenError_OutOfRange;
+               return NULL;
+       }
+
+       /* FIXME: What to do if the index points into the middle of a string ? */
+
+       return mono_ldstr (mono_domain_get (), image, index);
+}
+
+static MonoClassField*
+ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
+{
+       MonoClass *klass;
+       int table = mono_metadata_token_table (token);
+       int index = mono_metadata_token_index (token);
+
+       *error = ResolveTokenError_Other;
+
+       /* Validate token */
+       if ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) {
+               *error = ResolveTokenError_BadTable;
+               return NULL;
+       }
+
+       if (image->dynamic)
+               /* FIXME: validate memberref token type */
+               return mono_lookup_dynamic_token (image, token);
+
+       if ((index <= 0) || (index > image->tables [table].rows)) {
+               *error = ResolveTokenError_OutOfRange;
+               return NULL;
+       }
+       if ((table == MONO_TABLE_MEMBERREF) && (mono_metadata_memberref_is_method (image, token))) {
+               *error = ResolveTokenError_BadTable;
+               return NULL;
+       }
+
+       return mono_field_from_token (image, token, &klass, NULL);
+}
+
+
+static MonoObject*
+ves_icall_System_Reflection_Module_ResolveMemberToken (MonoImage *image, guint32 token, MonoResolveTokenError *error)
+{
+       int table = mono_metadata_token_table (token);
+
+       *error = ResolveTokenError_Other;
+
+       switch (table) {
+       case MONO_TABLE_TYPEDEF:
+       case MONO_TABLE_TYPEREF:
+       case MONO_TABLE_TYPESPEC: {
+               MonoType *t = ves_icall_System_Reflection_Module_ResolveTypeToken (image, token, error);
+               if (t)
+                       return (MonoObject*)mono_type_get_object (mono_domain_get (), t);
+               else
+                       return NULL;
+       }
+       case MONO_TABLE_METHOD:
+       case MONO_TABLE_METHODSPEC: {
+               MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
+               if (m)
+                       return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
+               else
+                       return NULL;
+       }               
+       case MONO_TABLE_FIELD: {
+               MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
+               if (f)
+                       return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
+               else
+                       return NULL;
+       }
+       case MONO_TABLE_MEMBERREF:
+               if (mono_metadata_memberref_is_method (image, token)) {
+                       MonoMethod *m = ves_icall_System_Reflection_Module_ResolveMethodToken (image, token, error);
+                       if (m)
+                               return (MonoObject*)mono_method_get_object (mono_domain_get (), m, m->klass);
+                       else
+                               return NULL;
+               }
+               else {
+                       MonoClassField *f = ves_icall_System_Reflection_Module_ResolveFieldToken (image, token, error);
+                       if (f)
+                               return (MonoObject*)mono_field_get_object (mono_domain_get (), f->parent, f);
+                       else
+                               return NULL;
+               }
+               break;
+
+       default:
+               *error = ResolveTokenError_BadTable;
+       }
+
+       return NULL;
+}
+
 static MonoReflectionType*
 ves_icall_ModuleBuilder_create_modified_type (MonoReflectionTypeBuilder *tb, MonoString *smodifiers)
 {
@@ -3924,6 +4437,18 @@ ves_icall_Type_make_byref_type (MonoReflectionType *type)
        return mono_type_get_object (mono_object_domain (type), &klass->this_arg);
 }
 
+static MonoReflectionType *
+ves_icall_Type_MakePointerType (MonoReflectionType *type)
+{
+       MonoClass *pklass;
+
+       MONO_ARCH_SAVE_REGS;
+
+       pklass = mono_ptr_class_get (type->type);
+
+       return mono_type_get_object (mono_object_domain (type), &pklass->byval_arg);
+}
+
 static MonoObject *
 ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, MonoObject *target,
                                                   MonoReflectionMethod *info)
@@ -3945,6 +4470,12 @@ ves_icall_System_Delegate_CreateDelegate_internal (MonoReflectionType *type, Mon
        return delegate;
 }
 
+static void
+ves_icall_System_Delegate_FreeTrampoline (MonoDelegate *this)
+{
+       mono_delegate_free_ftnptr (this);
+}
+
 /*
  * Magic number to convert a time which is relative to
  * Jan 1, 1970 into a value which is relative to Jan 1, 0001.
@@ -4613,7 +5144,8 @@ static MonoString*
 ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page) 
 {
        const char *cset;
-       char *p;
+       const char *p;
+       char *c;
        char *codepage = NULL;
        int code;
        int want_name = *int_code_page;
@@ -4623,12 +5155,12 @@ ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page)
        MONO_ARCH_SAVE_REGS;
 
        g_get_charset (&cset);
-       p = codepage = strdup (cset);
-       for (p = codepage; *p; p++){
-               if (isascii (*p) && isalpha (*p))
-                       *p = tolower (*p);
-               if (*p == '-')
-                       *p = '_';
+       c = codepage = strdup (cset);
+       for (c = codepage; *c; c++){
+               if (isascii (*c) && isalpha (*c))
+                       *c = tolower (*c);
+               if (*c == '-')
+                       *c = '_';
        }
        /* g_print ("charset: %s\n", cset); */
        
@@ -4636,8 +5168,8 @@ ves_icall_System_Text_Encoding_InternalCodePage (gint32 *int_code_page)
        p = encodings [0];
        code = 0;
        for (i = 0; p != 0; ){
-               if ((int) p < 7){
-                       code = (int) p;
+               if ((gssize) p < 7){
+                       code = (gssize) p;
                        p = encodings [++i];
                        continue;
                }
@@ -5033,11 +5565,15 @@ ves_icall_System_Runtime_InteropServices_Marshal_PrelinkAll (MonoReflectionType
                prelink_method (klass->methods [i]);
 }
 
+/* These parameters are "readonly" in corlib/System/Char.cs */
 static void
-ves_icall_System_Char_GetDataTablePointers (guint8 **category_data, guint8 **numeric_data,
-               gdouble **numeric_data_values, guint16 **to_lower_data_low,
-               guint16 **to_lower_data_high, guint16 **to_upper_data_low,
-               guint16 **to_upper_data_high)
+ves_icall_System_Char_GetDataTablePointers (guint8 const **category_data,
+                                           guint8 const **numeric_data,
+                                           gdouble const **numeric_data_values,
+                                           guint16 const **to_lower_data_low,
+                                           guint16 const **to_lower_data_high,
+                                           guint16 const **to_upper_data_low,
+                                           guint16 const **to_upper_data_high)
 {
        *category_data = CategoryData;
        *numeric_data = NumericData;
@@ -5048,6 +5584,23 @@ ves_icall_System_Char_GetDataTablePointers (guint8 **category_data, guint8 **num
        *to_upper_data_high = ToUpperDataHigh;
 }
 
+static MonoString *
+ves_icall_MonoDebugger_check_runtime_version (MonoString *fname)
+{
+       gchar *filename, *error = NULL;
+
+       MONO_ARCH_SAVE_REGS;
+
+       filename = mono_string_to_utf8 (fname);
+       error = mono_debugger_check_runtime_version (filename);
+       g_free (filename);
+
+       if (error)
+               return mono_string_new (mono_domain_get (), error);
+       else
+               return NULL;
+}
+
 /* icall map */
 typedef struct {
        const char *method;
@@ -5096,6 +5649,7 @@ static const IcallEntry argiterator_icalls [] = {
 };
 
 static const IcallEntry array_icalls [] = {
+       {"ClearInternal",    ves_icall_System_Array_ClearInternal},
        {"Clone",            mono_array_clone},
        {"CreateInstanceImpl",   ves_icall_System_Array_CreateInstanceImpl},
        {"FastCopy",         ves_icall_System_Array_FastCopy},
@@ -5151,7 +5705,8 @@ static const IcallEntry decimal_icalls [] = {
 };
 
 static const IcallEntry delegate_icalls [] = {
-       {"CreateDelegate_internal", ves_icall_System_Delegate_CreateDelegate_internal}
+       {"CreateDelegate_internal", ves_icall_System_Delegate_CreateDelegate_internal},
+       {"FreeTrampoline", ves_icall_System_Delegate_FreeTrampoline}
 };
 
 static const IcallEntry tracelist_icalls [] = {
@@ -5319,7 +5874,7 @@ static const IcallEntry math_icalls [] = {
 };
 
 static const IcallEntry customattrs_icalls [] = {
-       {"GetCustomAttributes", mono_reflection_get_custom_attrs}
+       {"GetCustomAttributesInternal", mono_reflection_get_custom_attrs}
 };
 
 static const IcallEntry enuminfo_icalls [] = {
@@ -5327,9 +5882,14 @@ static const IcallEntry enuminfo_icalls [] = {
 };
 
 static const IcallEntry fieldinfo_icalls [] = {
+       {"GetUnmanagedMarshal", ves_icall_System_Reflection_FieldInfo_GetUnmanagedMarshal},
        {"internal_from_handle", ves_icall_System_Reflection_FieldInfo_internal_from_handle}
 };
 
+static const IcallEntry memberinfo_icalls [] = {
+       {"get_MetadataToken", mono_reflection_get_token}
+};
+
 static const IcallEntry monotype_icalls [] = {
        {"GetArrayRank", ves_icall_MonoType_GetArrayRank},
        {"GetConstructors", ves_icall_Type_GetConstructors_internal},
@@ -5383,12 +5943,16 @@ static const IcallEntry assembly_icalls [] = {
        /*
         * Private icalls for the Mono Debugger
         */
+       {"MonoDebugger_CheckRuntimeVersion", ves_icall_MonoDebugger_check_runtime_version},
        {"MonoDebugger_GetLocalTypeFromSignature", ves_icall_MonoDebugger_GetLocalTypeFromSignature},
        {"MonoDebugger_GetMethod", ves_icall_MonoDebugger_GetMethod},
        {"MonoDebugger_GetMethodToken", ves_icall_MonoDebugger_GetMethodToken},
        {"MonoDebugger_GetType", ves_icall_MonoDebugger_GetType},
+
        /* normal icalls again */
        {"get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint},
+       {"get_ManifestModule", ves_icall_System_Reflection_Assembly_get_ManifestModule},
+       {"get_MetadataToken", mono_reflection_get_token},
        {"get_code_base", ves_icall_System_Reflection_Assembly_get_code_base},
        {"get_global_assembly_cache", ves_icall_System_Reflection_Assembly_get_global_assembly_cache},
        {"get_location", ves_icall_System_Reflection_Assembly_get_location},
@@ -5396,14 +5960,23 @@ static const IcallEntry assembly_icalls [] = {
 };
 
 static const IcallEntry methodbase_icalls [] = {
-       {"GetCurrentMethod", ves_icall_GetCurrentMethod}
+       {"GetCurrentMethod", ves_icall_GetCurrentMethod},
+       {"GetMethodBodyInternal", ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal},
+       {"GetMethodFromHandleInternal", ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternal}
 };
 
 static const IcallEntry module_icalls [] = {
        {"Close", ves_icall_System_Reflection_Module_Close},
        {"GetGlobalType", ves_icall_System_Reflection_Module_GetGlobalType},
        {"GetGuidInternal", ves_icall_System_Reflection_Module_GetGuidInternal},
-       {"InternalGetTypes", ves_icall_System_Reflection_Module_InternalGetTypes}
+       {"GetPEKind", ves_icall_System_Reflection_Module_GetPEKind},
+       {"InternalGetTypes", ves_icall_System_Reflection_Module_InternalGetTypes},
+       {"ResolveFieldToken", ves_icall_System_Reflection_Module_ResolveFieldToken},
+       {"ResolveMemberToken", ves_icall_System_Reflection_Module_ResolveMemberToken},
+       {"ResolveMethodToken", ves_icall_System_Reflection_Module_ResolveMethodToken},
+       {"ResolveStringToken", ves_icall_System_Reflection_Module_ResolveStringToken},
+       {"ResolveTypeToken", ves_icall_System_Reflection_Module_ResolveTypeToken},
+       {"get_MetadataToken", mono_reflection_get_token}
 };
 
 static const IcallEntry monocmethod_icalls [] = {
@@ -5417,6 +5990,7 @@ static const IcallEntry monoeventinfo_icalls [] = {
 };
 
 static const IcallEntry monofield_icalls [] = {
+       {"GetFieldOffset", ves_icall_MonoField_GetFieldOffset},
        {"GetParentType", ves_icall_MonoField_GetParentType},
        {"GetValueInternal", ves_icall_MonoField_GetValueInternal},
        {"Mono_GetGenericFieldDefinition", ves_icall_MonoField_Mono_GetGenericFieldDefinition},
@@ -5440,6 +6014,7 @@ static const IcallEntry generictypeparambuilder_icalls [] = {
 
 static const IcallEntry monomethod_icalls [] = {
        {"BindGenericParameters", mono_reflection_bind_generic_method_parameters},
+       {"GetDllImportAttribute", ves_icall_MonoMethod_GetDllImportAttribute},
        {"GetGenericArguments", ves_icall_MonoMethod_GetGenericArguments},
        {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
        {"InternalInvoke", ves_icall_InternalInvoke},
@@ -5458,6 +6033,10 @@ static const IcallEntry monopropertyinfo_icalls [] = {
        {"get_property_info", ves_icall_get_property_info}
 };
 
+static const IcallEntry parameterinfo_icalls [] = {
+       {"get_MetadataToken", mono_reflection_get_token}
+};
+
 static const IcallEntry dns_icalls [] = {
        {"GetHostByAddr_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByAddr_internal},
        {"GetHostByName_internal(string,string&,string[]&,string[]&)", ves_icall_System_Net_Dns_GetHostByName_internal},
@@ -5535,6 +6114,7 @@ static const IcallEntry signaturehelper_icalls [] = {
 };
 
 static const IcallEntry typebuilder_icalls [] = {
+       {"create_generic_class", mono_reflection_create_generic_class},
        {"create_internal_class", mono_reflection_create_internal_class},
        {"create_runtime_class", mono_reflection_create_runtime_class},
        {"get_IsGenericParameter", ves_icall_TypeBuilder_get_IsGenericParameter},
@@ -5565,10 +6145,12 @@ static const IcallEntry gchandle_icalls [] = {
 
 static const IcallEntry marshal_icalls [] = {
        {"AllocCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_AllocCoTaskMem},
-       {"AllocHGlobal", mono_marshal_alloc},
+       {"AllocHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_AllocHGlobal},
        {"DestroyStructure", ves_icall_System_Runtime_InteropServices_Marshal_DestroyStructure},
        {"FreeCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_FreeCoTaskMem},
-       {"FreeHGlobal", mono_marshal_free},
+       {"FreeHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_FreeHGlobal},
+       {"GetDelegateForFunctionPointerInternal", ves_icall_System_Runtime_InteropServices_Marshal_GetDelegateForFunctionPointerInternal},
+       {"GetFunctionPointerForDelegateInternal", mono_delegate_to_ftnptr},
        {"GetLastWin32Error", ves_icall_System_Runtime_InteropServices_Marshal_GetLastWin32Error},
        {"OffsetOf", ves_icall_System_Runtime_InteropServices_Marshal_OffsetOf},
        {"Prelink", ves_icall_System_Runtime_InteropServices_Marshal_Prelink},
@@ -5767,12 +6349,16 @@ static const IcallEntry waithandle_icalls [] = {
 static const IcallEntry type_icalls [] = {
        {"BindGenericParameters", ves_icall_Type_BindGenericParameters},
        {"Equals", ves_icall_type_Equals},
+       {"GetGenericParameterAttributes", ves_icall_Type_GetGenericParameterAttributes},
+       {"GetGenericParameterConstraints_impl", ves_icall_Type_GetGenericParameterConstraints},
        {"GetGenericParameterPosition", ves_icall_Type_GetGenericParameterPosition},
        {"GetGenericTypeDefinition_impl", ves_icall_Type_GetGenericTypeDefinition_impl},
        {"GetInterfaceMapData", ves_icall_Type_GetInterfaceMapData},
+       {"GetPacking", ves_icall_Type_GetPacking},
        {"GetTypeCode", ves_icall_type_GetTypeCode},
        {"IsArrayImpl", ves_icall_Type_IsArrayImpl},
        {"IsInstanceOfType", ves_icall_type_IsInstanceOfType},
+       {"MakePointerType", ves_icall_Type_MakePointerType},
        {"get_IsGenericInstance", ves_icall_Type_get_IsGenericInstance},
        {"get_IsGenericTypeDefinition", ves_icall_Type_get_IsGenericTypeDefinition},
        {"internal_from_handle", ves_icall_type_from_handle},
@@ -5876,6 +6462,7 @@ static const IcallMap icall_entries [] = {
        {"System.Reflection.Emit.SignatureHelper", signaturehelper_icalls, G_N_ELEMENTS (signaturehelper_icalls)},
        {"System.Reflection.Emit.TypeBuilder", typebuilder_icalls, G_N_ELEMENTS (typebuilder_icalls)},
        {"System.Reflection.FieldInfo", fieldinfo_icalls, G_N_ELEMENTS (fieldinfo_icalls)},
+       {"System.Reflection.MemberInfo", memberinfo_icalls, G_N_ELEMENTS (memberinfo_icalls)},
        {"System.Reflection.MethodBase", methodbase_icalls, G_N_ELEMENTS (methodbase_icalls)},
        {"System.Reflection.Module", module_icalls, G_N_ELEMENTS (module_icalls)},
        {"System.Reflection.MonoCMethod", monocmethod_icalls, G_N_ELEMENTS (monocmethod_icalls)},
@@ -5885,6 +6472,7 @@ static const IcallMap icall_entries [] = {
        {"System.Reflection.MonoMethod", monomethod_icalls, G_N_ELEMENTS (monomethod_icalls)},
        {"System.Reflection.MonoMethodInfo", monomethodinfo_icalls, G_N_ELEMENTS (monomethodinfo_icalls)},
        {"System.Reflection.MonoPropertyInfo", monopropertyinfo_icalls, G_N_ELEMENTS (monopropertyinfo_icalls)},
+       {"System.Reflection.ParameterInfo", parameterinfo_icalls, G_N_ELEMENTS (parameterinfo_icalls)},
        {"System.Runtime.CompilerServices.RuntimeHelpers", runtimehelpers_icalls, G_N_ELEMENTS (runtimehelpers_icalls)},
        {"System.Runtime.InteropServices.GCHandle", gchandle_icalls, G_N_ELEMENTS (gchandle_icalls)},
        {"System.Runtime.InteropServices.Marshal", marshal_icalls, G_N_ELEMENTS (marshal_icalls)},
@@ -6092,7 +6680,7 @@ mono_lookup_internal_call (MonoMethod *method)
 static MonoType*
 type_from_typename (char *typename)
 {
-       MonoClass *klass;
+       MonoClass *klass = NULL;        /* assignment to shut GCC warning up */
 
        if (!strcmp (typename, "int"))
                klass = mono_defaults.int_class;
@@ -6165,7 +6753,7 @@ mono_create_icall_signature (const char *sigstr)
 
        g_strfreev (parts);
 
-       g_hash_table_insert (mono_defaults.corlib->helper_signatures, sigstr, res);
+       g_hash_table_insert (mono_defaults.corlib->helper_signatures, (gpointer)sigstr, res);
 
        mono_loader_unlock ();