Hide some more methods
[mono.git] / mono / metadata / icall.c
index 4144a54167a52c420f4aea101c20306d01d72e31..41b3ee3f809a72dc95fffb3679a063b0a74d96d7 100644 (file)
@@ -43,7 +43,7 @@
 #include <mono/metadata/rand.h>
 #include <mono/metadata/sysmath.h>
 #include <mono/metadata/string-icalls.h>
-#include <mono/metadata/mono-debug-debugger.h>
+#include <mono/metadata/debug-helpers.h>
 #include <mono/metadata/process.h>
 #include <mono/metadata/environment.h>
 #include <mono/metadata/profiler-private.h>
@@ -70,28 +70,26 @@ static MonoReflectionAssembly* ves_icall_System_Reflection_Assembly_GetCallingAs
 /*
  * We expect a pointer to a char, not a string
  */
-static double
-mono_double_ParseImpl (char *ptr)
+static gboolean
+mono_double_ParseImpl (char *ptr, double *result)
 {
        gchar *endptr = NULL;
-       gdouble result = 0.0;
+       *result = 0.0;
 
        MONO_ARCH_SAVE_REGS;
 
 #ifdef __arm__
        if (*ptr)
-               result = strtod (ptr, &endptr);
+               *result = strtod (ptr, &endptr);
 #else
        if (*ptr)
-               result = bsd_strtod (ptr, &endptr);
+               *result = bsd_strtod (ptr, &endptr);
 #endif
 
        if (!*ptr || (endptr && *endptr))
-               mono_raise_exception (mono_exception_from_name (mono_get_corlib (),
-                                                               "System",
-                                                               "FormatException"));
+               return FALSE;
        
-       return result;
+       return TRUE;
 }
 
 static void
@@ -555,7 +553,7 @@ 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);
+       memset (mono_array_addr_with_size (arr, sz, idx), 0, length * sz);
 }
 
 static gboolean
@@ -580,10 +578,6 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
                (source_idx + length > mono_array_length (source)))
                return FALSE;
 
-       element_size = mono_array_element_size (source->obj.vtable->klass);
-       dest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);
-       source_addr = mono_array_addr_with_size (source, element_size, source_idx);
-
        src_class = source->obj.vtable->klass->element_class;
        dest_class = dest->obj.vtable->klass->element_class;
 
@@ -593,6 +587,7 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
 
        /* Case1: object[] -> valuetype[] (ArrayList::ToArray) */
        if (src_class == mono_defaults.object_class && dest_class->valuetype) {
+               int has_refs = dest_class->has_references;
                for (i = source_idx; i < source_idx + length; ++i) {
                        MonoObject *elem = mono_array_get (source, MonoObject*, i);
                        if (elem && !mono_object_isinst (elem, dest_class))
@@ -600,11 +595,14 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
                }
 
                element_size = mono_array_element_size (dest->obj.vtable->klass);
+               memset (mono_array_addr_with_size (dest, element_size, dest_idx), 0, element_size * length);
                for (i = 0; i < length; ++i) {
                        MonoObject *elem = mono_array_get (source, MonoObject*, source_idx + i);
                        void *addr = mono_array_addr_with_size (dest, element_size, dest_idx + i);
                        if (!elem)
-                               memset (addr, 0, element_size);
+                               continue;
+                       if (has_refs)
+                               mono_value_copy (addr, (char *)elem + sizeof (MonoObject), dest_class);
                        else
                                memcpy (addr, (char *)elem + sizeof (MonoObject), element_size);
                }
@@ -629,7 +627,18 @@ ves_icall_System_Array_FastCopy (MonoArray *source, int source_idx, MonoArray* d
                        return FALSE;
        }
 
-       memmove (dest_addr, source_addr, element_size * length);
+       if (dest_class->valuetype) {
+               element_size = mono_array_element_size (source->obj.vtable->klass);
+               source_addr = mono_array_addr_with_size (source, element_size, source_idx);
+               if (dest_class->has_references) {
+                       mono_value_copy_array (dest, dest_idx, source_addr, length);
+               } else {
+                       dest_addr = mono_array_addr_with_size (dest, element_size, dest_idx);
+                       memmove (dest_addr, source_addr, element_size * length);
+               }
+       } else {
+               mono_array_memcpy_refs (dest, dest_idx, source, source_idx, length);
+       }
 
        return TRUE;
 }
@@ -782,7 +791,7 @@ ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fi
        klass = mono_object_class (this);
 
        if (mono_class_num_fields (klass) == 0)
-               return ves_icall_System_Object_GetHashCode (this);
+               return mono_object_hash (this);
 
        /*
         * Compute the starting value of the hashcode for fields of primitive
@@ -816,11 +825,13 @@ ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this, MonoArray **fi
        }
 
        if (values) {
+               int i;
                *fields = mono_array_new (mono_domain_get (), mono_defaults.object_class, count);
-               memcpy (mono_array_addr (*fields, MonoObject*, 0), values, count * sizeof (MonoObject*));
-       }
-       else
+               for (i = 0; i < count; ++i)
+                       mono_array_setref (*fields, i, values [i]);
+       } else {
                *fields = NULL;
+       }
        return result;
 }
 
@@ -891,13 +902,14 @@ ves_icall_System_ValueType_Equals (MonoObject *this, MonoObject *that, MonoArray
        }
 
        if (values) {
+               int i;
                *fields = mono_array_new (mono_domain_get (), mono_defaults.object_class, count);
-               memcpy (mono_array_addr (*fields, MonoObject*, 0), values, count * sizeof (MonoObject*));
-
+               for (i = 0; i < count; ++i)
+                       mono_array_setref (*fields, i, values [i]);
                return FALSE;
-       }
-       else
+       } else {
                return TRUE;
+       }
 }
 
 static MonoReflectionType *
@@ -959,11 +971,31 @@ ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)
        mono_image_build_metadata (mb);
 }
 
+static gboolean
+get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
+{
+       MonoMethod **dest = data;
+
+       /* skip unmanaged frames */
+       if (!managed)
+               return FALSE;
+
+       if (m == *dest) {
+               *dest = NULL;
+               return FALSE;
+       }
+       if (!(*dest)) {
+               *dest = m;
+               return TRUE;
+       }
+       return FALSE;
+}
+
 static MonoReflectionType *
 type_from_name (const char *str, MonoBoolean ignoreCase)
 {
        MonoType *type = NULL;
-       MonoAssembly *assembly;
+       MonoAssembly *assembly = NULL;
        MonoTypeNameParse info;
        char *temp_str = g_strdup (str);
        gboolean type_resolve = FALSE;
@@ -981,10 +1013,26 @@ type_from_name (const char *str, MonoBoolean ignoreCase)
        if (info.assembly.name) {
                assembly = mono_assembly_load (&info.assembly, NULL, NULL);
        } else {
-               MonoReflectionAssembly *refass;
+               MonoMethod *m = mono_method_get_last_managed ();
+               MonoMethod *dest = m;
 
-               refass = ves_icall_System_Reflection_Assembly_GetCallingAssembly  ();
-               assembly = refass->assembly;
+               mono_stack_walk_no_il (get_caller, &dest);
+               if (!dest)
+                       dest = m;
+
+               /*
+                * FIXME: mono_method_get_last_managed() sometimes returns NULL, thus
+                *        causing ves_icall_System_Reflection_Assembly_GetCallingAssembly()
+                *        to crash.  This only seems to happen in some strange remoting
+                *        scenarios and I was unable to figure out what's happening there.
+                *        Dec 10, 2005 - Martin.
+                */
+
+               if (dest)
+                       assembly = dest->klass->image->assembly;
+               else {
+                       g_warning (G_STRLOC);
+               }
        }
 
        if (assembly)
@@ -1051,7 +1099,7 @@ ves_icall_type_Equals (MonoReflectionType *type, MonoReflectionType *c)
 {
        MONO_ARCH_SAVE_REGS;
 
-       if (type->type && c->type)
+       if (c && type->type && c->type)
                return mono_metadata_type_equal (type->type, c->type);
        else
                return FALSE;
@@ -1299,6 +1347,33 @@ ves_icall_get_parameter_info (MonoMethod *method)
        return mono_param_get_objects (domain, method);
 }
 
+static MonoReflectionMarshal*
+ves_icall_System_MonoMethodInfo_get_retval_marshal (MonoMethod *method)
+{
+       MonoDomain *domain = mono_domain_get (); 
+       MonoReflectionMarshal* res = NULL;
+       MonoMarshalSpec **mspecs;
+       int i;
+
+       MONO_ARCH_SAVE_REGS;
+
+       if (method->is_inflated)
+               method = mono_get_inflated_method (method);
+
+       mspecs = g_new (MonoMarshalSpec*, mono_method_signature (method)->param_count + 1);
+       mono_method_get_marshal_info (method, mspecs);
+
+       if (mspecs [0])
+               res = mono_reflection_marshal_from_marshal_spec (domain, method->klass, mspecs [0]);
+               
+       for (i = mono_method_signature (method)->param_count; i >= 0; i--)
+               if (mspecs [i])
+                       mono_metadata_free_marshal_spec (mspecs [i]);
+       g_free (mspecs);
+
+       return res;
+}
+
 static gint32
 ves_icall_MonoField_GetFieldOffset (MonoReflectionField *field)
 {
@@ -1363,6 +1438,13 @@ ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *ob
        case MONO_TYPE_VALUETYPE:
                is_ref = t->byref;
                break;
+       case MONO_TYPE_GENERICINST:
+               if (mono_type_generic_inst_is_valuetype (t)) {
+                       is_ref = t->byref;
+               } else {
+                       is_ref = TRUE;
+               }
+               break;
        default:
                g_error ("type 0x%x not handled in "
                         "ves_icall_Monofield_GetValue", t->type);
@@ -1386,6 +1468,19 @@ ves_icall_MonoField_GetValueInternal (MonoReflectionField *field, MonoObject *ob
                return o;
        }
 
+       if (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {
+               MonoClass *nklass = mono_class_from_mono_type (cf->type);
+               guint8 *buf;
+
+               /* Convert the Nullable structure into a boxed vtype */
+               if (is_static)
+                       buf = (guint8*)vtable->data + cf->offset;
+               else
+                       buf = (guint8*)obj + cf->offset;
+
+               return mono_nullable_box (buf, nklass);
+       }
+
        /* boxed value type */
        klass = mono_class_from_mono_type (cf->type);
        o = mono_object_new (domain, klass);
@@ -1442,8 +1537,26 @@ ves_icall_FieldInfo_SetValueInternal (MonoReflectionField *field, MonoObject *ob
                case MONO_TYPE_GENERICINST: {
                        MonoGenericClass *gclass = cf->type->data.generic_class;
                        g_assert (!gclass->inst->is_open);
-                       if (gclass->container_class->valuetype && (v != NULL))
-                               v += sizeof (MonoObject);
+
+                       if (mono_class_is_nullable (mono_class_from_mono_type (cf->type))) {
+                               MonoClass *nklass = mono_class_from_mono_type (cf->type);
+                               guint8 *buf;
+
+                               /* 
+                                * Convert the boxed vtype into a Nullable structure.
+                                * This is complicated by the fact that Nullables have
+                                * a variable structure.
+                                */
+                               /* Allocate using alloca so it gets GC tracking */
+                               buf = alloca (nklass->instance_size);
+
+                               mono_nullable_init (buf, value, nklass);
+
+                               v = (gchar*)buf;
+                       }
+                       else 
+                               if (gclass->container_class->valuetype && (v != NULL))
+                                       v += sizeof (MonoObject);
                        break;
                }
                default:
@@ -1463,17 +1576,6 @@ ves_icall_FieldInfo_SetValueInternal (MonoReflectionField *field, MonoObject *ob
        }
 }
 
-static MonoReflectionField*
-ves_icall_MonoField_Mono_GetGenericFieldDefinition (MonoReflectionField *field)
-{
-       MONO_ARCH_SAVE_REGS;
-
-       if (field->field->generic_info && field->field->generic_info->reflection_info)
-               return field->field->generic_info->reflection_info;
-
-       return field;
-}
-
 static MonoReflectionType*
 ves_icall_MonoGenericMethod_get_ReflectedType (MonoReflectionGenericMethod *rmethod)
 {
@@ -1530,8 +1632,8 @@ ves_icall_get_event_info (MonoReflectionEvent *event, MonoEventInfo *info)
 
        MONO_ARCH_SAVE_REGS;
 
-       info->declaring_type = mono_type_get_object (domain, &event->klass->byval_arg);
-       info->reflected_type = mono_type_get_object (domain, &event->event->parent->byval_arg);
+       info->reflected_type = mono_type_get_object (domain, &event->klass->byval_arg);
+       info->declaring_type = mono_type_get_object (domain, &event->event->parent->byval_arg);
 
        info->name = mono_string_new (domain, event->event->name);
        info->attrs = event->event->attrs;
@@ -1546,8 +1648,7 @@ ves_icall_get_event_info (MonoReflectionEvent *event, MonoEventInfo *info)
                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));
+                       mono_array_setref (info->other_methods, i, mono_method_get_object (domain, event->event->other [i], NULL));
        }               
 }
 
