X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fobject.c;h=7d562d98e23b48c2b1f3e80ddd4cb5f2b1f7930d;hb=e7951e6ee0786855af92d677d5fb20fe14f5ecdf;hp=9147dcb0960ba92c28478fb1f99098be3eb4445d;hpb=15af51806d816ad6ad966bc1dfbdd232b63fde52;p=mono.git diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 9147dcb0960..7d562d98e23 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -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); }