chiark / gitweb /
src/method-impl.lisp: Initialize `suppliedp' flags properly.
[sod] / lib / sod.3
CommitLineData
47de28ae
MW
1.\" -*-nroff-*-
2.\"
3.\" The Sod runtime library
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.
9ed8eb2a 27.\" Highlight using terminal escapes, rather than overstriking.
47de28ae 28.\"\X'tty: sgr 1'
9ed8eb2a 29.
47de28ae
MW
30.\" String definitions and font selection.
31.ie t \{\
32. ds o \(bu
33. if \n(.g .fam P
34.\}
35.el \{\
36. ds o o
37.\}
38.
39.\" .hP TEXT -- start an indented paragraph with TEXT hanging off to the left
40.de hP
41.IP
42\h'-\w'\fB\\$1\ \fP'u'\fB\\$1\ \fP\c
43..
44.
45.\"--------------------------------------------------------------------------
46.TH sod 3 "8 September 2015" "Straylight/Edgeware" "Sensible Object Design"
47.
48.SH NAME
49sod \- Sensible Object Design runtime library
50.
51.\"--------------------------------------------------------------------------
52.SH SYNOPSIS
53.B #include <sod/sod.h>
54.PP
55.B void *\c
56.B SOD_XCHAIN(\c
57.IB chead ,
58.BI "const " cls " *" obj );
59.br
60.B ptrdiff_t
61.B SOD_OFFSETDIFF(\c
62.IB type ,
63.IB mema ,
64.IB memb );
65.br
66.IB cls "__ilayout *" \c
67.B SOD_ILAYOUT(\c
68.IB cls ,
69.IB chead ,
70.BI "const void *" obj );
47de28ae
MW
71.br
72.B void *\c
73.B SOD_INSTBASE(\c
74.BI "const " cls " *" obj );
47de28ae 75.PP
4e3a7cb2
MW
76.B const void *\c
77.B SOD_CLASSOF(\c
78.BI "const " cls " *" obj );
79.br
47de28ae
MW
80.B int
81.B sod_subclassp(\c
82.BI "const SodClass *" sub ,
83.BI "const SodClass *" super );
4e3a7cb2
MW
84.PP
85.IB cls " *" \c
86.B SOD_CONVERT(\c
87.IB cls ,
88.BI "const void *" obj );
47de28ae
MW
89.br
90.B int
91.B sod_convert(\c
92.BI "const SodClass *" cls ,
93.BI "const void *" obj );
4e3a7cb2 94.PP
a142609c
MW
95.IB cls " *" \c
96.B SOD_INIT(\c
97.IB cls ,
98.BI "void *" p ,
99.IB keywords );
100.br
101.B void *\c
102.B sod_init(\c
103.BI "const SodClass *" cls ,
104.BI "void *" p ,
105.B ...);
106.br
107.B void *\c
108.B sod_initv(\c
109.BI "const SodClass *" cls ,
110.BI "void *" p ,
111.BI "va_list " ap );
112.br
4e3a7cb2
MW
113.B SOD_DECL(\c
114.IB cls ,
115.IB var );
116.PP
47de28ae
MW
117.
118.\"--------------------------------------------------------------------------
119.SH DESCRIPTION
120.
121The functions and macros defined here generally expect that
122instances and classes inherit from the standard
123.B SodObject
124root object.
125While the translator can (at some effort) support alternative roots,
126they will require different run-time support machinery.
127.
4e3a7cb2
MW
128.SS Layout utilities
129The following macros are useful in
130finding one's way around an instance layout structure,
131given various levels of information about
132what kind of object one is dealing with,
133or for computing the tables which are used for
134this kind of navigation.
135.PP
136These macros are mostly intended for use in
137code generated by the Sod translator.
47de28ae
MW
138Others may find them useful for special effects,
139but they can be tricky to understand and use correctly
140and can't really be recommended for general use.
141.PP
142The
47de28ae
MW
143.B SOD_OFFSETDIFF
144macro returns the signed offset between
145two members of a structure or union type.
146Given a structure or union type
147.IR type ,
148and two member names
149.I mema
150and
151.IR memb ,
152then
153.B SOD_OFFSETDIFF(\c
154.IB type ,
155.IB mema ,
156.IB memb )
157gives the difference, in bytes,
158between the objects
159.IB x . mema
160and
161.IB x . memb
162for any object
163.I x
164of type
165.IR type .
166This macro is used internally when generating vtables
167and is not expected to be very useful elsewhere.
168.PP
169The
170.B SOD_ILAYOUT
171macro recovers the instance layout base address
172from a pointer to one of its instance chains.
173Specifically, given a class name
174.IR cls ,
175the nickname
176.I chead
177of the least specific class in one of
178.IR cls 's
179superclass chains,
180and a pointer
181.I obj
182to the instance storage for the chain containing
183.I chead
184within an exact instance of
185.I cls
186(i.e., not an instance of any proper subclass),
187.B SOD_ILAYOUT(\c
188.IB cls ,
189.IB chead ,
190.IB obj )
191returns the a pointer to the layout structure containing
192.IB obj .
193This macro is used internally in effective method bodies
194and is not expected to be very useful elsewhere
195since it's unusual to have such specific knowledge
196about the dynamic type of an instance.
197The
198.B SOD_INSTBASE
199macro (described below) is more suited to general use.
4e3a7cb2
MW
200.PP
201The
202.B SOD_INSTBASE
203macro finds the base address of an instance's layout.
204Given a pointer
205.BI "const " cls " *" obj
206to an instance,
207.BI SOD_INSTBASE( obj )
208returns the base address of the storage allocated to
209.IR obj .
210This is useful if you want to free a dynamically allocated instance,
211for example.
212This macro needs to look up an offset in
213.IR obj 's
214vtable to do its work.
215Compare
216.B SOD_ILAYOUT
217above,
218which is faster but requires
219precise knowledge of the instance's dynamic class.
47de28ae 220.
4e3a7cb2
MW
221.SS Classes
222The following macros and functions
223query the runtime relationhips between
224instances and classes.
47de28ae
MW
225.PP
226The
227.B SOD_CLASSOF
228macro returns the class object describing an instance's dynamic class.
229Given a pointer
230.BI "const " cls " *" obj
231to an instance,
232.BI SOD_CLASSOF( obj )
233returns a pointer to
234.IR obj 's
235dynamic class,
236which
237(assuming
238.I obj
239is typed correctly in the first place)
240will be a subclass of
241.IR cls .
242(If you wanted the class object for
243.I cls
244itself,
245it's called
246.IB cls __class \fR.)
247.PP
248The
4e3a7cb2
MW
249.B sod_subclassp
250function answers whether one class
251.I sub
252is actually a subclass of another class
253.IR super .
254.B sod_subclassp(\c
255.IB sub ,
256.IB super )
257returns nonzero if and only if
258.I sub
259is a subclass of
260.IR super .
261This involves a run-time trawl through the class structures:
262while some effort has been made to make it perform well
263it's still not very fast.
264.
265.SS Conversions
266The following macros and functions are used
267to convert instance pointers of some (static) type
268into instance pointers of other static types
269to the same instance.
270.PP
271The
272.B SOD_XCHAIN
273macro performs a `cross-chain upcast'.
47de28ae 274Given a pointer
4e3a7cb2
MW
275.I cls
276.BI * obj
277to an instance of a class of type
278.I cls
279and the nickname
280.I chead
281of the least specific class in one of
282.IR cls 's
283superclass chains which does not contain
284.I cls
285itself,
286.B SOD_XCHAIN(\c
287.IB chead ,
288.IB obj )
289returns the address of that chain's storage
290within the instance layout as a raw
291.B void *
292pointer.
293(Note that
294.I cls
295is not mentioned explicitly.)
296This macro is used by the generated
297.IB cls __CONV_ c
298conversion macros,
299which you are encouraged to use instead where possible.
47de28ae
MW
300.PP
301The
302.B SOD_CONVERT
4e3a7cb2
MW
303macro
304and
305.B sod_convert
306function
307perform general conversions
47de28ae 308(up-, down-, and cross-casts) on instance pointers.
4e3a7cb2 309Given a class
47de28ae
MW
310.I cls
311and a pointer
312.BI "const void *" obj
313to an instance,
4e3a7cb2 314they return an appropriately converted pointer to
47de28ae
MW
315.I obj
316if
317.I obj
318is indeed an instance of (some subclass of)
319.IR cls ;
4e3a7cb2
MW
320otherwise they return a null pointer.
321.PP
322The
323.B SOD_CONVERT
324macro expects
325.I cls
326to be a class name;
327the
328.B sod_convert
329function
330expects a pointer to a class object instead.
331.PP
332This involves a run-time trawl through the class structures:
333while some effort has been made to make it perform well
334it's still not very fast.
335For upcasts (where
336.I cls
337is a superclass of the static type of
338.IR obj )
339the automatically defined conversion macros should be used instead,
340because they're much faster and can't fail.
341.PP
342When the target class is known statically,
343it's slightly more convenient to use the
344.B SOD_CONVERT
345macro rather than the
47de28ae 346.B sod_convert
4e3a7cb2
MW
347function,
348since the class object name is longer and uglier,
349and the macro returns a pointer of the correct type.
350.
351.SS Instance lifecycle
352The following macros and functions
353manage the standard steps along
354an instance's lifecycle.
47de28ae
MW
355.PP
356The
a142609c
MW
357.B SOD_INIT
358macro,
359and the
360.B sod_init
361and
362.B sod_initv
363functions,
364imprint and initialize an instance of a class
365.I cls
366in the storage starting at address
367.IR p .
368.PP
369The direct class for the new instance is specified as
370a class name to
371.BR SOD_INIT ,
372or a pointer to a class object to the functions.
373.PP
374Keyword arguments for the initialization message may be provided.
375The
376.B SOD_INIT
377macro expects a single preprocessor-time argument
378which is a use of one of
379.B KWARGS
380or
381.B NO_KWARGS
382(see
383.BR keyword (3));
384the
385.B sod_init
386function expects the keywords as
387a variable-length argument tail;
388and
389.B sod_initv
390expects the keywords to be passed indirectly,
391through the captured argument-tail cursor
392.IR ap .
393.PP
394The return value is an instance pointer for the class
395.IR cls ;
396the
397.B SOD_INIT
398macro will have converted it to the correct type,
399so it should probably be used where possible.
400In fact, this is guaranteed to be equal to
401.I p
402by the layout rules described in
403.BR sod-structs (3).
404.PP
405The
47de28ae
MW
406.B SOD_DECL
407macro declares and initializes an instance
408with automatic storage duration.
409Given a class name
410.I cls
411and an identifier
412.IR var ,
413.B SOD_DECL(\c
414.IB cls ,
415.IB var )
416declares
417.I var
418to be a pointer to an instance of
419.IR cls .
420The instance is initialized in the sense that
421its vtable and class pointers have been set up,
422and slots for which initializers are defined
423are set to the appropriate initial values.
424The instance has automatic storage duration:
425pointers to it will become invalid when control
426exits the scope of the declaration.
427.
47de28ae
MW
428.\"--------------------------------------------------------------------------
429.SH SEE ALSO
a142609c 430.BR keyword (3),
9ed8eb2a 431.BR sod (1),
47de28ae
MW
432.BR sod-structs (3).
433.
434.\"--------------------------------------------------------------------------
435.SH AUTHOR
436Mark Wooding, <mdw@distorted.org.uk>
437.
438.\"----- That's all, folks --------------------------------------------------