@@ -1560,10 +1661,21 @@ ves_icall_Type_GetInterfaces (MonoReflectionType* type)
        int i;
        MonoClass *class = mono_class_from_mono_type (type->type);
        MonoClass *parent;
-       MonoBitSet *slots = mono_bitset_new (class->max_interface_id + 1, 0);
+       MonoBitSet *slots;
+       MonoGenericContext *context = NULL;
 
        MONO_ARCH_SAVE_REGS;
 
+       /* open generic-instance classes can share their interface_id */
+       if (class->generic_class && class->generic_class->inst->is_open) {
+               context = class->generic_class->context;
+               class = class->generic_class->container_class;
+       }
+
+       mono_class_setup_vtable (class);
+
+       slots = mono_bitset_new (class->max_interface_id + 1, 0);
+
        if (class->rank) {
                /* GetInterfaces() returns an empty array in MS.NET (this may be a bug) */
                mono_bitset_free (slots);
@@ -1595,9 +1707,11 @@ ves_icall_Type_GetInterfaces (MonoReflectionType* type)
        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);
+               MonoType *ret = &ic->byval_arg;
+               if (context && ic->generic_class && ic->generic_class->inst->is_open)
+                       ret = mono_class_inflate_generic_type (ret, context);
                
-               mono_array_set (intf, gpointer, i,
-                                               mono_type_get_object (domain, &ic->byval_arg));
+               mono_array_setref (intf, i, mono_type_get_object (domain, ret));
        }
        g_ptr_array_free (ifaces, TRUE);
 
@@ -1617,6 +1731,8 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType
 
        MONO_ARCH_SAVE_REGS;
 
+       mono_class_setup_vtable (class);
+
        /* type doesn't implement iface: the exception is thrown in managed code */
        if ((iclass->interface_id > class->max_interface_id) || !class->interface_offsets [iclass->interface_id])
                        return;
@@ -1630,9 +1746,9 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType
        iter = NULL;
        while ((method = mono_class_get_methods (iclass, &iter))) {
                member = mono_method_get_object (domain, method, iclass);
-               mono_array_set (*methods, gpointer, i, member);
+               mono_array_setref (*methods, i, member);
                member = mono_method_get_object (domain, class->vtable [i + ioffset], class);
-               mono_array_set (*targets, gpointer, i, member);
+               mono_array_setref (*targets, i, member);
                
                i ++;
        }
@@ -1727,12 +1843,21 @@ ves_icall_MonoType_get_Assembly (MonoReflectionType *type)
 static MonoReflectionType*
 ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)
 {
-       MonoDomain *domain = mono_domain_get (); 
-       MonoClass *class = mono_class_from_mono_type (type->type);
+       MonoDomain *domain = mono_domain_get ();
+       MonoClass *class;
 
        MONO_ARCH_SAVE_REGS;
 
-       return class->nested_in ? mono_type_get_object (domain, &class->nested_in->byval_arg) : NULL;
+       if (type->type->byref)
+               return NULL;
+       if (type->type->type == MONO_TYPE_VAR)
+               class = type->type->data.generic_param->owner->klass;
+       else if (type->type->type == MONO_TYPE_MVAR)
+               class = type->type->data.generic_param->method->klass;
+       else
+               class = mono_class_from_mono_type (type->type)->nested_in;
+
+       return class ? mono_type_get_object (domain, &class->byval_arg) : NULL;
 }
 
 static MonoReflectionType*
@@ -1804,14 +1929,13 @@ ves_icall_MonoType_GetGenericArguments (MonoReflectionType *type)
                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));
+                       mono_array_setref (res, i, mono_type_get_object (mono_object_domain (type), &pklass->byval_arg));
                }
        } else if (klass->generic_class) {
                MonoGenericInst *inst = klass->generic_class->inst;
                res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, inst->type_argc);
-               for (i = 0; i < inst->type_argc; ++i) {
-                       mono_array_set (res, gpointer, i, mono_type_get_object (mono_object_domain (type), inst->type_argv [i]));
-               }
+               for (i = 0; i < inst->type_argc; ++i)
+                       mono_array_setref (res, i, mono_type_get_object (mono_object_domain (type), inst->type_argv [i]));
        } else {
                res = mono_array_new (mono_object_domain (type), mono_defaults.monotype_class, 0);
        }
@@ -1928,8 +2052,7 @@ ves_icall_Type_GetGenericParameterConstraints (MonoReflectionType *type)
 
        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));
+               mono_array_setref (res, i, mono_type_get_object (domain, &param->constraints [i]->byval_arg));
 
 
        return res;
@@ -1941,7 +2064,7 @@ ves_icall_MonoType_get_IsGenericParameter (MonoReflectionType *type)
        MONO_ARCH_SAVE_REGS;
 
        if (type->type->type == MONO_TYPE_VAR || type->type->type == MONO_TYPE_MVAR)
-               return TRUE;
+               return !type->type->byref;
        return FALSE;
 }
 
@@ -1951,7 +2074,7 @@ ves_icall_TypeBuilder_get_IsGenericParameter (MonoReflectionTypeBuilder *tb)
        MONO_ARCH_SAVE_REGS;
 
        if (tb->type.type->type == MONO_TYPE_VAR || tb->type.type->type == MONO_TYPE_MVAR)
-               return TRUE;
+               return !tb->type.type->byref;
        return FALSE;
 }
 
@@ -1966,6 +2089,9 @@ static MonoReflectionType*
 ves_icall_MonoGenericClass_GetParentType (MonoReflectionGenericClass *type)
 {
        MonoDynamicGenericClass *gclass;
+       MonoReflectionType *parent = NULL;
+       MonoDomain *domain;
+       MonoType *inflated;
        MonoClass *klass;
 
        MONO_ARCH_SAVE_REGS;
@@ -1973,14 +2099,31 @@ ves_icall_MonoGenericClass_GetParentType (MonoReflectionGenericClass *type)
        g_assert (type->type.type->data.generic_class->is_dynamic);
        gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class;
 
-       if (!gclass->parent || (gclass->parent->type != MONO_TYPE_GENERICINST))
-               return NULL;
+       domain = mono_object_domain (type);
+       klass = mono_class_from_mono_type (type->generic_type->type);
 
-       klass = mono_class_from_mono_type (gclass->parent);
        if (!klass->generic_class && !klass->generic_container)
                return NULL;
 
-       return mono_type_get_object (mono_object_domain (type), gclass->parent);
+       if (!strcmp (type->generic_type->object.vtable->klass->name, "TypeBuilder")) {
+               MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *) type->generic_type;
+               parent = tb->parent;
+       } else if (klass->wastypebuilder) {
+               MonoReflectionTypeBuilder *tb = (MonoReflectionTypeBuilder *) type->generic_type;
+               parent = tb->parent;
+       } else {
+               MonoClass *pklass = klass->parent;
+               if (pklass)
+                       parent = mono_type_get_object (domain, &pklass->byval_arg);
+       }
+
+       if (!parent || (parent->type->type != MONO_TYPE_GENERICINST))
+               return NULL;
+
+       inflated = mono_class_inflate_generic_type (
+               parent->type, gclass->generic_class.generic_class.context);
+
+       return mono_type_get_object (domain, inflated);
 }
 
 static MonoArray*
