Merge pull request #205 from m3rlinez/master
[mono.git] / mono / metadata / object.c
index 9147dcb0960ba92c28478fb1f99098be3eb4445d..7d562d98e23b48c2b1f3e80ddd4cb5f2b1f7930d 100644 (file)
@@ -490,7 +490,7 @@ default_remoting_trampoline (MonoDomain *domain, MonoMethod *method, MonoRemotin
 }
 
 static gpointer
-default_delegate_trampoline (MonoClass *klass)
+default_delegate_trampoline (MonoDomain *domain, MonoClass *klass)
 {
        g_assert_not_reached ();
        return NULL;
@@ -587,7 +587,7 @@ mono_runtime_create_jump_trampoline (MonoDomain *domain, MonoMethod *method, gbo
 gpointer
 mono_runtime_create_delegate_trampoline (MonoClass *klass)
 {
-       return arch_create_delegate_trampoline (klass);
+       return arch_create_delegate_trampoline (mono_domain_get (), klass);
 }
 
 static MonoFreeMethodFunc default_mono_free_method = NULL;
@@ -1837,6 +1837,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean
        char *t;
        int i, vtable_slots;
        int imt_table_bytes = 0;
+       int gc_bits;
        guint32 vtable_size, class_size;
        guint32 cindex;
        gpointer iter;
@@ -1954,6 +1955,11 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean
 #endif
                vt->gc_descr = class->gc_descr;
 
+       gc_bits = mono_gc_get_vtable_bits (class);
+       g_assert (!(gc_bits & ~((1 << MONO_VTABLE_AVAILABLE_GC_BITS) - 1)));
+
+       vt->gc_bits = gc_bits;
+
        if (class_size) {
                /* we store the static field pointer at the end of the vtable: vt->vtable [class->vtable_size] */
                if (class->has_static_refs) {
@@ -5185,9 +5191,10 @@ mono_object_isinst_mbyref (MonoObject *obj, MonoClass *klass)
                        return obj;
        } else {
                MonoClass *oklass = vt->klass;
-               if ((oklass == mono_defaults.transparent_proxy_class))
+               if (oklass == mono_defaults.transparent_proxy_class)
                        oklass = ((MonoTransparentProxy *)obj)->remote_class->proxy_class;
-       
+
+               mono_class_setup_supertypes (klass);    
                if ((oklass->idepth >= klass->idepth) && (oklass->supertypes [klass->idepth - 1] == klass))
                        return obj;
        }
@@ -6061,7 +6068,7 @@ mono_delegate_ctor_with_method (MonoObject *this, MonoObject *target, gpointer a
                MONO_OBJECT_SETREF (delegate, target, target);
        }
 
-       delegate->invoke_impl = arch_create_delegate_trampoline (delegate->object.vtable->klass);
+       delegate->invoke_impl = arch_create_delegate_trampoline (delegate->object.vtable->domain, delegate->object.vtable->klass);
 }
 
 /**
@@ -6081,7 +6088,11 @@ mono_delegate_ctor (MonoObject *this, MonoObject *target, gpointer addr)
 
        g_assert (addr);
 
-       if ((ji = mono_jit_info_table_find (domain, mono_get_addr_from_ftnptr (addr)))) {
+       ji = mono_jit_info_table_find (domain, mono_get_addr_from_ftnptr (addr));
+       /* Shared code */
+       if (!ji && domain != mono_get_root_domain ())
+               ji = mono_jit_info_table_find (mono_get_root_domain (), mono_get_addr_from_ftnptr (addr));
+       if (ji) {
                method = ji->method;
                g_assert (!method->klass->generic_container);
        }