fix scm_protects deprecation warning
[bpt/guile.git] / libguile / __scm.h
1 /* classes: h_files */
2
3 #ifndef SCM___SCM_H
4 #define SCM___SCM_H
5
6 /* Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2006,
7 * 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
8 *
9 * This library is free software; you can redistribute it and/or
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.
13 *
14 * This library is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
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
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 * 02110-1301 USA
23 */
24
25 \f
26
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?"
42
43 _scm.h is not installed; it's only visible to the libguile sources
44 themselves, and it includes config.h, the private config header.
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
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"
55
56 \f
57
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
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
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
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. */
102 #if SCM_GNUC_PREREQ (3, 0)
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
111 /* The SCM_INTERNAL macro makes it possible to explicitly declare a function
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
116
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 ()'. */
121 #if !defined (SCM_BUILDING_DEPRECATED_CODE) && SCM_GNUC_PREREQ (3, 0)
122 # define SCM_DEPRECATED SCM_API __attribute__ ((__deprecated__))
123 #else
124 # define SCM_DEPRECATED SCM_API
125 #endif
126
127 /* The SCM_ALIGNED macro, when defined, can be used to instruct the compiler
128 * to honor the given alignment constraint. */
129 #if defined __GNUC__
130 # define SCM_ALIGNED(x) __attribute__ ((aligned (x)))
131 #elif defined __INTEL_COMPILER
132 # define SCM_ALIGNED(x) __declspec (align (x))
133 #else
134 /* Don't know how to align things. */
135 # undef SCM_ALIGNED
136 #endif
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. */
141 #if SCM_GNUC_PREREQ (3, 0)
142 # define SCM_MALLOC __attribute__ ((__malloc__))
143 #else
144 # define SCM_MALLOC
145 #endif
146
147 \f
148 /* {Supported Options}
149 *
150 * These may be defined or undefined.
151 */
152
153 /* #define GUILE_DEBUG_FREELIST */
154
155
156 /* Use engineering notation when converting numbers strings?
157 */
158 #undef ENGNOT
159
160 \f
161 /* {Unsupported Options}
162 *
163 * These must be defined as given here.
164 */
165
166
167 /* Guile Scheme supports the #f/() distinction; Guile Lisp won't. We
168 have horrible plans for their unification. */
169 #undef SICP
170
171 \f
172
173 /* Random options (not yet supported or in final form). */
174
175 #define STACK_CHECKING
176 #undef NO_CEVAL_STACK_CHECKING
177
178 \f
179
180 /* SCM_API is a macro prepended to all function and data definitions
181 which should be exported from libguile. */
182
183 #if defined BUILDING_LIBGUILE && defined HAVE_VISIBILITY
184 # define SCM_API extern __attribute__((__visibility__("default")))
185 #elif defined BUILDING_LIBGUILE && defined _MSC_VER
186 # define SCM_API __declspec(dllexport) extern
187 #elif defined _MSC_VER
188 # define SCM_API __declspec(dllimport) extern
189 #else
190 # define SCM_API extern
191 #endif
192
193 \f
194
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
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:
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
210 * file or give suitable options to make, like:
211 * make all CFLAGS="-DSCM_DEBUG_XXX=1 ..."
212 */
213
214
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
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
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
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
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
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.
259 */
260 #ifndef SCM_DEBUG_REST_ARGUMENT
261 #define SCM_DEBUG_REST_ARGUMENT SCM_DEBUG
262 #endif
263
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
283 * errors, and then do 'make clean; make'.
284 */
285 #ifndef SCM_DEBUG_TYPING_STRICTNESS
286 #define SCM_DEBUG_TYPING_STRICTNESS 1
287 #endif
288
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.
300 */
301 #ifndef SCM_DEBUG_DEBUGGING_SUPPORT
302 #define SCM_DEBUG_DEBUGGING_SUPPORT SCM_DEBUG
303 #endif
304
305 \f
306
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 ..."
323 */
324
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
331 #endif
332
333 \f
334
335 /* {Architecture and compiler properties}
336 *
337 * Guile as of today can only work on systems which fulfill at least the
338 * following requirements:
339 *
340 * - scm_t_bits and SCM variables have at least 32 bits.
341 * Guile's type system is based on this assumption.
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 *
361 * - numbers are encoded using two's complement.
362 * The implementation of the bitwise scheme level operations is based on
363 * this assumption.
364 *
365 * - ... add more
366 */
367
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)
382 #else
383 # define SCM_CHAR_CODE_LIMIT 256L
384 #endif
385
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
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)
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
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
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
424 \f
425
426 #include "libguile/tags.h"
427
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
436 typedef SCM (* scm_t_subr) ();
437 #else
438 typedef void *scm_t_subr;
439 #endif
440
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 */
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;
467 } scm_i_jmp_buf;
468 # define SCM_I_SETJMP(JB) \
469 ( (JB).fresh = 1, \
470 getcontext (&((JB).ctx)), \
471 ((JB).fresh ? ((JB).fresh = 0, 0) : 1) )
472 # define SCM_I_LONGJMP(JB,VAL) scm_ia64_longjmp (&(JB), VAL)
473 void scm_ia64_longjmp (scm_i_jmp_buf *, int);
474 # else /* ndef __ia64__ */
475 # include <setjmp.h>
476 # endif /* ndef __ia64__ */
477 # endif /* ndef _CRAY1 */
478 #endif /* ndef vms */
479
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
489 /* James Clark came up with this neat one instruction fix for
490 * continuations on the SPARC. It flushes the register windows so
491 * that all the state of the process is contained in the stack.
492 */
493
494 #if defined (sparc) || defined (__sparc__) || defined (__sparc)
495 # define SCM_FLUSH_REGISTER_WINDOWS asm("ta 3")
496 #else
497 # define SCM_FLUSH_REGISTER_WINDOWS /* empty */
498 #endif
499
500 /* If stack is not longword aligned then
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
515 typedef short SCM_STACKITEM;
516 #else
517 typedef long SCM_STACKITEM;
518 #endif
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))
523 \f
524
525 SCM_API void scm_async_tick (void);
526
527 #ifdef BUILDING_LIBGUILE
528
529 /* FIXME: should change names */
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 */
539 # define SCM_ASYNC_TICK_WITH_CODE(thr, stmt) \
540 do \
541 { \
542 if (SCM_UNLIKELY (thr->pending_asyncs)) \
543 { \
544 stmt; \
545 scm_async_click (); \
546 } \
547 } \
548 while (0)
549
550 #else /* !BUILDING_LIBGUILE */
551
552 # define SCM_ASYNC_TICK (scm_async_tick ())
553
554 #endif /* !BUILDING_LIBGUILE */
555
556
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...
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. */
572 #ifdef __GNUC__
573 #define SCM_FENCE asm /* volatile */ ("")
574 #elif defined (__INTEL_COMPILER) && defined (__ia64)
575 #define SCM_FENCE __memory_barrier()
576 #else
577 #define SCM_FENCE
578 #endif
579
580 #define SCM_TICK \
581 do { \
582 SCM_ASYNC_TICK; \
583 SCM_THREAD_SWITCHING_CODE; \
584 } while (0)
585
586 \f
587
588 /** SCM_ASSERT
589 **
590 **/
591
592
593 #ifdef SCM_RECKLESS
594 #define SCM_ASSERT(_cond, _arg, _pos, _subr)
595 #define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg)
596 #define SCM_ASRTGO(_cond, _label)
597 #else
598 #define SCM_ASSERT(_cond, _arg, _pos, _subr) \
599 do { if (SCM_UNLIKELY (!(_cond))) \
600 scm_wrong_type_arg (_subr, _pos, _arg); } while (0)
601 #define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \
602 do { if (SCM_UNLIKELY (!(_cond))) \
603 scm_wrong_type_arg_msg(_subr, _pos, _arg, _msg); } while (0)
604 #define SCM_ASRTGO(_cond, _label) \
605 do { if (SCM_UNLIKELY (!(_cond))) \
606 goto _label; } while (0)
607 #endif
608
609 /*
610 * SCM_WTA_DISPATCH
611 */
612
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
618 SCM_API SCM scm_call_generic_0 (SCM gf);
619
620 #define SCM_WTA_DISPATCH_0(gf, subr) \
621 return (SCM_UNPACK (gf) \
622 ? scm_call_generic_0 ((gf)) \
623 : (scm_error_num_args_subr ((subr)), SCM_UNSPECIFIED))
624 #define SCM_GASSERT0(cond, gf, subr) \
625 if (SCM_UNLIKELY(!(cond))) \
626 SCM_WTA_DISPATCH_0((gf), (subr))
627
628 SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
629
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))
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
641 #define SCM_GASSERT1(cond, gf, a1, pos, subr) \
642 if (SCM_UNLIKELY (!(cond))) \
643 SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
644
645 SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
646
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))
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))
656
657 SCM_API SCM scm_apply_generic (SCM gf, SCM args);
658
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), \
664 scm_from_int ((pos) - 1))), \
665 SCM_UNSPECIFIED))
666 #define SCM_GASSERTn(cond, gf, args, pos, subr) \
667 if (SCM_UNLIKELY (!(cond))) \
668 SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
669
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 --
675 actual numbers in SCM_VALIDATE_* and SCM_ASSERT
676 constructs must match the formal argument name,
677 but using SCM_ARG* avoids the test */
678
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
685 #define SCM_ARG6 6
686 #define SCM_ARG7 7
687
688 #endif /* SCM_MAGIC_SNARFER */
689
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
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
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
732 #endif /* SCM___SCM_H */
733
734 /*
735 Local Variables:
736 c-file-style: "gnu"
737 End:
738 */