| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- Author: Dietmar Maurer ([email protected])
- (C) 2001 Ximian, Inc.
- Object and VTable layout
- ========================
- 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 {
- MonoVTable *vtable;
- MonoThreadsSync synchronisation;
-
- /* object specific data goes here */
- } MonoObject;
- 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;
- ...
- } MonoClass;
- Calling virtual functions:
- ==========================
- 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->vtable->vtable [method->slot];
- Calling interface methods:
- ==========================
- Each interface class is associated with an unique ID. The following code
- computes the address of an interface function:
- method_addr = *(object->vtable->interface_offsets [interface_id] + method->slot*4);
|