\begin{describe}[SodClass]{cls}
{[nick = cls, link = SodObject] \\
- class SodClass : SodObject \{ \\ \ind
+ class SodClass: SodObject \{ \\ \ind
const char *name; \\
const char *nick; \\
size_t initsz; \\
@<type>_n @<slot>_n; \-\\
\} $c$; \-\\
\} $c$; \\
- struct $H$__ichain_$h$ $h$; \\
+ struct $A$__ichain_$h$ $a$; \\
\quad$\vdots$ \-\\
\} $h$; \\
union $B$__ichainu_$i$ $i$; \\
naming their least specific classes; the least specific class in a chain is
called the \emph{chain head}. Suppose that the chain head of the chain
containing $C$ itself is named $H$ (though keep in mind that it's possible
-that .$H$ is in fact $C$ itself.)
+that $H$ is in fact $C$ itself.)
\subsubsection{The ilayout structure}
The @|ilayout| structure contains one member for each of $C$'s superclass
struct $A$__ichain_$h$ $a$;
\end{prog}
for each of $C$'s superclasses $A$ in the same chain in some (unimportant)
-order.
+order. The (somewhat obtuse) purpose of this union is to engage the `common
+initial sequence' rule of \cite[6.5.2.3]{FIXME:C99}.
\subsubsection{The ichain structure}
-The
-@|ichain|
-structure contains (in order), a pointer
+The @|ichain| structure contains (in order), a pointer
\begin{prog}
const struct $C$__vt_$h$ *_vt;
\end{prog}
extern const union $C$__vtu_$h$ $C$__vtable_$h$;
\end{prog}
+In the following, let $M$ be the metaclass of $C$.
+
\subsubsection{The vtu union}
The outer layer is a @|union $C$__vtu_$h$| containing a member
\begin{prog}
for each of $C$'s superclasses $A$ in the same chain, with $C$ itself listed
first.
-This is mostly an irrelevant detail,
-whose purpose is to defend against malicious compilers:
-pointers are always to one of the inner
-@|vt|
-structures.
-It's important only because it's the outer
-@|vtu|
-union which is exported by name.
-Specifically, for each chain of
-$C$'s
-superclasses
-there is an external object
+This is mostly an irrelevant detail, whose purpose is to defend against
+malicious compilers: pointers are always to one of the inner @|vt|
+structures. It's important only because it's the outer @|vtu| union which is
+exported by name. Specifically, for each chain of $C$'s superclasses there is
+an external object
\begin{prog}
const union $A$__vtu_$i$ $C$__vtable_$i$;
\end{prog}
@<type>_n @<arg>_n? \+\\
@<type>_{n+1} @<kw>_{n+1} @[= @<dflt>_{n+1}@],
$\ldots$,
- @<type>_m @<kw>_m @[= @<dflt>_m@]);
+ @<type>_{n'} @<kw>_{n'} @[= @<dflt>_{n'}@]);
\end{prog}
two entry points are defined: the usual `main' entry point which accepts a
variable number of arguments, and a `valist' entry point which accepts an