Commit | Line | Data |
---|---|---|
0518d3e2 MD |
1 | /* classes: h_files */ |
2 | ||
729dbac3 DH |
3 | #ifndef SCM_GOOPS_H |
4 | #define SCM_GOOPS_H | |
a392ee15 | 5 | |
f3c6a02c | 6 | /* Copyright (C) 1998,1999,2000,2001,2002,2003, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. |
a392ee15 | 7 | * |
73be1d9e | 8 | * This library is free software; you can redistribute it and/or |
53befeb7 NJ |
9 | * modify it under the terms of the GNU Lesser General Public License |
10 | * as published by the Free Software Foundation; either version 3 of | |
11 | * the License, or (at your option) any later version. | |
a392ee15 | 12 | * |
53befeb7 NJ |
13 | * This library is distributed in the hope that it will be useful, but |
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
73be1d9e MV |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * Lesser General Public License for more details. | |
a392ee15 | 17 | * |
73be1d9e MV |
18 | * You should have received a copy of the GNU Lesser General Public |
19 | * License along with this library; if not, write to the Free Software | |
53befeb7 NJ |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
21 | * 02110-1301 USA | |
73be1d9e | 22 | */ |
a392ee15 | 23 | |
0518d3e2 MD |
24 | \f |
25 | ||
26 | /* This software is a derivative work of other copyrighted softwares; the | |
27 | * copyright notices of these softwares are placed in the file COPYRIGHTS | |
28 | * | |
29 | * This file is based upon stklos.h from the STk distribution by | |
30 | * Erick Gallesio <eg@unice.fr>. | |
31 | */ | |
32 | ||
33 | #include "libguile/__scm.h" | |
34 | ||
398d8ee1 KN |
35 | #include "libguile/validate.h" |
36 | ||
b6cf4d02 AW |
37 | /* {Class flags} |
38 | * | |
39 | * These are used for efficient identification of instances of a | |
40 | * certain class or its subclasses when traversal of the inheritance | |
41 | * graph would be too costly. | |
42 | */ | |
43 | #define SCM_VTABLE_FLAG_GOOPS_CLASS SCM_VTABLE_FLAG_GOOPS_0 | |
44 | #define SCM_VTABLE_FLAG_GOOPS_VALID SCM_VTABLE_FLAG_GOOPS_1 | |
51f66c91 | 45 | #define SCM_VTABLE_FLAG_GOOPS_PURE_GENERIC SCM_VTABLE_FLAG_GOOPS_2 |
b6cf4d02 AW |
46 | |
47 | #define SCM_CLASS_OF(x) SCM_STRUCT_VTABLE (x) | |
48 | #define SCM_CLASS_FLAGS(class) (SCM_VTABLE_FLAGS (class)) | |
49 | #define SCM_OBJ_CLASS_FLAGS(obj) (SCM_STRUCT_VTABLE_FLAGS (obj)) | |
50 | #define SCM_SET_CLASS_FLAGS(c, f) (SCM_SET_VTABLE_FLAGS (c, f)) | |
51 | #define SCM_CLEAR_CLASS_FLAGS(c, f) (SCM_CLEAR_VTABLE_FLAGS (c, f)) | |
52 | ||
51f66c91 | 53 | #define SCM_CLASSF_METACLASS (SCM_VTABLE_FLAG_GOOPS_CLASS|SCM_VTABLE_FLAG_VTABLE) |
b6cf4d02 AW |
54 | #define SCM_CLASSF_PURE_GENERIC SCM_VTABLE_FLAG_GOOPS_PURE_GENERIC |
55 | #define SCM_CLASSF_GOOPS_VALID SCM_VTABLE_FLAG_GOOPS_VALID | |
56 | #define SCM_CLASSF_GOOPS SCM_VTABLE_FLAG_GOOPS_CLASS | |
b6cf4d02 AW |
57 | #define SCM_CLASSF_GOOPS_OR_VALID (SCM_CLASSF_GOOPS | SCM_CLASSF_GOOPS_VALID) |
58 | ||
0518d3e2 MD |
59 | /* |
60 | * scm_class_class | |
61 | */ | |
62 | ||
b6cf4d02 | 63 | /* see also, SCM_VTABLE_BASE_LAYOUT, and build_class_class_slots */ |
2858deaf AW |
64 | #define SCM_CLASS_CLASS_LAYOUT \ |
65 | "pw" /* redefined */ \ | |
66 | "uw" /* h0 */ \ | |
67 | "uw" /* h1 */ \ | |
68 | "uw" /* h2 */ \ | |
69 | "uw" /* h3 */ \ | |
70 | "uw" /* h4 */ \ | |
71 | "uw" /* h5 */ \ | |
72 | "uw" /* h6 */ \ | |
73 | "uw" /* h7 */ \ | |
74 | "pw" /* direct supers */ \ | |
75 | "pw" /* direct slots */ \ | |
76 | "pw" /* direct subclasses */ \ | |
77 | "pw" /* direct methods */ \ | |
78 | "pw" /* cpl */ \ | |
79 | "pw" /* default-slot-definition-class */ \ | |
80 | "pw" /* slots */ \ | |
81 | "pw" /* getters-n-setters */ \ | |
9d019f9b | 82 | "pw" /* nfields */ |
b6cf4d02 AW |
83 | |
84 | #define scm_si_redefined (scm_vtable_offset_user + 0) | |
85 | #define scm_si_h0 (scm_vtable_offset_user + 1) | |
86 | #define scm_si_hashsets scm_si_h0 | |
87 | #define scm_si_h1 (scm_vtable_offset_user + 2) | |
88 | #define scm_si_h2 (scm_vtable_offset_user + 3) | |
89 | #define scm_si_h3 (scm_vtable_offset_user + 4) | |
90 | #define scm_si_h4 (scm_vtable_offset_user + 5) | |
91 | #define scm_si_h5 (scm_vtable_offset_user + 6) | |
92 | #define scm_si_h6 (scm_vtable_offset_user + 7) | |
93 | #define scm_si_h7 (scm_vtable_offset_user + 8) | |
94 | #define scm_si_direct_supers (scm_vtable_offset_user + 9) /* (class ...) */ | |
95 | #define scm_si_direct_slots (scm_vtable_offset_user + 10) /* ((name . options) ...) */ | |
96 | #define scm_si_direct_subclasses (scm_vtable_offset_user + 11) /* (class ...) */ | |
97 | #define scm_si_direct_methods (scm_vtable_offset_user + 12) /* (methods ...) */ | |
98 | #define scm_si_cpl (scm_vtable_offset_user + 13) /* (class ...) */ | |
99 | #define scm_si_slotdef_class (scm_vtable_offset_user + 14) | |
100 | #define scm_si_slots (scm_vtable_offset_user + 15) /* ((name . options) ...) */ | |
686022e8 | 101 | #define scm_si_getters_n_setters (scm_vtable_offset_user + 16) |
2575157e AW |
102 | #define scm_si_nfields (scm_vtable_offset_user + 17) /* an integer */ |
103 | #define SCM_N_CLASS_SLOTS (scm_vtable_offset_user + 18) | |
0518d3e2 | 104 | |
92c2555f | 105 | typedef struct scm_t_method { |
0518d3e2 MD |
106 | SCM generic_function; |
107 | SCM specializers; | |
108 | SCM procedure; | |
92c2555f | 109 | } scm_t_method; |
0518d3e2 | 110 | |
92c2555f | 111 | #define SCM_METHOD(obj) ((scm_t_method *) SCM_STRUCT_DATA (obj)) |
0518d3e2 | 112 | |
efcebb5b | 113 | #define SCM_OBJ_CLASS_REDEF(x) (SCM_PACK (SCM_STRUCT_VTABLE_DATA (x) [scm_si_redefined])) |
0518d3e2 | 114 | #define SCM_INST(x) SCM_STRUCT_DATA (x) |
00d8d838 | 115 | |
0518d3e2 | 116 | #define SCM_CLASS_OF(x) SCM_STRUCT_VTABLE (x) |
729dbac3 | 117 | #define SCM_ACCESSORS_OF(x) (SCM_PACK (SCM_STRUCT_VTABLE_DATA (x)[scm_si_getters_n_setters])) |
00d8d838 DH |
118 | |
119 | #define SCM_CLASSP(x) \ | |
120 | (SCM_STRUCTP (x) && SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_METACLASS) | |
6182ceac | 121 | #define SCM_VALIDATE_CLASS(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, CLASSP, "class") |
0518d3e2 | 122 | |
25ba37df | 123 | #define SCM_INSTANCEP(x) \ |
00d8d838 | 124 | (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_GOOPS)) |
6182ceac | 125 | #define SCM_VALIDATE_INSTANCE(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, INSTANCEP, "instance") |
0518d3e2 | 126 | |
25ba37df | 127 | #define SCM_PUREGENERICP(x) \ |
00d8d838 | 128 | (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_PURE_GENERIC)) |
6182ceac | 129 | #define SCM_VALIDATE_PUREGENERIC(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, PUREGENERICP, "pure generic function") |
e11208ca | 130 | |
b6cf4d02 AW |
131 | #define SCM_SLOT(x, i) (SCM_STRUCT_SLOT_REF (x, i)) |
132 | #define SCM_SET_SLOT(x, i, v) (SCM_STRUCT_SLOT_SET (x, i, v)) | |
f12745b6 | 133 | #define SCM_INSTANCE_HASH(c, i) (SCM_INST (c) [scm_si_hashsets + (i)]) |
dcb410ec | 134 | #define SCM_SET_HASHSET(c, i, h) (SCM_INST (c) [scm_si_hashsets + (i)] = (h)) |
00d8d838 | 135 | |
7888309b | 136 | #define SCM_SUBCLASSP(c1, c2) (scm_is_true (scm_c_memq (c2, SCM_SLOT (c1, scm_si_cpl)))) |
00d8d838 DH |
137 | #define SCM_IS_A_P(x, c) \ |
138 | (SCM_INSTANCEP (x) && SCM_SUBCLASSP (SCM_CLASS_OF (x), c)) | |
0518d3e2 | 139 | |
00d8d838 DH |
140 | #define SCM_GENERICP(x) \ |
141 | (SCM_INSTANCEP (x) && SCM_SUBCLASSP (SCM_CLASS_OF (x), scm_class_generic)) | |
6182ceac | 142 | #define SCM_VALIDATE_GENERIC(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, GENERICP, "generic function") |
00d8d838 DH |
143 | |
144 | #define SCM_METHODP(x) \ | |
145 | (SCM_INSTANCEP (x) && SCM_SUBCLASSP (SCM_CLASS_OF (x), scm_class_method)) | |
6182ceac | 146 | #define SCM_VALIDATE_METHOD(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, METHODP, "method") |
398d8ee1 | 147 | |
efcebb5b | 148 | #define SCM_SET_CLASS_DESTRUCTOR(c, d) SCM_SET_VTABLE_DESTRUCTOR (c, d) |
efcebb5b | 149 | |
a9a90a88 AW |
150 | #define SCM_SET_GENERIC_DISPATCH_PROCEDURE(G,C) (SCM_STRUCT_SLOT_SET (G, scm_si_dispatch_procedure, (C))) |
151 | #define SCM_CLEAR_GENERIC_EFFECTIVE_METHODS(G) (SCM_STRUCT_SLOT_SET (G, scm_si_effective_methods, SCM_EOL)); | |
152 | ||
153 | #define SCM_GENERIC_SETTER(G) (SCM_PACK (SCM_STRUCT_DATA (G) [scm_si_generic_setter])) | |
154 | #define SCM_SET_GENERIC_SETTER(G,C) (SCM_STRUCT_DATA (G) [scm_si_generic_setter] = SCM_UNPACK (C)) | |
155 | ||
51f66c91 AW |
156 | #define scm_si_dispatch_procedure scm_applicable_struct_index_procedure /* 0 */ |
157 | #define scm_si_methods 1 | |
158 | #define scm_si_n_specialized 2 | |
72d2e7e6 | 159 | #define scm_si_extended_by 3 |
c06e3eb0 AW |
160 | #define scm_si_effective_methods 4 |
161 | #define scm_si_generic_setter 5 | |
0518d3e2 MD |
162 | |
163 | #define scm_si_generic_function 0 /* offset of gf slot in a <method> */ | |
164 | #define scm_si_specializers 1 /* offset of spec. slot in a <method> */ | |
0518d3e2 | 165 | #define scm_si_procedure 2 /* offset of proc. slot in a <method> */ |
c40944c9 AW |
166 | #define scm_si_formals 3 /* offset of form. slot in a <method> */ |
167 | #define scm_si_body 4 /* offset of body slot in a <method> */ | |
168 | #define scm_si_make_procedure 5 /* offset of makep.slot in a <method> */ | |
0518d3e2 MD |
169 | |
170 | /* C interface */ | |
539d5410 MV |
171 | SCM_API SCM scm_class_boolean; |
172 | SCM_API SCM scm_class_char; | |
173 | SCM_API SCM scm_class_pair; | |
174 | SCM_API SCM scm_class_procedure; | |
175 | SCM_API SCM scm_class_string; | |
176 | SCM_API SCM scm_class_symbol; | |
539d5410 | 177 | SCM_API SCM scm_class_primitive_generic; |
c99de5aa | 178 | SCM_API SCM scm_class_vector; |
c99de5aa | 179 | SCM_API SCM scm_class_null; |
539d5410 MV |
180 | SCM_API SCM scm_class_real; |
181 | SCM_API SCM scm_class_complex; | |
182 | SCM_API SCM scm_class_integer; | |
183 | SCM_API SCM scm_class_fraction; | |
184 | SCM_API SCM scm_class_unknown; | |
6290d3f1 | 185 | SCM_API SCM scm_port_class[]; |
04795a1c | 186 | SCM_API SCM scm_smob_class[]; |
33b001fd MV |
187 | SCM_API SCM scm_class_top; |
188 | SCM_API SCM scm_class_object; | |
189 | SCM_API SCM scm_class_class; | |
74b6d6e4 | 190 | SCM_API SCM scm_class_applicable; |
51f66c91 AW |
191 | SCM_API SCM scm_class_applicable_struct; |
192 | SCM_API SCM scm_class_applicable_struct_with_setter; | |
33b001fd MV |
193 | SCM_API SCM scm_class_generic; |
194 | SCM_API SCM scm_class_generic_with_setter; | |
f8af5c6d | 195 | SCM_API SCM scm_class_accessor; |
bbf8d523 MD |
196 | SCM_API SCM scm_class_extended_generic; |
197 | SCM_API SCM scm_class_extended_generic_with_setter; | |
74b6d6e4 | 198 | SCM_API SCM scm_class_extended_accessor; |
33b001fd | 199 | SCM_API SCM scm_class_method; |
f8af5c6d | 200 | SCM_API SCM scm_class_accessor_method; |
33b001fd | 201 | SCM_API SCM scm_class_procedure_class; |
51f66c91 | 202 | SCM_API SCM scm_class_applicable_struct_class; |
33b001fd MV |
203 | SCM_API SCM scm_class_number; |
204 | SCM_API SCM scm_class_list; | |
205 | SCM_API SCM scm_class_keyword; | |
206 | SCM_API SCM scm_class_port; | |
207 | SCM_API SCM scm_class_input_output_port; | |
208 | SCM_API SCM scm_class_input_port; | |
209 | SCM_API SCM scm_class_output_port; | |
33b001fd MV |
210 | SCM_API SCM scm_class_foreign_slot; |
211 | SCM_API SCM scm_class_self; | |
212 | SCM_API SCM scm_class_protected; | |
b6cf4d02 | 213 | SCM_API SCM scm_class_hidden; |
33b001fd MV |
214 | SCM_API SCM scm_class_opaque; |
215 | SCM_API SCM scm_class_read_only; | |
b6cf4d02 | 216 | SCM_API SCM scm_class_protected_hidden; |
33b001fd MV |
217 | SCM_API SCM scm_class_protected_opaque; |
218 | SCM_API SCM scm_class_protected_read_only; | |
219 | SCM_API SCM scm_class_scm; | |
220 | SCM_API SCM scm_class_int; | |
221 | SCM_API SCM scm_class_float; | |
222 | SCM_API SCM scm_class_double; | |
223 | SCM_API const char *scm_s_slot_set_x; | |
224 | ||
539d5410 MV |
225 | SCM_API SCM scm_no_applicable_method; |
226 | ||
33b001fd MV |
227 | SCM_API SCM scm_module_goops; |
228 | ||
229 | SCM_API SCM scm_goops_version (void); | |
230 | SCM_API SCM scm_oldfmt (SCM); | |
231 | SCM_API char *scm_c_oldfmt0 (char *); | |
232 | SCM_API char *scm_c_oldfmt (char *, int n); | |
233 | SCM_API void scm_load_goops (void); | |
efcebb5b AW |
234 | SCM_API SCM scm_make_extended_class (char const *type_name, int applicablep); |
235 | SCM_API void scm_make_port_classes (long ptobnum, char *type_name); | |
33b001fd | 236 | SCM_API SCM scm_ensure_accessor (SCM name); |
539d5410 | 237 | SCM_API SCM scm_class_of (SCM obj); |
0518d3e2 MD |
238 | |
239 | /* Low level functions exported */ | |
33b001fd MV |
240 | SCM_API SCM scm_make_next_method (SCM methods, SCM args, SCM gf); |
241 | SCM_API SCM scm_basic_basic_make_class (SCM c, SCM name, SCM dsupers, SCM dslots); | |
242 | SCM_API SCM scm_basic_make_class (SCM c, SCM name, SCM dsupers, SCM dslots); | |
0518d3e2 MD |
243 | |
244 | /* Primitives exported */ | |
33b001fd MV |
245 | SCM_API SCM scm_sys_allocate_instance (SCM c, SCM initargs); |
246 | SCM_API SCM scm_sys_set_object_setter_x (SCM obj, SCM setter); | |
247 | SCM_API SCM scm_slot_ref (SCM obj, SCM slot_name); | |
248 | SCM_API SCM scm_slot_set_x (SCM obj, SCM slot_name, SCM value); | |
249 | ||
250 | SCM_API SCM scm_compute_applicable_methods (SCM gf, SCM args, long len, int scm_find_method); | |
251 | SCM_API SCM scm_sys_compute_applicable_methods (SCM gf, SCM args); | |
0518d3e2 | 252 | #ifdef GUILE_DEBUG |
33b001fd | 253 | SCM_API SCM scm_pure_generic_p (SCM obj); |
0518d3e2 | 254 | #endif |
0518d3e2 | 255 | |
0b607675 | 256 | SCM_API SCM scm_sys_compute_slots (SCM c); |
efcebb5b | 257 | SCM_INTERNAL void scm_i_inherit_applicable (SCM c); |
102dbb6f LC |
258 | SCM_INTERNAL SCM scm_i_get_keyword (SCM key, SCM l, long len, |
259 | SCM default_value, const char *subr); | |
0b607675 TTN |
260 | SCM_API SCM scm_get_keyword (SCM key, SCM l, SCM default_value); |
261 | SCM_API SCM scm_sys_initialize_object (SCM obj, SCM initargs); | |
262 | SCM_API SCM scm_sys_prep_layout_x (SCM c); | |
263 | SCM_API SCM scm_sys_inherit_magic_x (SCM c, SCM dsupers); | |
264 | SCM_API SCM scm_instance_p (SCM obj); | |
265 | SCM_API SCM scm_class_name (SCM obj); | |
266 | SCM_API SCM scm_class_direct_supers (SCM obj); | |
267 | SCM_API SCM scm_class_direct_slots (SCM obj); | |
268 | SCM_API SCM scm_class_direct_subclasses (SCM obj); | |
269 | SCM_API SCM scm_class_direct_methods (SCM obj); | |
270 | SCM_API SCM scm_class_precedence_list (SCM obj); | |
271 | SCM_API SCM scm_class_slots (SCM obj); | |
0b607675 TTN |
272 | SCM_API SCM scm_generic_function_name (SCM obj); |
273 | SCM_API SCM scm_generic_function_methods (SCM obj); | |
274 | SCM_API SCM scm_method_generic_function (SCM obj); | |
275 | SCM_API SCM scm_method_specializers (SCM obj); | |
276 | SCM_API SCM scm_method_procedure (SCM obj); | |
0b607675 TTN |
277 | SCM_API SCM scm_sys_fast_slot_ref (SCM obj, SCM index); |
278 | SCM_API SCM scm_sys_fast_slot_set_x (SCM obj, SCM index, SCM value); | |
279 | SCM_API SCM scm_slot_ref_using_class (SCM cls, SCM obj, SCM slot_name); | |
280 | SCM_API SCM scm_slot_set_using_class_x (SCM cls, SCM obj, SCM slot_name, SCM value); | |
281 | SCM_API SCM scm_slot_bound_using_class_p (SCM cls, SCM obj, SCM slot_name); | |
282 | SCM_API SCM scm_slot_exists_using_class_p (SCM cls, SCM obj, SCM slot_name); | |
283 | SCM_API SCM scm_slot_bound_p (SCM obj, SCM slot_name); | |
284 | SCM_API SCM scm_slot_exists_p (SCM obj, SCM slot_name); | |
285 | SCM_API SCM scm_sys_modify_instance (SCM old, SCM newinst); | |
33b001fd MV |
286 | SCM_API SCM scm_sys_modify_class (SCM old, SCM newcls); |
287 | SCM_API SCM scm_sys_invalidate_class (SCM cls); | |
33b001fd MV |
288 | SCM_API SCM scm_sys_invalidate_method_cache_x (SCM gf); |
289 | SCM_API SCM scm_generic_capability_p (SCM proc); | |
290 | SCM_API SCM scm_enable_primitive_generic_x (SCM subrs); | |
9f63ce02 | 291 | SCM_INTERNAL SCM scm_set_primitive_generic_x (SCM subr, SCM generic); |
33b001fd | 292 | SCM_API SCM scm_primitive_generic_generic (SCM subr); |
a48d60b1 | 293 | SCM_API void scm_c_extend_primitive_generic (SCM subr, SCM extension); |
0b607675 TTN |
294 | SCM_API SCM stklos_version (void); |
295 | SCM_API SCM scm_make (SCM args); | |
296 | SCM_API SCM scm_find_method (SCM args); | |
297 | SCM_API SCM scm_sys_method_more_specific_p (SCM m1, SCM m2, SCM targs); | |
efcebb5b | 298 | SCM_API void scm_change_object_class (SCM, SCM, SCM); |
fa075d40 AW |
299 | |
300 | /* These procedures are for dispatching to a generic when a primitive | |
301 | fails to apply. They raise a wrong-type-arg error if the primitive's | |
302 | generic has not been initialized yet. */ | |
303 | SCM_API SCM scm_wta_dispatch_0 (SCM gf, const char *subr); | |
304 | SCM_API SCM scm_wta_dispatch_1 (SCM gf, SCM a1, int pos, const char *subr); | |
305 | SCM_API SCM scm_wta_dispatch_2 (SCM gf, SCM a1, SCM a2, int pos, const char *subr); | |
306 | SCM_API SCM scm_wta_dispatch_n (SCM gf, SCM args, int pos, const char *subr); | |
efcebb5b | 307 | |
f3c6a02c AW |
308 | SCM_INTERNAL SCM scm_i_define_class_for_vtable (SCM vtable); |
309 | ||
33b001fd | 310 | |
102dbb6f LC |
311 | SCM_INTERNAL SCM scm_init_goops_builtins (void); |
312 | SCM_INTERNAL void scm_init_goops (void); | |
0518d3e2 | 313 | |
a392ee15 DH |
314 | #endif /* SCM_GOOPS_H */ |
315 | ||
316 | /* | |
317 | Local Variables: | |
318 | c-file-style: "gnu" | |
319 | End: | |
320 | */ |