Tue Jul 16 12:39:33 CEST 2002 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Tue, 16 Jul 2002 10:45:35 +0000 (10:45 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Tue, 16 Jul 2002 10:45:35 +0000 (10:45 -0000)
* object.c, class.h: cache the vtable in the class as suggested by
vargaz@freemail.hu (Zoltan Varga).

svn path=/trunk/mono/; revision=5825

mono/metadata/ChangeLog
mono/metadata/class.h
mono/metadata/object.c

index 40cb55616676a076df558a4117da5590b24bc7af..6e9a80f2572def6990df80731d0759386bc39692 100644 (file)
@@ -1,4 +1,9 @@
 
+Tue Jul 16 12:39:33 CEST 2002 Paolo Molaro <lupus@ximian.com>
+
+       * object.c, class.h: cache the vtable in the class as suggested by
+       vargaz@freemail.hu (Zoltan Varga).
+
 Tue Jul 16 11:27:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
 
        * class.h, loader.c: added mono_field_from_token().
index 5c1720b17e14c47aaac92e8f4495dbc9ba1d469e..589fd4ee55b97c9103ea6bacb7d90c2d331a3139 100644 (file)
@@ -8,6 +8,7 @@
 #define MONO_CLASS_IS_ARRAY(c) ((c)->rank)
 
 extern gboolean mono_print_vtable;
+typedef struct MonoVTable MonoVTable;
 
 typedef struct {
        MonoType        *type;
@@ -140,17 +141,18 @@ struct _MonoClass {
        MonoMethod *ptr_to_str;
        MonoMethod *str_to_ptr;
 
+       MonoVTable *cached_vtable;
         MonoMethod **vtable;   
 };
 
-typedef struct {
+struct MonoVTable {
        MonoClass  *klass;
        MonoDomain *domain;  /* each object/vtable belongs to exactly one domain */
        guint       max_interface_id;
         gpointer   *interface_offsets;   
         gpointer    data;
         gpointer    vtable [MONO_ZERO_LEN_ARRAY];      
-} MonoVTable;
+};
 
 typedef struct {
        gulong new_object_count;
index 9340cb59ef2737ac67acbf1490c35fbfec76dc4e..d8f499303935c4023ab8dba5c8c75fe1ff1d8170 100644 (file)
@@ -144,6 +144,10 @@ mono_class_vtable (MonoDomain *domain, MonoClass *class)
 
        g_assert (class);
 
+       vt = class->cached_vtable;
+       if (vt && vt->domain == domain)
+               return vt;
+
        /* can interfaces have static fields? */
        if (class->flags & TYPE_ATTRIBUTE_INTERFACE)
                g_assert_not_reached ();
@@ -273,6 +277,9 @@ mono_class_vtable (MonoDomain *domain, MonoClass *class)
        }
 
        mono_g_hash_table_insert (domain->class_vtable_hash, class, vt);
+       if (!class->cached_vtable)
+               class->cached_vtable = vt;
+
        mono_domain_unlock (domain);
 
        /* make sure the the parent is initialized */