3 %%% In-depth exploration of the generated structures
5 %%% (c) 2015 Straylight/Edgeware
8 %%%----- Licensing notice ---------------------------------------------------
10 %%% This file is part of the Simple Object Definition system.
12 %%% SOD is free software; you can redistribute it and/or modify
13 %%% it under the terms of the GNU General Public License as published by
14 %%% the Free Software Foundation; either version 2 of the License, or
15 %%% (at your option) any later version.
17 %%% SOD is distributed in the hope that it will be useful,
18 %%% but WITHOUT ANY WARRANTY; without even the implied warranty of
19 %%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 %%% GNU General Public License for more details.
22 %%% You should have received a copy of the GNU General Public License
23 %%% along with SOD; if not, write to the Free Software Foundation,
24 %%% Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 \chapter{Object structures} \label{ch:structures}
28 This chapter describes the structure and layout of standard Sod objects,
29 classes and associated metadata. Note that Sod's object system is very
30 flexible and it's possible for an extension to define a new root class which
31 works very differently from the standard @|SodObject| described here.
33 The concrete types described in \xref{sec:structures.common} and
34 \ref{sec:structures.root} are declared by the header file @|<sod/sod.h>|.
35 The definitions described in \xref{sec:structures.layout} are defined in the
36 header file generated by the containing module.
38 %%%--------------------------------------------------------------------------
39 \section{Common instance structure} \label{sec:structures.common}
41 As described below, a pointer to an instance actually points to an
42 \emph{instance chain} structure within the instances overall layout
45 Instance chains contain slots and vtable pointers, as described below. All
46 instances have the basic structure of a @|struct sod_instance|.
48 \begin{describe}[struct sod_instance]{type}
49 {struct sod_instance \{ \\ \ind
50 const struct sod_vtable *_vt; \- \\
53 The basic structure of all instances. Members are as follows.
54 \begin{description} \let\makelabel\code
55 \item[_vt] A pointer to a \emph{vtable}, which has the basic structure of a
56 @|struct sod_vtable|, described below.
60 \begin{describe}[struct sod_vtable]{type}
61 {struct sod_vtable \{ \\ \ind
62 const SodClass *_class; \\
66 A vtable contains static metadata needed for efficient conversions and
67 message dispatch, and pointers to the instance's class. Each chain points
68 to a different vtable. All vtables have the basic structure of a @|struct
69 sod_vtable|, which has the following members.
70 \begin{description} \let\makelabel\code
71 \item[_class] A pointer to the instance's class object.
72 \item[_base] The offset of this chain structure above the start of the
73 overall instance layout, in bytes. Subtracting @|_base| from the
74 instance chain pointer finds the layout base address.
78 %%%--------------------------------------------------------------------------
79 \section{Built-in root objects} \label{sec:structures.root}
81 This section describes the built-in classes @|SodObject| and @|SodClass|,
82 which are the standard roots of the inheritance and metaclass graphs
83 respectively. Specifically, @|SodObject| has no direct superclasses, and
84 @|SodClass| is its own metaclass. It is not possible to define root classes
85 in module files because of circularities: @|SodObject| has @|SodClass| as its
86 metaclass, and @|SodClass| is a subclass of @|SodObject|. Extensions can
87 define additional root classes, but this is tricky, and not really to be
91 \subsection{The SodObject class} \label{sec:structures.root.sodobject}
94 \begin{tabular}{p{10pt}p{10pt}}
96 struct SodObject__ilayout \{ \\ \ind
98 struct SodObject__ichain_obj \{ \\ \ind
99 const struct SodObject__vt_obj *_vt; \- \\
106 struct SodObject__vt_obj \{ \\ \ind
107 const SodClass *_class; \\
109 struct SodObject__vtmsgs_obj \{ \\ \ind
110 void (*init)(SodObject *me, ...); \\
111 void (*init__v)(SodObject *me, va_list); \\
112 int (*teardown)(SodObject *me); \- \\
117 \caption{Instance and vtable layout of @|SodObject|}
118 \label{fig:structures.root.sodobject}
121 \begin{describe}[SodObject]{cls}
122 {[nick = obj, metaclass = SodClass, lisp_metaclass = sod_class] \\
123 class SodObject \{ \\ \ind
127 The @|SodObject| class defines no slots. Because @|SodObject| has no
128 direct superclasses, there is only one chain, and no inherited slots or
129 messages, so the single chain contains only a vtable pointer.
131 Since @|SodClass| also has only one chain, the vtable contains only the
132 standard class pointer and offset-to-base members. In a direct instance of
133 @|SodObject| (why would you want one?) the class pointer contains the
134 address of @|SodObject__class| and the offset is zero.
136 The instance and vtable layout of @|SodObject| is shown in
137 \xref{fig:structures.root.sodobject}.
139 The following messages are defined.
141 \begin{describe}[obj.init]{msg}{void init(?);}
142 Initialize a newly allocated instance.
144 This message uses a custom method combination which works like the
145 standard method combination except that default behaviour specific to the
146 receiver's direct class is invoked if no primary or around method
147 overrides. This default behaviour may be invoked multiple times if some
148 method calls on its @|next_method| function more than once.
150 This default behaviour is to initialize the instance's slots using the
151 defined slot initializers, and execute the initialization fragments.
152 Each slot is initialized using the most specific applicable initializer,
153 if any. Slots without an initializer are left uninitialized.
155 Slots are initialized and initialization fragments executed together, a
156 superclass at a time: first, the superclass's slots are initialized (if
157 any); then the superclass's initialization fragments (if any) are
158 executed, starting with the least specific superclass first. Slots and
159 initialization fragments defined by the same class are processed in the
160 order in which they appear in the class definition.
162 There are no standard keyword arguments; methods on subclasses are free
163 to introduce their own in the usual way.
165 It is usual to provide complex initialization behaviour as @|after|
166 methods. This ensures that slots have been initialized as necessary
167 before the method executes.
169 For more details on instance construction, see
170 \xref{sec:concepts.lifecycle.birth}.
173 \begin{describe}[obj.teardown]{msg}{int teardown();}
174 Teardown an instance which is no longer required.
176 The message returns an integer flag. A zero value means that the
177 instance is safe to deallocate. A nonzero value means that the instance
178 should not be deallocated, and that it is safe for the caller to simply
179 forget about it. This simple protocol may be used, for example, to
180 implement a reference-counting system.
182 This message uses a custom method combination which works like the
183 standard method combination except that default behaviour is invoked if
184 no primary or around method overrides.
186 This default behaviour is to execute each superclass's teardown
187 fragments, most specific first, and then return zero to indicate that the
188 object is ready for deallocation. Teardown fragments defined by the same
189 class are processed in the order in which they appear in the class
192 It is usual to provide complex teardown behaviour as @|before| methods.
193 Logic to decide whether to allow deallocation is usually implemented as
199 \subsection{The SodClass class} \label{sec:structures.root.sodclass}
201 \begin{describe}[SodClass]{cls}
202 {[nick = cls, link = SodObject] \\
203 class SodClass : SodObject \{ \\ \ind
207 void *(*imprint)(void *@<p>); \\
209 const SodClass *const *supers; \\
211 const SodClass *const *cpl; \\
212 const SodClass *link; \\
213 const SodClass *head; \\
216 const struct sod_chain *chains; \\
217 size_t off_islots; \\
218 size_t islotsz; \- \\
221 The @|SodClass| class defines no additional messages , but there are a
222 number of slots. Its only direct superclass is @|SodObject| and so (like
223 its superclass) its vtable is simple.
225 The slots defined are as follows.
226 \begin{description} \let\makelabel\code
228 \item[name] A pointer to the class's name.
230 \item[nick] A pointer to the class's nickname.
232 \item[initsz] The size in bytes required to store an instance of the class.
234 \item[imprint] A pointer to a function: given a pointer @<p> to at least
235 @<initsz> bytes of appropriately aligned memory, `imprint' this memory it
236 so that it becomes a minimally functional instance of the class: all of
237 the vtable and class pointers are properly initialized, but the slots are
238 left untouched. The function returns its argument @<p>.
240 \item[n_supers] The number of direct superclasses. (This is zero exactly
241 in the case of @|SodObject|.)
243 \item[supers] A pointer to an array of @<n_supers> pointers to class
244 objects listing the class's direct superclasses, in the order in which
245 they were listed in the class definition. If @<n_supers> is zero, then
246 this pointer is null.
248 \item[n_cpl] The number of superclasses in the class's class precedence
251 \item[cpl] A pointer to an array of pointers to class objects listing all
252 of the class's superclasses, from most- to least-specific, starting with
253 the class itself, so $@|$c$@->cls.cpl[0]| = c$ for all class objects
256 \item[link] If the class is a chain head, then this is a null pointer;
257 otherwise it points to the class's distinguished link superclass (which
258 might or might not be a direct superclass).
260 \item[head] A pointer to the least-specific class in this class's chain; so
261 @|$c$@->cls.head@->cls.link| is always null, and either @|$c$@->cls.link|
262 is null (in which case $@|$c$@->cls.head| = c$) or $@|$c$@->cls.head| =
263 @|$c$@->cls.link@->cls.head|$.
265 \item[level] The number of less specific superclasses in this class's
266 chain. If @|$c$@->cls.link| is null then @|$c$@->cls.level| is zero;
267 otherwise $@|$c$@->cls.level| = @|$c$@->cls.link@->cls.level| + 1$.
269 \item[n_chains] The number of chains formed by the class's superclasses.
271 \item[chains] A pointer to an array of @|struct sod_chain| structures (see
272 below) describing the class's superclass chains, in decreasing order of
273 specificity of their most specific classes. It is always the case that
274 $@|$c$@->cls.chains[0].classes[$c$@->cls.level]| = c$.
276 \item[off_islots] The offset of the class's @|islots| structure relative to
277 its containing @|ichain| structure. The class doesn't define any slots
278 if and only if this is zero. (The offset can't be zero because the
279 vtable pointer is at offset zero.)
281 \item[islotsz] The size required to store the class's direct slots, i.e.,
282 the size of its @|islots| structure. The class doesn't define any slots
283 if and only if this is zero.
288 \begin{describe}[struct sod_chain]{type}
289 {struct sod_chain \{ \\ \ind
291 const SodClass *const *classes; \\
292 size_t off_ichain; \\
293 const struct sod_vtable *vt; \\
294 size_t ichainsz; \- \\
297 The @|struct sod_chain| structure describes an individual chain of
298 superclasses. It has the following members.
299 \begin{description} \let\makelabel\code
301 \item[n_classes] The number of classes in the chain. This is always at
304 \item[classes] A pointer to an array of class pointers listing the classes
305 in the chain from least- to most-specific. So
306 $@|@<classes>[$i$]@->cls.head| = @|@<classes>[0]|$ for all $0 \le i <
307 @<n_classes>$, @|@<classes>[0]@->cls.link| is always null, and
308 $@|@<classes>[$i$]@->cls.link| = @|@<classes>[$i - 1$]|$ if $1 \le i <
311 \item[off_ichain] The size of the @|ichain| structure for this chain.
313 \item[vt] The vtable for this chain. (It is possible, therefore, to
314 partially duplicate the behaviour of the @<imprint> function by walking
315 the chain structure.\footnote{%
316 There isn't enough information readily available to fill in the class
317 pointers correctly.} %
318 The @<imprint> function is much faster, though.)
320 \item[ichainsz] The size of the @|ichain| structure for this chain.
325 %%%--------------------------------------------------------------------------
326 \section{Class and vtable layout} \label{sec:structures.layout}
328 The layout algorithms for Sod instances and vtables are nontrivial. They are
329 defined here in full detail, since they're effectively fixed by Sod's ABI
330 compatibility guarantees, so they might as well be documented for the sake of
331 interoperating programs.
333 Unfortunately, the descriptions are rather complicated, and, for the most
334 part not necessary to a working understanding of Sod. The skeleton structure
335 definitions shown should be more than enough for readers attempting to make
336 sense of the generated headers and tables.
338 In the description that follows, uppercase letters vary over class names,
339 while the corresponding lowercase letters indicate the class nicknames.
340 Throughout, we consider a class $C$ (therefore with nickname $c$).
343 \subsection{Generic instance structure}
344 \label{sec:structures.layout.instance}
346 The entire state of an instance of $C$ is contained in a single structure of
347 type @|struct $C$__ilayout|.
350 struct $C$__ilayout \{ \\ \ind
351 union $C$__ichainu_$h$ \{ \\ \ind
352 struct $C$__ichain_$h$ \{ \\ \ind
353 const struct $C$__vt_$h$ *_vt; \\
354 struct $H$__islots $h$; \\
356 struct $C$__islots \{ \\ \ind
357 @<type>_1 @<slot>_1; \\
359 @<type>_n @<slot>_n; \- \\
362 struct $H$__ichain_$h$ $h$; \\
365 union $B$__ichainu_$i$ $i$; \\
369 typedef struct $C$__ichain_$h$ $C$;
372 The set of superclasses of $C$, including itself, can be partitioned into
373 chains by following their distinguished superclass links. (Formally, the
374 chains are the equivalence classes determined by the reflexive, symmetric,
375 transitive closure of the `links to' relation.) Chains are identified by
376 naming their least specific classes; the least specific class in a chain is
377 called the \emph{chain head}. Suppose that the chain head of the chain
378 containing $C$ itself is named $H$ (though keep in mind that it's possible
379 that .$H$ is in fact $C$ itself.)
381 \subsubsection{The ilayout structure}
382 The @|ilayout| structure contains one member for each of $C$'s superclass
383 chains. The first such member is
385 union $C$__ichainu_$h$ $h$;
387 described below; this is followed by members
389 union $B$__ichainu_$i$ $i$;
391 for each other chain, where $I$ is the head and $B$ the tail (most-specific)
392 class of the chain. The members are in decreasing order of the specificity
393 of the chains' most-specific classes. (Note that all but the first of these
394 unions has already been defined as part of the definition of the
397 \subsubsection{The ichainu union}
398 The @|ichainu| union contains a member for each class in the chain. The
401 struct $C$__ichain_$h$ $c$;
403 and this is followed by corresponding members
405 struct $A$__ichain_$h$ $a$;
407 for each of $C$'s superclasses $A$ in the same chain in some (unimportant)
410 \subsubsection{The ichain structure}
413 structure contains (in order), a pointer
415 const struct $C$__vt_$h$ *_vt;
417 followed by a structure
419 struct $A$__islots $a$;
421 for each superclass $A$ of $C$ in the same chain which defines slots, from
422 least- to most-specific; if $C$ defines any slots, then the last member is
424 struct $C$__islots $c$;
426 A `pointer to $C$' is always assumed (and, indeed, defined in C's
427 type system) to be a pointer to the @|struct $C$__ichain_$h$|.
429 \subsubsection{The islots structure}
430 Finally, the @|islots| structure simply contains one member for each slot
431 defined by $C$ in the order they appear in the class definition.
434 \subsection{Generic vtable structure} \label{sec:structures.layout.vtable}
436 As described above, each @|ichain| structure of an instance's storage has a
439 const struct $C$__vt_$h$ *_vt;
441 In general, the vtables for the different chains will have \emph{different}
444 The instance layout split neatly into disjoint chains. This is necessary
445 because each @|ichain| must have as a prefix the @|ichain| for each
446 superclass in the same chain, and each slot must be stored in exactly one
447 place. The layout of vtables doesn't have this second requirement: it
448 doesn't matter that there are multiple method entry pointers for the same
449 effective method as long as they all work correctly. Indeed, it's essential
450 that they do, because each chain's method entry function will need to apply a
451 different offset to the receiver pointer before invoking the effective
454 A vtable for a class $C$ with chain head $H$ has the following general
457 union $C$__vtu_$h$ \{ \\ \ind
458 struct $C$__vt_$h$ \{ \\ \ind
459 const $P$ *_class; \\
462 const $Q$ *_cls_$j$; \\
464 ptrdiff_t _off_$i$; \\
466 struct $C$__vtmsgs_$a$ \{ \\ \ind
467 @<type> (*@<msg>)($C$ *, $\dots$); \\
474 extern const union $C$__vtu_$h$ $C$__vtable_$h$;
477 \subsubsection{The vtu union}
478 The outer layer is a @|union $C$__vtu_$h$| containing a member
480 struct $A$__vt_$h$ $a$;
482 for each of $C$'s superclasses $A$ in the same chain, with $C$ itself listed
485 This is mostly an irrelevant detail,
486 whose purpose is to defend against malicious compilers:
487 pointers are always to one of the inner
490 It's important only because it's the outer
492 union which is exported by name.
493 Specifically, for each chain of
496 there is an external object
498 const union $A$__vtu_$i$ $C$__vtable_$i$;
500 where $A$ and $I$ are respectively the most and least specific classes in the
503 \subsubsection{The vt structure}
504 The first member in the @|vt| structure is the \emph{root class pointer}
508 Among the superclasses of $C$ there must be exactly one class $O$ which
509 itself has no direct superclasses; this is the \emph{root superclass} of $C$.
510 (This is a rule enforced by the Sod translator.) The metaclass $R$ of $O$ is
511 then the \emph{root metaclass} of $C$. The @|_class| member points to the
512 @|ichain| structure of most specific superclass $P$ of $M$ in the same chain
515 This is followed by the \emph{base offset}
519 which is simply the offset of the @|ichain| structure from the instance base.
521 The rest of the vtable structure is populated by walking the superclass chain
522 containing $C$ as follows. For each such superclass $B$, in increasing order
523 of specificity, walk the class precedence list of $B$, again starting with
524 its least-specific superclass. (This complex procedure guarantees that the
525 vtable structure for a class is a prefix of the vtable structure for any of
526 its subclasses in the same chain.)
528 So, let $A$ be some superclass of $C$ which has been encountered during this
533 \item Let $N$ be the metaclass of $A$. Examine the superclass chains of $N$
534 in order of decreasing specificity of their most-specific classes. Let $J$
535 be the chain head of such a chain, and let $Q$ be the most specific
536 superclass of $M$ in the same chain as $J$. Then, if there is currently no
537 class pointer of type $Q$, then add a member
541 to the vtable pointing to the appropriate @|islots| structure within $M$'s
544 \item Examine the superclass chains of $A$ in order of decreasing specificity
545 of their most-specific classes. Let $I$ be the chain head of such a chain.
546 If there is currently no member @|_off_$i$| then add a member
550 to the vtable, containing the (signed) offset from the @|ichain| structure
551 of the chain headed by $h$ to that of the chain headed by $i$ within the
554 \item If class $A$ defines any messages, and there is currently no member
555 $a$, then add a member
557 struct $C$__vtmsgs_$a$ $a$;
559 to the vtable. See below.
563 \subsubsection{The vtmsgs structure}
564 Finally, the @|vtmsgs| structures contain pointers to the effective method
565 entry functions for the messages defined by a superclass. There may be more
566 than one method entry for a message, but all of the entry pointers for a
567 message appear together, and entry pointers for separate messages appear in
568 the order in which the messages are defined. If the receiver class has no
569 applicable primary method for a message then it's usual for the method entry
570 pointer to be null (though, as with a lot of things in Sod, extensions may do
571 something different).
573 For a standard message which takes a fixed number of arguments, defined as
575 @<type>_0 $m$(@<type>_1 @<arg>_1, $\ldots$, @<type>_n @<arg>_n);
577 there is always a `main' entry point,
579 @<type>_0 $m$($C$ *me, @<type>_1 @<arg>_1, $\ldots$, @<type>_n @<arg>_n);
582 For a standard message which takes a variable number of arguments,
585 @<type>_0 $m$(@<type>_1 @<arg>_1, $\ldots$, @<type>_n @<arg>_n, \dots);
587 or a standard message which takes keyword arguments, defined as
589 @<type>_0 $m$(\=@<type>_1 @<arg>_1, $\ldots$, @<type>_n @<arg>_n? \+ \\
590 @<type>_{n+1} @<kw>_{n+1} @[= @<dflt>_{n+1}@], $\ldots$,
591 @<type>_m @<kw>_m @[= @<dflt>_m@]);
593 two entry points are defined: the usual `main' entry point which accepts a
594 variable number of arguments, and a `valist' entry point which accepts an
595 argument of type @|va_list| in place of the variable portion of the argument
598 @<type>_0 $m$($C$ *me, @<type>_1 @<arg>_1, $\ldots$,
599 @<type>_n @<arg>_n, \dots); \\
600 @<type>_0 $m$__v($C$ *me, @<type>_1 @<arg>_1, $\ldots$,
601 @<type>_n @<arg>_n, va_list sod__ap);
605 \subsection{Additional definitions} \label{sec:structures.layout.additional}
607 In addition to the instance and vtable structures described above, the
608 following definitions are made for each class $C$.
610 For each message $m$ directly defined by $C$ there is a macro definition
612 \#define $C$_$m$(@<me>, $\ldots$) @<me>@->_vt@->$c$.$m$(@<me>, $\ldots$)
614 which makes sending the message $m$ to an instance of (any subclass of) $C$
617 If $m$ takes a variable number of arguments, or keyword arguments, the macro
618 is more complicated and is only available in compilers advertising C99
619 support, but the effect is the same. For each variable-argument message,
620 there is also an additional macro for calling the `valist' entry point.
622 \#define $C$_$m$__v(@<me>, $\ldots$, @<sod__ap>)
623 @<me>@->_vt@->$c$.$m$__v(@<me>, $\ldots$, @<sod__ap>)
626 For each proper superclass $A$ of $C$, there is a macro defined
628 $A$ *$C$__CONV_$a$($C$ *_obj);
630 (named in \emph{upper case}) which converts a (static-type) pointer to $C$ to
631 a pointer to the same actual instance, but statically typed as a pointer to
632 $A$. This is most useful when $A$ is not in the same chain as $C$ since
633 in-chain upcasts are both trivial and rarely needed, but the full set is
634 defined for the sake of completeness.
636 Finally, the class object is defined as
638 extern const struct $R$__ilayout $C$__classobj; \\
639 \#define $C$__class (\&$C$__classobj.$j$.$r$)
641 The exported symbol @|$C$__classobj| contains the entire class instance.
642 This is usually rather unwieldy. The macro @|$C$__class| is usable as a
643 pointer of type @|const $R$~*|, where $R$ is the root metaclass of $C$, i.e.,
644 the metaclass of the least specific superclass of $C$; usually this is
647 %%%----- That's all, folks --------------------------------------------------
651 %%% TeX-master: "sod.tex"