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