X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=docs%2Fobject-layout;h=4916751d1e73c97948d51b8c792cb400e500d397;hb=8501c39432305aa7fdf9b41c6a5d83acbd6755c0;hp=1a066453ada71c746e0a9bb0c1268a6c3d871a84;hpb=bea5147eb23530d6b3a264168dbbf6e981008f62;p=mono.git diff --git a/docs/object-layout b/docs/object-layout index 1a066453ada..4916751d1e7 100644 --- a/docs/object-layout +++ b/docs/object-layout @@ -1,35 +1,41 @@ +Author: Dietmar Maurer (dietmar@ximian.com) +(C) 2001 Ximian, Inc. + Object and VTable layout ======================== -The first pointer inside an Object points to a MonoClass structure. Objects +The first pointer inside an Object points to a MonoVtable structure. Objects also contains a MonoThreadsSync structure which is used by the mono Thread implementation. typedef struct { - MonoClass *class; + MonoVTable *vtable; MonoThreadsSync synchronisation; /* object specific data goes here */ } MonoObject; -The MonoClass contains all Class infos, the VTable and a pointer to static -class data. +The MonoVtable contains the vtable, interface offsets and a pointer to static +class data. Each object/vtable belongs to exactly one AppDomain. + +typedef struct { + MonoClass *klass; + MonoDomain *domain; + gpointer *interface_offsets; + /* a pointer to static data */ + gpointer data; + /* the variable sized vtable is included at the end */ + gpointer vtable [0]; +} MonoVTable; + +The MonoClass contains domain independent Class infos. typedef struct { /* various class infos */ MonoClass *parent; const char *name; const char *name_space; - ... - - /* interface offset table */ - gint *interface_offsets; - - gpointer data; /* a pointer to static data */ - - /* the variable sized vtable is included at the end */ - gpointer vtable [vtable_size]; } MonoClass; @@ -40,7 +46,7 @@ Each MonoMethod (if virtual) has an associated slot, which is an index into the VTable. So we can use the following code to compute the address of a virtual function: -method_addr = object->class->vtable [method->slot]; +method_addr = object->vtable->vtable [method->slot]; Calling interface methods: @@ -49,8 +55,7 @@ Calling interface methods: Each interface class is associated with an unique ID. The following code computes the address of an interface function: -offset_into_vtable = object->class->interface_offsets [interface_id]; -method_addr = object->class->vtable [offset_into_vtable + method->slot]; +method_addr = *(object->vtable->interface_offsets [interface_id] + method->slot*4);