add partial support for tail patterns in syntax-rules/syntax-case
[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
743b8872
LC
107/* The SCM_DEPRECATED macro is used in declarations of deprecated functions
108 * or variables. Defining `SCM_BUILDING_DEPRECATED_CODE' allows deprecated
109 * functions to be implemented in terms of deprecated functions, and allows
110 * deprecated functions to be referred to by `scm_c_define_gsubr ()'. */
111#if !defined (SCM_BUILDING_DEPRECATED_CODE) \
112 && defined (__GNUC__) && (__GNUC__ >= 3)
113# define SCM_DEPRECATED SCM_API __attribute__ ((__deprecated__))
114#else
115# define SCM_DEPRECATED SCM_API
116#endif
117
c6054fea
LC
118/* The SCM_ALIGNED macro, when defined, can be used to instruct the compiler
119 * to honor the given alignment constraint. */
731dd0ce 120#if defined __GNUC__
c6054fea 121# define SCM_ALIGNED(x) __attribute__ ((aligned (x)))
731dd0ce 122#elif defined __INTEL_COMPILER
c6054fea
LC
123# define SCM_ALIGNED(x) __declspec (align (x))
124#else
125/* Don't know how to align things. */
126# undef SCM_ALIGNED
127#endif
9cc37597
LC
128
129\f
0f2d19dd
JB
130/* {Supported Options}
131 *
132 * These may be defined or undefined.
133 */
134
16d35552 135/* #define GUILE_DEBUG_FREELIST */
70d63753 136
0f2d19dd
JB
137
138/* Use engineering notation when converting numbers strings?
139 */
140#undef ENGNOT
141
0f2d19dd
JB
142\f
143/* {Unsupported Options}
144 *
3c205827 145 * These must be defined as given here.
0f2d19dd
JB
146 */
147
148
3c205827
JB
149/* Guile Scheme supports the #f/() distinction; Guile Lisp won't. We
150 have horrible plans for their unification. */
151#undef SICP
0f2d19dd
JB
152
153\f
154
80c78696 155/* Random options (not yet supported or in final form). */
0f2d19dd 156
80c78696
MD
157#define STACK_CHECKING
158#undef NO_CEVAL_STACK_CHECKING
0f2d19dd 159
43ff3170 160\f
3a9809df 161
1174045c 162/* SCM_API is a macro prepended to all function and data definitions
442f3f20
AW
163 which should be exported from libguile. */
164
56a3dcd4 165#if defined BUILDING_LIBGUILE && defined HAVE_VISIBILITY
442f3f20 166# define SCM_API extern __attribute__((__visibility__("default")))
56a3dcd4 167#elif defined BUILDING_LIBGUILE && defined _MSC_VER
442f3f20
AW
168# define SCM_API __declspec(dllexport) extern
169#elif defined _MSC_VER
170# define SCM_API __declspec(dllimport) extern
1174045c
MV
171#else
172# define SCM_API extern
173#endif
174
175\f
176
3a9809df
DH
177/* {Debugging Options}
178 *
179 * These compile time options determine whether to include code that is only
180 * useful for debugging guile itself or C level extensions to guile. The
181 * common prefix for all option macros of this kind is "SCM_DEBUG_". It is
fce0b22d
DH
182 * guaranteed that a macro named SCM_DEBUG_XXX is always defined (typically to
183 * either 0 or 1), i. e. there is no need to test for the undefined case.
184 * This allows to use these definitions comfortably within code, as in the
185 * following example:
3a9809df
DH
186 * #define FOO do { if (SCM_DEBUG_XXX) bar(); else baz(); } while (0)
187 * Any sane compiler will remove the unused branch without any performance
188 * penalty for the resulting code.
189 *
190 * Note: Some SCM_DEBUG_XXX options are not settable at configure time.
191 * To change the value of such options you will have to edit this header
56100716
DH
192 * file or give suitable options to make, like:
193 * make all CFLAGS="-DSCM_DEBUG_XXX=1 ..."
3a9809df
DH
194 */
195
196
c8a54c4b
DH
197/* The value of SCM_DEBUG determines the default for most of the not yet
198 * defined debugging options. This allows, for example, to enable most of the
199 * debugging options by simply defining SCM_DEBUG as 1.
200 */
201#ifndef SCM_DEBUG
202#define SCM_DEBUG 0
203#endif
204
7ddb9baf
HWN
205/* For debugging purposes: define this is to ensure nobody is using
206 * the mark bits outside of the marking phase. This is meant for
207 * debugging purposes only.
208 */
209#ifndef SCM_DEBUG_MARKING_API
210#define SCM_DEBUG_MARKING_API 0
211#endif
212
46d53380
DH
213/* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform
214 * exhaustive parameter checking: It will be verified that cell parameters
215 * actually point to a valid heap cell. Note: If this option is enabled,
216 * guile will run about ten times slower than normally.
217 */
218#ifndef SCM_DEBUG_CELL_ACCESSES
219#define SCM_DEBUG_CELL_ACCESSES SCM_DEBUG
220#endif
221
216eedfc
DH
222/* If SCM_DEBUG_INTERRUPTS is set to 1, with every deferring and allowing of
223 * interrupts a consistency check will be performed.
224 */
225#ifndef SCM_DEBUG_INTERRUPTS
226#define SCM_DEBUG_INTERRUPTS SCM_DEBUG
227#endif
228
e81d98ec
DH
229/* If SCM_DEBUG_PAIR_ACCESSES is set to 1, accesses to cons cells will be
230 * exhaustively checked. Note: If this option is enabled, guile will run
231 * slower than normally.
232 */
233#ifndef SCM_DEBUG_PAIR_ACCESSES
234#define SCM_DEBUG_PAIR_ACCESSES SCM_DEBUG
235#endif
236
af45e3b0
DH
237/* If SCM_DEBUG_REST_ARGUMENT is set to 1, functions that take rest arguments
238 * will check whether the rest arguments are actually passed as a proper list.
239 * Otherwise, if SCM_DEBUG_REST_ARGUMENT is 0, functions that take rest
240 * arguments will take it for granted that these are passed as a proper list.
c8a54c4b 241 */
af45e3b0
DH
242#ifndef SCM_DEBUG_REST_ARGUMENT
243#define SCM_DEBUG_REST_ARGUMENT SCM_DEBUG
3a9809df
DH
244#endif
245
fce0b22d
DH
246/* The macro SCM_DEBUG_TYPING_STRICTNESS indicates what level of type checking
247 * shall be performed with respect to the use of the SCM datatype. The macro
248 * may be defined to one of the values 0, 1 and 2.
249 *
250 * A value of 0 means that there will be no compile time type checking, since
251 * the SCM datatype will be declared as an integral type. This setting should
252 * only be used on systems, where casting from integral types to pointers may
253 * lead to loss of bit information.
254 *
255 * A value of 1 means that there will an intermediate level of compile time
256 * type checking, since the SCM datatype will be declared as a pointer to an
257 * undefined struct. This setting is the default, since it does not cost
258 * anything in terms of performance or code size.
259 *
260 * A value of 2 provides a maximum level of compile time type checking since
261 * the SCM datatype will be declared as a struct. This setting should be used
262 * for _compile time_ type checking only, since the compiled result is likely
263 * to be quite inefficient. The right way to make use of this option is to do
264 * a 'make clean; make CFLAGS=-DSCM_DEBUG_TYPING_STRICTNESS=2', fix your
56100716 265 * errors, and then do 'make clean; make'.
c8a54c4b 266 */
56100716 267#ifndef SCM_DEBUG_TYPING_STRICTNESS
729dbac3 268#define SCM_DEBUG_TYPING_STRICTNESS 1
56100716
DH
269#endif
270
d0624e39
DH
271/* If SCM_DEBUG_DEBUGGING_SUPPORT is set to 1, guile will provide a set of
272 * special functions that support debugging with a debugger like gdb or
273 * debugging of guile internals on the scheme level. The behaviour of guile
274 * is not changed by this macro, only the set of functions that are available
275 * will differ. All functions that are introduced this way have the prefix
276 * 'scm_dbg_' on the C level and the prefix 'dbg-' on the scheme level. This
277 * allows to easily determine the set of support functions, given that your
278 * debugger or repl provide automatic name completion. Note that these
279 * functions are intended to be used during interactive debugging sessions
280 * only. They are not considered part of guile's official API. They may
281 * change or disappear without notice or deprecation phase.
94fb5a6e 282 */
d0624e39
DH
283#ifndef SCM_DEBUG_DEBUGGING_SUPPORT
284#define SCM_DEBUG_DEBUGGING_SUPPORT SCM_DEBUG
94fb5a6e
DH
285#endif
286
3a9809df
DH
287\f
288
8c494e99
DH
289/* {Feature Options}
290 *
291 * These compile time options determine whether code for certain features
292 * should be compiled into guile. The common prefix for all option macros
293 * of this kind is "SCM_ENABLE_". It is guaranteed that a macro named
294 * SCM_ENABLE_XXX is defined to be either 0 or 1, i. e. there is no need to
295 * test for the undefined case. This allows to use these definitions
296 * comfortably within code, as in the following example:
297 * #define FOO do { if (SCM_ENABLE_XXX) bar(); else baz(); } while (0)
298 * Any sane compiler will remove the unused branch without any performance
299 * penalty for the resulting code.
300 *
301 * Note: Some SCM_ENABLE_XXX options are not settable at configure time.
302 * To change the value of such options you will have to edit this header
303 * file or give suitable options to make, like:
304 * make all CFLAGS="-DSCM_ENABLE_XXX=1 ..."
0f2d19dd 305 */
1be6b49c 306
8c494e99
DH
307/* If SCM_ENABLE_DEPRECATED is set to 1, deprecated code will be included in
308 * guile, as well as some functions to issue run-time warnings about uses of
309 * deprecated functions.
310 */
311#ifndef SCM_ENABLE_DEPRECATED
312#define SCM_ENABLE_DEPRECATED 0
1be6b49c 313#endif
0f2d19dd 314
b971d089 315\f
0f2d19dd 316
5c75b29f 317/* {Architecture and compiler properties}
0f2d19dd 318 *
5c75b29f
DH
319 * Guile as of today can only work on systems which fulfill at least the
320 * following requirements:
59c4bb82
DH
321 *
322 * - scm_t_bits and SCM variables have at least 32 bits.
5c75b29f 323 * Guile's type system is based on this assumption.
59c4bb82
DH
324 *
325 * - sizeof (scm_t_bits) >= sizeof (void*) and sizeof (SCM) >= sizeof (void*)
326 * Guile's type system is based on this assumption, since it must be
327 * possible to store pointers to cells on the heap in scm_t_bits and SCM
328 * variables.
329 *
330 * - sizeof (scm_t_bits) >= 4 and sizeof (scm_t_bits) is a power of 2.
331 * Guile's type system is based on this assumption. In particular, it is
332 * assumed that cells, i. e. pairs of scm_t_bits variables, are eight
333 * character aligned. This is because three bits of a scm_t_bits variable
334 * that is holding a pointer to a cell on the heap must be available for
335 * storing type data.
336 *
337 * - sizeof (scm_t_bits) <= sizeof (void*) and sizeof (SCM) <= sizeof (void*)
338 * In some parts of guile, scm_t_bits and SCM variables are passed to
339 * functions as void* arguments. Together with the requirement above, this
340 * requires a one-to-one correspondence between the size of a void* and the
341 * sizes of scm_t_bits and SCM variables.
342 *
5c75b29f
DH
343 * - numbers are encoded using two's complement.
344 * The implementation of the bitwise scheme level operations is based on
345 * this assumption.
59c4bb82 346 *
5c75b29f 347 * - ... add more
0f2d19dd
JB
348 */
349
5c75b29f
DH
350#ifdef CHAR_BIT
351# define SCM_CHAR_BIT CHAR_BIT
352#else
353# define SCM_CHAR_BIT 8
354#endif
355
356#ifdef LONG_BIT
357# define SCM_LONG_BIT LONG_BIT
358#else
359# define SCM_LONG_BIT (SCM_CHAR_BIT * sizeof (long) / sizeof (char))
360#endif
361
362#ifdef UCHAR_MAX
363# define SCM_CHAR_CODE_LIMIT (UCHAR_MAX + 1L)
0f2d19dd 364#else
e2806c10 365# define SCM_CHAR_CODE_LIMIT 256L
5c75b29f
DH
366#endif
367
e88d45aa
MV
368#define SCM_I_UTYPE_MAX(type) ((type)-1)
369#define SCM_I_TYPE_MAX(type,umax) ((type)((umax)/2))
370#define SCM_I_TYPE_MIN(type,umax) (-((type)((umax)/2))-1)
371
372#define SCM_T_UINT8_MAX SCM_I_UTYPE_MAX(scm_t_uint8)
373#define SCM_T_INT8_MIN SCM_I_TYPE_MIN(scm_t_int8,SCM_T_UINT8_MAX)
374#define SCM_T_INT8_MAX SCM_I_TYPE_MAX(scm_t_int8,SCM_T_UINT8_MAX)
375
376#define SCM_T_UINT16_MAX SCM_I_UTYPE_MAX(scm_t_uint16)
377#define SCM_T_INT16_MIN SCM_I_TYPE_MIN(scm_t_int16,SCM_T_UINT16_MAX)
378#define SCM_T_INT16_MAX SCM_I_TYPE_MAX(scm_t_int16,SCM_T_UINT16_MAX)
379
380#define SCM_T_UINT32_MAX SCM_I_UTYPE_MAX(scm_t_uint32)
381#define SCM_T_INT32_MIN SCM_I_TYPE_MIN(scm_t_int32,SCM_T_UINT32_MAX)
382#define SCM_T_INT32_MAX SCM_I_TYPE_MAX(scm_t_int32,SCM_T_UINT32_MAX)
383
384#if SCM_HAVE_T_INT64
385#define SCM_T_UINT64_MAX SCM_I_UTYPE_MAX(scm_t_uint64)
386#define SCM_T_INT64_MIN SCM_I_TYPE_MIN(scm_t_int64,SCM_T_UINT64_MAX)
387#define SCM_T_INT64_MAX SCM_I_TYPE_MAX(scm_t_int64,SCM_T_UINT64_MAX)
388#endif
389
390#if SCM_SIZEOF_LONG_LONG
391#define SCM_I_ULLONG_MAX SCM_I_UTYPE_MAX(unsigned long long)
392#define SCM_I_LLONG_MIN SCM_I_TYPE_MIN(long long,SCM_I_ULLONG_MAX)
393#define SCM_I_LLONG_MAX SCM_I_TYPE_MAX(long long,SCM_I_ULLONG_MAX)
394#endif
395
396#define SCM_T_UINTMAX_MAX SCM_I_UTYPE_MAX(scm_t_uintmax)
397#define SCM_T_INTMAX_MIN SCM_I_TYPE_MIN(scm_t_intmax,SCM_T_UINTMAX_MAX)
398#define SCM_T_INTMAX_MAX SCM_I_TYPE_MAX(scm_t_intmax,SCM_T_UINTMAX_MAX)
399
114bc68a
LC
400#define SCM_T_UINTPTR_MAX SCM_I_UTYPE_MAX(scm_t_uintptr)
401#define SCM_T_INTPTR_MIN SCM_I_TYPE_MIN(scm_t_intptr,SCM_T_UINTPTR_MAX)
402#define SCM_T_INTPTR_MAX SCM_I_TYPE_MAX(scm_t_intptr,SCM_T_UINTPTR_MAX)
403
e88d45aa
MV
404#define SCM_I_SIZE_MAX SCM_I_UTYPE_MAX(size_t)
405#define SCM_I_SSIZE_MIN SCM_I_TYPE_MIN(ssize_t,SCM_I_SIZE_MAX)
406#define SCM_I_SSIZE_MAX SCM_I_TYPE_MAX(ssize_t,SCM_I_SIZE_MAX)
407
0f2d19dd
JB
408\f
409
2a1d8241 410#include "libguile/tags.h"
0f2d19dd
JB
411
412\f
413#ifdef vms
414# ifndef CHEAP_CONTINUATIONS
415 typedef int jmp_buf[17];
416 extern int setjump(jmp_buf env);
417 extern int longjump(jmp_buf env, int ret);
418# define setjmp setjump
419# define longjmp longjump
420# else
421# include <setjmp.h>
422# endif
423#else /* ndef vms */
424# ifdef _CRAY1
425 typedef int jmp_buf[112];
426 extern int setjump(jmp_buf env);
427 extern int longjump(jmp_buf env, int ret);
428# define setjmp setjump
429# define longjmp longjump
430# else /* ndef _CRAY1 */
346e4402
NJ
431# if defined (__ia64__)
432/* For IA64, emulate the setjmp API using getcontext. */
433# include <signal.h>
434# include <ucontext.h>
435 typedef struct {
436 ucontext_t ctx;
437 int fresh;
a4dbe1ac
NJ
438 } scm_i_jmp_buf;
439# define SCM_I_SETJMP(JB) \
346e4402
NJ
440 ( (JB).fresh = 1, \
441 getcontext (&((JB).ctx)), \
442 ((JB).fresh ? ((JB).fresh = 0, 0) : 1) )
a4dbe1ac
NJ
443# define SCM_I_LONGJMP(JB,VAL) scm_ia64_longjmp (&(JB), VAL)
444 void scm_ia64_longjmp (scm_i_jmp_buf *, int);
346e4402
NJ
445# else /* ndef __ia64__ */
446# include <setjmp.h>
447# endif /* ndef __ia64__ */
0f2d19dd
JB
448# endif /* ndef _CRAY1 */
449#endif /* ndef vms */
450
a4dbe1ac
NJ
451/* For any platform where SCM_I_SETJMP hasn't been defined in some
452 special way above, map SCM_I_SETJMP, SCM_I_LONGJMP and
453 scm_i_jmp_buf to setjmp, longjmp and jmp_buf. */
454#ifndef SCM_I_SETJMP
455#define scm_i_jmp_buf jmp_buf
456#define SCM_I_SETJMP setjmp
457#define SCM_I_LONGJMP longjmp
458#endif
459
0f2d19dd
JB
460/* James Clark came up with this neat one instruction fix for
461 * continuations on the SPARC. It flushes the register windows so
3dd84ef1 462 * that all the state of the process is contained in the stack.
0f2d19dd
JB
463 */
464
7c12f0ac 465#if defined (sparc) || defined (__sparc__) || defined (__sparc)
0f2d19dd
JB
466# define SCM_FLUSH_REGISTER_WINDOWS asm("ta 3")
467#else
468# define SCM_FLUSH_REGISTER_WINDOWS /* empty */
469#endif
470
3dd84ef1 471/* If stack is not longword aligned then
0f2d19dd
JB
472 */
473
474/* #define SHORT_ALIGN */
475#ifdef THINK_C
476# define SHORT_ALIGN
477#endif
478#ifdef MSDOS
479# define SHORT_ALIGN
480#endif
481#ifdef atarist
482# define SHORT_ALIGN
483#endif
484
485#ifdef SHORT_ALIGN
486typedef short SCM_STACKITEM;
487#else
488typedef long SCM_STACKITEM;
489#endif
79f55b7c
MD
490
491/* Cast pointer through (void *) in order to avoid compiler warnings
492 when strict aliasing is enabled */
493#define SCM_STACK_PTR(ptr) ((SCM_STACKITEM *) (void *) (ptr))
0f2d19dd
JB
494\f
495
46935a1f
LC
496SCM_API void scm_async_tick (void);
497
498#ifdef BUILDING_LIBGUILE
499
500/* FIXME: should change names */
501# define SCM_ASYNC_TICK \
502 do \
503 { \
504 if (SCM_I_CURRENT_THREAD->pending_asyncs) \
505 scm_async_click (); \
506 } \
507 while (0)
508
509#else /* !BUILDING_LIBGUILE */
510
511# define SCM_ASYNC_TICK (scm_async_tick ())
512
513#endif /* !BUILDING_LIBGUILE */
25d3ee9d 514
0f2d19dd 515
8417b665
JB
516/* Anthony Green writes:
517 When the compiler sees...
518 DEFER_INTS;
519 [critical code here]
520 ALLOW_INTS;
521 ...it doesn't actually promise to keep the critical code within the
522 boundries of the DEFER/ALLOW_INTS instructions. It may very well
523 schedule it outside of the magic defined in those macros.
524
525 However, GCC's volatile asm feature forms a barrier over which code is
526 never moved. So if you add...
35eec738
JB
527 asm ("");
528 ...to each of the DEFER_INTS and ALLOW_INTS macros, the critical
529 code will always remain in place. asm's without inputs or outputs
530 are implicitly volatile. */
8417b665 531#ifdef __GNUC__
35eec738 532#define SCM_FENCE asm /* volatile */ ("")
189b66ba
MV
533#elif defined (__INTEL_COMPILER) && defined (__ia64)
534#define SCM_FENCE __memory_barrier()
8417b665
JB
535#else
536#define SCM_FENCE
537#endif
538
c72cc5fb 539#define SCM_TICK \
bfc69694 540do { \
cd911565 541 SCM_ASYNC_TICK; \
216eedfc 542 SCM_THREAD_SWITCHING_CODE; \
bfc69694 543} while (0)
0f2d19dd
JB
544
545\f
546
547/** SCM_ASSERT
3dd84ef1 548 **
0f2d19dd
JB
549 **/
550
551
552#ifdef SCM_RECKLESS
553#define SCM_ASSERT(_cond, _arg, _pos, _subr)
23deee81 554#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg)
0f2d19dd
JB
555#define SCM_ASRTGO(_cond, _label)
556#else
9cc37597
LC
557#define SCM_ASSERT(_cond, _arg, _pos, _subr) \
558 do { if (SCM_UNLIKELY (!(_cond))) \
aeb4c2e1 559 scm_wrong_type_arg (_subr, _pos, _arg); } while (0)
9cc37597
LC
560#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \
561 do { if (SCM_UNLIKELY (!(_cond))) \
aeb4c2e1 562 scm_wrong_type_arg_msg(_subr, _pos, _arg, _msg); } while (0)
9cc37597
LC
563#define SCM_ASRTGO(_cond, _label) \
564 do { if (SCM_UNLIKELY (!(_cond))) \
aeb4c2e1 565 goto _label; } while (0)
0f2d19dd 566#endif
95b88819 567
9de33deb
MD
568/*
569 * SCM_WTA_DISPATCH
570 */
571
451e591c
DH
572/* Dirk:FIXME:: In all of the SCM_WTA_DISPATCH_* macros it is assumed that
573 * 'gf' is zero if uninitialized. It would be cleaner if some valid SCM value
574 * like SCM_BOOL_F or SCM_UNDEFINED was chosen.
575 */
576
1174045c 577SCM_API SCM scm_call_generic_0 (SCM gf);
b3c8a0f5 578
e68fc829 579#define SCM_WTA_DISPATCH_0(gf, subr) \
c07b3fef
MD
580 return (SCM_UNPACK (gf) \
581 ? scm_call_generic_0 ((gf)) \
e68fc829 582 : (scm_error_num_args_subr ((subr)), SCM_UNSPECIFIED))
9cc37597
LC
583#define SCM_GASSERT0(cond, gf, subr) \
584 if (SCM_UNLIKELY(!(cond))) \
585 SCM_WTA_DISPATCH_0((gf), (subr))
b3c8a0f5 586
1174045c 587SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
9de33deb 588
c07b3fef
MD
589#define SCM_WTA_DISPATCH_1(gf, a1, pos, subr) \
590 return (SCM_UNPACK (gf) \
591 ? scm_call_generic_1 ((gf), (a1)) \
592 : (scm_wrong_type_arg ((subr), (pos), (a1)), SCM_UNSPECIFIED))
0193377d
MG
593
594/* This form is for dispatching a subroutine. */
595#define SCM_WTA_DISPATCH_1_SUBR(subr, a1, pos) \
596 return (SCM_UNPACK ((*SCM_SUBR_GENERIC (subr))) \
597 ? scm_call_generic_1 ((*SCM_SUBR_GENERIC (subr)), (a1)) \
598 : (scm_i_wrong_type_arg_symbol (SCM_SUBR_NAME (subr), (pos), (a1)), SCM_UNSPECIFIED))
599
9cc37597
LC
600#define SCM_GASSERT1(cond, gf, a1, pos, subr) \
601 if (SCM_UNLIKELY (!(cond))) \
602 SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
9de33deb 603
1174045c 604SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
9de33deb 605
c07b3fef
MD
606#define SCM_WTA_DISPATCH_2(gf, a1, a2, pos, subr) \
607 return (SCM_UNPACK (gf) \
608 ? scm_call_generic_2 ((gf), (a1), (a2)) \
609 : (scm_wrong_type_arg ((subr), (pos), \
610 (pos) == SCM_ARG1 ? (a1) : (a2)), \
611 SCM_UNSPECIFIED))
9cc37597
LC
612#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \
613 if (SCM_UNLIKELY (!(cond))) \
614 SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr))
9de33deb 615
1174045c 616SCM_API SCM scm_apply_generic (SCM gf, SCM args);
89c358b1 617
c07b3fef
MD
618#define SCM_WTA_DISPATCH_n(gf, args, pos, subr) \
619 return (SCM_UNPACK (gf) \
620 ? scm_apply_generic ((gf), (args)) \
621 : (scm_wrong_type_arg ((subr), (pos), \
622 scm_list_ref ((args), \
93ccaef0 623 scm_from_int ((pos) - 1))), \
c07b3fef 624 SCM_UNSPECIFIED))
9cc37597
LC
625#define SCM_GASSERTn(cond, gf, args, pos, subr) \
626 if (SCM_UNLIKELY (!(cond))) \
627 SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
89c358b1 628
c751e5e3
GB
629#ifndef SCM_MAGIC_SNARFER
630/* Let these macros pass through if
631 we are snarfing; thus we can tell the
632 difference between the use of an actual
633 number vs. the use of one of these macros --
f5421cfc 634 actual numbers in SCM_VALIDATE_* and SCM_ASSERT
c751e5e3
GB
635 constructs must match the formal argument name,
636 but using SCM_ARG* avoids the test */
637
0f2d19dd
JB
638#define SCM_ARGn 0
639#define SCM_ARG1 1
640#define SCM_ARG2 2
641#define SCM_ARG3 3
642#define SCM_ARG4 4
643#define SCM_ARG5 5
1146b6cd 644#define SCM_ARG6 6
3dd84ef1 645#define SCM_ARG7 7
0f2d19dd 646
c751e5e3 647#endif /* SCM_MAGIC_SNARFER */
0f2d19dd 648
0f2d19dd
JB
649\f
650
651/* SCM_EXIT_SUCCESS is the default code to return from SCM if no errors
652 * were encountered. SCM_EXIT_FAILURE is the default code to return from
653 * SCM if errors were encountered. The return code can be explicitly
654 * specified in a SCM program with (scm_quit <n>).
655 */
656
657#ifndef SCM_EXIT_SUCCESS
658#ifdef vms
659#define SCM_EXIT_SUCCESS 1
660#else
661#define SCM_EXIT_SUCCESS 0
662#endif /* def vms */
663#endif /* ndef SCM_EXIT_SUCCESS */
664#ifndef SCM_EXIT_FAILURE
665#ifdef vms
666#define SCM_EXIT_FAILURE 2
667#else
668#define SCM_EXIT_FAILURE 1
669#endif /* def vms */
670#endif /* ndef SCM_EXIT_FAILURE */
671
570b6821
MV
672/* Define SCM_C_INLINE_KEYWORD so that it can be used as a replacement
673 for the "inline" keyword, expanding to nothing when "inline" is not
674 available.
675*/
676
677#ifdef SCM_C_INLINE
678#define SCM_C_INLINE_KEYWORD SCM_C_INLINE
679#else
680#define SCM_C_INLINE_KEYWORD
681#endif
682
705edb95
LC
683/* Handling thread-local storage (TLS). */
684
685#ifdef SCM_HAVE_THREAD_STORAGE_CLASS
686# define SCM_THREAD_LOCAL __thread
687#else
688# define SCM_THREAD_LOCAL
689#endif
690
729dbac3 691#endif /* SCM___SCM_H */
89e00824
ML
692
693/*
694 Local Variables:
695 c-file-style: "gnu"
696 End:
697*/