@@ -1988,10 +2131,11 @@ ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type)
 {
        static MonoClass *System_Reflection_MonoGenericClass;
        MonoDynamicGenericClass *gclass;
+       MonoReflectionTypeBuilder *tb = NULL;
+       MonoClass *klass = NULL;
        MonoDomain *domain;
-       MonoClass *klass;
        MonoArray *res;
-       int i;
+       int icount, i;
 
        MONO_ARCH_SAVE_REGS;
 
@@ -2005,23 +2149,38 @@ ves_icall_MonoGenericClass_GetInterfaces (MonoReflectionGenericClass *type)
 
        g_assert (type->type.type->data.generic_class->is_dynamic);
        gclass = (MonoDynamicGenericClass *) type->type.type->data.generic_class;
-       if (!gclass->ifaces)
-               return mono_array_new (domain, System_Reflection_MonoGenericClass, 0);
 
-       klass = gclass->generic_class.generic_class.container_class;
+       if (!strcmp (type->generic_type->object.vtable->klass->name, "TypeBuilder")) {
+               tb = (MonoReflectionTypeBuilder *) type->generic_type;
+               icount = tb->interfaces ? mono_array_length (tb->interfaces) : 0;
+       } else {
+               klass = gclass->generic_class.generic_class.container_class;
+               mono_class_init (klass);
+               icount = klass->interface_count;
+       }
+
+       res = mono_array_new (domain, System_Reflection_MonoGenericClass, icount);
 
-       res = mono_array_new (domain, System_Reflection_MonoGenericClass, gclass->count_ifaces);
+       for (i = 0; i < icount; i++) {
+               MonoReflectionType *iface;
+               MonoType *it;
 
-       for (i = 0; i < gclass->count_ifaces; i++) {
-               MonoReflectionType *iface = mono_type_get_object (domain, gclass->ifaces [i]);
+               if (tb) {
+                       iface = mono_array_get (tb->interfaces, MonoReflectionType *, i);
+                       it = iface->type;
+               } else
+                       it = &klass->interfaces [i]->byval_arg;
 
-               mono_array_set (res, gpointer, i, iface);
+               it = mono_class_inflate_generic_type (
+                       it, gclass->generic_class.generic_class.context);
+
+               iface = mono_type_get_object (domain, it);
+               mono_array_setref (res, i, iface);
        }
 
        return res;
 }
 
-
 static MonoReflectionMethod*
 ves_icall_MonoGenericClass_GetCorrespondingInflatedMethod (MonoReflectionGenericClass *type, 
                                                            MonoReflectionMethod* generic)
@@ -2154,8 +2313,7 @@ ves_icall_MonoGenericClass_GetMethods (MonoReflectionGenericClass *type,
        res = mono_array_new (domain, mono_defaults.method_info_class, dgclass->count_methods);
 
        for (i = 0; i < dgclass->count_methods; i++)
-               mono_array_set (res, gpointer, i,
-                               mono_method_get_object (domain, dgclass->methods [i], refclass));
+               mono_array_setref (res, i, mono_method_get_object (domain, dgclass->methods [i], refclass));
 
        return res;
 }
@@ -2188,8 +2346,7 @@ ves_icall_MonoGenericClass_GetConstructors (MonoReflectionGenericClass *type,
        res = mono_array_new (domain, System_Reflection_ConstructorInfo, dgclass->count_ctors);
 
        for (i = 0; i < dgclass->count_ctors; i++)
-               mono_array_set (res, gpointer, i,
-                               mono_method_get_object (domain, dgclass->ctors [i], refclass));
+               mono_array_setref (res, i, mono_method_get_object (domain, dgclass->ctors [i], refclass));
 
        return res;
 }
@@ -2217,8 +2374,7 @@ ves_icall_MonoGenericClass_GetFields (MonoReflectionGenericClass *type,
        res = mono_array_new (domain, mono_defaults.field_info_class, dgclass->count_fields);
 
        for (i = 0; i < dgclass->count_fields; i++)
-               mono_array_set (res, gpointer, i,
-                               mono_field_get_object (domain, refclass, &dgclass->fields [i]));
+               mono_array_setref (res, i, mono_field_get_object (domain, refclass, &dgclass->fields [i]));
 
        return res;
 }
@@ -2251,8 +2407,7 @@ ves_icall_MonoGenericClass_GetProperties (MonoReflectionGenericClass *type,
        res = mono_array_new (domain, System_Reflection_PropertyInfo, dgclass->count_properties);
 
        for (i = 0; i < dgclass->count_properties; i++)
-               mono_array_set (res, gpointer, i,
-                               mono_property_get_object (domain, refclass, &dgclass->properties [i]));
+               mono_array_setref (res, i, mono_property_get_object (domain, refclass, &dgclass->properties [i]));
 
        return res;
 }
@@ -2285,8 +2440,7 @@ ves_icall_MonoGenericClass_GetEvents (MonoReflectionGenericClass *type,
        res = mono_array_new (domain, System_Reflection_EventInfo, dgclass->count_events);
 
        for (i = 0; i < dgclass->count_events; i++)
-               mono_array_set (res, gpointer, i,
-                               mono_event_get_object (domain, refclass, &dgclass->events [i]));
+               mono_array_setref (res, i, mono_event_get_object (domain, refclass, &dgclass->events [i]));
 
        return res;
 }
@@ -2299,10 +2453,11 @@ ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *type)
 
        MONO_ARCH_SAVE_REGS;
 
-       method = type->type->data.generic_param->method;
-       if (!method)
+       if (type->type->byref || type->type->type != MONO_TYPE_MVAR)
                return NULL;
 
+       method = type->type->data.generic_param->method;
+       g_assert (method);
        klass = mono_class_from_mono_type (type->type);
        return mono_method_get_object (mono_object_domain (type), method, klass);
 }
@@ -2357,8 +2512,8 @@ ves_icall_MonoMethod_GetDllImportAttribute (MonoMethod *method)
        
        attr = (MonoReflectionDllImportAttribute*)mono_object_new (domain, DllImportAttributeClass);
 
-       attr->dll = mono_string_new (domain, scope);
-       attr->entry_point = mono_string_new (domain, import);
+       MONO_OBJECT_SETREF (attr, dll, mono_string_new (domain, scope));
+       MONO_OBJECT_SETREF (attr, entry_point, mono_string_new (domain, import));
        attr->call_conv = (flags & 0x700) >> 8;
        attr->charset = ((flags & 0x6) >> 1) + 1;
        if (attr->charset == 1)
@@ -2395,39 +2550,20 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
 }
 
 static gboolean
