.I different
structures.
.PP
-The instance layout split neatly into disjoint chains.
+The instance layout splits neatly into disjoint chains.
This is necessary because
each
.B ichain
multiple method entry pointers
for the same effective method
as long as they all work correctly.
-Indeed, it's essential that they do,
+Indeed, it's essential that there are multiple entry pointers,
because each chain's method entry function
will need to apply a different offset to the receiver pointer
before invoking the effective method.
.I M
in the same chain as
.IR J .
-Then, if there is currently no class pointer of type
-.IR Q ,
+If there is currently no class pointer
+for the chain headed by
+.IR J ,
then add a member
.RS
.IP
.B islots
structure within
.IR M 's
-class object.
+class object,
+where
+.I Q
+is the most specific superclass of
+.I M
+in the same chain as
+.IR J .
.RE
.hP \*o
Examine the superclass chains of
.B #define
.IB C __class
.BI (& C __classobj. j . r )
+.br
+.B #define
+.IB C __cls_ k
+.BI (& C __classobj. k . n )
+.br
+\&...
.PP
The exported symbol
.IB C __classobj
i.e., the metaclass of the least specific superclass of
.IR C ;
usually this is
-.BR "const SodClass *" .
+.BR "const SodClass\ *" .
+For each chain of
+.IR C 's
+metaclass, a macro
+.IB C __cls_ k
+is defined, usable as a pointer of type
+.B const
+.IR N \ \c
+.BR * ,
+where
+.I K
+and
+.I N
+are the chain's head and tail classes
+(i.e., the least- and most-specific classes in the chain)
+respectively;
+this macro is
+.I omitted
+if
+.IR N "\ =\ " R ,
+i.e., in the common case where
+.IR C 's
+metaclass is precisely the root metaclass,
+since the existing
+.IB C __class
+macro is already sufficient.
.
.\"--------------------------------------------------------------------------
.SH SEE ALSO