* __scm.h (SCM_ALLOW_INTS_ONLY): Removed.
[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
bd987b8e 6/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
8c494e99 7 *
0f2d19dd
JB
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2, or (at your option)
11 * any later version.
8c494e99 12 *
0f2d19dd
JB
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
8c494e99 17 *
0f2d19dd
JB
18 * You should have received a copy of the GNU General Public License
19 * along with this software; see the file COPYING. If not, write to
82892bed
JB
20 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
21 * Boston, MA 02111-1307 USA
0f2d19dd
JB
22 *
23 * As a special exception, the Free Software Foundation gives permission
24 * for additional uses of the text contained in its release of GUILE.
25 *
26 * The exception is that, if you link the GUILE library with other files
27 * to produce an executable, this does not by itself cause the
28 * resulting executable to be covered by the GNU General Public License.
29 * Your use of that executable is in no way restricted on account of
30 * linking the GUILE library code into it.
31 *
32 * This exception does not however invalidate any other reasons why
33 * the executable file might be covered by the GNU General Public License.
34 *
35 * This exception applies only to the code released by the
36 * Free Software Foundation under the name GUILE. If you copy
37 * code from other Free Software Foundation releases into a copy of
38 * GUILE, as the General Public License permits, the exception does
39 * not apply to the code that you add in this way. To avoid misleading
40 * anyone as to the status of such modified files, you must delete
41 * this exception notice from them.
42 *
43 * If you write modifications of your own for GUILE, it is your choice
44 * whether to permit this exception to apply to your modifications.
82892bed 45 * If you do not wish that, delete this exception notice. */
8c494e99 46
0f2d19dd 47\f
176067df
JB
48
49/* "What's the difference between _scm.h and __scm.h?"
50
51 _scm.h is not installed; it's only visible to the libguile sources
52 themselves.
53
54 __scm.h is installed, and is #included by <libguile.h>. If both
55 the client and libguile need some piece of information, and it
56 doesn't fit well into the header file for any particular module, it
57 should go in __scm.h. */
58
59
e81d98ec
DH
60/* {Compiler hints}
61 *
62 * The following macros are used to provide additional information for the
63 * compiler, which may help to do better error checking and code
64 * optimization. A second benefit of these macros is, that they also provide
65 * additional information to the developers.
66 */
67
68/* The macro SCM_NORETURN indicates that a function will never return.
69 * Examples:
70 * 1) int foo (char arg) SCM_NORETURN;
71 */
72#ifdef __GNUC__
73#define SCM_NORETURN __attribute__ ((noreturn))
74#else
75#define SCM_NORETURN
76#endif
77
78/* The macro SCM_UNUSED indicates that a function, function argument or
79 * variable may potentially be unused.
80 * Examples:
81 * 1) static int unused_function (char arg) SCM_UNUSED;
82 * 2) int foo (char unused_argument SCM_UNUSED);
83 * 3) int unused_variable SCM_UNUSED;
84 */
85#ifdef __GNUC__
86#define SCM_UNUSED __attribute__ ((unused))
87#else
88#define SCM_UNUSED
89#endif
90
91
0f2d19dd
JB
92/* {Supported Options}
93 *
94 * These may be defined or undefined.
95 */
96
16d35552 97/* #define GUILE_DEBUG_FREELIST */
70d63753 98
0f2d19dd
JB
99/* All the number support there is.
100 */
0f2d19dd
JB
101#define BIGNUMS
102
686765af
ML
103/* GC should relinquish empty cons-pair arenas. */
104/* cmm:FIXME look at this after done mangling the GC */
105/* #define GC_FREE_SEGMENTS */
0f2d19dd
JB
106
107/* Provide a scheme-accessible count-down timer that
108 * generates a pseudo-interrupt.
109 */
110#define TICKS
111
112
113/* Use engineering notation when converting numbers strings?
114 */
115#undef ENGNOT
116
0f2d19dd
JB
117\f
118/* {Unsupported Options}
119 *
3c205827 120 * These must be defined as given here.
0f2d19dd
JB
121 */
122
123
124#define CCLO
3c205827
JB
125
126/* Guile Scheme supports the #f/() distinction; Guile Lisp won't. We
127 have horrible plans for their unification. */
128#undef SICP
0f2d19dd
JB
129
130\f
131
80c78696 132/* Random options (not yet supported or in final form). */
0f2d19dd 133
80c78696
MD
134#define STACK_CHECKING
135#undef NO_CEVAL_STACK_CHECKING
0f2d19dd 136
43ff3170 137\f
3a9809df 138
1174045c
MV
139/* SCM_API is a macro prepended to all function and data definitions
140 which should be exported or imported in the resulting dynamic link
8f99e3f3 141 library (DLL) in the Win32 port. */
1174045c 142
8f99e3f3 143#if defined (SCM_IMPORT)
1174045c 144# define SCM_API __declspec (dllimport) extern
8f99e3f3 145#elif defined (SCM_EXPORT) || defined (DLL_EXPORT)
1174045c
MV
146# define SCM_API __declspec (dllexport) extern
147#else
148# define SCM_API extern
149#endif
150
151\f
152
43ff3170
GH
153/* What did the configure script discover about the outside world? */
154#include "libguile/scmconfig.h"
155
3a9809df
DH
156\f
157
158/* {Debugging Options}
159 *
160 * These compile time options determine whether to include code that is only
161 * useful for debugging guile itself or C level extensions to guile. The
162 * common prefix for all option macros of this kind is "SCM_DEBUG_". It is
163 * guaranteed that a macro named SCM_DEBUG_XXX is defined to be either 0 or 1,
164 * i. e. there is no need to test for the undefined case. This allows to use
8c494e99 165 * these definitions comfortably within code, as in the following example:
3a9809df
DH
166 * #define FOO do { if (SCM_DEBUG_XXX) bar(); else baz(); } while (0)
167 * Any sane compiler will remove the unused branch without any performance
168 * penalty for the resulting code.
169 *
170 * Note: Some SCM_DEBUG_XXX options are not settable at configure time.
171 * To change the value of such options you will have to edit this header
56100716
DH
172 * file or give suitable options to make, like:
173 * make all CFLAGS="-DSCM_DEBUG_XXX=1 ..."
3a9809df
DH
174 */
175
176
c8a54c4b
DH
177/* The value of SCM_DEBUG determines the default for most of the not yet
178 * defined debugging options. This allows, for example, to enable most of the
179 * debugging options by simply defining SCM_DEBUG as 1.
180 */
181#ifndef SCM_DEBUG
182#define SCM_DEBUG 0
183#endif
184
46d53380
DH
185/* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform
186 * exhaustive parameter checking: It will be verified that cell parameters
187 * actually point to a valid heap cell. Note: If this option is enabled,
188 * guile will run about ten times slower than normally.
189 */
190#ifndef SCM_DEBUG_CELL_ACCESSES
191#define SCM_DEBUG_CELL_ACCESSES SCM_DEBUG
192#endif
193
216eedfc
DH
194/* If SCM_DEBUG_INTERRUPTS is set to 1, with every deferring and allowing of
195 * interrupts a consistency check will be performed.
196 */
197#ifndef SCM_DEBUG_INTERRUPTS
198#define SCM_DEBUG_INTERRUPTS SCM_DEBUG
199#endif
200
e81d98ec
DH
201/* If SCM_DEBUG_PAIR_ACCESSES is set to 1, accesses to cons cells will be
202 * exhaustively checked. Note: If this option is enabled, guile will run
203 * slower than normally.
204 */
205#ifndef SCM_DEBUG_PAIR_ACCESSES
206#define SCM_DEBUG_PAIR_ACCESSES SCM_DEBUG
207#endif
208
af45e3b0
DH
209/* If SCM_DEBUG_REST_ARGUMENT is set to 1, functions that take rest arguments
210 * will check whether the rest arguments are actually passed as a proper list.
211 * Otherwise, if SCM_DEBUG_REST_ARGUMENT is 0, functions that take rest
212 * arguments will take it for granted that these are passed as a proper list.
c8a54c4b 213 */
af45e3b0
DH
214#ifndef SCM_DEBUG_REST_ARGUMENT
215#define SCM_DEBUG_REST_ARGUMENT SCM_DEBUG
3a9809df
DH
216#endif
217
56100716
DH
218/* Use this for _compile time_ type checking only, since the compiled result
219 * will be quite inefficient. The right way to make use of this option is to
220 * do a 'make clean; make CFLAGS=-DSCM_DEBUG_TYPING_STRICTNESS=1', fix your
221 * errors, and then do 'make clean; make'.
c8a54c4b 222 */
56100716 223#ifndef SCM_DEBUG_TYPING_STRICTNESS
729dbac3 224#define SCM_DEBUG_TYPING_STRICTNESS 1
56100716
DH
225#endif
226
3a9809df
DH
227\f
228
8c494e99
DH
229/* {Feature Options}
230 *
231 * These compile time options determine whether code for certain features
232 * should be compiled into guile. The common prefix for all option macros
233 * of this kind is "SCM_ENABLE_". It is guaranteed that a macro named
234 * SCM_ENABLE_XXX is defined to be either 0 or 1, i. e. there is no need to
235 * test for the undefined case. This allows to use these definitions
236 * comfortably within code, as in the following example:
237 * #define FOO do { if (SCM_ENABLE_XXX) bar(); else baz(); } while (0)
238 * Any sane compiler will remove the unused branch without any performance
239 * penalty for the resulting code.
240 *
241 * Note: Some SCM_ENABLE_XXX options are not settable at configure time.
242 * To change the value of such options you will have to edit this header
243 * file or give suitable options to make, like:
244 * make all CFLAGS="-DSCM_ENABLE_XXX=1 ..."
0f2d19dd 245 */
1be6b49c 246
8c494e99
DH
247/* If SCM_ENABLE_DEPRECATED is set to 1, deprecated code will be included in
248 * guile, as well as some functions to issue run-time warnings about uses of
249 * deprecated functions.
250 */
251#ifndef SCM_ENABLE_DEPRECATED
252#define SCM_ENABLE_DEPRECATED 0
1be6b49c 253#endif
0f2d19dd 254
b971d089 255\f
0f2d19dd 256
5c75b29f 257/* {Architecture and compiler properties}
0f2d19dd 258 *
5c75b29f
DH
259 * Guile as of today can only work on systems which fulfill at least the
260 * following requirements:
261 * - long ints have at least 32 bits.
262 * Guile's type system is based on this assumption.
263 * - long ints consist of at least four characters.
264 * It is assumed that cells, i. e. pairs of long ints, are eight character
265 * aligned, because three bits of a cell pointer are used for type data.
266 * - sizeof (void*) == sizeof (long int)
267 * Pointers are stored in SCM objects, and sometimes SCM objects are passed
268 * as void*. Thus, there has to be a one-to-one correspondence.
269 * - numbers are encoded using two's complement.
270 * The implementation of the bitwise scheme level operations is based on
271 * this assumption.
272 * - ... add more
0f2d19dd
JB
273 */
274
3dd84ef1
TTN
275#if SIZEOF_UINTPTR_T != 0 && defined(UINTPTR_MAX) \
276 && defined(INTPTR_MAX) \
277 && defined(INTPTR_MIN)
278/* Used as SCM if available, so we bundle related attributes to avoid possible
279 type incon[st][oi]n[ae]nce later. Word in tags.h. */
cd990539 280#define HAVE_UINTPTR_T 1
fdf773fa
MV
281#endif
282
283#if SIZEOF_PTRDIFF_T != 0
cd990539 284#define HAVE_PTRDIFF_T 1
fdf773fa
MV
285#endif
286
287#if SIZEOF_LONG_LONG != 0
cd990539
MV
288#define HAVE_LONG_LONGS 1
289#define HAVE_LONG_LONG 1
fdf773fa
MV
290#endif
291
38956d84
MV
292#ifndef HAVE_PTRDIFF_T
293typedef long ptrdiff_t;
294#endif
295
b971d089 296#ifdef HAVE_LIMITS_H
0f2d19dd 297# include <limits.h>
5c75b29f
DH
298#endif
299
300#ifdef CHAR_BIT
301# define SCM_CHAR_BIT CHAR_BIT
302#else
303# define SCM_CHAR_BIT 8
304#endif
305
306#ifdef LONG_BIT
307# define SCM_LONG_BIT LONG_BIT
308#else
309# define SCM_LONG_BIT (SCM_CHAR_BIT * sizeof (long) / sizeof (char))
310#endif
311
312#ifdef UCHAR_MAX
313# define SCM_CHAR_CODE_LIMIT (UCHAR_MAX + 1L)
0f2d19dd 314#else
e2806c10 315# define SCM_CHAR_CODE_LIMIT 256L
5c75b29f
DH
316#endif
317
0f2d19dd
JB
318\f
319
2a1d8241
JB
320#ifdef STDC_HEADERS
321# include <stdlib.h>
1be6b49c
ML
322# if HAVE_SYS_TYPES_H
323# include <sys/types.h>
324# endif
325# if HAVE_SYS_STDTYPES_H
326# include <sys/stdtypes.h>
327# endif
2a1d8241 328# include <stddef.h>
2a1d8241
JB
329#endif /* def STDC_HEADERS */
330
331\f
332
8f99e3f3
SJ
333/* Define some additional CPP macros on Win32 platforms. */
334#if USE_DLL_IMPORT
335# define __REGEX_IMPORT__ 1
336# define __CRYPT_IMPORT__ 1
337# define __READLINE_IMPORT__ 1
338# define QT_IMPORT 1
339#endif
340
341\f
342
2a1d8241 343#include "libguile/tags.h"
0f2d19dd
JB
344
345\f
346#ifdef vms
347# ifndef CHEAP_CONTINUATIONS
348 typedef int jmp_buf[17];
349 extern int setjump(jmp_buf env);
350 extern int longjump(jmp_buf env, int ret);
351# define setjmp setjump
352# define longjmp longjump
353# else
354# include <setjmp.h>
355# endif
356#else /* ndef vms */
357# ifdef _CRAY1
358 typedef int jmp_buf[112];
359 extern int setjump(jmp_buf env);
360 extern int longjump(jmp_buf env, int ret);
361# define setjmp setjump
362# define longjmp longjump
363# else /* ndef _CRAY1 */
364# include <setjmp.h>
365# endif /* ndef _CRAY1 */
366#endif /* ndef vms */
367
0f2d19dd
JB
368/* James Clark came up with this neat one instruction fix for
369 * continuations on the SPARC. It flushes the register windows so
3dd84ef1 370 * that all the state of the process is contained in the stack.
0f2d19dd
JB
371 */
372
373#ifdef sparc
374# define SCM_FLUSH_REGISTER_WINDOWS asm("ta 3")
375#else
376# define SCM_FLUSH_REGISTER_WINDOWS /* empty */
377#endif
378
3dd84ef1 379/* If stack is not longword aligned then
0f2d19dd
JB
380 */
381
382/* #define SHORT_ALIGN */
383#ifdef THINK_C
384# define SHORT_ALIGN
385#endif
386#ifdef MSDOS
387# define SHORT_ALIGN
388#endif
389#ifdef atarist
390# define SHORT_ALIGN
391#endif
392
393#ifdef SHORT_ALIGN
394typedef short SCM_STACKITEM;
395#else
396typedef long SCM_STACKITEM;
397#endif
398\f
399
9f0e55a6
MD
400#define SCM_ASYNC_TICK /*fixme* should change names */ \
401do { \
1ceead47 402 if (scm_root->pending_asyncs) \
9f0e55a6
MD
403 scm_async_click (); \
404} while (0)
25d3ee9d 405
216eedfc
DH
406#if (SCM_DEBUG_INTERRUPTS == 1)
407#include <stdio.h>
0f2d19dd 408#define SCM_CHECK_NOT_DISABLED \
216eedfc
DH
409 do { \
410 if (scm_ints_disabled) \
411 fprintf(stderr, "ints already disabled (at %s:%d)\n", \
412 __FILE__, __LINE__); \
413 } while (0)
0f2d19dd
JB
414
415#define SCM_CHECK_NOT_ENABLED \
216eedfc
DH
416 do { \
417 if (!scm_ints_disabled) \
418 fprintf(stderr, "ints already enabled (at %s:%d)\n", \
419 __FILE__, __LINE__); \
420 } while (0)
0f2d19dd
JB
421
422#else
423#define SCM_CHECK_NOT_DISABLED
424#define SCM_CHECK_NOT_ENABLED
425#endif
426
427
8417b665
JB
428/* Anthony Green writes:
429 When the compiler sees...
430 DEFER_INTS;
431 [critical code here]
432 ALLOW_INTS;
433 ...it doesn't actually promise to keep the critical code within the
434 boundries of the DEFER/ALLOW_INTS instructions. It may very well
435 schedule it outside of the magic defined in those macros.
436
437 However, GCC's volatile asm feature forms a barrier over which code is
438 never moved. So if you add...
35eec738
JB
439 asm ("");
440 ...to each of the DEFER_INTS and ALLOW_INTS macros, the critical
441 code will always remain in place. asm's without inputs or outputs
442 are implicitly volatile. */
8417b665 443#ifdef __GNUC__
35eec738 444#define SCM_FENCE asm /* volatile */ ("")
8417b665
JB
445#else
446#define SCM_FENCE
447#endif
448
9bc4701c
MD
449#define SCM_DEFER_INTS \
450do { \
451 SCM_FENCE; \
452 SCM_CHECK_NOT_DISABLED; \
453 SCM_REC_CRITICAL_SECTION_START (scm_i_defer); \
454 SCM_FENCE; \
455 scm_ints_disabled = 1; \
456 SCM_FENCE; \
bfc69694 457} while (0)
0f2d19dd
JB
458
459
9bc4701c
MD
460#define SCM_ALLOW_INTS \
461do { \
462 SCM_FENCE; \
463 SCM_CHECK_NOT_ENABLED; \
464 SCM_REC_CRITICAL_SECTION_END (scm_i_defer); \
465 SCM_FENCE; \
466 scm_ints_disabled = 0; \
467 SCM_FENCE; \
468 SCM_THREAD_SWITCHING_CODE; \
469 SCM_FENCE; \
bfc69694 470} while (0)
0f2d19dd
JB
471
472
9bc4701c
MD
473#define SCM_REDEFER_INTS \
474do { \
475 SCM_FENCE; \
476 SCM_REC_CRITICAL_SECTION_START (scm_i_defer); \
477 ++scm_ints_disabled; \
478 SCM_FENCE; \
bfc69694 479} while (0)
0f2d19dd
JB
480
481
9bc4701c
MD
482#define SCM_REALLOW_INTS \
483do { \
484 SCM_FENCE; \
485 SCM_REC_CRITICAL_SECTION_END (scm_i_defer); \
486 SCM_FENCE; \
487 --scm_ints_disabled; \
488 SCM_FENCE; \
bfc69694 489} while (0)
0f2d19dd
JB
490
491
c72cc5fb 492#define SCM_TICK \
bfc69694 493do { \
cd911565 494 SCM_ASYNC_TICK; \
216eedfc 495 SCM_THREAD_SWITCHING_CODE; \
bfc69694 496} while (0)
0f2d19dd
JB
497
498\f
499
9bc4701c
MD
500/* Critical sections */
501
502#define SCM_DECLARE_NONREC_CRITICAL_SECTION(prefix) \
503 extern scm_t_mutex prefix ## _mutex
504
505#define SCM_NONREC_CRITICAL_SECTION_START(prefix) \
506 do { scm_thread *t = scm_i_leave_guile (); \
507 scm_i_plugin_mutex_lock (&prefix ## _mutex); \
508 scm_i_enter_guile (t); \
509 } while (0)
510
511#define SCM_NONREC_CRITICAL_SECTION_END(prefix) \
512 do { scm_i_plugin_mutex_unlock (&prefix ## _mutex); \
513 } while (0)
514
515/* This could be replaced by a single call to scm_i_plugin_mutex_lock
516 on systems which support recursive mutecis (like LinuxThreads).
517 We should test for the presence of recursive mutecis in
518 configure.in.
519
520 Also, it is probably possible to replace recursive sections with
521 non-recursive ones, so don't worry about the complexity.
522 */
523
524#define SCM_DECLARE_REC_CRITICAL_SECTION(prefix) \
525 extern scm_t_mutex prefix ## _mutex; \
526 extern int prefix ## _count; \
527 extern scm_thread *prefix ## _owner
528
529#define SCM_REC_CRITICAL_SECTION_START(prefix) \
530 do { scm_i_plugin_mutex_lock (&scm_i_section_mutex); \
531 if (prefix ## _count && prefix ## _owner == SCM_CURRENT_THREAD) \
532 { \
533 ++prefix ## _count; \
534 scm_i_plugin_mutex_unlock (&scm_i_section_mutex); \
535 } \
536 else \
537 { \
538 scm_thread *t = scm_i_leave_guile (); \
539 scm_i_plugin_mutex_unlock (&scm_i_section_mutex); \
540 scm_i_plugin_mutex_lock (&prefix ## _mutex); \
541 prefix ## _count = 1; \
542 prefix ## _owner = t; \
543 scm_i_enter_guile (t); \
544 } \
545 } while (0)
546
547#define SCM_REC_CRITICAL_SECTION_END(prefix) \
548 do { scm_i_plugin_mutex_lock (&scm_i_section_mutex); \
549 if (!--prefix ## _count) \
550 { \
551 prefix ## _owner = 0; \
552 scm_i_plugin_mutex_unlock (&prefix ## _mutex); \
553 } \
554 scm_i_plugin_mutex_unlock (&scm_i_section_mutex); \
555 } while (0)
556
557/* Note: The following needs updating. */
558
f83e2737
MD
559/* Classification of critical sections
560 *
561 * When Guile moves to POSIX threads, it won't be possible to prevent
562 * context switching. In fact, the whole idea of context switching is
563 * bogus if threads are run by different processors. Therefore, we
564 * must ultimately eliminate all critical sections or enforce them by
565 * use of mutecis.
566 *
567 * All instances of SCM_DEFER_INTS and SCM_ALLOW_INTS should therefore
568 * be classified and replaced by one of the delimiters below. If you
569 * understand what this is all about, I'd like to encourage you to
570 * help with this task. The set of classes below must of course be
571 * incrementally augmented.
572 *
573 * MDJ 980419 <djurfeldt@nada.kth.se>
574 */
575
576/* A sections
577 *
578 * Allocation of a cell with type tag in the CAR.
579 *
580 * With POSIX threads, each thread will have a private pool of free
581 * cells. Therefore, this type of section can be removed. But! It
582 * is important that the CDR is initialized first (with the CAR still
583 * indicating a free cell) so that we can guarantee a consistent heap
584 * at all times.
585 */
586
216eedfc
DH
587#define SCM_ENTER_A_SECTION SCM_CRITICAL_SECTION_START
588#define SCM_EXIT_A_SECTION SCM_CRITICAL_SECTION_END
f83e2737
MD
589
590\f
591
0f2d19dd 592/** SCM_ASSERT
3dd84ef1 593 **
0f2d19dd
JB
594 **/
595
596
597#ifdef SCM_RECKLESS
598#define SCM_ASSERT(_cond, _arg, _pos, _subr)
23deee81 599#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg)
0f2d19dd
JB
600#define SCM_ASRTGO(_cond, _label)
601#else
602#define SCM_ASSERT(_cond, _arg, _pos, _subr) \
603 if (!(_cond)) \
b3fcac34 604 scm_wrong_type_arg (_subr, _pos, _arg)
b6791b2e
GB
605#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \
606 if (!(_cond)) \
607 scm_wrong_type_arg_msg(_subr, _pos, _arg, _msg)
0f2d19dd
JB
608#define SCM_ASRTGO(_cond, _label) \
609 if (!(_cond)) \
610 goto _label
611#endif
95b88819 612
9de33deb
MD
613/*
614 * SCM_WTA_DISPATCH
615 */
616
451e591c
DH
617/* Dirk:FIXME:: In all of the SCM_WTA_DISPATCH_* macros it is assumed that
618 * 'gf' is zero if uninitialized. It would be cleaner if some valid SCM value
619 * like SCM_BOOL_F or SCM_UNDEFINED was chosen.
620 */
621
1174045c 622SCM_API SCM scm_call_generic_0 (SCM gf);
b3c8a0f5 623
e68fc829 624#define SCM_WTA_DISPATCH_0(gf, subr) \
c07b3fef
MD
625 return (SCM_UNPACK (gf) \
626 ? scm_call_generic_0 ((gf)) \
e68fc829
MV
627 : (scm_error_num_args_subr ((subr)), SCM_UNSPECIFIED))
628#define SCM_GASSERT0(cond, gf, subr) \
629 if (!(cond)) SCM_WTA_DISPATCH_0((gf), (subr))
b3c8a0f5 630
1174045c 631SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
9de33deb 632
c07b3fef
MD
633#define SCM_WTA_DISPATCH_1(gf, a1, pos, subr) \
634 return (SCM_UNPACK (gf) \
635 ? scm_call_generic_1 ((gf), (a1)) \
636 : (scm_wrong_type_arg ((subr), (pos), (a1)), SCM_UNSPECIFIED))
9de33deb
MD
637#define SCM_GASSERT1(cond, gf, a1, pos, subr) \
638 if (!(cond)) SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
639
1174045c 640SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
9de33deb 641
c07b3fef
MD
642#define SCM_WTA_DISPATCH_2(gf, a1, a2, pos, subr) \
643 return (SCM_UNPACK (gf) \
644 ? scm_call_generic_2 ((gf), (a1), (a2)) \
645 : (scm_wrong_type_arg ((subr), (pos), \
646 (pos) == SCM_ARG1 ? (a1) : (a2)), \
647 SCM_UNSPECIFIED))
9de33deb
MD
648#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \
649 if (!(cond)) SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr))
650
1174045c 651SCM_API SCM scm_apply_generic (SCM gf, SCM args);
89c358b1 652
c07b3fef
MD
653#define SCM_WTA_DISPATCH_n(gf, args, pos, subr) \
654 return (SCM_UNPACK (gf) \
655 ? scm_apply_generic ((gf), (args)) \
656 : (scm_wrong_type_arg ((subr), (pos), \
657 scm_list_ref ((args), \
658 SCM_MAKINUM ((pos) - 1))), \
659 SCM_UNSPECIFIED))
89c358b1
MD
660#define SCM_GASSERTn(cond, gf, args, pos, subr) \
661 if (!(cond)) SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
662
c751e5e3
GB
663#ifndef SCM_MAGIC_SNARFER
664/* Let these macros pass through if
665 we are snarfing; thus we can tell the
666 difference between the use of an actual
667 number vs. the use of one of these macros --
f5421cfc 668 actual numbers in SCM_VALIDATE_* and SCM_ASSERT
c751e5e3
GB
669 constructs must match the formal argument name,
670 but using SCM_ARG* avoids the test */
671
0f2d19dd
JB
672#define SCM_ARGn 0
673#define SCM_ARG1 1
674#define SCM_ARG2 2
675#define SCM_ARG3 3
676#define SCM_ARG4 4
677#define SCM_ARG5 5
1146b6cd 678#define SCM_ARG6 6
3dd84ef1 679#define SCM_ARG7 7
0f2d19dd 680
c751e5e3 681#endif /* SCM_MAGIC_SNARFER */
0f2d19dd 682
0f2d19dd
JB
683\f
684
685/* SCM_EXIT_SUCCESS is the default code to return from SCM if no errors
686 * were encountered. SCM_EXIT_FAILURE is the default code to return from
687 * SCM if errors were encountered. The return code can be explicitly
688 * specified in a SCM program with (scm_quit <n>).
689 */
690
691#ifndef SCM_EXIT_SUCCESS
692#ifdef vms
693#define SCM_EXIT_SUCCESS 1
694#else
695#define SCM_EXIT_SUCCESS 0
696#endif /* def vms */
697#endif /* ndef SCM_EXIT_SUCCESS */
698#ifndef SCM_EXIT_FAILURE
699#ifdef vms
700#define SCM_EXIT_FAILURE 2
701#else
702#define SCM_EXIT_FAILURE 1
703#endif /* def vms */
704#endif /* ndef SCM_EXIT_FAILURE */
705
729dbac3 706#endif /* SCM___SCM_H */
89e00824
ML
707
708/*
709 Local Variables:
710 c-file-style: "gnu"
711 End:
712*/