-ves_icall_MonoMethod_get_HasGenericParameters (MonoReflectionMethod *method)
+ves_icall_MonoMethod_get_IsGenericMethod (MonoReflectionMethod *method)
 {
        MONO_ARCH_SAVE_REGS;
 
-       if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
-           (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
-               return FALSE;
-
        return mono_method_signature (method->method)->generic_param_count != 0;
 }
 
-static gboolean
-ves_icall_MonoMethod_get_Mono_IsInflatedMethod (MonoReflectionMethod *method)
-{
-       MONO_ARCH_SAVE_REGS;
-
-       if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
-           (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
-               return FALSE;
-
-       return method->method->is_inflated;
-}
-
 static gboolean
 ves_icall_MonoMethod_get_IsGenericMethodDefinition (MonoReflectionMethod *method)
 {
        MONO_ARCH_SAVE_REGS;
 
-       if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
-           (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
-               return FALSE;
-
-       return mono_method_signature (method->method)->generic_param_count != 0;
+       return !method->method->is_inflated &&
+               (mono_method_signature (method->method)->generic_param_count != 0);
 }
 
 static MonoArray*
@@ -2435,16 +2571,11 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
 {
        MonoArray *res;
        MonoDomain *domain;
-       MonoMethodNormal *mn;
        int count, i;
        MONO_ARCH_SAVE_REGS;
 
        domain = mono_object_domain (method);
 
-       if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
-           (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
-               return mono_array_new (domain, mono_defaults.monotype_class, 0);
-
        if (method->method->is_inflated) {
                MonoMethodInflated *imethod = (MonoMethodInflated *) method->method;
                MonoGenericMethod *gmethod = imethod->context->gmethod;
@@ -2453,25 +2584,21 @@ ves_icall_MonoMethod_GetGenericArguments (MonoReflectionMethod *method)
                        count = gmethod->inst->type_argc;
                        res = mono_array_new (domain, mono_defaults.monotype_class, count);
 
-                       for (i = 0; i < count; i++) {
-                               MonoType *t = gmethod->inst->type_argv [i];
-                               mono_array_set (
-                                       res, gpointer, i, mono_type_get_object (domain, t));
-                       }
+                       for (i = 0; i < count; i++)
+                               mono_array_setref (res, i, mono_type_get_object (domain, gmethod->inst->type_argv [i]));
 
                        return res;
                }
        }
 
-       mn = (MonoMethodNormal *) method->method;
        count = mono_method_signature (method->method)->generic_param_count;
        res = mono_array_new (domain, mono_defaults.monotype_class, count);
 
        for (i = 0; i < count; i++) {
-               MonoGenericParam *param = &mn->generic_container->type_params [i];
+               MonoGenericParam *param = &method->method->generic_container->type_params [i];
                MonoClass *pklass = mono_class_from_generic_parameter (
                        param, method->method->klass->image, TRUE);
-               mono_array_set (res, gpointer, i,
+               mono_array_setref (res, i,
                                mono_type_get_object (domain, &pklass->byval_arg));
        }
 
@@ -2486,7 +2613,7 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoAr
         * is stupid), mono_runtime_invoke_*() calls the provided method, allowing
         * greater flexibility.
         */
-       MonoMethod *m = method->method;
+       MonoMethod *m = mono_get_inflated_method (method->method);
        int pcount;
        void *obj = this;
 
@@ -2579,7 +2706,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA
                                
                                        out_args = mono_array_new (domain, mono_defaults.object_class, 1);
                                        *outArgs = out_args;
-                                       mono_array_set (out_args, gpointer, 0, result);
+                                       mono_array_setref (out_args, 0, result);
                                        g_free (str);
                                        return NULL;
                                }
@@ -2654,7 +2781,7 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA
                if (sig->params [i]->byref) {
                        gpointer arg;
                        arg = mono_array_get (params, gpointer, i);
-                       mono_array_set (out_args, gpointer, j, arg);
+                       mono_array_setref (out_args, j, arg);
                        j++;
                }
        }
@@ -2664,13 +2791,73 @@ ves_icall_InternalExecute (MonoReflectionMethod *method, MonoObject *this, MonoA
        return result;
 }
 
+static guint64
+read_enum_value (char *mem, int type)
+{
+       switch (type) {
+       case MONO_TYPE_U1:
+               return *(guint8*)mem;
+       case MONO_TYPE_I1:
+               return *(gint8*)mem;
+       case MONO_TYPE_U2:
+               return *(guint16*)mem;
+       case MONO_TYPE_I2:
+               return *(gint16*)mem;
+       case MONO_TYPE_U4:
+               return *(guint32*)mem;
+       case MONO_TYPE_I4:
+               return *(gint32*)mem;
+       case MONO_TYPE_U8:
+               return *(guint64*)mem;
+       case MONO_TYPE_I8:
+               return *(gint64*)mem;
+       default:
+               g_assert_not_reached ();
+       }
+       return 0;
+}
+
+static void
+write_enum_value (char *mem, int type, guint64 value)
+{
+       switch (type) {
+       case MONO_TYPE_U1:
+       case MONO_TYPE_I1: {
+               guint8 *p = (guint8*)mem;
+               *p = value;
+               break;
+       }
+       case MONO_TYPE_U2:
+       case MONO_TYPE_I2: {
+               guint16 *p = (void*)mem;
+               *p = value;
+               break;
+       }
+       case MONO_TYPE_U4:
+       case MONO_TYPE_I4: {
+               guint32 *p = (void*)mem;
+               *p = value;
+               break;
+       }
+       case MONO_TYPE_U8:
+       case MONO_TYPE_I8: {
+               guint64 *p = (void*)mem;
+               *p = value;
+               break;
+       }
+       default:
+               g_assert_not_reached ();
+       }
+       return;
+}
+
 static MonoObject *
 ves_icall_System_Enum_ToObject (MonoReflectionType *type, MonoObject *obj)
 {
        MonoDomain *domain; 
        MonoClass *enumc, *objc;
-       gint32 s1, s2;
        MonoObject *res;
+       guint64 val;
        
        MONO_ARCH_SAVE_REGS;
 
@@ -2681,22 +2868,15 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *type, MonoObject *obj)
        enumc = mono_class_from_mono_type (type->type);
        objc = obj->vtable->klass;
 
-       MONO_CHECK_ARG (obj, enumc->enumtype == TRUE);
-       MONO_CHECK_ARG (obj, (objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 &&
-                                                 objc->byval_arg.type <= MONO_TYPE_U8));
-       
-       s1 = mono_class_value_size (enumc, NULL);
-       s2 = mono_class_value_size (objc, NULL);
+       if (!enumc->enumtype)
+               mono_raise_exception (mono_get_exception_argument ("enumType", "Type provided must be an Enum."));
+       if (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8)))
+               mono_raise_exception (mono_get_exception_argument ("value", "The value passed in must be an enum base or an underlying type for an enum, such as an Int32."));
 
        res = mono_object_new (domain, enumc);
+       val = read_enum_value ((char *)obj + sizeof (MonoObject), objc->enumtype? objc->enum_basetype->type: objc->byval_arg.type);
+       write_enum_value ((char *)res + sizeof (MonoObject), enumc->enum_basetype->type, val);
 
-#if G_BYTE_ORDER == G_LITTLE_ENDIAN
-       memcpy ((char *)res + sizeof (MonoObject), (char *)obj + sizeof (MonoObject), MIN (s1, s2));
-#else
-       memcpy ((char *)res + sizeof (MonoObject) + (s1 > s2 ? s1 - s2 : 0),
-               (char *)obj + sizeof (MonoObject) + (s2 > s1 ? s2 - s1 : 0),
-               MIN (s1, s2));
-#endif
        return res;
 }
 
@@ -2753,7 +2933,7 @@ ves_icall_get_enum_info (MonoReflectionType *type, MonoEnumInfo *info)
                        continue;
                if (mono_field_is_deleted (field))
                        continue;
-               mono_array_set (info->names, gpointer, j, mono_string_new (domain, field->name));
+               mono_array_setref (info->names, j, mono_string_new (domain, field->name));
 
                if (!field->data) {
                        crow = mono_metadata_get_constant_index (enumc->image, mono_class_get_field_token (field), crow + 1);
@@ -2931,7 +3111,7 @@ handle_parent:
        i = 0;
        tmp = l = g_slist_reverse (l);
        for (; tmp; tmp = tmp->next, ++i)
-               mono_array_set (res, gpointer, i, tmp->data);
+               mono_array_setref (res, i, tmp->data);
        g_slist_free (l);
        return res;
 }
@@ -2946,7 +3126,7 @@ ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, gui
        MonoMethod *method;
        gpointer iter;
        MonoObject *member;
-       int i, len, match;
+       int i, len, match, nslots;
        guint32 method_slots_default [8];
        guint32 *method_slots;
        gchar *mname = NULL;
@@ -2965,8 +3145,11 @@ ves_icall_Type_GetMethodsByName (MonoReflectionType *type, MonoString *name, gui
                compare_func = (ignore_case) ? g_strcasecmp : strcmp;
        }
 
-       if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
-               method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
+       mono_class_setup_vtable (klass);
+
+       nslots = MONO_CLASS_IS_INTERFACE (klass) ? mono_class_num_methods (klass) : klass->vtable_size;
+       if (nslots >= sizeof (method_slots_default) * 8) {
+               method_slots = g_new0 (guint32, nslots / 32 + 1);
        } else {
                method_slots = method_slots_default;
                memset (method_slots, 0, sizeof (method_slots_default));
@@ -3007,6 +3190,7 @@ handle_parent:
                
                match = 0;
                if (method->slot != -1) {
+                       g_assert (method->slot < nslots);
                        if (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))
                                continue;
                        method_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);
@@ -3027,7 +3211,7 @@ handle_parent:
        tmp = l = g_slist_reverse (l);
 
        for (; tmp; tmp = tmp->next, ++i)
-               mono_array_set (res, gpointer, i, tmp->data);
+               mono_array_setref (res, i, tmp->data);
        g_slist_free (l);
        if (method_slots != method_slots_default)
                g_free (method_slots);
@@ -3093,7 +3277,7 @@ ves_icall_Type_GetConstructors_internal (MonoReflectionType *type, guint32 bflag
        i = 0;
        tmp = l = g_slist_reverse (l);
        for (; tmp; tmp = tmp->next, ++i)
-               mono_array_set (res, gpointer, i, tmp->data);
+               mono_array_setref (res, i, tmp->data);
        g_slist_free (l);
        return res;
 }
@@ -3108,7 +3292,7 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name,
        MonoArray *res;
        MonoMethod *method;
        MonoProperty *prop;
-       int i, match;
+       int i, match, nslots;
        int len = 0;
        guint32 flags;
        guint32 method_slots_default [8];
@@ -3132,8 +3316,11 @@ ves_icall_Type_GetPropertiesByName (MonoReflectionType *type, MonoString *name,
                compare_func = (ignore_case) ? g_strcasecmp : strcmp;
        }
 
-       if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
-               method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
+       mono_class_setup_vtable (klass);
+
+       nslots = MONO_CLASS_IS_INTERFACE (klass) ? mono_class_num_methods (klass) : klass->vtable_size;
+       if (nslots >= sizeof (method_slots_default) * 8) {
+               method_slots = g_new0 (guint32, nslots / 32 + 1);
        } else {
                method_slots = method_slots_default;
                memset (method_slots, 0, sizeof (method_slots_default));
@@ -3203,7 +3390,7 @@ handle_parent:
        tmp = l = g_slist_reverse (l);
 
        for (; tmp; tmp = tmp->next, ++i)
-               mono_array_set (res, gpointer, i, tmp->data);
+               mono_array_setref (res, i, tmp->data);
        g_slist_free (l);
        if (method_slots != method_slots_default)
                g_free (method_slots);
@@ -3327,7 +3514,7 @@ handle_parent:
                if (!match)
                        continue;
                match = 0;
-               l = g_slist_prepend (l, mono_event_get_object (domain, klass, event));
+               l = g_slist_prepend (l, mono_event_get_object (domain, startklass, event));
        }
        if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
                goto handle_parent;
