Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDietmar Maurer <dietmar@mono-cvs.ximian.com>2002-02-13 10:55:01 +0300
committerDietmar Maurer <dietmar@mono-cvs.ximian.com>2002-02-13 10:55:01 +0300
commiteae711d5a034efefe7cb3561245a608dbaab11ba (patch)
tree69293de18e5f95523abc58c546b9b731b64f22a3 /docs/object-layout
parent1cb538d09174f130a9e8b5d2c85d1aac6e40ff36 (diff)
update
svn path=/trunk/mono/; revision=2363
Diffstat (limited to 'docs/object-layout')
-rw-r--r--docs/object-layout34
1 files changed, 18 insertions, 16 deletions
diff --git a/docs/object-layout b/docs/object-layout
index 1a066453ada..8135ca2805f 100644
--- a/docs/object-layout
+++ b/docs/object-layout
@@ -1,35 +1,38 @@
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 +43,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 +52,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);