+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().
#define MONO_CLASS_IS_ARRAY(c) ((c)->rank)
extern gboolean mono_print_vtable;
+typedef struct MonoVTable MonoVTable;
typedef struct {
MonoType *type;
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;
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 ();
}
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 */