@@ -3338,7 +3525,7 @@ handle_parent:
        tmp = l = g_slist_reverse (l);
 
        for (; tmp; tmp = tmp->next, ++i)
-               mono_array_set (res, gpointer, i, tmp->data);
+               mono_array_setref (res, i, tmp->data);
        g_slist_free (l);
        return res;
 }
@@ -3423,7 +3610,7 @@ ves_icall_Type_GetNestedTypes (MonoReflectionType *type, guint32 bflags)
        i = 0;
        tmp = l = g_slist_reverse (l);
        for (; tmp; tmp = tmp->next, ++i)
-               mono_array_set (res, gpointer, i, tmp->data);
+               mono_array_setref (res, i, tmp->data);
        g_slist_free (l);
        return res;
 }
@@ -3434,10 +3621,12 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
        gchar *str;
        MonoType *type = NULL;
        MonoTypeNameParse info;
-       gboolean type_resolve = FALSE;
+       gboolean type_resolve;
 
        MONO_ARCH_SAVE_REGS;
 
+       /* On MS.NET, this does not fire a TypeResolve event */
+       type_resolve = TRUE;
        str = mono_string_to_utf8 (name);
        /*g_print ("requested type %s in %s\n", str, assembly->assembly->aname.name);*/
        if (!mono_reflection_parse_type (str, &info)) {
@@ -3510,20 +3699,35 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as
 }
 
 static MonoString *
-ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly)
+ves_icall_System_Reflection_Assembly_get_code_base (MonoReflectionAssembly *assembly, MonoBoolean escaped)
 {
        MonoDomain *domain = mono_object_domain (assembly); 
        MonoAssembly *mass = assembly->assembly;
-       MonoString *res;
+       MonoString *res = NULL;
        gchar *uri;
        gchar *absolute;
        
        MONO_ARCH_SAVE_REGS;
 
        absolute = g_build_filename (mass->basedir, mass->image->module_name, NULL);
-       uri = g_filename_to_uri (absolute, NULL, NULL);
-       res = mono_string_new (domain, uri);
-       g_free (uri);
+#if PLATFORM_WIN32
+       {
+               gint i;
+               for (i = strlen (absolute) - 1; i >= 0; i--)
+                       if (absolute [i] == '\\')
+                               absolute [i] = '/';
+       }
+#endif
+       if (escaped) {
+               uri = g_filename_to_uri (absolute, NULL, NULL);
+       } else {
+               uri = g_strconcat ("file://", absolute, NULL);
+       }
+
+       if (uri) {
+               res = mono_string_new (domain, uri);
+               g_free (uri);
+       }
        g_free (absolute);
        return res;
 }
@@ -3618,7 +3822,7 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceNames (MonoReflectionAss
 
        for (i = 0; i < table->rows; ++i) {
                val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_MANIFEST_NAME));
-               mono_array_set (result, gpointer, i, mono_string_new (mono_object_domain (assembly), val));
+               mono_array_setref (result, i, mono_string_new (mono_object_domain (assembly), val));
        }
        return result;
 }
@@ -3692,7 +3896,7 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
                aname = (MonoReflectionAssemblyName *) mono_object_new (
                        domain, System_Reflection_AssemblyName);
 
-               aname->name = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME]));
+               MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME])));
 
                aname->major = cols [MONO_ASSEMBLYREF_MAJOR_VERSION];
                aname->minor = cols [MONO_ASSEMBLYREF_MINOR_VERSION];
@@ -3701,12 +3905,12 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
                aname->flags = cols [MONO_ASSEMBLYREF_FLAGS];
                aname->versioncompat = 1; /* SameMachine (default) */
                aname->hashalg = ASSEMBLY_HASH_SHA1; /* SHA1 (default) */
-               aname->version = create_version (domain, aname->major, aname->minor, aname->build, aname->revision);
+               MONO_OBJECT_SETREF (aname, version, create_version (domain, aname->major, aname->minor, aname->build, aname->revision));
 
                if (create_culture) {
                        gpointer args [1];
                        args [0] = mono_string_new (domain, mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_CULTURE]));
-                       aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL);
+                       MONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));
                }
                
                if (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {
@@ -3716,10 +3920,10 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
                        if ((cols [MONO_ASSEMBLYREF_FLAGS] & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG)) {
                                /* public key token isn't copied - the class library will 
                                automatically generate it from the public key if required */
-                               aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
+                               MONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));
                                memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
                        } else {
-                               aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
+                               MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, pkey_len));
                                memcpy (mono_array_addr (aname->keyToken, guint8, 0), pkey_ptr, pkey_len);
                        }
                }
@@ -3727,7 +3931,7 @@ ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAsse
                /* note: this function doesn't return the codebase on purpose (i.e. it can
                         be used under partial trust as path information isn't present). */
 
-               mono_array_set (result, gpointer, i, aname);
+               mono_array_setref (result, i, aname);
        }
        return result;
 }
@@ -3742,7 +3946,7 @@ foreach_namespace (const char* key, gconstpointer val, NameSpaceInfo *info)
 {
        MonoString *name = mono_string_new (mono_object_domain (info->res), key);
 
-       mono_array_set (info->res, gpointer, info->idx, name);
+       mono_array_setref (info->res, info->idx, name);
        info->idx++;
 }
 
@@ -3857,7 +4061,7 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec
                        table = &assembly->assembly->image->tables [MONO_TABLE_FILE];
                        mono_metadata_decode_row (table, i - 1, file_cols, MONO_FILE_SIZE);
                        val = mono_metadata_string_heap (assembly->assembly->image, file_cols [MONO_FILE_NAME]);
-                       info->filename = mono_string_new (mono_object_domain (assembly), val);
+                       MONO_OBJECT_SETREF (info, filename, mono_string_new (mono_object_domain (assembly), val));
                        if (file_cols [MONO_FILE_FLAGS] && FILE_CONTAINS_NO_METADATA)
                                info->location = 0;
                        else
@@ -3873,7 +4077,7 @@ ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (MonoReflec
                                g_free (msg);
                                mono_raise_exception (ex);
                        }
-                       info->assembly = mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]);
+                       MONO_OBJECT_SETREF (info, assembly, mono_assembly_get_object (mono_domain_get (), assembly->assembly->image->references [i - 1]));
 
                        /* Obtain info recursively */
                        ves_icall_System_Reflection_Assembly_GetManifestResourceInfoInternal (info->assembly, name, info);
@@ -3931,7 +4135,7 @@ ves_icall_System_Reflection_Assembly_GetFilesInternal (MonoReflectionAssembly *a
                if (resource_modules || !(mono_metadata_decode_row_col (table, i, MONO_FILE_FLAGS) & FILE_CONTAINS_NO_METADATA)) {
                        val = mono_metadata_string_heap (assembly->assembly->image, mono_metadata_decode_row_col (table, i, MONO_FILE_NAME));
                        n = g_concat_dir_and_file (assembly->assembly->basedir, val);
-                       mono_array_set (result, gpointer, count, mono_string_new (mono_object_domain (assembly), n));
+                       mono_array_setref (result, count, mono_string_new (mono_object_domain (assembly), n));
                        g_free (n);
                        count ++;
                }
@@ -3985,16 +4189,16 @@ ves_icall_System_Reflection_Assembly_GetModulesInternal (MonoReflectionAssembly
        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));
+       mono_array_setref (res, 0, mono_module_get_object (domain, assembly->assembly->image));
        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]));
+                       mono_array_setref (res, j, mono_module_get_object (domain, modules[i]));
                        ++j;
                }
 
        for (i = 0; i < file_count; ++i, ++j)
-               mono_array_set (res, gpointer, j, mono_module_file_get_object (domain, assembly->assembly->image, i));
+               mono_array_setref (res, j, mono_module_file_get_object (domain, assembly->assembly->image, i));
 
        if (assembly->assembly->dynamic)
                g_free (modules);
@@ -4035,26 +4239,6 @@ ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
 }
 
 
-static gboolean
-get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
-{
-       MonoMethod **dest = data;
-
-       /* skip unmanaged frames */
-       if (!managed)
-               return FALSE;
-
-       if (m == *dest) {
-               *dest = NULL;
-               return FALSE;
-       }
-       if (!(*dest)) {
-               *dest = m;
-               return TRUE;
-       }
-       return FALSE;
-}
-
 static MonoReflectionAssembly*
 ves_icall_System_Reflection_Assembly_GetEntryAssembly (void)
 {
@@ -4068,7 +4252,6 @@ ves_icall_System_Reflection_Assembly_GetEntryAssembly (void)
        return mono_assembly_get_object (domain, domain->entry_assembly);
 }
 
