VASmalltalk – Primitives – Class structures

Wenn man auf Instanzen von Klassen in den Primitives zugreifen möchte, hat man es mit Strukturen zu tun, deren Mitglieder auf weitere Informationen erweisen.

Zu jeder Instanz gehört eine Struktur, die immer gleich beginnt. In den mitgelieferten include-Dateien werden einige Klassen definiert. Der Aufbau sieht dabei prinzipiell so aus:

typedef struct [KlassenName]{
 struct ESObjectHeader* class;
 U_32 flags;
 U_32 size;
 ...
} [KlassenName]

Wenn man nun auf eine Klasse zugreifen möchte, für die es noch keine Struktur gibt, dann muss man sich diese selber definieren – und das ist recht einfach.

Dem oben angegebenen Vorspann folgt für jede Instanzvariable ein weiterer Eintrag und zwar ausgehend von der Oberklasse hin zu den Unterklassen und innerhalb einer Klasse in der Definitionsreihenfolge in der jeweiligen Klasse.

Als Beispiel sei die Struktur der Klasse “Class” aufgezeigt werden:

// At the beginning we see the prolog ....
typedef struct ESClass {
    struct ESObjectHeader* class;
    U_32 flags;
    U_32 size;

    // Now we get the instance variables of class "Behaviour"
    struct ESObjectHeader* specialMethods;
    struct ESClass* superclass;
    struct ESObjectHeader* methodsArray;
    struct ESObjectHeader* namedInstVarSize;
    struct ESObjectHeader* instanceShape;
    struct ESObjectHeader* instanceLink;
    struct ESObjectHeader* classLink;
    struct ESObjectHeader* methodDictionary;
    struct ESObjectHeader* subclasses;

    // Then we get the instance variables of class "ClassDescription"
    struct ESObjectHeader* instVarNames;
    struct ESObjectHeader* description;

    // ... and at the end we have the definitions for class "Class"
    struct ESByteArray* name;
    struct ESObjectHeader* classPool;
    struct ESObjectHeader* sharedPoolNames;
} ESClass;

Damit sollte der Aufbau von normalen Klassen beschrieben sein.

This entry was posted in Smalltalk and tagged , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s