lib/keyword.3.in, lib/sod-structs.3.in: Use `.VS' and `.VE'.
[sod] / lib / sod-structs.3.in
CommitLineData
47de28ae
MW
1.\" -*-nroff-*-
2.\"
3.\" Description of the main Sod data structures
4.\"
5.\" (c) 2015 Straylight/Edgeware
6.\"
7.
8.\"----- Licensing notice ---------------------------------------------------
9.\"
e0808c47 10.\" This file is part of the Sensible Object Design, an object system for C.
47de28ae
MW
11.\"
12.\" SOD is free software; you can redistribute it and/or modify
65aaa02c
MW
13.\" it under the terms of the GNU Library General Public License as
14.\" published by the Free Software Foundation; either version 2 of the
15.\" License, or (at your option) any later version.
47de28ae
MW
16.\"
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
65aaa02c 20.\" GNU Library General Public License for more details.
47de28ae 21.\"
65aaa02c
MW
22.\" You should have received a copy of the GNU Library General Public
23.\" License along with SOD; if not, write to the Free
24.\" Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25.\" MA 02111-1307, USA.
47de28ae 26.
6bed6ea3
MW
27.\"--------------------------------------------------------------------------
28.so ../common/defs.man \" @@@PRE@@@
47de28ae
MW
29.
30.\"--------------------------------------------------------------------------
31.TH sod-structs 3 "8 September 2015" "Straylight/Edgeware" "Sensible Object Design"
32.
33.SH NAME
34sod-structs \- main Sod data structures
35.
36.\"--------------------------------------------------------------------------
37.SH SYNOPSIS
38.nf
39.ft B
40#include <sod/sod.h>
41
42typedef struct SodObject__ichain_obj SodObject;
43typedef struct SodClass__ichain_obj SodClass;
44
45struct sod_instance {
46\h'2n'const struct sod_vtable *_vt;
47};
48
49struct sod_vtable {
50\h'2n'const SodClass *_class;
51\h'2n'size_t _base;
52};
53
54struct SodObject__vt_obj {
55\h'2n'const SodClass *_class;
56\h'2n'size_t _base;
a142609c
MW
57\h'2n'struct SodObject__vtmsgs_obj {
58\h'4n'void (*init)(SodObject *\fIme\fB, ...);
59\h'4n'void (*init__v)(SodObject *\fIme\fB, va_list);
a42893dd 60\h'4n'int (*teardown)(SodObject *\fIme\fB);
a142609c 61\h'2n'} obj;
47de28ae
MW
62};
63
64struct SodObject__ilayout {
65\h'2n'union {
66\h'4n'struct SodObject__ichain_obj {
67\h'6n'const struct SodObject__vt_obj *_vt;
68\h'4n'};
69\h'2n'} obj;
70};
71
72extern const struct SodClass__ilayout SodObject__classobj;
73#define SodObject__class (&SodObject__classobj.obj.cls)
74
75struct SodClass__vt_obj {
76\h'2n'const SodClass *_class;
77\h'2n'size_t _base;
a142609c
MW
78\h'2n'struct SodClass__vtmsgs_obj {
79\h'4n'void (*init)(SodClass *\fIme\fB, ...);
80\h'4n'void (*init__v)(SodClass *\fIme\fB, va_list);
a42893dd 81\h'4n'int (*teardown)(SodClass *\fIme\fB);
a142609c 82\h'2n'} obj;
47de28ae
MW
83};
84
8263521d 85struct SodClass__ilayout {
47de28ae
MW
86\h'2n'union {
87\h'4n'struct SodClass__ichain_obj {
88\h'6n'const struct SodClass__vt_obj *_vt;
89\h'6n'struct SodClass__islots {
90\h'8n'const char *name;
91\h'8n'const char *nick;
92\h'8n'size_t initsz;
8c2c58ae 93\h'8n'size_t align;
47de28ae 94\h'8n'void *(*imprint)(void *\fIp\fB);
47de28ae
MW
95\h'8n'size_t n_supers;
96\h'8n'const SodClass *const *supers;
97\h'8n'size_t n_cpl;
98\h'8n'const SodClass *const *cpl;
99\h'8n'const SodClass *link;
100\h'8n'const SodClass *head;
101\h'8n'size_t level;
102\h'8n'size_t n_chains;
103\h'8n'const struct sod_chain *chains;
104\h'8n'size_t off_islots;
105\h'8n'size_t islotsz;
106\h'6n'} cls;
107\h'4n'};
108\h'4n'SodObject obj;
109\h'2n'} obj;
110};
111
112struct sod_chain {
113\h'2n'size_t n_classes;
114\h'2n'const SodClass *const *classes;
115\h'2n'size_t off_ichain;
116\h'2n'const struct sod_vtable *vt;
117\h'2n'size_t ichainsz;
118};
119
120extern const struct SodClass__ilayout SodClass__classobj;
121#define SodClass__class (&SodClass__classobj.obj.cls)
122.fi
123.ft P
124.
125.\"--------------------------------------------------------------------------
126.SH DESCRIPTION
127.
128This page describes the structure and layout
129of standard Sod objects, classes and associated metadata.
130Note that Sod's object system is very flexible
131and it's possible for an extension
132to define a new root class
133which works very differently from the standard
134.B SodObject
135described here.
136.
137.\"--------------------------------------------------------------------------
138.SH COMMON INSTANCE STRUCTURE
139.
140As described below,
141a pointer to an instance actually points to an
142.I "instance chain"
143structure within the instances overall layout structure.
144.PP
145Instance chains contain slots and vtable pointers,
146as described below.
147All instances have the basic structure of a
148.BR "struct sod_instance" ,
149which has the following members.
150.TP
151.B "const struct sod_vtable *_vt"
152A pointer to a
153.IR vtable ,
154which has the basic structure of a
155.BR "struct sod_vtable" ,
156described below.
157.PP
158A vtable contains static metadata needed
159for efficient conversions and
160message dispatch,
161and pointers to the instance's class.
162Each chain points to a different vtable
163All vtables have the basic structure of a
164.BR "struct sod_vtable" ,
165which has the following members.
166.TP
167.B "const SodClass *_class"
168A pointer to the instance's class object.
169.TP
170.B "size_t _base;"
171The offset of this chain structure
172above the start of the overall instance layout, in bytes.
173Subtracting
174.B _base
175from the instance chain pointer
176finds the layout base address.
177.
178.\"--------------------------------------------------------------------------
179.SH BUILT-IN ROOT OBJECTS
180.
181This section describes the built-in classes
182.B SodObject
183and
184.BR SodClass ,
185which are the standard roots of the inheritance and metaclass graphs
186respectively.
187Specifically,
188.B SodObject
189has no direct superclasses,
190and
191.B SodClass
192is its own metaclass.
9c4a4110
MW
193It is not possible to define root classes in module files
194because of circularities:
47de28ae
MW
195.B SodObject
196has
197.B SodClass
9c4a4110
MW
198as its metaclass,
199and
47de28ae
MW
200.B SodClass
201is a subclass of
202.BR SodObject .
203Extensions can define additional root classes,
204but this is tricky,
205and not really to be recommended.
206.
207.SS The SodObject class
208The
209.B SodObject
a142609c 210class defines no slots.
47de28ae
MW
211Because
212.B SodObject
213has no direct superclasses,
214there is only one chain,
215and no inherited slots or messages,
216so the single chain contains only a vtable pointer.
217.PP
a142609c 218Since
47de28ae
MW
219.B SodClass
220also has only one chain,
221the vtable contains only the standard class pointer and offset-to-base
222members.
223In an actual instance of
224.B SodObject
225(why would you want one?)
226the class pointer contains the address of
227.B SodObject__class
228and the offset is zero.
a142609c
MW
229.PP
230The
231.B init
232message is used to initialize a newly allocated instance.
233.PP
234This message uses a custom method combination
235which works like the standard method combination
236except that default behaviour
237specific to the receiver's direct class
238is invoked if no primary or around method overrides.
239This default behaviour may be invoked multiple times
240if some method calls on its
241.B next_method
242function more than once.
243.PP
244This default behaviour is to initialize the instance's slots
a42893dd
MW
245using the defined slot initializers,
246and execute the initialization fragments.
247Each slot is initialized
a142609c
MW
248using the most specific applicable initializer,
249if any.
250Slots without an initializer
251are left uninitialized.
252.PP
a42893dd
MW
253Slots are initialized and initialization fragments executed together,
254a superclass at a time:
255first, the superclass's slots are initialized (if any);
256then the superclass's initialization fragments (if any) are executed,
257starting with the least specific superclass first.
258Slots and initialization fragments defined by the same class
259are processed in the order in which they appear in the class definition.
a142609c
MW
260.PP
261There are no standard keyword arguments;
262methods on subclasses are free to
263introduce their own in the usual way.
264.PP
265It is usual to provide complex initialization behaviour as
266.B after
267methods.
268This ensures that slots have been initialized as necessary
269before the method executes.
a42893dd
MW
270.PP
271The
272.B teardown
273message is used to tear down an instance which is no longer required.
274.PP
275The message returns an integer flag.
276A zero value means that the instance is safe to deallocate.
277A nonzero value means that the instance should not be deallocated,
278and that it is safe for the caller to simply forget about it.
279This simple protocol may be used, for example,
280to implement a reference-counting system.
281.PP
282This message uses a custom method combination
283which works like the standard method combination
284except that default behaviour is invoked if
285no primary or around method overrides.
286This default behaviour is to execute
287each superclass's teardown fragments,
288most specific first,
289and then return zero to indicate
290that the object is ready for deallocation.
291Teardown fragments defined by the same class
292are processed in the order in which they appear
293in the class definition.
294.PP
295It is usual to provide complex teardown behaviour as
296.B before
297methods.
298Logic to decide whether to allow deallocation
299is usually implemented as
300.B around
301methods.
47de28ae
MW
302.
303.SS The SodClass class
304The
305.B SodClass
306class defines no messages,
307but there are a number of slots.
308Its only direct superclass is
309.B SodObject
310and so (like its superclass) its vtable is trivial.
311.PP
312The slots defined are as follows.
313.TP
314.B const char *name;
315A pointer to the class's name.
316.TP
317.B const char *nick;
318A pointer to the class's nickname.
319.TP
320.B size_t initsz;
321The size in bytes required to store an instance of the class.
322.TP
8c2c58ae
MW
323.B size_t align;
324A sufficient alignment for the class's instance storage.
325.TP
47de28ae
MW
326.BI "void *(*imprint)(void *" p );
327A pointer to a function:
328given a pointer
329.I p
330to at least
331.I initsz
332bytes of appropriately aligned memory,
333`imprint' this memory it so that it becomes a minimally functional
334instance of the class:
335all of the vtable and class pointers are properly initialized,
336but the slots are left untouched.
337The function returns its argument
338.IR p .
339.TP
47de28ae
MW
340.B size_t n_supers;
341The number of direct superclasses.
342(This is zero exactly in the case of
343.BR SodObject .)
344.TP
345.B const SodClass *const *supers;
346A pointer to an array of
347.I n_supers
348pointers to class objects
349listing the class's direct superclasses,
350in the order in which they were listed in the class definition.
351If
352.I n_supers
353is zero,
354then this pointer is null.
355.TP
356.B size_t n_cpl;
357The number of superclasses in the class's class precedence list.
358.TP
359.B const SodClass *const *cpl;
360A pointer to an array of pointers to class objects
361listing all of the class's superclasses,
362from most- to least-specific,
363starting with the class itself,
364so
365.IB c ->cls.cpl[0]
366=
367.I c
368for all class objects
369.IR c .
370.TP
371.B const SodClass *link;
372If the class is a chain head, then this is a null pointer;
373otherwise it points to the class's distinguished link superclass
374(which might or might not be a direct superclass).
375.TP
376.B const SodClass *head;
377A pointer to the least-specific class in this class's chain;
378so
379.IB c ->cls.head->cls.link
380is always null,
381and either
382.IB c ->cls.link
383is null
384(in which case
385.IB c ->cls.head
386=
387.IR c )
388or
389.IB c ->cls.head
390=
391.IB c ->cls.link->cls.head \fR.
392.TP
393.B size_t level;
394The number of less specific superclasses in this class's chain.
395If
396.IB c ->cls.link
397is null then
398.IB c ->cls.level
399is zero;
400otherwise
401.IB c ->cls.level
402=
403.IB c ->cls.link->cls.level
404+ 1.
405.TP
406.B size_t n_chains;
407The number of chains formed by the class's superclasses.
408.TP
409.B const struct sod_chain *chains;
410A pointer to an array of
411.B struct sod_chain
412structures (see below) describing the class's superclass chains,
413in decreasing order of specificity of their most specific classes.
414It is always the case that
415.IB c ->cls.chains[0].classes[ c ->cls.level]
416=
417.IR c .
418.TP
419.B size_t off_islots;
420The offset of the class's
421.B islots
422structure relative to its containing
423.B ichain
424structure.
425The class doesn't define any slots if and only if this is zero.
426(The offset can't be zero because the vtable pointer is at offset zero.)
427.TP
428.B size_t islotsz;
429The size required to store the class's direct slots,
430i.e., the size of its
431.B islots
432structure.
433The class doesn't define any slots if and only if this is zero.
434.PP
435The
436.B struct sod_chain
437structure describes an individual chain of superclasses.
438It has the following members.
439.TP
440.B size_t n_classes;
441The number of classes in the chain.
442This is always at least one.
443.TP
444.B const SodClass *const *classes;
445A pointer to an array of class pointers
446listing the classes in the chain from least- to most-specific.
447So
448.IB classes [ i ]->cls.head
449=
450.IB classes [0]
451for all
4520 \(<=
453.I i
454<
455.IR n_classes ,
456.IB classes [0]->cls.link
457is always null,
458and
459.IB classes [ i ]->cls.link
460=
461.IB classes [ "i\fR \- 1" ]
462if
4631 \(<=
464.I i
465<
466.IR n_classes .
467.TP
468.B size_t off_ichain;
469The size of the
470.B ichain
471structure for this chain.
472.TP
473.B const struct sod_vtable *vt;
474The vtable for this chain.
475(It is possible, therefore, to duplicate the behaviour of the
476.I imprint
477function by walking the chain structure.
478The
479.I imprint
480function is much faster, though.)
481.TP
482.B size_t ichainsz;
483The size of the
484.B ichain
485structure for this chain.
486.
487.\"--------------------------------------------------------------------------
488.SH CLASS AND VTABLE LAYOUT
489.
490The layout algorithms for Sod instances and vtables are nontrivial.
491They are defined here in full detail,
492since they're effectively fixed by Sod's ABI compatibility guarantees,
493so they might as well be documented for the sake of interoperating
494programs.
495.PP
496Unfortunately, the descriptions are rather complicated,
497and, for the most part not necessary to a working understanding of Sod.
498The skeleton structure definitions shown should be more than enough
499for readers attempting to make sense of the generated headers and tables.
500.PP
501In the description that follows,
502uppercase letters vary over class names,
503while the corresponding lowercase letters indicate the class nicknames.
504Throughout, we consider a class
505.I C
506(therefore with nickname
507.IR c ).
508.
509.SS Generic instance structure
510The entire state of an instance of
511.I C
512is contained in a single structure of type
513.B struct
514.IB C __ilayout \fR.
f759343a 515.VS
47de28ae
MW
516struct \fIC\fB__ilayout {
517\h'2n'union \fIC\fB__ichainu_\fIh\fB {
518\h'4n'struct \fIC\fB__ichain_\fIh\fB {
519\h'6n'const struct \fIC\fB__vt_\fIh\fB *_vt;
520\h'6n'struct \fIH\fB__islots \fIh\fB;
521\h'6n'\fR...\fB
522\h'6n'struct \fIC\fB__islots {
523\h'8n'\fItype\fB \fIslota\fB;
524\h'8n'\fR...\fB
525\h'6n'} \fIc\fB;
526\h'4n'} \fIc\fB;
527\h'4n'\fR...\fB
faf3eb58 528\h'4n'struct \fIA\fB__ichain_\fIh\fB \fIa\fB;
47de28ae
MW
529\h'2n'} \fIh\fB;
530\h'2n'union \fIB\fB__ichainu_\fIi\fB \fIi\fB;
531\h'2n'\fR...\fB
532};
533
534typedef struct \fIC\fB__ichain_\fIh\fB \fIC\fB;
f759343a 535.VE
47de28ae
MW
536The set of superclasses of
537.IR C ,
538including itself,
539can be partitioned into chains
540by following their distinguished superclass links.
541(Formally, the chains are the equivalence classes determined by
542the reflexive, symmetric, transitive closure of
543the `links to' relation.)
544Chains are identified by naming their least specific classes;
545the least specific class in a chain is called the
546.IR "chain head" .
547Suppose that the chain head of the chain containing
548.I C
549itself is named
550.I H
551(though keep in mind that it's possible that
552.I H
553is in fact
554.I C
555itself.)
556.PP
557The
558.B ilayout
559structure contains one member for each of
560.IR C 's
561superclass chains.
562The first such member is
563.IP
564.B
565.B union
566.IB C __ichainu_ h
567.IB h ;
568.PP
569described below;
570this is followed by members
571.IP
572.B union
573.IB B __ichainu_ i
574.IB i ;
575.PP
576for each other chain,
577where
578.I I
579is the head
580and
581.I B
582the tail (most-specific) class of the chain.
583The members are in decreasing order
584of the specificity of the chains' most-specific classes.
585(Note that all but the first of these unions
586has already been defined as part of
587the definition of the corresponding
588.IR B .)
589.PP
590The
591.B ichainu
592union contains a member for each class in the chain.
593The first is
594.IP
595.B struct
596.IB C __ichain_ h
597.IB c ;
598.PP
599and this is followed by corresponding members
600.IP
601.B struct
602.IB A __ichain_ h
603.IB a ;
604.PP
605for each of
9c4a4110
MW
606.IR C 's
607superclasses
47de28ae
MW
608.IR A
609in the same chain in some (unimportant) order.
f9bc613c
MW
610The (somewhat obtuse) purpose of this union is to
611engage the `common initial sequence' rule of
612C99 (clause 6.5.2.3).
47de28ae
MW
613.PP
614The
615.B ichain
616structure contains (in order), a pointer
617.IP
618.B const
619.B struct
620.IB C __vt_ h
621.B *_vt;
622.PP
623followed by a structure
624.IP
625.B struct
626.IB A __islots
627.IB a ;
628.PP
629for each superclass
630.I A
631of
632.IR C
633in the same chain which defines slots,
634from least- to most-specific;
635if
636.I C
637defines any slots,
638then the last member is
639.IP
640.B struct
641.IB C __islots
642.IB c ;
643.PP
23e62934
MW
644A `pointer to
645.IR C '
646is always assumed
647(and, indeed, defined in C's type system)
648to be a pointer to the
649.B struct
650.IB C __ichain_ h \fR.
651.PP
47de28ae
MW
652Finally, the
653.B islots
654structure simply contains one member for each slot defined by
655.I C
656in the order they appear in the class definition.
657.
658.SS Generic vtable structure
659As described above,
660each
661.B ichain
662structure of an instance's storage
663has a vtable pointer
664.IP
665.B const
666.B struct
667.IB C __vt_ h
668.B *_vt;
669.PP
670In general,
671the vtables for the different chains
672will have
673.I different
674structures.
675.PP
756e9293 676The instance layout splits neatly into disjoint chains.
47de28ae
MW
677This is necessary because
678each
679.B ichain
680must have as a prefix the
681.B ichain
9c4a4110
MW
682for each superclass in the same chain,
683and each slot must be stored in exactly one place.
47de28ae
MW
684The layout of vtables doesn't have this second requirement:
685it doesn't matter that there are
686multiple method entry pointers
687for the same effective method
688as long as they all work correctly.
74bf1b29 689Indeed, it's essential that there are multiple entry pointers,
9c4a4110
MW
690because each chain's method entry function
691will need to apply a different offset to the receiver pointer
692before invoking the effective method.
47de28ae
MW
693.PP
694A vtable for a class
695.I C
696with chain head
697.I H
698has the following general structure.
f759343a 699.VS
47de28ae
MW
700union \fIC\fB__vtu_\fIh\fB {
701\h'2n'struct \fIC\fB__vt_\fIh\fB {
702\h'4n'const \fIP\fB *_class;
703\h'4n'size_t _base;
704\h'4n'\fR...\fB
705\h'4n'const \fIQ\fB *_cls_\fIj\fB;
706\h'4n'\fR...\fB
707\h'4n'ptrdiff_t _off_\fIi\fB;
708\h'4n'\fR...\fB
709\h'4n'struct \fIC\fB__vtmsgs_\fIa\fB {
710\h'6n'\fItype\fB (*\fImsg\fB)(\fIC\fB *, \fR...\fB);
711\h'6n'\fR...\fB
712\h'4n'} \fIa\fB;
713\h'4n'\fR...\fB
714\h'2n'} \fIc\fB;
715};
716
717extern const union \fIC\fB__vtu_\fIh\fB \fIC\fB__vtable_\fIh\fB;
f759343a 718.VE
fa388683
MW
719In the following,
720let
721.I M
722be the metaclass of
723.IR C .
724.PP
47de28ae 725The outer layer is a
47de28ae
MW
726.B union
727.IB C __vtu_ h
47de28ae
MW
728containing a member
729.IP
730.B struct
731.IB A __vt_ h
732.IB a ;
733.PP
734for each of
735.IR C 's
736superclasses
737.I A
738in the same chain,
739with
740.I C
741itself listed first.
742This is mostly an irrelevant detail,
743whose purpose is to defend against malicious compilers:
744pointers are always to one of the inner
745.B vt
746structures.
747It's important only because it's the outer
748.B vtu
749union which is exported by name.
750Specifically, for each chain of
751.IR C 's
752superclasses
753there is an external object
754.IP
755.B const union
756.IB A __vtu_ i
757.IB C __vtable_ i ;
758.PP
759where
760.I A
761and
762.I I
763are respectively the most and least specific classes in the chain.
764.PP
765The first member in the
766.B vt
767structure is the
768.I root class pointer
769.IP
770.B const
771.IR P
772.B *_class;
773.PP
774Among the superclasses of
775.I C
776there must be exactly one class
777.I O
778which itself has no direct superclasses;
779this is the
780.I root superclass
781of
782.IR C .
783(This is a rule enforced by the Sod translator.)
784The metaclass
785.I R
786of
9c4a4110 787.I O
47de28ae
MW
788is then the
789.I root metaclass
790of
791.IR C .
792The
793.B _class
794member points to the
795.B ichain
796structure of most specific superclass
797.I P
798of
799.I M
800in the same chain as
801.IR R .
802.PP
803This is followed by the
804.I base offset
805.IP
806.B size_t
807.B _base;
808.PP
809which is simply the offset of the
810.B ichain
811structure from the instance base.
812.PP
813The rest of the vtable structure is populated
814by walking the superclass chain containing
815.I C
816as follows.
817For each such superclass
818.IR B ,
819in increasing order of specificity,
820walk the class precedence list of
821.IR B ,
822again starting with its least-specific superclass.
823(This complex procedure guarantees that
824the vtable structure for a class is a prefix of
825the vtable structure for any of its subclasses in the same chain.)
826.PP
827So, let
828.I A
829be some superclass of
830.I C
831which has been encountered during this traversal.
832.hP \*o
833Let
834.I N
835be the metaclass of
836.IR A .
837Examine the superclass chains of
838.I N
839in order of decreasing specificity of their most-specific classes.
840Let
841.I J
842be the chain head of such a chain,
843and let
844.I Q
845be the most specific superclass of
846.I M
847in the same chain as
848.IR J .
9a9a7b35
MW
849If there is currently no class pointer
850for the chain headed by
851.IR J ,
47de28ae
MW
852then add a member
853.RS
854.IP
855.B const
856.I Q
857.BI *_cls_ j ;
858.PP
859to the vtable
860pointing to the appropriate
861.B islots
862structure within
863.IR M 's
9a9a7b35
MW
864class object,
865where
866.I Q
867is the most specific superclass of
868.I M
869in the same chain as
870.IR J .
47de28ae
MW
871.RE
872.hP \*o
873Examine the superclass chains of
874.I A
875in order of decreasing specificity of their most-specific classes.
876Let
877.I I
878be the chain head of such a chain.
879If there is currently no member
880.BI _off_ i
881then add a member
882.RS
883.IP
884.B ptrdiff_t
885.BI _off_ i ;
886.PP
887to the vtable,
888containing the (signed) offset from the
889.B ichain
890structure of the chain headed by
891.I h
892to that of the chain headed by
893.I i
894within the instance's layout.
895.RE
896.hP \*o
897If class
898.I A
899defines any messages,
900and there is currently no member
9c4a4110 901.IR a ,
47de28ae
MW
902then add a member
903.RS
904.IP
905.B struct
906.IB C __vtmsgs_ a
907.IB a ;
908.PP
909to the vtable.
910See below.
911.RE
912.PP
913Finally, the
914.B vtmsgs
915structures contain pointers to the effective method entry functions
916for the messages defined by a superclass.
917There may be more than one method entry for a message,
918but all of the entry pointers for a message appear together,
919and entry pointers for separate messages appear
920in the order in which the messages are defined.
921If the receiver class has no applicable primary method for a message
922then it's usual for the method entry pointer to be null
923(though, as with a lot of things in Sod,
924extensions may do something different).
925.PP
926For a standard message which takes a fixed number of arguments,
927defined as
928.IP
929.I tr
930.IB m ( \c
931.I t1
932.IB a1 ,
933.RB ... ,
934.I tn
935.IB an );
936.PP
937there is always a `main' entry point,
938.IP
939.I tr
940.BI (* m )( \c
941.I C
942.BI * me ,
943.I t1
944.IB a1 ,
945.RB ... ,
946.I tn
947.IB an );
948.PP
949For a standard message which takes a variable number of arguments,
950defined as
951.IP
952.I tr
953.IB m ( \c
954.I t1
955.IB a1 ,
956.RB ... ,
957.I tn
958.IB an ,
959.B ...);
960.PP
43073476
MW
961or a standard message which takes keyword arguments,
962defined as
963.IP
964.I tr
965.IB m ( \c
966.I t1
967.IB a1 ,
968.RB ... ,
969.I tn
970.IB an ?\&
971.IR tn +1
972.IR kn +1
973.RB [ =
974.IR dn +1] \c
975.B ,
976.I tm
977.I km
978.RB [ =
979.IR dm ] \c
980);
981.PP
47de28ae
MW
982two entry points are defined:
983the usual `main' entry point
984which accepts a variable number of
985arguments,
986and a `valist' entry point
987which accepts an argument of type
988.B va_list
43073476
MW
989in place of the variable portion of the argument list
990or keywords.
47de28ae
MW
991.IP
992.I tr
993.BI (* m )( \c
994.I C
995.BI * me ,
996.I t1
997.IB a1 ,
998.RB ... ,
999.I tn
1000.IB an ,
1001.B ...);
1002.br
1003.I tr
1004.BI (* m __v)( \c
1005.I C
1006.BI * me ,
1007.I t1
1008.IB a1 ,
1009.RB ... ,
1010.I tn
1011.IB an ,
1012.B va_list
1013.IB sod__ap );
1014.
1015.SS Additional definitions
1016In addition to the instance and vtable structures described above,
1017the following definitions are made for each class
1018.IR C .
1019.PP
1020For each message
1021.I m
1022directly defined by
1023.I C
1024there is a macro definition
1025.IP
1026.B #define
1027.IB C _ m ( me ,
1028.RB ... )
1029.IB me ->_vt-> c . m ( me ,
1030.RB ... )
1031.PP
1032which makes sending the message
1033.I m
1034to an instance of (any subclass of)
1035.I C
1036somewhat less ugly.
1037If
1038.I m
1039takes a variable number of arguments,
43073476 1040or keyword arguments,
47de28ae
MW
1041the macro is more complicated
1042and is only available in compilers advertising C99 support,
1043but the effect is the same.
1044For each variable-argument message,
1045there is also an additional macro
1046for calling the `valist' entry point.
1047.IP
1048.B #define
1049.IB C _ m __v( me ,
1050.RB ...,
1051.IB sod__ap )
1052.if !t \{\
1053\e
1054.br
1055\h'4m'\c
1056.\}
1057.IB me ->_vt-> c . m __v( me ,
1058.RB ...,
1059.IB sod__ap )
1060.PP
1061For each proper superclass
1062.I A
1063of
1064.IR C ,
1065there is a macro defined
1066.IP
1067.I A
1068.BI * C __CONV_ a ( C
1069.BI * _obj );
1070.PP
1071(named in
1072.IR "upper case" )
1073which converts a (static-type) pointer to
1074.I C
1075to a pointer to the same actual instance,
1076but statically typed as a pointer to
1077.IR A .
1078This is most useful when
1079.I A
1080is not in the same chain as
1081.I C
1082since in-chain upcasts are both trivial and rarely needed,
1083but the full set is defined for the sake of completeness.
1084.PP
1085Finally, the class object is defined as
1086.IP
1087.B extern const struct
1088.IB R __ilayout
1089.IB C __classobj;
1090.br
1091.B #define
1092.IB C __class
1093.BI (& C __classobj. j . r )
489173a5
MW
1094.br
1095.B #define
1096.IB C __cls_ k
1097.BI (& C __classobj. k . n )
1098.br
1099\&...
47de28ae
MW
1100.PP
1101The exported symbol
1102.IB C __classobj
1103contains the entire class instance.
1104This is usually rather unwieldy.
1105The macro
1106.IB C __class
1107is usable as a pointer of type
1108.B const
1109.I R
1110.BR * ,
1111where
1112.I R
1113is the root metaclass of
1114.IR C ,
1115i.e., the metaclass of the least specific superclass of
1116.IR C ;
1117usually this is
489173a5
MW
1118.BR "const SodClass\ *" .
1119For each chain of
1120.IR C 's
1121metaclass, a macro
1122.IB C __cls_ k
1123is defined, usable as a pointer of type
1124.B const
1125.IR N \ \c
1126.BR * ,
1127where
1128.I K
1129and
1130.I N
1131are the chain's head and tail classes
1132(i.e., the least- and most-specific classes in the chain)
1133respectively;
1134this macro is
1135.I omitted
1136if
1137.IR N "\ =\ " R ,
1138i.e., in the common case where
1139.IR C 's
1140metaclass is precisely the root metaclass,
1141since the existing
1142.IB C __class
1143macro is already sufficient.
47de28ae
MW
1144.
1145.\"--------------------------------------------------------------------------
1146.SH SEE ALSO
1147.BR sod (3).
1148.
1149.\"--------------------------------------------------------------------------
1150.SH AUTHOR
1151Mark Wooding, <mdw@distorted.org.uk>
1152.
1153.\"----- That's all, folks --------------------------------------------------