Improve description of `scm_set_smob_mark ()'.
[bpt/guile.git] / doc / ref / api-smobs.texi
CommitLineData
07d83abe
MV
1@c -*-texinfo-*-
2@c This is part of the GNU Guile Reference Manual.
f07c349e 3@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2009
07d83abe
MV
4@c Free Software Foundation, Inc.
5@c See the file guile.texi for copying conditions.
6
7@page
8@node Smobs
9@section Smobs
10
f07c349e
LC
11@cindex smob
12
07d83abe
MV
13This chapter contains reference information related to defining and
14working with smobs. See @ref{Defining New Types (Smobs)} for a
15tutorial-like introduction to smobs.
16
17@deftypefun scm_t_bits scm_make_smob_type (const char *name, size_t size)
18This function adds a new smob type, named @var{name}, with instance size
19@var{size}, to the system. The return value is a tag that is used in
20creating instances of the type.
21
22If @var{size} is 0, the default @emph{free} function will do nothing.
23
24If @var{size} is not 0, the default @emph{free} function will
25deallocate the memory block pointed to by @code{SCM_SMOB_DATA} with
26@code{scm_gc_free}. The @var{WHAT} parameter in the call to
27@code{scm_gc_free} will be @var{NAME}.
28
29Default values are provided for the @emph{mark}, @emph{free},
30@emph{print}, and @emph{equalp} functions, as described in
31@ref{Defining New Types (Smobs)}. If you want to customize any of
32these functions, the call to @code{scm_make_smob_type} should be
33immediately followed by calls to one or several of
34@code{scm_set_smob_mark}, @code{scm_set_smob_free},
35@code{scm_set_smob_print}, and/or @code{scm_set_smob_equalp}.
36@end deftypefun
37
f07c349e
LC
38@cindex finalizer
39@cindex finalization
40
41@deftypefn {C Function} void scm_set_smob_free (scm_t_bits tc, size_t (*free) (SCM obj))
42This function sets the smob freeing procedure (sometimes referred to as
43a @dfn{finalizer}) for the smob type specified by the tag
44@var{tc}. @var{tc} is the tag returned by @code{scm_make_smob_type}.
45
46The @var{free} procedure must deallocate all resources that are
47directly associated with the smob instance @var{OBJ}. It must assume
48that all @code{SCM} values that it references have already been freed
49and are thus invalid.
50
51It must also not call any libguile function or macro except
52@code{scm_gc_free}, @code{SCM_SMOB_FLAGS}, @code{SCM_SMOB_DATA},
53@code{SCM_SMOB_DATA_2}, and @code{SCM_SMOB_DATA_3}.
54
55The @var{free} procedure must return 0.
56
57Note that defining a freeing procedure is not necessary if the resources
58associated with @var{obj} consists only of memory allocated with
59@code{scm_gc_malloc} or @code{scm_gc_malloc_pointerless} because this
60memory is automatically reclaimed by the garbage collector when it is no
61longer needed (@pxref{Memory Blocks, @code{scm_gc_malloc}}).
62@end deftypefn
63
64@cindex precise marking
65
07d83abe
MV
66@deftypefn {C Function} void scm_set_smob_mark (scm_t_bits tc, SCM (*mark) (SCM obj))
67This function sets the smob marking procedure for the smob type specified by
68the tag @var{tc}. @var{tc} is the tag returned by @code{scm_make_smob_type}.
69
e0f65135
LC
70Defining a marking procedure may sometimes be unnecessary because large
71parts of the process' memory (with the exception of
72@code{scm_gc_malloc_pointerless} regions, and @code{malloc}- or
73@code{scm_malloc}-allocated memory) are scanned for live
74pointers@footnote{Conversely, in Guile up to the 1.8 series, the marking
75procedure was always required. The reason is that Guile's GC would only
76look for pointers in the memory area used for built-in types (the
77@dfn{cell heap}), not in user-allocated or statically allocated memory.
78This approach is often referred to as @dfn{precise marking}.}.
f07c349e 79
07d83abe
MV
80The @var{mark} procedure must cause @code{scm_gc_mark} to be called
81for every @code{SCM} value that is directly referenced by the smob
82instance @var{obj}. One of these @code{SCM} values can be returned
83from the procedure and Guile will call @code{scm_gc_mark} for it.
84This can be used to avoid deep recursions for smob instances that form
85a list.
e8a7ec79
MV
86
87It must not call any libguile function or macro except
88@code{scm_gc_mark}, @code{SCM_SMOB_FLAGS}, @code{SCM_SMOB_DATA},
89@code{SCM_SMOB_DATA_2}, and @code{SCM_SMOB_DATA_3}.
07d83abe
MV
90@end deftypefn
91
07d83abe
MV
92
93@deftypefn {C Function} void scm_set_smob_print (scm_t_bits tc, int (*print) (SCM obj, SCM port, scm_print_state* pstate))
94This function sets the smob printing procedure for the smob type
95specified by the tag @var{tc}. @var{tc} is the tag returned by
96@code{scm_make_smob_type}.
97
98The @var{print} procedure should output a textual representation of
99the smob instance @var{obj} to @var{port}, using information in
100@var{pstate}.
101
102The textual representation should be of the form @code{#<name ...>}.
103This ensures that @code{read} will not interpret it as some other
104Scheme value.
105
106It is often best to ignore @var{pstate} and just print to @var{port}
107with @code{scm_display}, @code{scm_write}, @code{scm_simple_format},
108and @code{scm_puts}.
109@end deftypefn
110
111@deftypefn {C Function} void scm_set_smob_equalp (scm_t_bits tc, SCM (*equalp) (SCM obj1, SCM obj1))
112This function sets the smob equality-testing predicate for the smob
113type specified by the tag @var{tc}. @var{tc} is the tag returned by
114@code{scm_make_smob_type}.
115
116The @var{equalp} procedure should return @code{SCM_BOOL_T} when
117@var{obj1} is @code{equal?} to @var{obj2}. Else it should return
118@var{SCM_BOOL_F}. Both @var{obj1} and @var{obj2} are instances of the
119smob type @var{tc}.
120@end deftypefn
121
52191b37
MV
122@deftypefn {C Function} void scm_assert_smob_type (scm_t_bits tag, SCM val)
123When @var{val} is a smob of the type indicated by @var{tag}, do nothing.
124Else, signal an error.
125@end deftypefn
126
07d83abe
MV
127@deftypefn {C Macro} int SCM_SMOB_PREDICATE (scm_t_bits tag, SCM exp)
128Return true iff @var{exp} is a smob instance of the type indicated by
129@var{tag}. The expression @var{exp} can be evaluated more than once,
130so it shouldn't contain any side effects.
131@end deftypefn
132
133@deftypefn {C Macro} void SCM_NEWSMOB (SCM value, scm_t_bits tag, void *data)
134@deftypefnx {C Macro} void SCM_NEWSMOB2 (SCM value, scm_t_bits tag, void *data, void *data2)
135@deftypefnx {C Macro} void SCM_NEWSMOB3 (SCM value, scm_t_bits tag, void *data, void *data2, void *data3)
136Make @var{value} contain a smob instance of the type with tag
137@var{tag} and smob data @var{data}, @var{data2}, and @var{data3}, as
138appropriate.
139
140The @var{tag} is what has been returned by @code{scm_make_smob_type}.
141The initial values @var{data}, @var{data2}, and @var{data3} are of
142type @code{scm_t_bits}; when you want to use them for @code{SCM}
143values, these values need to be converted to a @code{scm_t_bits} first
144by using @code{SCM_UNPACK}.
145
146The flags of the smob instance start out as zero.
147@end deftypefn
148
149Since it is often the case (e.g., in smob constructors) that you will
150create a smob instance and return it, there is also a slightly specialized
151macro for this situation:
152
153@deftypefn {C Macro} {} SCM_RETURN_NEWSMOB (scm_t_bits tag, void *data)
154@deftypefnx {C Macro} {} SCM_RETURN_NEWSMOB2 (scm_t_bits tag, void *data1, void *data2)
155@deftypefnx {C Macro} {} SCM_RETURN_NEWSMOB3 (scm_t_bits tag, void *data1, void *data2, void *data3)
156This macro expands to a block of code that creates a smob instance of
157the type with tag @var{tag} and smob data @var{data}, @var{data2}, and
158@var{data3}, as with @code{SCM_NEWSMOB}, etc., and causes the
159surrounding function to return that @code{SCM} value. It should be
160the last piece of code in a block.
161@end deftypefn
162
163@deftypefn {C Macro} scm_t_bits SCM_SMOB_FLAGS (SCM obj)
164Return the 16 extra bits of the smob @var{obj}. No meaning is
165predefined for these bits, you can use them freely.
166@end deftypefn
167
168@deftypefn {C Macro} scm_t_bits SCM_SET_SMOB_FLAGS (SCM obj, scm_t_bits flags)
169Set the 16 extra bits of the smob @var{obj} to @var{flags}. No
170meaning is predefined for these bits, you can use them freely.
171@end deftypefn
172
173@deftypefn {C Macro} scm_t_bits SCM_SMOB_DATA (SCM obj)
174@deftypefnx {C Macro} scm_t_bits SCM_SMOB_DATA_2 (SCM obj)
175@deftypefnx {C Macro} scm_t_bits SCM_SMOB_DATA_3 (SCM obj)
176Return the first (second, third) immediate word of the smob @var{obj}
177as a @code{scm_t_bits} value. When the word contains a @code{SCM}
178value, use @code{SCM_SMOB_OBJECT} (etc.) instead.
179@end deftypefn
180
181@deftypefn {C Macro} void SCM_SET_SMOB_DATA (SCM obj, scm_t_bits val)
182@deftypefnx {C Macro} void SCM_SET_SMOB_DATA_2 (SCM obj, scm_t_bits val)
183@deftypefnx {C Macro} void SCM_SET_SMOB_DATA_3 (SCM obj, scm_t_bits val)
184Set the first (second, third) immediate word of the smob @var{obj} to
185@var{val}. When the word should be set to a @code{SCM} value, use
186@code{SCM_SMOB_SET_OBJECT} (etc.) instead.
187@end deftypefn
188
189@deftypefn {C Macro} SCM SCM_SMOB_OBJECT (SCM obj)
190@deftypefnx {C Macro} SCM SCM_SMOB_OBJECT_2 (SCM obj)
191@deftypefnx {C Macro} SCM SCM_SMOB_OBJECT_3 (SCM obj)
192Return the first (second, third) immediate word of the smob @var{obj}
193as a @code{SCM} value. When the word contains a @code{scm_t_bits}
194value, use @code{SCM_SMOB_DATA} (etc.) instead.
195@end deftypefn
196
197@deftypefn {C Macro} void SCM_SET_SMOB_OBJECT (SCM obj, SCM val)
198@deftypefnx {C Macro} void SCM_SET_SMOB_OBJECT_2 (SCM obj, SCM val)
199@deftypefnx {C Macro} void SCM_SET_SMOB_OBJECT_3 (SCM obj, SCM val)
200Set the first (second, third) immediate word of the smob @var{obj} to
201@var{val}. When the word should be set to a @code{scm_t_bits} value, use
202@code{SCM_SMOB_SET_DATA} (etc.) instead.
203@end deftypefn
204
205@deftypefn {C Macro} {SCM *} SCM_SMOB_OBJECT_LOC (SCM obj)
206@deftypefnx {C Macro} {SCM *} SCM_SMOB_OBJECT_2_LOC (SCM obj)
207@deftypefnx {C Macro} {SCM *} SCM_SMOB_OBJECT_3_LOC (SCM obj)
208Return a pointer to the first (second, third) immediate word of the
209smob @var{obj}. Note that this is a pointer to @code{SCM}. If you
210need to work with @code{scm_t_bits} values, use @code{SCM_PACK} and
211@code{SCM_UNPACK}, as appropriate.
212@end deftypefn
213
214@deftypefun SCM scm_markcdr (SCM @var{x})
215Mark the references in the smob @var{x}, assuming that @var{x}'s first
216data word contains an ordinary Scheme object, and @var{x} refers to no
217other objects. This function simply returns @var{x}'s first data word.
218@end deftypefun
219
220@c Local Variables:
221@c TeX-master: "guile.texi"
222@c End: