* goops.scm (compute-getters-n-setters/verify-accessors): Better
[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 48
92e6989f
RB
49/**********************************************************************
50 This file is Guile's central public header.
51
52 When included by other files, this file should preceed any include
53 other than __scm.h.
54
55 Under *NO* circumstances should new items be added to the global
56 namespace (via adding #define, typedef, or similar to this file) with
57 generic names. This usually means that any new names should be
58 prefixed by either SCM_ or GUILE_. i.e. do *not* #define HAVE_FOO or
59 SIZEOF_BAR. See configure.in, gen-scmconfig.h.in, and
60 gen-scmconfig.c for examples of how to properly handle this issue.
61 The main documentation is in gen-scmconfig.c.
62
63 "What's the difference between _scm.h and __scm.h?"
176067df
JB
64
65 _scm.h is not installed; it's only visible to the libguile sources
92e6989f 66 themselves, and it includes config.h, the private config header.
176067df
JB
67
68 __scm.h is installed, and is #included by <libguile.h>. If both
69 the client and libguile need some piece of information, and it
70 doesn't fit well into the header file for any particular module, it
92e6989f
RB
71 should go in __scm.h. __scm.h includes scmconfig.h, the public
72 config header.
73 **********************************************************************/
74
75/* What did the configure script discover about the outside world? */
76#include "libguile/scmconfig.h"
176067df 77
92e6989f 78\f
176067df 79
e81d98ec
DH
80/* {Compiler hints}
81 *
82 * The following macros are used to provide additional information for the
83 * compiler, which may help to do better error checking and code
84 * optimization. A second benefit of these macros is, that they also provide
85 * additional information to the developers.
86 */
87
88/* The macro SCM_NORETURN indicates that a function will never return.
89 * Examples:
90 * 1) int foo (char arg) SCM_NORETURN;
91 */
92#ifdef __GNUC__
93#define SCM_NORETURN __attribute__ ((noreturn))
94#else
95#define SCM_NORETURN
96#endif
97
98/* The macro SCM_UNUSED indicates that a function, function argument or
99 * variable may potentially be unused.
100 * Examples:
101 * 1) static int unused_function (char arg) SCM_UNUSED;
102 * 2) int foo (char unused_argument SCM_UNUSED);
103 * 3) int unused_variable SCM_UNUSED;
104 */
105#ifdef __GNUC__
106#define SCM_UNUSED __attribute__ ((unused))
107#else
108#define SCM_UNUSED
109#endif
110
111
0f2d19dd
JB
112/* {Supported Options}
113 *
114 * These may be defined or undefined.
115 */
116
16d35552 117/* #define GUILE_DEBUG_FREELIST */
70d63753 118
0f2d19dd
JB
119/* All the number support there is.
120 */
0f2d19dd
JB
121#define BIGNUMS
122
686765af
ML
123/* GC should relinquish empty cons-pair arenas. */
124/* cmm:FIXME look at this after done mangling the GC */
125/* #define GC_FREE_SEGMENTS */
0f2d19dd
JB
126
127/* Provide a scheme-accessible count-down timer that
128 * generates a pseudo-interrupt.
129 */
130#define TICKS
131
132
133/* Use engineering notation when converting numbers strings?
134 */
135#undef ENGNOT
136
0f2d19dd
JB
137\f
138/* {Unsupported Options}
139 *
3c205827 140 * These must be defined as given here.
0f2d19dd
JB
141 */
142
143
144#define CCLO
3c205827
JB
145
146/* Guile Scheme supports the #f/() distinction; Guile Lisp won't. We
147 have horrible plans for their unification. */
148#undef SICP
0f2d19dd
JB
149
150\f
151
80c78696 152/* Random options (not yet supported or in final form). */
0f2d19dd 153
80c78696
MD
154#define STACK_CHECKING
155#undef NO_CEVAL_STACK_CHECKING
0f2d19dd 156
43ff3170 157\f
3a9809df 158
1174045c
MV
159/* SCM_API is a macro prepended to all function and data definitions
160 which should be exported or imported in the resulting dynamic link
8f99e3f3 161 library (DLL) in the Win32 port. */
1174045c 162
8f99e3f3 163#if defined (SCM_IMPORT)
1174045c 164# define SCM_API __declspec (dllimport) extern
8f99e3f3 165#elif defined (SCM_EXPORT) || defined (DLL_EXPORT)
1174045c
MV
166# define SCM_API __declspec (dllexport) extern
167#else
168# define SCM_API extern
169#endif
170
171\f
172
3a9809df
DH
173/* {Debugging Options}
174 *
175 * These compile time options determine whether to include code that is only
176 * useful for debugging guile itself or C level extensions to guile. The
177 * common prefix for all option macros of this kind is "SCM_DEBUG_". It is
178 * guaranteed that a macro named SCM_DEBUG_XXX is defined to be either 0 or 1,
179 * i. e. there is no need to test for the undefined case. This allows to use
8c494e99 180 * these definitions comfortably within code, as in the following example:
3a9809df
DH
181 * #define FOO do { if (SCM_DEBUG_XXX) bar(); else baz(); } while (0)
182 * Any sane compiler will remove the unused branch without any performance
183 * penalty for the resulting code.
184 *
185 * Note: Some SCM_DEBUG_XXX options are not settable at configure time.
186 * To change the value of such options you will have to edit this header
56100716
DH
187 * file or give suitable options to make, like:
188 * make all CFLAGS="-DSCM_DEBUG_XXX=1 ..."
3a9809df
DH
189 */
190
191
c8a54c4b
DH
192/* The value of SCM_DEBUG determines the default for most of the not yet
193 * defined debugging options. This allows, for example, to enable most of the
194 * debugging options by simply defining SCM_DEBUG as 1.
195 */
196#ifndef SCM_DEBUG
197#define SCM_DEBUG 0
198#endif
199
46d53380
DH
200/* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform
201 * exhaustive parameter checking: It will be verified that cell parameters
202 * actually point to a valid heap cell. Note: If this option is enabled,
203 * guile will run about ten times slower than normally.
204 */
205#ifndef SCM_DEBUG_CELL_ACCESSES
206#define SCM_DEBUG_CELL_ACCESSES SCM_DEBUG
207#endif
208
216eedfc
DH
209/* If SCM_DEBUG_INTERRUPTS is set to 1, with every deferring and allowing of
210 * interrupts a consistency check will be performed.
211 */
212#ifndef SCM_DEBUG_INTERRUPTS
213#define SCM_DEBUG_INTERRUPTS SCM_DEBUG
214#endif
215
e81d98ec
DH
216/* If SCM_DEBUG_PAIR_ACCESSES is set to 1, accesses to cons cells will be
217 * exhaustively checked. Note: If this option is enabled, guile will run
218 * slower than normally.
219 */
220#ifndef SCM_DEBUG_PAIR_ACCESSES
221#define SCM_DEBUG_PAIR_ACCESSES SCM_DEBUG
222#endif
223
af45e3b0
DH
224/* If SCM_DEBUG_REST_ARGUMENT is set to 1, functions that take rest arguments
225 * will check whether the rest arguments are actually passed as a proper list.
226 * Otherwise, if SCM_DEBUG_REST_ARGUMENT is 0, functions that take rest
227 * arguments will take it for granted that these are passed as a proper list.
c8a54c4b 228 */
af45e3b0
DH
229#ifndef SCM_DEBUG_REST_ARGUMENT
230#define SCM_DEBUG_REST_ARGUMENT SCM_DEBUG
3a9809df
DH
231#endif
232
56100716
DH
233/* Use this for _compile time_ type checking only, since the compiled result
234 * will be quite inefficient. The right way to make use of this option is to
235 * do a 'make clean; make CFLAGS=-DSCM_DEBUG_TYPING_STRICTNESS=1', fix your
236 * errors, and then do 'make clean; make'.
c8a54c4b 237 */
56100716 238#ifndef SCM_DEBUG_TYPING_STRICTNESS
729dbac3 239#define SCM_DEBUG_TYPING_STRICTNESS 1
56100716
DH
240#endif
241
3a9809df
DH
242\f
243
8c494e99
DH
244/* {Feature Options}
245 *
246 * These compile time options determine whether code for certain features
247 * should be compiled into guile. The common prefix for all option macros
248 * of this kind is "SCM_ENABLE_". It is guaranteed that a macro named
249 * SCM_ENABLE_XXX is defined to be either 0 or 1, i. e. there is no need to
250 * test for the undefined case. This allows to use these definitions
251 * comfortably within code, as in the following example:
252 * #define FOO do { if (SCM_ENABLE_XXX) bar(); else baz(); } while (0)
253 * Any sane compiler will remove the unused branch without any performance
254 * penalty for the resulting code.
255 *
256 * Note: Some SCM_ENABLE_XXX options are not settable at configure time.
257 * To change the value of such options you will have to edit this header
258 * file or give suitable options to make, like:
259 * make all CFLAGS="-DSCM_ENABLE_XXX=1 ..."
0f2d19dd 260 */
1be6b49c 261
8c494e99
DH
262/* If SCM_ENABLE_DEPRECATED is set to 1, deprecated code will be included in
263 * guile, as well as some functions to issue run-time warnings about uses of
264 * deprecated functions.
265 */
266#ifndef SCM_ENABLE_DEPRECATED
267#define SCM_ENABLE_DEPRECATED 0
1be6b49c 268#endif
0f2d19dd 269
b971d089 270\f
0f2d19dd 271
5c75b29f 272/* {Architecture and compiler properties}
0f2d19dd 273 *
5c75b29f
DH
274 * Guile as of today can only work on systems which fulfill at least the
275 * following requirements:
276 * - long ints have at least 32 bits.
277 * Guile's type system is based on this assumption.
278 * - long ints consist of at least four characters.
279 * It is assumed that cells, i. e. pairs of long ints, are eight character
280 * aligned, because three bits of a cell pointer are used for type data.
281 * - sizeof (void*) == sizeof (long int)
282 * Pointers are stored in SCM objects, and sometimes SCM objects are passed
283 * as void*. Thus, there has to be a one-to-one correspondence.
284 * - numbers are encoded using two's complement.
285 * The implementation of the bitwise scheme level operations is based on
286 * this assumption.
287 * - ... add more
0f2d19dd
JB
288 */
289
5c75b29f
DH
290#ifdef CHAR_BIT
291# define SCM_CHAR_BIT CHAR_BIT
292#else
293# define SCM_CHAR_BIT 8
294#endif
295
296#ifdef LONG_BIT
297# define SCM_LONG_BIT LONG_BIT
298#else
299# define SCM_LONG_BIT (SCM_CHAR_BIT * sizeof (long) / sizeof (char))
300#endif
301
302#ifdef UCHAR_MAX
303# define SCM_CHAR_CODE_LIMIT (UCHAR_MAX + 1L)
0f2d19dd 304#else
e2806c10 305# define SCM_CHAR_CODE_LIMIT 256L
5c75b29f
DH
306#endif
307
0f2d19dd
JB
308\f
309
2a1d8241 310#include "libguile/tags.h"
0f2d19dd
JB
311
312\f
313#ifdef vms
314# ifndef CHEAP_CONTINUATIONS
315 typedef int jmp_buf[17];
316 extern int setjump(jmp_buf env);
317 extern int longjump(jmp_buf env, int ret);
318# define setjmp setjump
319# define longjmp longjump
320# else
321# include <setjmp.h>
322# endif
323#else /* ndef vms */
324# ifdef _CRAY1
325 typedef int jmp_buf[112];
326 extern int setjump(jmp_buf env);
327 extern int longjump(jmp_buf env, int ret);
328# define setjmp setjump
329# define longjmp longjump
330# else /* ndef _CRAY1 */
331# include <setjmp.h>
332# endif /* ndef _CRAY1 */
333#endif /* ndef vms */
334
0f2d19dd
JB
335/* James Clark came up with this neat one instruction fix for
336 * continuations on the SPARC. It flushes the register windows so
3dd84ef1 337 * that all the state of the process is contained in the stack.
0f2d19dd
JB
338 */
339
340#ifdef sparc
341# define SCM_FLUSH_REGISTER_WINDOWS asm("ta 3")
342#else
343# define SCM_FLUSH_REGISTER_WINDOWS /* empty */
344#endif
345
3dd84ef1 346/* If stack is not longword aligned then
0f2d19dd
JB
347 */
348
349/* #define SHORT_ALIGN */
350#ifdef THINK_C
351# define SHORT_ALIGN
352#endif
353#ifdef MSDOS
354# define SHORT_ALIGN
355#endif
356#ifdef atarist
357# define SHORT_ALIGN
358#endif
359
360#ifdef SHORT_ALIGN
361typedef short SCM_STACKITEM;
362#else
363typedef long SCM_STACKITEM;
364#endif
365\f
366
9f0e55a6
MD
367#define SCM_ASYNC_TICK /*fixme* should change names */ \
368do { \
1ceead47 369 if (scm_root->pending_asyncs) \
9f0e55a6
MD
370 scm_async_click (); \
371} while (0)
25d3ee9d 372
0f2d19dd 373
8417b665
JB
374/* Anthony Green writes:
375 When the compiler sees...
376 DEFER_INTS;
377 [critical code here]
378 ALLOW_INTS;
379 ...it doesn't actually promise to keep the critical code within the
380 boundries of the DEFER/ALLOW_INTS instructions. It may very well
381 schedule it outside of the magic defined in those macros.
382
383 However, GCC's volatile asm feature forms a barrier over which code is
384 never moved. So if you add...
35eec738
JB
385 asm ("");
386 ...to each of the DEFER_INTS and ALLOW_INTS macros, the critical
387 code will always remain in place. asm's without inputs or outputs
388 are implicitly volatile. */
8417b665 389#ifdef __GNUC__
35eec738 390#define SCM_FENCE asm /* volatile */ ("")
8417b665
JB
391#else
392#define SCM_FENCE
393#endif
394
28d52ebb 395#define SCM_DEFER_INTS scm_rec_mutex_lock (&scm_i_defer_mutex);
0f2d19dd 396
28d52ebb 397#define SCM_ALLOW_INTS scm_rec_mutex_unlock (&scm_i_defer_mutex);
0f2d19dd 398
c7fabadf 399#define SCM_REDEFER_INTS SCM_DEFER_INTS
0f2d19dd 400
c7fabadf 401#define SCM_REALLOW_INTS SCM_ALLOW_INTS
0f2d19dd 402
c72cc5fb 403#define SCM_TICK \
bfc69694 404do { \
cd911565 405 SCM_ASYNC_TICK; \
216eedfc 406 SCM_THREAD_SWITCHING_CODE; \
bfc69694 407} while (0)
0f2d19dd
JB
408
409\f
410
9bc4701c
MD
411/* Note: The following needs updating. */
412
f83e2737
MD
413/* Classification of critical sections
414 *
415 * When Guile moves to POSIX threads, it won't be possible to prevent
416 * context switching. In fact, the whole idea of context switching is
417 * bogus if threads are run by different processors. Therefore, we
418 * must ultimately eliminate all critical sections or enforce them by
419 * use of mutecis.
420 *
421 * All instances of SCM_DEFER_INTS and SCM_ALLOW_INTS should therefore
422 * be classified and replaced by one of the delimiters below. If you
423 * understand what this is all about, I'd like to encourage you to
424 * help with this task. The set of classes below must of course be
425 * incrementally augmented.
426 *
427 * MDJ 980419 <djurfeldt@nada.kth.se>
428 */
429
430/* A sections
431 *
432 * Allocation of a cell with type tag in the CAR.
433 *
434 * With POSIX threads, each thread will have a private pool of free
435 * cells. Therefore, this type of section can be removed. But! It
436 * is important that the CDR is initialized first (with the CAR still
437 * indicating a free cell) so that we can guarantee a consistent heap
438 * at all times.
439 */
440
216eedfc
DH
441#define SCM_ENTER_A_SECTION SCM_CRITICAL_SECTION_START
442#define SCM_EXIT_A_SECTION SCM_CRITICAL_SECTION_END
f83e2737
MD
443
444\f
445
0f2d19dd 446/** SCM_ASSERT
3dd84ef1 447 **
0f2d19dd
JB
448 **/
449
450
451#ifdef SCM_RECKLESS
452#define SCM_ASSERT(_cond, _arg, _pos, _subr)
23deee81 453#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg)
0f2d19dd
JB
454#define SCM_ASRTGO(_cond, _label)
455#else
456#define SCM_ASSERT(_cond, _arg, _pos, _subr) \
457 if (!(_cond)) \
b3fcac34 458 scm_wrong_type_arg (_subr, _pos, _arg)
b6791b2e
GB
459#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \
460 if (!(_cond)) \
461 scm_wrong_type_arg_msg(_subr, _pos, _arg, _msg)
0f2d19dd
JB
462#define SCM_ASRTGO(_cond, _label) \
463 if (!(_cond)) \
464 goto _label
465#endif
95b88819 466
9de33deb
MD
467/*
468 * SCM_WTA_DISPATCH
469 */
470
451e591c
DH
471/* Dirk:FIXME:: In all of the SCM_WTA_DISPATCH_* macros it is assumed that
472 * 'gf' is zero if uninitialized. It would be cleaner if some valid SCM value
473 * like SCM_BOOL_F or SCM_UNDEFINED was chosen.
474 */
475
1174045c 476SCM_API SCM scm_call_generic_0 (SCM gf);
b3c8a0f5 477
e68fc829 478#define SCM_WTA_DISPATCH_0(gf, subr) \
c07b3fef
MD
479 return (SCM_UNPACK (gf) \
480 ? scm_call_generic_0 ((gf)) \
e68fc829
MV
481 : (scm_error_num_args_subr ((subr)), SCM_UNSPECIFIED))
482#define SCM_GASSERT0(cond, gf, subr) \
483 if (!(cond)) SCM_WTA_DISPATCH_0((gf), (subr))
b3c8a0f5 484
1174045c 485SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
9de33deb 486
c07b3fef
MD
487#define SCM_WTA_DISPATCH_1(gf, a1, pos, subr) \
488 return (SCM_UNPACK (gf) \
489 ? scm_call_generic_1 ((gf), (a1)) \
490 : (scm_wrong_type_arg ((subr), (pos), (a1)), SCM_UNSPECIFIED))
9de33deb
MD
491#define SCM_GASSERT1(cond, gf, a1, pos, subr) \
492 if (!(cond)) SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
493
1174045c 494SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
9de33deb 495
c07b3fef
MD
496#define SCM_WTA_DISPATCH_2(gf, a1, a2, pos, subr) \
497 return (SCM_UNPACK (gf) \
498 ? scm_call_generic_2 ((gf), (a1), (a2)) \
499 : (scm_wrong_type_arg ((subr), (pos), \
500 (pos) == SCM_ARG1 ? (a1) : (a2)), \
501 SCM_UNSPECIFIED))
9de33deb
MD
502#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \
503 if (!(cond)) SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr))
504
1174045c 505SCM_API SCM scm_apply_generic (SCM gf, SCM args);
89c358b1 506
c07b3fef
MD
507#define SCM_WTA_DISPATCH_n(gf, args, pos, subr) \
508 return (SCM_UNPACK (gf) \
509 ? scm_apply_generic ((gf), (args)) \
510 : (scm_wrong_type_arg ((subr), (pos), \
511 scm_list_ref ((args), \
512 SCM_MAKINUM ((pos) - 1))), \
513 SCM_UNSPECIFIED))
89c358b1
MD
514#define SCM_GASSERTn(cond, gf, args, pos, subr) \
515 if (!(cond)) SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
516
c751e5e3
GB
517#ifndef SCM_MAGIC_SNARFER
518/* Let these macros pass through if
519 we are snarfing; thus we can tell the
520 difference between the use of an actual
521 number vs. the use of one of these macros --
f5421cfc 522 actual numbers in SCM_VALIDATE_* and SCM_ASSERT
c751e5e3
GB
523 constructs must match the formal argument name,
524 but using SCM_ARG* avoids the test */
525
0f2d19dd
JB
526#define SCM_ARGn 0
527#define SCM_ARG1 1
528#define SCM_ARG2 2
529#define SCM_ARG3 3
530#define SCM_ARG4 4
531#define SCM_ARG5 5
1146b6cd 532#define SCM_ARG6 6
3dd84ef1 533#define SCM_ARG7 7
0f2d19dd 534
c751e5e3 535#endif /* SCM_MAGIC_SNARFER */
0f2d19dd 536
0f2d19dd
JB
537\f
538
539/* SCM_EXIT_SUCCESS is the default code to return from SCM if no errors
540 * were encountered. SCM_EXIT_FAILURE is the default code to return from
541 * SCM if errors were encountered. The return code can be explicitly
542 * specified in a SCM program with (scm_quit <n>).
543 */
544
545#ifndef SCM_EXIT_SUCCESS
546#ifdef vms
547#define SCM_EXIT_SUCCESS 1
548#else
549#define SCM_EXIT_SUCCESS 0
550#endif /* def vms */
551#endif /* ndef SCM_EXIT_SUCCESS */
552#ifndef SCM_EXIT_FAILURE
553#ifdef vms
554#define SCM_EXIT_FAILURE 2
555#else
556#define SCM_EXIT_FAILURE 1
557#endif /* def vms */
558#endif /* ndef SCM_EXIT_FAILURE */
559
729dbac3 560#endif /* SCM___SCM_H */
89e00824
ML
561
562/*
563 Local Variables:
564 c-file-style: "gnu"
565 End:
566*/