-
 static MonoReflectionAssembly*
 ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
 {
@@ -4104,6 +4287,9 @@ ves_icall_System_MonoType_getFullName (MonoReflectionType *object, gboolean full
        if (!name)
                return NULL;
 
+       if (full_name && (object->type->type == MONO_TYPE_VAR || object->type->type == MONO_TYPE_MVAR))
+               return NULL;
+
        res = mono_string_new (domain, name);
        g_free (name);
 
@@ -4121,18 +4307,18 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a
 
        MONO_ARCH_SAVE_REGS;
 
-       aname->name = mono_string_new (domain, name->name);
+       MONO_OBJECT_SETREF (aname, name, mono_string_new (domain, name->name));
        aname->major = name->major;
        aname->minor = name->minor;
        aname->build = name->build;
        aname->revision = name->revision;
        aname->hashalg = name->hash_alg;
        if (by_default_version)
-               aname->version = create_version (domain, name->major, name->minor, name->build, name->revision);
+               MONO_OBJECT_SETREF (aname, version, create_version (domain, name->major, name->minor, name->build, name->revision));
        
        codebase = g_filename_to_uri (absolute, NULL, NULL);
        if (codebase) {
-               aname->codebase = mono_string_new (domain, codebase);
+               MONO_OBJECT_SETREF (aname, codebase, mono_string_new (domain, codebase));
                g_free (codebase);
        }
 
@@ -4145,14 +4331,14 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a
 
        if (name->culture) {
                args [0] = mono_string_new (domain, name->culture);
-               aname->cultureInfo = mono_runtime_invoke (create_culture, NULL, args, NULL);
+               MONO_OBJECT_SETREF (aname, cultureInfo, mono_runtime_invoke (create_culture, NULL, args, NULL));
        }
 
        if (name->public_key) {
                pkey_ptr = (char*)name->public_key;
                pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
 
-               aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
+               MONO_OBJECT_SETREF (aname, publicKey, mono_array_new (domain, mono_defaults.byte_class, pkey_len));
                memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
        }
 
@@ -4161,7 +4347,7 @@ fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *a
                int i, j;
                char *p;
 
-               aname->keyToken = mono_array_new (domain, mono_defaults.byte_class, 8);
+               MONO_OBJECT_SETREF (aname, keyToken, mono_array_new (domain, mono_defaults.byte_class, 8));
                p = mono_array_addr (aname->keyToken, char, 0);
 
                for (i = 0, j = 0; i < 8; i++) {
@@ -4201,7 +4387,7 @@ ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname,
        filename = mono_string_to_utf8 (fname);
 
        image = mono_image_open (filename, &status);
-       
+
        if (!image){
                MonoException *exc;
 
@@ -4210,6 +4396,8 @@ ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname,
                mono_raise_exception (exc);
        }
 
+       /* So we can call mono_image_close () later */
+       mono_image_addref (image);
        res = mono_assembly_fill_assembly_name (image, &name);
        if (!res) {
                mono_image_close (image);
@@ -4281,7 +4469,7 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image,
                visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK;
                if (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) {
                        klass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF);
-                       mono_array_set (res, gpointer, count, mono_type_get_object (domain, &klass->byval_arg));
+                       mono_array_setref (res, count, mono_type_get_object (domain, &klass->byval_arg));
                        count++;
                }
        }
@@ -4307,28 +4495,21 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *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;
-                                       }
+                               MonoArray *append = mb->types;
+                               if (append && mono_array_length (append) > 0) {
+                                       guint32 len1, len2;
+                                       MonoArray *new;
+                                       len1 = res ? mono_array_length (res) : 0;
+                                       len2 = mono_array_length (append);
+                                       new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
+                                       if (res)
+                                               mono_array_memcpy_refs (new, 0, res, 0, len1);
+                                       mono_array_memcpy_refs (new, len1, append, 0, len2);
+                                       res = new;
                                }
                        }
 
-                       /* 
+                       /*
                         * Replace TypeBuilders with the created types to be compatible
                         * with MS.NET.
                         */
@@ -4336,7 +4517,7 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                                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);
+                                               mono_array_setref (res, i, tb->created);
                                }
                        }
                }
@@ -4344,27 +4525,23 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                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;
-                                       }
+                               MonoArray *append = mono_module_get_types (domain, rm->image, exportedOnly);
+                               if (append && mono_array_length (append) > 0) {
+                                       guint32 len1, len2;
+                                       MonoArray *new;
+                                       len1 = res ? mono_array_length (res) : 0;
+                                       len2 = mono_array_length (append);
+                                       new = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
+                                       if (res)
+                                               mono_array_memcpy_refs (new, 0, res, 0, len1);
+                                       mono_array_memcpy_refs (new, len1, append, 0, len2);
+                                       res = new;
                                }
                        }
-               return res;
+               if (res)
+                       return res;
+               else
+                       return mono_array_new (domain, mono_defaults.monotype_class, 0);
        }
        image = assembly->assembly->image;
        table = &image->tables [MONO_TABLE_FILE];
@@ -4384,12 +4561,8 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                                        len1 = mono_array_length (res);
                                        len2 = mono_array_length (res2);
                                        res3 = mono_array_new (domain, mono_defaults.monotype_class, len1 + len2);
-                                       memcpy (mono_array_addr (res3, MonoReflectionType*, 0),
-                                                       mono_array_addr (res, MonoReflectionType*, 0),
-                                                       len1 * sizeof (MonoReflectionType*));
-                                       memcpy (mono_array_addr (res3, MonoReflectionType*, len1),
-                                                       mono_array_addr (res2, MonoReflectionType*, 0),
-                                                       len2 * sizeof (MonoReflectionType*));
+                                       mono_array_memcpy_refs (res3, 0, res, 0, len1);
+                                       mono_array_memcpy_refs (res3, len1, res2, 0, len2);
                                        res = res3;
                                }
                        }
@@ -4412,7 +4585,7 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                                /* keep the class in the list */
                                list = g_list_append (list, klass);
                                /* and replace Type with NULL */
-                               mono_array_set (res, gpointer, i, NULL);
+                               mono_array_setref (res, i, NULL);
                        }
                }
 
@@ -4424,7 +4597,7 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly,
                        MonoArray *exl = mono_array_new (domain, mono_defaults.exception_class, length);
                        for (i = 0, tmp = list; i < length; i++, tmp = tmp->next) {
                                MonoException *exc = mono_class_get_exception_for_failure (tmp->data);
-                               mono_array_set (exl, gpointer, i, exc);
+                               mono_array_setref (exl, i, exc);
                        }
                        g_list_free (list);
                        list = NULL;
@@ -4508,6 +4681,17 @@ ves_icall_System_Reflection_Module_GetPEKind (MonoImage *image, gint32 *pe_kind,
        }
 }
 
