Use string and symbol accessors with obarrays and keyword-dash-symbols
[bpt/guile.git] / libguile / __scm.h
CommitLineData
0f2d19dd
JB
1/* classes: h_files */
2
729dbac3
DH
3#ifndef SCM___SCM_H
4#define SCM___SCM_H
8c494e99 5
e20d7001 6/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2003, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
8c494e99 7 *
d3cf93bc 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.
8c494e99 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
d3cf93bc
NJ
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
8c494e99 17 *
d3cf93bc
NJ
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
d3cf93bc 22 */
8c494e99 23
0f2d19dd 24\f
176067df 25
92e6989f
RB
26/**********************************************************************
27 This file is Guile's central public header.
28
29 When included by other files, this file should preceed any include
30 other than __scm.h.
31
32 Under *NO* circumstances should new items be added to the global
33 namespace (via adding #define, typedef, or similar to this file) with
34 generic names. This usually means that any new names should be
35 prefixed by either SCM_ or GUILE_. i.e. do *not* #define HAVE_FOO or
36 SIZEOF_BAR. See configure.in, gen-scmconfig.h.in, and
37 gen-scmconfig.c for examples of how to properly handle this issue.
38 The main documentation is in gen-scmconfig.c.
39
40 "What's the difference between _scm.h and __scm.h?"
176067df
JB
41
42 _scm.h is not installed; it's only visible to the libguile sources
92e6989f 43 themselves, and it includes config.h, the private config header.
176067df
JB
44
45 __scm.h is installed, and is #included by <libguile.h>. If both
46 the client and libguile need some piece of information, and it
47 doesn't fit well into the header file for any particular module, it
92e6989f
RB
48 should go in __scm.h. __scm.h includes scmconfig.h, the public
49 config header.
50 **********************************************************************/
51
52/* What did the configure script discover about the outside world? */
53#include "libguile/scmconfig.h"
176067df 54
92e6989f 55\f
176067df 56
e81d98ec
DH
57/* {Compiler hints}
58 *
59 * The following macros are used to provide additional information for the
60 * compiler, which may help to do better error checking and code
61 * optimization. A second benefit of these macros is, that they also provide
62 * additional information to the developers.
63 */
64
65/* The macro SCM_NORETURN indicates that a function will never return.
66 * Examples:
67 * 1) int foo (char arg) SCM_NORETURN;
68 */
69#ifdef __GNUC__
70#define SCM_NORETURN __attribute__ ((noreturn))
71#else
72#define SCM_NORETURN
73#endif
74
75/* The macro SCM_UNUSED indicates that a function, function argument or
76 * variable may potentially be unused.
77 * Examples:
78 * 1) static int unused_function (char arg) SCM_UNUSED;
79 * 2) int foo (char unused_argument SCM_UNUSED);
80 * 3) int unused_variable SCM_UNUSED;
81 */
82#ifdef __GNUC__
83#define SCM_UNUSED __attribute__ ((unused))
84#else
85#define SCM_UNUSED
86#endif
87
88
9cc37597
LC
89/* The SCM_EXPECT macros provide branch prediction hints to the compiler. To
90 * use only in places where the result of the expression under "normal"
91 * circumstances is known. */
92#if defined(__GNUC__) && (__GNUC__ >= 3)
93# define SCM_EXPECT __builtin_expect
94#else
95# define SCM_EXPECT(_expr, _value) (_expr)
96#endif
97
98#define SCM_LIKELY(_expr) SCM_EXPECT ((_expr), 1)
99#define SCM_UNLIKELY(_expr) SCM_EXPECT ((_expr), 0)
100
102dbb6f 101/* The SCM_INTERNAL macro makes it possible to explicitly declare a function
442f3f20
AW
102 * as having "internal" linkage. However our current tack on this problem is
103 * to use GCC 4's -fvisibility=hidden, making functions internal by default,
104 * and then SCM_API marks them for export. */
105#define SCM_INTERNAL extern
102dbb6f 106
9cc37597
LC
107
108\f
0f2d19dd
JB
109/* {Supported Options}
110 *
111 * These may be defined or undefined.
112 */
113
16d35552 114/* #define GUILE_DEBUG_FREELIST */
70d63753 115
0f2d19dd
JB
116/* All the number support there is.
117 */
0f2d19dd
JB
118#define BIGNUMS
119
686765af
ML
120/* GC should relinquish empty cons-pair arenas. */
121/* cmm:FIXME look at this after done mangling the GC */
122/* #define GC_FREE_SEGMENTS */
0f2d19dd
JB
123
124/* Provide a scheme-accessible count-down timer that
125 * generates a pseudo-interrupt.
126 */
127#define TICKS
128
129
130/* Use engineering notation when converting numbers strings?
131 */
132#undef ENGNOT
133
0f2d19dd
JB
134\f
135/* {Unsupported Options}
136 *
3c205827 137 * These must be defined as given here.
0f2d19dd
JB
138 */
139
140
3c205827
JB
141/* Guile Scheme supports the #f/() distinction; Guile Lisp won't. We
142 have horrible plans for their unification. */
143#undef SICP
0f2d19dd
JB
144
145\f
146
80c78696 147/* Random options (not yet supported or in final form). */
0f2d19dd 148
80c78696
MD
149#define STACK_CHECKING
150#undef NO_CEVAL_STACK_CHECKING
0f2d19dd 151
43ff3170 152\f
3a9809df 153
1174045c 154/* SCM_API is a macro prepended to all function and data definitions
442f3f20
AW
155 which should be exported from libguile. */
156
157#if BUILDING_LIBGUILE && HAVE_VISIBILITY
158# define SCM_API extern __attribute__((__visibility__("default")))
159#elif BUILDING_LIBGUILE && defined _MSC_VER
160# define SCM_API __declspec(dllexport) extern
161#elif defined _MSC_VER
162# define SCM_API __declspec(dllimport) extern
1174045c
MV
163#else
164# define SCM_API extern
165#endif
166
167\f
168
3a9809df
DH
169/* {Debugging Options}
170 *
171 * These compile time options determine whether to include code that is only
172 * useful for debugging guile itself or C level extensions to guile. The
173 * common prefix for all option macros of this kind is "SCM_DEBUG_". It is
fce0b22d
DH
174 * guaranteed that a macro named SCM_DEBUG_XXX is always defined (typically to
175 * either 0 or 1), i. e. there is no need to test for the undefined case.
176 * This allows to use these definitions comfortably within code, as in the
177 * following example:
3a9809df
DH
178 * #define FOO do { if (SCM_DEBUG_XXX) bar(); else baz(); } while (0)
179 * Any sane compiler will remove the unused branch without any performance
180 * penalty for the resulting code.
181 *
182 * Note: Some SCM_DEBUG_XXX options are not settable at configure time.
183 * To change the value of such options you will have to edit this header
56100716
DH
184 * file or give suitable options to make, like:
185 * make all CFLAGS="-DSCM_DEBUG_XXX=1 ..."
3a9809df
DH
186 */
187
188
c8a54c4b
DH
189/* The value of SCM_DEBUG determines the default for most of the not yet
190 * defined debugging options. This allows, for example, to enable most of the
191 * debugging options by simply defining SCM_DEBUG as 1.
192 */
193#ifndef SCM_DEBUG
194#define SCM_DEBUG 0
195#endif
196
7ddb9baf
HWN
197/* For debugging purposes: define this is to ensure nobody is using
198 * the mark bits outside of the marking phase. This is meant for
199 * debugging purposes only.
200 */
201#ifndef SCM_DEBUG_MARKING_API
202#define SCM_DEBUG_MARKING_API 0
203#endif
204
46d53380
DH
205/* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform
206 * exhaustive parameter checking: It will be verified that cell parameters
207 * actually point to a valid heap cell. Note: If this option is enabled,
208 * guile will run about ten times slower than normally.
209 */
210#ifndef SCM_DEBUG_CELL_ACCESSES
211#define SCM_DEBUG_CELL_ACCESSES SCM_DEBUG
212#endif
213
216eedfc
DH
214/* If SCM_DEBUG_INTERRUPTS is set to 1, with every deferring and allowing of
215 * interrupts a consistency check will be performed.
216 */
217#ifndef SCM_DEBUG_INTERRUPTS
218#define SCM_DEBUG_INTERRUPTS SCM_DEBUG
219#endif
220
e81d98ec
DH
221/* If SCM_DEBUG_PAIR_ACCESSES is set to 1, accesses to cons cells will be
222 * exhaustively checked. Note: If this option is enabled, guile will run
223 * slower than normally.
224 */
225#ifndef SCM_DEBUG_PAIR_ACCESSES
226#define SCM_DEBUG_PAIR_ACCESSES SCM_DEBUG
227#endif
228
af45e3b0
DH
229/* If SCM_DEBUG_REST_ARGUMENT is set to 1, functions that take rest arguments
230 * will check whether the rest arguments are actually passed as a proper list.
231 * Otherwise, if SCM_DEBUG_REST_ARGUMENT is 0, functions that take rest
232 * arguments will take it for granted that these are passed as a proper list.
c8a54c4b 233 */
af45e3b0
DH
234#ifndef SCM_DEBUG_REST_ARGUMENT
235#define SCM_DEBUG_REST_ARGUMENT SCM_DEBUG
3a9809df
DH
236#endif
237
fce0b22d
DH
238/* The macro SCM_DEBUG_TYPING_STRICTNESS indicates what level of type checking
239 * shall be performed with respect to the use of the SCM datatype. The macro
240 * may be defined to one of the values 0, 1 and 2.
241 *
242 * A value of 0 means that there will be no compile time type checking, since
243 * the SCM datatype will be declared as an integral type. This setting should
244 * only be used on systems, where casting from integral types to pointers may
245 * lead to loss of bit information.
246 *
247 * A value of 1 means that there will an intermediate level of compile time
248 * type checking, since the SCM datatype will be declared as a pointer to an
249 * undefined struct. This setting is the default, since it does not cost
250 * anything in terms of performance or code size.
251 *
252 * A value of 2 provides a maximum level of compile time type checking since
253 * the SCM datatype will be declared as a struct. This setting should be used
254 * for _compile time_ type checking only, since the compiled result is likely
255 * to be quite inefficient. The right way to make use of this option is to do
256 * a 'make clean; make CFLAGS=-DSCM_DEBUG_TYPING_STRICTNESS=2', fix your
56100716 257 * errors, and then do 'make clean; make'.
c8a54c4b 258 */
56100716 259#ifndef SCM_DEBUG_TYPING_STRICTNESS
729dbac3 260#define SCM_DEBUG_TYPING_STRICTNESS 1
56100716
DH
261#endif
262
d0624e39
DH
263/* If SCM_DEBUG_DEBUGGING_SUPPORT is set to 1, guile will provide a set of
264 * special functions that support debugging with a debugger like gdb or
265 * debugging of guile internals on the scheme level. The behaviour of guile
266 * is not changed by this macro, only the set of functions that are available
267 * will differ. All functions that are introduced this way have the prefix
268 * 'scm_dbg_' on the C level and the prefix 'dbg-' on the scheme level. This
269 * allows to easily determine the set of support functions, given that your
270 * debugger or repl provide automatic name completion. Note that these
271 * functions are intended to be used during interactive debugging sessions
272 * only. They are not considered part of guile's official API. They may
273 * change or disappear without notice or deprecation phase.
94fb5a6e 274 */
d0624e39
DH
275#ifndef SCM_DEBUG_DEBUGGING_SUPPORT
276#define SCM_DEBUG_DEBUGGING_SUPPORT SCM_DEBUG
94fb5a6e
DH
277#endif
278
3a9809df
DH
279\f
280
8c494e99
DH
281/* {Feature Options}
282 *
283 * These compile time options determine whether code for certain features
284 * should be compiled into guile. The common prefix for all option macros
285 * of this kind is "SCM_ENABLE_". It is guaranteed that a macro named
286 * SCM_ENABLE_XXX is defined to be either 0 or 1, i. e. there is no need to
287 * test for the undefined case. This allows to use these definitions
288 * comfortably within code, as in the following example:
289 * #define FOO do { if (SCM_ENABLE_XXX) bar(); else baz(); } while (0)
290 * Any sane compiler will remove the unused branch without any performance
291 * penalty for the resulting code.
292 *
293 * Note: Some SCM_ENABLE_XXX options are not settable at configure time.
294 * To change the value of such options you will have to edit this header
295 * file or give suitable options to make, like:
296 * make all CFLAGS="-DSCM_ENABLE_XXX=1 ..."
0f2d19dd 297 */
1be6b49c 298
8c494e99
DH
299/* If SCM_ENABLE_DEPRECATED is set to 1, deprecated code will be included in
300 * guile, as well as some functions to issue run-time warnings about uses of
301 * deprecated functions.
302 */
303#ifndef SCM_ENABLE_DEPRECATED
304#define SCM_ENABLE_DEPRECATED 0
1be6b49c 305#endif
0f2d19dd 306
b971d089 307\f
0f2d19dd 308
5c75b29f 309/* {Architecture and compiler properties}
0f2d19dd 310 *
5c75b29f
DH
311 * Guile as of today can only work on systems which fulfill at least the
312 * following requirements:
59c4bb82
DH
313 *
314 * - scm_t_bits and SCM variables have at least 32 bits.
5c75b29f 315 * Guile's type system is based on this assumption.
59c4bb82
DH
316 *
317 * - sizeof (scm_t_bits) >= sizeof (void*) and sizeof (SCM) >= sizeof (void*)
318 * Guile's type system is based on this assumption, since it must be
319 * possible to store pointers to cells on the heap in scm_t_bits and SCM
320 * variables.
321 *
322 * - sizeof (scm_t_bits) >= 4 and sizeof (scm_t_bits) is a power of 2.
323 * Guile's type system is based on this assumption. In particular, it is
324 * assumed that cells, i. e. pairs of scm_t_bits variables, are eight
325 * character aligned. This is because three bits of a scm_t_bits variable
326 * that is holding a pointer to a cell on the heap must be available for
327 * storing type data.
328 *
329 * - sizeof (scm_t_bits) <= sizeof (void*) and sizeof (SCM) <= sizeof (void*)
330 * In some parts of guile, scm_t_bits and SCM variables are passed to
331 * functions as void* arguments. Together with the requirement above, this
332 * requires a one-to-one correspondence between the size of a void* and the
333 * sizes of scm_t_bits and SCM variables.
334 *
5c75b29f
DH
335 * - numbers are encoded using two's complement.
336 * The implementation of the bitwise scheme level operations is based on
337 * this assumption.
59c4bb82 338 *
5c75b29f 339 * - ... add more
0f2d19dd
JB
340 */
341
5c75b29f
DH
342#ifdef CHAR_BIT
343# define SCM_CHAR_BIT CHAR_BIT
344#else
345# define SCM_CHAR_BIT 8
346#endif
347
348#ifdef LONG_BIT
349# define SCM_LONG_BIT LONG_BIT
350#else
351# define SCM_LONG_BIT (SCM_CHAR_BIT * sizeof (long) / sizeof (char))
352#endif
353
354#ifdef UCHAR_MAX
355# define SCM_CHAR_CODE_LIMIT (UCHAR_MAX + 1L)
0f2d19dd 356#else
e2806c10 357# define SCM_CHAR_CODE_LIMIT 256L
5c75b29f
DH
358#endif
359
e88d45aa
MV
360#define SCM_I_UTYPE_MAX(type) ((type)-1)
361#define SCM_I_TYPE_MAX(type,umax) ((type)((umax)/2))
362#define SCM_I_TYPE_MIN(type,umax) (-((type)((umax)/2))-1)
363
364#define SCM_T_UINT8_MAX SCM_I_UTYPE_MAX(scm_t_uint8)
365#define SCM_T_INT8_MIN SCM_I_TYPE_MIN(scm_t_int8,SCM_T_UINT8_MAX)
366#define SCM_T_INT8_MAX SCM_I_TYPE_MAX(scm_t_int8,SCM_T_UINT8_MAX)
367
368#define SCM_T_UINT16_MAX SCM_I_UTYPE_MAX(scm_t_uint16)
369#define SCM_T_INT16_MIN SCM_I_TYPE_MIN(scm_t_int16,SCM_T_UINT16_MAX)
370#define SCM_T_INT16_MAX SCM_I_TYPE_MAX(scm_t_int16,SCM_T_UINT16_MAX)
371
372#define SCM_T_UINT32_MAX SCM_I_UTYPE_MAX(scm_t_uint32)
373#define SCM_T_INT32_MIN SCM_I_TYPE_MIN(scm_t_int32,SCM_T_UINT32_MAX)
374#define SCM_T_INT32_MAX SCM_I_TYPE_MAX(scm_t_int32,SCM_T_UINT32_MAX)
375
376#if SCM_HAVE_T_INT64
377#define SCM_T_UINT64_MAX SCM_I_UTYPE_MAX(scm_t_uint64)
378#define SCM_T_INT64_MIN SCM_I_TYPE_MIN(scm_t_int64,SCM_T_UINT64_MAX)
379#define SCM_T_INT64_MAX SCM_I_TYPE_MAX(scm_t_int64,SCM_T_UINT64_MAX)
380#endif
381
382#if SCM_SIZEOF_LONG_LONG
383#define SCM_I_ULLONG_MAX SCM_I_UTYPE_MAX(unsigned long long)
384#define SCM_I_LLONG_MIN SCM_I_TYPE_MIN(long long,SCM_I_ULLONG_MAX)
385#define SCM_I_LLONG_MAX SCM_I_TYPE_MAX(long long,SCM_I_ULLONG_MAX)
386#endif
387
388#define SCM_T_UINTMAX_MAX SCM_I_UTYPE_MAX(scm_t_uintmax)
389#define SCM_T_INTMAX_MIN SCM_I_TYPE_MIN(scm_t_intmax,SCM_T_UINTMAX_MAX)
390#define SCM_T_INTMAX_MAX SCM_I_TYPE_MAX(scm_t_intmax,SCM_T_UINTMAX_MAX)
391
392#define SCM_I_SIZE_MAX SCM_I_UTYPE_MAX(size_t)
393#define SCM_I_SSIZE_MIN SCM_I_TYPE_MIN(ssize_t,SCM_I_SIZE_MAX)
394#define SCM_I_SSIZE_MAX SCM_I_TYPE_MAX(ssize_t,SCM_I_SIZE_MAX)
395
0f2d19dd
JB
396\f
397
2a1d8241 398#include "libguile/tags.h"
0f2d19dd
JB
399
400\f
401#ifdef vms
402# ifndef CHEAP_CONTINUATIONS
403 typedef int jmp_buf[17];
404 extern int setjump(jmp_buf env);
405 extern int longjump(jmp_buf env, int ret);
406# define setjmp setjump
407# define longjmp longjump
408# else
409# include <setjmp.h>
410# endif
411#else /* ndef vms */
412# ifdef _CRAY1
413 typedef int jmp_buf[112];
414 extern int setjump(jmp_buf env);
415 extern int longjump(jmp_buf env, int ret);
416# define setjmp setjump
417# define longjmp longjump
418# else /* ndef _CRAY1 */
346e4402
NJ
419# if defined (__ia64__)
420/* For IA64, emulate the setjmp API using getcontext. */
421# include <signal.h>
422# include <ucontext.h>
423 typedef struct {
424 ucontext_t ctx;
425 int fresh;
426 } jmp_buf;
427# define setjmp(JB) \
428 ( (JB).fresh = 1, \
429 getcontext (&((JB).ctx)), \
430 ((JB).fresh ? ((JB).fresh = 0, 0) : 1) )
431# define longjmp(JB,VAL) scm_ia64_longjmp (&(JB), VAL)
432 void scm_ia64_longjmp (jmp_buf *, int);
433# else /* ndef __ia64__ */
434# include <setjmp.h>
435# endif /* ndef __ia64__ */
0f2d19dd
JB
436# endif /* ndef _CRAY1 */
437#endif /* ndef vms */
438
0f2d19dd
JB
439/* James Clark came up with this neat one instruction fix for
440 * continuations on the SPARC. It flushes the register windows so
3dd84ef1 441 * that all the state of the process is contained in the stack.
0f2d19dd
JB
442 */
443
7c12f0ac 444#if defined (sparc) || defined (__sparc__) || defined (__sparc)
0f2d19dd
JB
445# define SCM_FLUSH_REGISTER_WINDOWS asm("ta 3")
446#else
447# define SCM_FLUSH_REGISTER_WINDOWS /* empty */
448#endif
449
3dd84ef1 450/* If stack is not longword aligned then
0f2d19dd
JB
451 */
452
453/* #define SHORT_ALIGN */
454#ifdef THINK_C
455# define SHORT_ALIGN
456#endif
457#ifdef MSDOS
458# define SHORT_ALIGN
459#endif
460#ifdef atarist
461# define SHORT_ALIGN
462#endif
463
464#ifdef SHORT_ALIGN
465typedef short SCM_STACKITEM;
466#else
467typedef long SCM_STACKITEM;
468#endif
79f55b7c
MD
469
470/* Cast pointer through (void *) in order to avoid compiler warnings
471 when strict aliasing is enabled */
472#define SCM_STACK_PTR(ptr) ((SCM_STACKITEM *) (void *) (ptr))
0f2d19dd
JB
473\f
474
9f0e55a6
MD
475#define SCM_ASYNC_TICK /*fixme* should change names */ \
476do { \
9de87eea 477 if (SCM_I_CURRENT_THREAD->pending_asyncs) \
9f0e55a6
MD
478 scm_async_click (); \
479} while (0)
25d3ee9d 480
0f2d19dd 481
8417b665
JB
482/* Anthony Green writes:
483 When the compiler sees...
484 DEFER_INTS;
485 [critical code here]
486 ALLOW_INTS;
487 ...it doesn't actually promise to keep the critical code within the
488 boundries of the DEFER/ALLOW_INTS instructions. It may very well
489 schedule it outside of the magic defined in those macros.
490
491 However, GCC's volatile asm feature forms a barrier over which code is
492 never moved. So if you add...
35eec738
JB
493 asm ("");
494 ...to each of the DEFER_INTS and ALLOW_INTS macros, the critical
495 code will always remain in place. asm's without inputs or outputs
496 are implicitly volatile. */
8417b665 497#ifdef __GNUC__
35eec738 498#define SCM_FENCE asm /* volatile */ ("")
189b66ba
MV
499#elif defined (__INTEL_COMPILER) && defined (__ia64)
500#define SCM_FENCE __memory_barrier()
8417b665
JB
501#else
502#define SCM_FENCE
503#endif
504
c72cc5fb 505#define SCM_TICK \
bfc69694 506do { \
cd911565 507 SCM_ASYNC_TICK; \
216eedfc 508 SCM_THREAD_SWITCHING_CODE; \
bfc69694 509} while (0)
0f2d19dd
JB
510
511\f
512
513/** SCM_ASSERT
3dd84ef1 514 **
0f2d19dd
JB
515 **/
516
517
518#ifdef SCM_RECKLESS
519#define SCM_ASSERT(_cond, _arg, _pos, _subr)
23deee81 520#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg)
0f2d19dd
JB
521#define SCM_ASRTGO(_cond, _label)
522#else
9cc37597
LC
523#define SCM_ASSERT(_cond, _arg, _pos, _subr) \
524 do { if (SCM_UNLIKELY (!(_cond))) \
aeb4c2e1 525 scm_wrong_type_arg (_subr, _pos, _arg); } while (0)
9cc37597
LC
526#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \
527 do { if (SCM_UNLIKELY (!(_cond))) \
aeb4c2e1 528 scm_wrong_type_arg_msg(_subr, _pos, _arg, _msg); } while (0)
9cc37597
LC
529#define SCM_ASRTGO(_cond, _label) \
530 do { if (SCM_UNLIKELY (!(_cond))) \
aeb4c2e1 531 goto _label; } while (0)
0f2d19dd 532#endif
95b88819 533
9de33deb
MD
534/*
535 * SCM_WTA_DISPATCH
536 */
537
451e591c
DH
538/* Dirk:FIXME:: In all of the SCM_WTA_DISPATCH_* macros it is assumed that
539 * 'gf' is zero if uninitialized. It would be cleaner if some valid SCM value
540 * like SCM_BOOL_F or SCM_UNDEFINED was chosen.
541 */
542
1174045c 543SCM_API SCM scm_call_generic_0 (SCM gf);
b3c8a0f5 544
e68fc829 545#define SCM_WTA_DISPATCH_0(gf, subr) \
c07b3fef
MD
546 return (SCM_UNPACK (gf) \
547 ? scm_call_generic_0 ((gf)) \
e68fc829 548 : (scm_error_num_args_subr ((subr)), SCM_UNSPECIFIED))
9cc37597
LC
549#define SCM_GASSERT0(cond, gf, subr) \
550 if (SCM_UNLIKELY(!(cond))) \
551 SCM_WTA_DISPATCH_0((gf), (subr))
b3c8a0f5 552
1174045c 553SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
9de33deb 554
c07b3fef
MD
555#define SCM_WTA_DISPATCH_1(gf, a1, pos, subr) \
556 return (SCM_UNPACK (gf) \
557 ? scm_call_generic_1 ((gf), (a1)) \
558 : (scm_wrong_type_arg ((subr), (pos), (a1)), SCM_UNSPECIFIED))
9cc37597
LC
559#define SCM_GASSERT1(cond, gf, a1, pos, subr) \
560 if (SCM_UNLIKELY (!(cond))) \
561 SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
9de33deb 562
1174045c 563SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
9de33deb 564
c07b3fef
MD
565#define SCM_WTA_DISPATCH_2(gf, a1, a2, pos, subr) \
566 return (SCM_UNPACK (gf) \
567 ? scm_call_generic_2 ((gf), (a1), (a2)) \
568 : (scm_wrong_type_arg ((subr), (pos), \
569 (pos) == SCM_ARG1 ? (a1) : (a2)), \
570 SCM_UNSPECIFIED))
9cc37597
LC
571#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \
572 if (SCM_UNLIKELY (!(cond))) \
573 SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr))
9de33deb 574
1174045c 575SCM_API SCM scm_apply_generic (SCM gf, SCM args);
89c358b1 576
c07b3fef
MD
577#define SCM_WTA_DISPATCH_n(gf, args, pos, subr) \
578 return (SCM_UNPACK (gf) \
579 ? scm_apply_generic ((gf), (args)) \
580 : (scm_wrong_type_arg ((subr), (pos), \
581 scm_list_ref ((args), \
93ccaef0 582 scm_from_int ((pos) - 1))), \
c07b3fef 583 SCM_UNSPECIFIED))
9cc37597
LC
584#define SCM_GASSERTn(cond, gf, args, pos, subr) \
585 if (SCM_UNLIKELY (!(cond))) \
586 SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
89c358b1 587
c751e5e3
GB
588#ifndef SCM_MAGIC_SNARFER
589/* Let these macros pass through if
590 we are snarfing; thus we can tell the
591 difference between the use of an actual
592 number vs. the use of one of these macros --
f5421cfc 593 actual numbers in SCM_VALIDATE_* and SCM_ASSERT
c751e5e3
GB
594 constructs must match the formal argument name,
595 but using SCM_ARG* avoids the test */
596
0f2d19dd
JB
597#define SCM_ARGn 0
598#define SCM_ARG1 1
599#define SCM_ARG2 2
600#define SCM_ARG3 3
601#define SCM_ARG4 4
602#define SCM_ARG5 5
1146b6cd 603#define SCM_ARG6 6
3dd84ef1 604#define SCM_ARG7 7
0f2d19dd 605
c751e5e3 606#endif /* SCM_MAGIC_SNARFER */
0f2d19dd 607
0f2d19dd
JB
608\f
609
610/* SCM_EXIT_SUCCESS is the default code to return from SCM if no errors
611 * were encountered. SCM_EXIT_FAILURE is the default code to return from
612 * SCM if errors were encountered. The return code can be explicitly
613 * specified in a SCM program with (scm_quit <n>).
614 */
615
616#ifndef SCM_EXIT_SUCCESS
617#ifdef vms
618#define SCM_EXIT_SUCCESS 1
619#else
620#define SCM_EXIT_SUCCESS 0
621#endif /* def vms */
622#endif /* ndef SCM_EXIT_SUCCESS */
623#ifndef SCM_EXIT_FAILURE
624#ifdef vms
625#define SCM_EXIT_FAILURE 2
626#else
627#define SCM_EXIT_FAILURE 1
628#endif /* def vms */
629#endif /* ndef SCM_EXIT_FAILURE */
630
570b6821
MV
631/* Define SCM_C_INLINE_KEYWORD so that it can be used as a replacement
632 for the "inline" keyword, expanding to nothing when "inline" is not
633 available.
634*/
635
636#ifdef SCM_C_INLINE
637#define SCM_C_INLINE_KEYWORD SCM_C_INLINE
638#else
639#define SCM_C_INLINE_KEYWORD
640#endif
641
729dbac3 642#endif /* SCM___SCM_H */
89e00824
ML
643
644/*
645 Local Variables:
646 c-file-style: "gnu"
647 End:
648*/