+static gint32
+ves_icall_System_Reflection_Module_get_MDStreamVersion (MonoReflectionModule *module)
+{
+       MonoImage *image = module->image;
+
+       if (!image)
+               mono_raise_exception (mono_get_exception_not_supported (""));
+       
+       return (image->md_version_major << 16) | (image->md_version_minor);
+}
+
 static MonoArray*
 ves_icall_System_Reflection_Module_InternalGetTypes (MonoReflectionModule *module)
 {
@@ -4954,7 +5138,7 @@ gmt_offset(struct tm *tm, time_t t)
  *  Returns true on success and zero on failure.
  */
 static guint32
-ves_icall_System_CurrentTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)
+ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData (guint32 year, MonoArray **data, MonoArray **names)
 {
 #ifndef PLATFORM_WIN32
        MonoDomain *domain = mono_domain_get ();
@@ -4992,8 +5176,8 @@ ves_icall_System_CurrentTimeZone_GetTimeZoneData (guint32 year, MonoArray **data
                t = time (NULL);
                tt = *localtime (&t);
                strftime (tzone, sizeof (tzone), "%Z", &tt);
-               mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
-               mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
+               mono_array_setref ((*names), 0, mono_string_new (domain, tzone));
+               mono_array_setref ((*names), 1, mono_string_new (domain, tzone));
                return 1;
        }
 
@@ -5027,11 +5211,11 @@ ves_icall_System_CurrentTimeZone_GetTimeZoneData (guint32 year, MonoArray **data
                        
                        /* Write data, if we're already in daylight saving, we're done. */
                        if (is_daylight) {
-                               mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
+                               mono_array_setref ((*names), 0, mono_string_new (domain, tzone));
                                mono_array_set ((*data), gint64, 1, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
                                return 1;
                        } else {
-                               mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
+                               mono_array_setref ((*names), 1, mono_string_new (domain, tzone));
                                mono_array_set ((*data), gint64, 0, ((gint64)t1 + EPOCH_ADJUST) * 10000000L);
                                is_daylight = 1;
                        }
@@ -5046,8 +5230,8 @@ ves_icall_System_CurrentTimeZone_GetTimeZoneData (guint32 year, MonoArray **data
 
        if (!is_daylight) {
                strftime (tzone, sizeof (tzone), "%Z", &tt);
-               mono_array_set ((*names), gpointer, 0, mono_string_new (domain, tzone));
-               mono_array_set ((*names), gpointer, 1, mono_string_new (domain, tzone));
+               mono_array_setref ((*names), 0, mono_string_new (domain, tzone));
+               mono_array_setref ((*names), 1, mono_string_new (domain, tzone));
                mono_array_set ((*data), gint64, 0, 0);
                mono_array_set ((*data), gint64, 1, 0);
                mono_array_set ((*data), gint64, 2, (gint64) gmtoff * 10000000L);
@@ -5075,11 +5259,11 @@ ves_icall_System_CurrentTimeZone_GetTimeZoneData (guint32 year, MonoArray **data
        for (i = 0; i < 32; ++i)
                if (!tz_info.DaylightName [i])
                        break;
-       mono_array_set ((*names), gpointer, 1, mono_string_new_utf16 (domain, tz_info.DaylightName, i));
+       mono_array_setref ((*names), 1, mono_string_new_utf16 (domain, tz_info.DaylightName, i));
        for (i = 0; i < 32; ++i)
                if (!tz_info.StandardName [i])
                        break;
-       mono_array_set ((*names), gpointer, 0, mono_string_new_utf16 (domain, tz_info.StandardName, i));
+       mono_array_setref ((*names), 0, mono_string_new_utf16 (domain, tz_info.StandardName, i));
 
        if ((year <= 1601) || (year > 30827)) {
                /*
@@ -5222,7 +5406,7 @@ ves_icall_Remoting_RealProxy_GetTransparentProxy (MonoObject *this, MonoString *
        res = mono_object_new (domain, mono_defaults.transparent_proxy_class);
        tp = (MonoTransparentProxy*) res;
        
-       tp->rp = rp;
+       MONO_OBJECT_SETREF (tp, rp, rp);
        type = ((MonoReflectionType *)rp->class_to_proxy)->type;
        klass = mono_class_from_mono_type (type);
 
@@ -5259,20 +5443,14 @@ ves_icall_System_Environment_get_MachineName (void)
        g_free (buf);
        return result;
 #else
-       gchar *buf;
-       int len;
+       gchar buf [256];
        MonoString *result;
 
-       MONO_ARCH_SAVE_REGS;
-
-       len = 256;
-       buf = g_new (gchar, len);
-
-       result = NULL;
-       if (gethostname (buf, len) == 0)
+       if (gethostname (buf, sizeof (buf)) == 0)
                result = mono_string_new (mono_domain_get (), buf);
+       else
+               result = NULL;
        
-       g_free (buf);
        return result;
 #endif
 }
@@ -5316,6 +5494,7 @@ ves_icall_System_Environment_GetEnvironmentVariable (MonoString *name)
 
        utf8_name = mono_string_to_utf8 (name); /* FIXME: this should be ascii */
        value = g_getenv (utf8_name);
+
        g_free (utf8_name);
 
        if (value == 0)
@@ -5355,7 +5534,7 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void)
                parts = g_strsplit (*e, "=", 2);
                if (*parts != 0) {
                        str = mono_string_new (domain, *parts);
-                       mono_array_set (names, MonoString *, n, str);
+                       mono_array_setref (names, n, str);
                }
 
                g_strfreev (parts);
@@ -5366,6 +5545,36 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void)
        return names;
 }
 
+/*
+ * If your platform lacks setenv/unsetenv, you must upgrade your glib.
+ */
+#if !GLIB_CHECK_VERSION(2,4,0)
+#define g_setenv(a,b,c)   setenv(a,b,c)
+#define g_unsetenv(a) unsetenv(a)
+#endif
+
+static void
+ves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, MonoString *value)
+{
+       gchar *utf8_name, *utf8_value;
+
+       MONO_ARCH_SAVE_REGS;
+
+       utf8_name = mono_string_to_utf8 (name); /* FIXME: this should be ascii */
+
+       if ((value == NULL) || (mono_string_length (value) == 0) || (mono_string_chars (value)[0] == 0)) {
+               g_unsetenv (utf8_name);
+               return;
+       }
+
+       utf8_value = mono_string_to_utf8 (value);
+
+       g_setenv (utf8_name, utf8_value, TRUE);
+
+       g_free (utf8_name);
+       g_free (utf8_value);
+}
+
 /*
  * Returns: the number of milliseconds elapsed since the system started.
  */
@@ -5464,7 +5673,7 @@ ves_icall_System_Environment_GetLogicalDrives (void)
                u16 = dname;
                while (*u16) { u16++; len ++; }
                drivestr = mono_string_new_utf16 (domain, dname, len);
-               mono_array_set (result, gpointer, ndrives++, drivestr);
+               mono_array_setref (result, ndrives++, drivestr);
                while (*dname++);
        } while (*dname);
 
@@ -5747,6 +5956,10 @@ ves_icall_System_Activator_CreateInstanceInternal (MonoReflectionType *type)
        domain = mono_object_domain (type);
        klass = mono_class_from_mono_type (type->type);
 
+       if (mono_class_is_nullable (klass))
+               /* No arguments -> null */
+               return NULL;
+
        return mono_object_new (domain, klass);
 }
 
@@ -6009,13 +6222,13 @@ GCHandle_CheckCurrentDomain (guint32 gchandle)
 static MonoString*
 ves_icall_Mono_Runtime_GetDisplayName (void)
 {
-       char *display_name_str = g_strdup_printf ("Mono %s", VERSION);
+       static const char display_name_str [] = "Mono " VERSION;
        MonoString *display_name = mono_string_new (mono_domain_get (), display_name_str);
-       g_free (display_name_str);
        return display_name;
 }
 
-static guchar dbase64 [] = {
+const static guchar
+dbase64 [] = {
        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
        128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63,
@@ -6024,7 +6237,7 @@ static guchar dbase64 [] = {
        15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128,
        128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
        41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
-       };
+};
 
 static MonoArray *
 base64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespaceOnly)
@@ -6043,13 +6256,13 @@ base64_to_byte_array (gunichar2 *start, gint ilength, MonoBoolean allowWhitespac
        last = prev_last = 0;
        for (i = 0; i < ilength; i++) {
                c = start [i];
-               if (isspace (c)) {
-                       ignored++;
-               } else if (c >= sizeof (dbase64)) {
+               if (c >= sizeof (dbase64)) {
                        exc = mono_exception_from_name_msg (mono_get_corlib (),
                                "System", "FormatException",
                                "Invalid character found.");
                        mono_raise_exception (exc);
+               } else if (isspace (c)) {
+                       ignored++;
                } else {
                        prev_last = last;
                        last = c;
@@ -6207,6 +6420,7 @@ static const IcallEntry defaultconf_icalls [] = {
 };
 
 static const IcallEntry consoledriver_icalls [] = {
+       {"GetTtySize", ves_icall_System_ConsoleDriver_GetTtySize },
        {"InternalKeyAvailable", ves_icall_System_ConsoleDriver_InternalKeyAvailable },
        {"Isatty", ves_icall_System_ConsoleDriver_Isatty },
        {"SetBreak", ves_icall_System_ConsoleDriver_SetBreak },
@@ -6220,7 +6434,7 @@ static const IcallEntry convert_icalls [] = {
 };
 
 static const IcallEntry timezone_icalls [] = {
-       {"GetTimeZoneData", ves_icall_System_CurrentTimeZone_GetTimeZoneData}
+       {"GetTimeZoneData", ves_icall_System_CurrentSystemTimeZone_GetTimeZoneData}
 };
 
 static const IcallEntry datetime_icalls [] = {
@@ -6260,6 +6474,7 @@ static const IcallEntry fileversion_icalls [] = {
 };
 
 static const IcallEntry process_icalls [] = {
+       {"CreateProcess_internal(System.Diagnostics.ProcessStartInfo,intptr,intptr,intptr,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_CreateProcess_internal},
        {"ExitCode_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitCode_internal},
        {"ExitTime_internal(intptr)", ves_icall_System_Diagnostics_Process_ExitTime_internal},
        {"GetModules_internal()", ves_icall_System_Diagnostics_Process_GetModules_internal},
@@ -6271,8 +6486,8 @@ static const IcallEntry process_icalls [] = {
        {"ProcessName_internal(intptr)", ves_icall_System_Diagnostics_Process_ProcessName_internal},
        {"Process_free_internal(intptr)", ves_icall_System_Diagnostics_Process_Process_free_internal},
        {"SetWorkingSet_internal(intptr,int,int,bool)", ves_icall_System_Diagnostics_Process_SetWorkingSet_internal},
+       {"ShellExecuteEx_internal(System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_ShellExecuteEx_internal},
        {"StartTime_internal(intptr)", ves_icall_System_Diagnostics_Process_StartTime_internal},
-       {"Start_internal(string,string,string,intptr,intptr,intptr,System.Diagnostics.Process/ProcInfo&)", ves_icall_System_Diagnostics_Process_Start_internal},
        {"WaitForExit_internal(intptr,int)", ves_icall_System_Diagnostics_Process_WaitForExit_internal}
 };
 
@@ -6294,6 +6509,7 @@ static const IcallEntry environment_icalls [] = {
        {"GetMachineConfigPath", ves_icall_System_Configuration_DefaultConfig_get_machine_config_path},
        {"GetOSVersionString", ves_icall_System_Environment_GetOSVersionString},
        {"GetWindowsFolderPath", ves_icall_System_Environment_GetWindowsFolderPath},
+       {"InternalSetEnvironmentVariable", ves_icall_System_Environment_InternalSetEnvironmentVariable},
        {"get_ExitCode", mono_environment_exitcode_get},
        {"get_HasShutdownStarted", ves_icall_System_Environment_get_HasShutdownStarted},
        {"get_MachineName", ves_icall_System_Environment_get_MachineName},
@@ -6374,7 +6590,7 @@ static const IcallEntry monoio_icalls [] = {
        {"GetTempPath(string&)", ves_icall_System_IO_MonoIO_GetTempPath},
        {"Lock(intptr,long,long,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Lock},
        {"MoveFile(string,string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_MoveFile},
-       {"Open(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,bool,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Open},
+       {"Open(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,System.IO.FileOptions,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Open},
        {"Read(intptr,byte[],int,int,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Read},
        {"RemoveDirectory(string,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_RemoveDirectory},
        {"Seek(intptr,long,System.IO.SeekOrigin,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Seek},
@@ -6494,7 +6710,6 @@ static const IcallEntry assembly_icalls [] = {
        /* 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_ReflectionOnly", ves_icall_System_Reflection_Assembly_get_ReflectionOnly},
        {"get_code_base", ves_icall_System_Reflection_Assembly_get_code_base},
        {"get_global_assembly_cache", ves_icall_System_Reflection_Assembly_get_global_assembly_cache},
@@ -6523,13 +6738,13 @@ static const IcallEntry module_icalls [] = {
        {"ResolveMethodToken", ves_icall_System_Reflection_Module_ResolveMethodToken},
        {"ResolveStringToken", ves_icall_System_Reflection_Module_ResolveStringToken},
        {"ResolveTypeToken", ves_icall_System_Reflection_Module_ResolveTypeToken},
+       {"get_MDStreamVersion", ves_icall_System_Reflection_Module_get_MDStreamVersion},
        {"get_MetadataToken", mono_reflection_get_token}
 };
 
 static const IcallEntry monocmethod_icalls [] = {
        {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
        {"InternalInvoke", ves_icall_InternalInvoke},
-       {"get_Mono_IsInflatedMethod", ves_icall_MonoMethod_get_Mono_IsInflatedMethod}
 };
 
 static const IcallEntry monoeventinfo_icalls [] = {
@@ -6540,7 +6755,6 @@ 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},
        {"SetValueInternal", ves_icall_FieldInfo_SetValueInternal}
 };
 
@@ -6571,16 +6785,16 @@ static const IcallEntry monomethod_icalls [] = {
        {"GetGenericArguments", ves_icall_MonoMethod_GetGenericArguments},
        {"GetGenericMethodDefinition_impl", ves_icall_MonoMethod_GetGenericMethodDefinition},
        {"InternalInvoke", ves_icall_InternalInvoke},
-       {"MakeGenericMethod", mono_reflection_bind_generic_method_parameters},
-       {"get_HasGenericParameters", ves_icall_MonoMethod_get_HasGenericParameters},
+       {"MakeGenericMethod_impl", mono_reflection_bind_generic_method_parameters},
+       {"get_IsGenericMethod", ves_icall_MonoMethod_get_IsGenericMethod},
        {"get_IsGenericMethodDefinition", ves_icall_MonoMethod_get_IsGenericMethodDefinition},
-       {"get_Mono_IsInflatedMethod", ves_icall_MonoMethod_get_Mono_IsInflatedMethod},
        {"get_base_definition", ves_icall_MonoMethod_get_base_definition}
 };
 
 static const IcallEntry monomethodinfo_icalls [] = {
        {"get_method_info", ves_icall_get_method_info},
-       {"get_parameter_info", ves_icall_get_parameter_info}
+       {"get_parameter_info", ves_icall_get_parameter_info},
+       {"get_retval_marshal", ves_icall_System_MonoMethodInfo_get_retval_marshal}
 };
 
 static const IcallEntry monopropertyinfo_icalls [] = {
@@ -6627,7 +6841,7 @@ static const IcallEntry socketex_icalls [] = {
 
 static const IcallEntry object_icalls [] = {
        {"GetType", ves_icall_System_Object_GetType},
-       {"InternalGetHashCode", ves_icall_System_Object_GetHashCode},
+       {"InternalGetHashCode", mono_object_hash},
        {"MemberwiseClone", ves_icall_System_Object_MemberwiseClone},
        {"obj_address", ves_icall_System_Object_obj_address}
 };
@@ -6813,9 +7027,10 @@ static const IcallEntry monitor_icalls [] = {
 };
 
 static const IcallEntry interlocked_icalls [] = {
-    {"Add(int&,int)", ves_icall_System_Threading_Interlocked_Add_Int},
+       {"Add(int&,int)", ves_icall_System_Threading_Interlocked_Add_Int},
        {"Add(long&,long)", ves_icall_System_Threading_Interlocked_Add_Long},
-    {"CompareExchange(double&,double,double)", ves_icall_System_Threading_Interlocked_CompareExchange_Double},
+       {"CompareExchange(T&,T,T)", ves_icall_System_Threading_Interlocked_CompareExchange_T},
+       {"CompareExchange(double&,double,double)", ves_icall_System_Threading_Interlocked_CompareExchange_Double},
        {"CompareExchange(int&,int,int)", ves_icall_System_Threading_Interlocked_CompareExchange_Int},
        {"CompareExchange(intptr&,intptr,intptr)", ves_icall_System_Threading_Interlocked_CompareExchange_Object},
        {"CompareExchange(long&,long,long)", ves_icall_System_Threading_Interlocked_CompareExchange_Long},
@@ -6823,6 +7038,7 @@ static const IcallEntry interlocked_icalls [] = {
        {"CompareExchange(single&,single,single)", ves_icall_System_Threading_Interlocked_CompareExchange_Single},
        {"Decrement(int&)", ves_icall_System_Threading_Interlocked_Decrement_Int},
        {"Decrement(long&)", ves_icall_System_Threading_Interlocked_Decrement_Long},
+       {"Exchange(T&,T)", ves_icall_System_Threading_Interlocked_Exchange_T},
        {"Exchange(double&,double)", ves_icall_System_Threading_Interlocked_Exchange_Double},
        {"Exchange(int&,int)", ves_icall_System_Threading_Interlocked_Exchange_Int},
        {"Exchange(intptr&,intptr)", ves_icall_System_Threading_Interlocked_Exchange_Object},
@@ -6836,12 +7052,20 @@ static const IcallEntry interlocked_icalls [] = {
 
 static const IcallEntry mutex_icalls [] = {
        {"CreateMutex_internal(bool,string,bool&)", ves_icall_System_Threading_Mutex_CreateMutex_internal},
+       {"OpenMutex_internal(string,System.Security.AccessControl.MutexRights,System.IO.MonoIOError&)", ves_icall_System_Threading_Mutex_OpenMutex_internal},
        {"ReleaseMutex_internal(intptr)", ves_icall_System_Threading_Mutex_ReleaseMutex_internal}
 };
 
+static const IcallEntry semaphore_icalls [] = {
+       {"CreateSemaphore_internal(int,int,string,bool&)", ves_icall_System_Threading_Semaphore_CreateSemaphore_internal},
+       {"OpenSemaphore_internal(string,System.Security.AccessControl.SemaphoreRights,System.IO.MonoIOError&)", ves_icall_System_Threading_Semaphore_OpenSemaphore_internal},
+       {"ReleaseSemaphore_internal(intptr,int,bool&)", ves_icall_System_Threading_Semaphore_ReleaseSemaphore_internal}
+};
+
 static const IcallEntry nativeevents_icalls [] = {
        {"CloseEvent_internal", ves_icall_System_Threading_Events_CloseEvent_internal},
-       {"CreateEvent_internal", ves_icall_System_Threading_Events_CreateEvent_internal},
+       {"CreateEvent_internal(bool,bool,string,bool&)", ves_icall_System_Threading_Events_CreateEvent_internal},
+       {"OpenEvent_internal(string,System.Security.AccessControl.EventWaitHandleRights,System.IO.MonoIOError&)", ves_icall_System_Threading_Events_OpenEvent_internal},
        {"ResetEvent_internal",  ves_icall_System_Threading_Events_ResetEvent_internal},
        {"SetEvent_internal",    ves_icall_System_Threading_Events_SetEvent_internal}
 };
@@ -6850,6 +7074,7 @@ static const IcallEntry thread_icalls [] = {
        {"Abort_internal(object)", ves_icall_System_Threading_Thread_Abort},
        {"ClrState", ves_icall_System_Threading_Thread_ClrState},
        {"CurrentThread_internal", mono_thread_current},
+       {"FreeLocalSlotValues", mono_thread_free_local_slot_values},
        {"GetCachedCurrentCulture", ves_icall_System_Threading_Thread_GetCachedCurrentCulture},
        {"GetCachedCurrentUICulture", ves_icall_System_Threading_Thread_GetCachedCurrentUICulture},
        {"GetDomainID", ves_icall_System_Threading_Thread_GetDomainID},
@@ -7016,7 +7241,7 @@ static const IcallMap icall_entries [] = {
        {"System.Configuration.DefaultConfig", defaultconf_icalls, G_N_ELEMENTS (defaultconf_icalls)},
        {"System.ConsoleDriver", consoledriver_icalls, G_N_ELEMENTS (consoledriver_icalls)},
        {"System.Convert", convert_icalls, G_N_ELEMENTS (convert_icalls)},
-       {"System.CurrentTimeZone", timezone_icalls, G_N_ELEMENTS (timezone_icalls)},
+       {"System.CurrentSystemTimeZone", timezone_icalls, G_N_ELEMENTS (timezone_icalls)},
        {"System.DateTime", datetime_icalls, G_N_ELEMENTS (datetime_icalls)},
 #ifndef DISABLE_DECIMAL
        {"System.Decimal", decimal_icalls, G_N_ELEMENTS (decimal_icalls)},
@@ -7089,6 +7314,7 @@ static const IcallMap icall_entries [] = {
        {"System.Threading.Monitor", monitor_icalls, G_N_ELEMENTS (monitor_icalls)},
        {"System.Threading.Mutex", mutex_icalls, G_N_ELEMENTS (mutex_icalls)},
        {"System.Threading.NativeEventCalls", nativeevents_icalls, G_N_ELEMENTS (nativeevents_icalls)},
+       {"System.Threading.Semaphore", semaphore_icalls, G_N_ELEMENTS (semaphore_icalls)},
        {"System.Threading.Thread", thread_icalls, G_N_ELEMENTS (thread_icalls)},
        {"System.Threading.ThreadPool", threadpool_icalls, G_N_ELEMENTS (threadpool_icalls)},
        {"System.Threading.WaitHandle", waithandle_icalls, G_N_ELEMENTS (waithandle_icalls)},
@@ -7213,6 +7439,9 @@ mono_lookup_internal_call (MonoMethod *method)
 
        g_assert (method != NULL);
 
+       if (method->is_inflated)
+               method = ((MonoMethodInflated *) method)->declaring;
+
        if (method->klass->nested_in) {
                int pos = concat_class_name (mname, sizeof (mname)-2, method->klass->nested_in);
                if (!pos)
@@ -7410,7 +7639,7 @@ void
 mono_register_jit_icall_wrapper (MonoJitICallInfo *info, gconstpointer wrapper)
 {
        mono_loader_lock ();
-       g_hash_table_insert (jit_icall_hash_addr, (gpointer)info->wrapper, info);       
+       g_hash_table_insert (jit_icall_hash_addr, (gpointer)wrapper, info);
        mono_loader_unlock ();
 }
 
@@ -7434,7 +7663,7 @@ mono_register_jit_icall (gconstpointer func, const char *name, MonoMethodSignatu
                g_assert_not_reached ();
        }
 
-       info = g_new (MonoJitICallInfo, 1);
+       info = g_new0 (MonoJitICallInfo, 1);
        
        info->name = name;
        info->func = func;