SCM_ASSERT to error.h
[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 148
1174045c 149/* SCM_API is a macro prepended to all function and data definitions
442f3f20
AW
150 which should be exported from libguile. */
151
56a3dcd4 152#if defined BUILDING_LIBGUILE && defined HAVE_VISIBILITY
442f3f20 153# define SCM_API extern __attribute__((__visibility__("default")))
56a3dcd4 154#elif defined BUILDING_LIBGUILE && defined _MSC_VER
442f3f20
AW
155# define SCM_API __declspec(dllexport) extern
156#elif defined _MSC_VER
157# define SCM_API __declspec(dllimport) extern
1174045c
MV
158#else
159# define SCM_API extern
160#endif
161
162\f
163
3a9809df
DH
164/* {Debugging Options}
165 *
166 * These compile time options determine whether to include code that is only
167 * useful for debugging guile itself or C level extensions to guile. The
168 * common prefix for all option macros of this kind is "SCM_DEBUG_". It is
fce0b22d
DH
169 * guaranteed that a macro named SCM_DEBUG_XXX is always defined (typically to
170 * either 0 or 1), i. e. there is no need to test for the undefined case.
171 * This allows to use these definitions comfortably within code, as in the
172 * following example:
3a9809df
DH
173 * #define FOO do { if (SCM_DEBUG_XXX) bar(); else baz(); } while (0)
174 * Any sane compiler will remove the unused branch without any performance
175 * penalty for the resulting code.
176 *
177 * Note: Some SCM_DEBUG_XXX options are not settable at configure time.
178 * To change the value of such options you will have to edit this header
56100716
DH
179 * file or give suitable options to make, like:
180 * make all CFLAGS="-DSCM_DEBUG_XXX=1 ..."
3a9809df
DH
181 */
182
183
c8a54c4b
DH
184/* The value of SCM_DEBUG determines the default for most of the not yet
185 * defined debugging options. This allows, for example, to enable most of the
186 * debugging options by simply defining SCM_DEBUG as 1.
187 */
188#ifndef SCM_DEBUG
189#define SCM_DEBUG 0
190#endif
191
46d53380
DH
192/* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform
193 * exhaustive parameter checking: It will be verified that cell parameters
194 * actually point to a valid heap cell. Note: If this option is enabled,
195 * guile will run about ten times slower than normally.
196 */
197#ifndef SCM_DEBUG_CELL_ACCESSES
198#define SCM_DEBUG_CELL_ACCESSES 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
218\f
219
8c494e99
DH
220/* {Feature Options}
221 *
222 * These compile time options determine whether code for certain features
223 * should be compiled into guile. The common prefix for all option macros
224 * of this kind is "SCM_ENABLE_". It is guaranteed that a macro named
225 * SCM_ENABLE_XXX is defined to be either 0 or 1, i. e. there is no need to
226 * test for the undefined case. This allows to use these definitions
227 * comfortably within code, as in the following example:
228 * #define FOO do { if (SCM_ENABLE_XXX) bar(); else baz(); } while (0)
229 * Any sane compiler will remove the unused branch without any performance
230 * penalty for the resulting code.
231 *
232 * Note: Some SCM_ENABLE_XXX options are not settable at configure time.
233 * To change the value of such options you will have to edit this header
234 * file or give suitable options to make, like:
235 * make all CFLAGS="-DSCM_ENABLE_XXX=1 ..."
0f2d19dd 236 */
1be6b49c 237
8c494e99
DH
238/* If SCM_ENABLE_DEPRECATED is set to 1, deprecated code will be included in
239 * guile, as well as some functions to issue run-time warnings about uses of
240 * deprecated functions.
241 */
242#ifndef SCM_ENABLE_DEPRECATED
243#define SCM_ENABLE_DEPRECATED 0
1be6b49c 244#endif
0f2d19dd 245
b971d089 246\f
0f2d19dd 247
5c75b29f 248/* {Architecture and compiler properties}
0f2d19dd 249 *
5c75b29f
DH
250 * Guile as of today can only work on systems which fulfill at least the
251 * following requirements:
59c4bb82
DH
252 *
253 * - scm_t_bits and SCM variables have at least 32 bits.
5c75b29f 254 * Guile's type system is based on this assumption.
59c4bb82
DH
255 *
256 * - sizeof (scm_t_bits) >= sizeof (void*) and sizeof (SCM) >= sizeof (void*)
257 * Guile's type system is based on this assumption, since it must be
258 * possible to store pointers to cells on the heap in scm_t_bits and SCM
259 * variables.
260 *
261 * - sizeof (scm_t_bits) >= 4 and sizeof (scm_t_bits) is a power of 2.
262 * Guile's type system is based on this assumption. In particular, it is
263 * assumed that cells, i. e. pairs of scm_t_bits variables, are eight
264 * character aligned. This is because three bits of a scm_t_bits variable
265 * that is holding a pointer to a cell on the heap must be available for
266 * storing type data.
267 *
268 * - sizeof (scm_t_bits) <= sizeof (void*) and sizeof (SCM) <= sizeof (void*)
269 * In some parts of guile, scm_t_bits and SCM variables are passed to
270 * functions as void* arguments. Together with the requirement above, this
271 * requires a one-to-one correspondence between the size of a void* and the
272 * sizes of scm_t_bits and SCM variables.
273 *
5c75b29f
DH
274 * - numbers are encoded using two's complement.
275 * The implementation of the bitwise scheme level operations is based on
276 * this assumption.
59c4bb82 277 *
5c75b29f 278 * - ... add more
0f2d19dd
JB
279 */
280
5c75b29f
DH
281#ifdef CHAR_BIT
282# define SCM_CHAR_BIT CHAR_BIT
283#else
284# define SCM_CHAR_BIT 8
285#endif
286
287#ifdef LONG_BIT
288# define SCM_LONG_BIT LONG_BIT
289#else
290# define SCM_LONG_BIT (SCM_CHAR_BIT * sizeof (long) / sizeof (char))
291#endif
292
e88d45aa
MV
293#define SCM_I_UTYPE_MAX(type) ((type)-1)
294#define SCM_I_TYPE_MAX(type,umax) ((type)((umax)/2))
295#define SCM_I_TYPE_MIN(type,umax) (-((type)((umax)/2))-1)
296
297#define SCM_T_UINT8_MAX SCM_I_UTYPE_MAX(scm_t_uint8)
298#define SCM_T_INT8_MIN SCM_I_TYPE_MIN(scm_t_int8,SCM_T_UINT8_MAX)
299#define SCM_T_INT8_MAX SCM_I_TYPE_MAX(scm_t_int8,SCM_T_UINT8_MAX)
300
301#define SCM_T_UINT16_MAX SCM_I_UTYPE_MAX(scm_t_uint16)
302#define SCM_T_INT16_MIN SCM_I_TYPE_MIN(scm_t_int16,SCM_T_UINT16_MAX)
303#define SCM_T_INT16_MAX SCM_I_TYPE_MAX(scm_t_int16,SCM_T_UINT16_MAX)
304
305#define SCM_T_UINT32_MAX SCM_I_UTYPE_MAX(scm_t_uint32)
306#define SCM_T_INT32_MIN SCM_I_TYPE_MIN(scm_t_int32,SCM_T_UINT32_MAX)
307#define SCM_T_INT32_MAX SCM_I_TYPE_MAX(scm_t_int32,SCM_T_UINT32_MAX)
308
e88d45aa
MV
309#define SCM_T_UINT64_MAX SCM_I_UTYPE_MAX(scm_t_uint64)
310#define SCM_T_INT64_MIN SCM_I_TYPE_MIN(scm_t_int64,SCM_T_UINT64_MAX)
311#define SCM_T_INT64_MAX SCM_I_TYPE_MAX(scm_t_int64,SCM_T_UINT64_MAX)
e88d45aa 312
e88d45aa
MV
313#define SCM_T_UINTMAX_MAX SCM_I_UTYPE_MAX(scm_t_uintmax)
314#define SCM_T_INTMAX_MIN SCM_I_TYPE_MIN(scm_t_intmax,SCM_T_UINTMAX_MAX)
315#define SCM_T_INTMAX_MAX SCM_I_TYPE_MAX(scm_t_intmax,SCM_T_UINTMAX_MAX)
316
114bc68a
LC
317#define SCM_T_UINTPTR_MAX SCM_I_UTYPE_MAX(scm_t_uintptr)
318#define SCM_T_INTPTR_MIN SCM_I_TYPE_MIN(scm_t_intptr,SCM_T_UINTPTR_MAX)
319#define SCM_T_INTPTR_MAX SCM_I_TYPE_MAX(scm_t_intptr,SCM_T_UINTPTR_MAX)
320
0f2d19dd
JB
321\f
322
2a1d8241 323#include "libguile/tags.h"
0f2d19dd 324
be90d0b6
LC
325
326/* The type of subrs, i.e., Scheme procedures implemented in C. Empty
327 function declarators are used internally for pointers to functions of
328 any arity. However, these are equivalent to `(void)' in C++, are
329 obsolescent as of C99, and trigger `strict-prototypes' GCC warnings
330 (bug #23681). */
331
332#ifdef BUILDING_LIBGUILE
333typedef SCM (* scm_t_subr) ();
334#else
335typedef void *scm_t_subr;
336#endif
337
0f2d19dd 338\f
5c838a97 339
04245bb7
AW
340/* scm_i_jmp_buf
341 *
342 * The corresponding SCM_I_SETJMP and SCM_I_LONGJMP are defined in the
343 * _scm.h private header.
5c838a97
AW
344 */
345
346#if defined (vms)
04245bb7 347typedef int scm_i_jmp_buf[17];
5c838a97
AW
348
349#elif defined (_CRAY1)
04245bb7 350typedef int scm_i_jmp_buf[112];
5c838a97
AW
351
352#elif defined (__ia64__)
5c838a97
AW
353# include <signal.h>
354# include <ucontext.h>
355typedef struct {
356 ucontext_t ctx;
357 int fresh;
358} scm_i_jmp_buf;
5c838a97
AW
359
360#else
5c838a97 361# include <setjmp.h>
04245bb7 362typedef jmp_buf scm_i_jmp_buf;
5c838a97 363#endif
0f2d19dd 364
04245bb7
AW
365
366\f
a4dbe1ac 367
3dd84ef1 368/* If stack is not longword aligned then
0f2d19dd
JB
369 */
370
371/* #define SHORT_ALIGN */
372#ifdef THINK_C
373# define SHORT_ALIGN
374#endif
375#ifdef MSDOS
376# define SHORT_ALIGN
377#endif
378#ifdef atarist
379# define SHORT_ALIGN
380#endif
381
382#ifdef SHORT_ALIGN
383typedef short SCM_STACKITEM;
384#else
385typedef long SCM_STACKITEM;
386#endif
79f55b7c
MD
387
388/* Cast pointer through (void *) in order to avoid compiler warnings
389 when strict aliasing is enabled */
390#define SCM_STACK_PTR(ptr) ((SCM_STACKITEM *) (void *) (ptr))
0f2d19dd
JB
391\f
392
f311754e
AW
393#ifdef BUILDING_LIBGUILE
394#define SCM_TICK SCM_ASYNC_TICK
395#else
396#define SCM_TICK scm_async_tick ()
397#endif
0f2d19dd
JB
398
399\f
400
9de33deb
MD
401/*
402 * SCM_WTA_DISPATCH
403 */
404
451e591c
DH
405/* Dirk:FIXME:: In all of the SCM_WTA_DISPATCH_* macros it is assumed that
406 * 'gf' is zero if uninitialized. It would be cleaner if some valid SCM value
407 * like SCM_BOOL_F or SCM_UNDEFINED was chosen.
408 */
409
1174045c 410SCM_API SCM scm_call_generic_0 (SCM gf);
b3c8a0f5 411
e68fc829 412#define SCM_WTA_DISPATCH_0(gf, subr) \
c07b3fef
MD
413 return (SCM_UNPACK (gf) \
414 ? scm_call_generic_0 ((gf)) \
e68fc829 415 : (scm_error_num_args_subr ((subr)), SCM_UNSPECIFIED))
9cc37597
LC
416#define SCM_GASSERT0(cond, gf, subr) \
417 if (SCM_UNLIKELY(!(cond))) \
418 SCM_WTA_DISPATCH_0((gf), (subr))
b3c8a0f5 419
1174045c 420SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
9de33deb 421
c07b3fef
MD
422#define SCM_WTA_DISPATCH_1(gf, a1, pos, subr) \
423 return (SCM_UNPACK (gf) \
424 ? scm_call_generic_1 ((gf), (a1)) \
425 : (scm_wrong_type_arg ((subr), (pos), (a1)), SCM_UNSPECIFIED))
0193377d
MG
426
427/* This form is for dispatching a subroutine. */
428#define SCM_WTA_DISPATCH_1_SUBR(subr, a1, pos) \
429 return (SCM_UNPACK ((*SCM_SUBR_GENERIC (subr))) \
430 ? scm_call_generic_1 ((*SCM_SUBR_GENERIC (subr)), (a1)) \
431 : (scm_i_wrong_type_arg_symbol (SCM_SUBR_NAME (subr), (pos), (a1)), SCM_UNSPECIFIED))
432
9cc37597
LC
433#define SCM_GASSERT1(cond, gf, a1, pos, subr) \
434 if (SCM_UNLIKELY (!(cond))) \
435 SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
9de33deb 436
1174045c 437SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
9de33deb 438
c07b3fef
MD
439#define SCM_WTA_DISPATCH_2(gf, a1, a2, pos, subr) \
440 return (SCM_UNPACK (gf) \
441 ? scm_call_generic_2 ((gf), (a1), (a2)) \
442 : (scm_wrong_type_arg ((subr), (pos), \
443 (pos) == SCM_ARG1 ? (a1) : (a2)), \
444 SCM_UNSPECIFIED))
9cc37597
LC
445#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \
446 if (SCM_UNLIKELY (!(cond))) \
447 SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr))
9de33deb 448
1174045c 449SCM_API SCM scm_apply_generic (SCM gf, SCM args);
89c358b1 450
c07b3fef
MD
451#define SCM_WTA_DISPATCH_n(gf, args, pos, subr) \
452 return (SCM_UNPACK (gf) \
453 ? scm_apply_generic ((gf), (args)) \
454 : (scm_wrong_type_arg ((subr), (pos), \
455 scm_list_ref ((args), \
93ccaef0 456 scm_from_int ((pos) - 1))), \
c07b3fef 457 SCM_UNSPECIFIED))
9cc37597
LC
458#define SCM_GASSERTn(cond, gf, args, pos, subr) \
459 if (SCM_UNLIKELY (!(cond))) \
460 SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
89c358b1 461
c751e5e3
GB
462#ifndef SCM_MAGIC_SNARFER
463/* Let these macros pass through if
464 we are snarfing; thus we can tell the
465 difference between the use of an actual
466 number vs. the use of one of these macros --
f5421cfc 467 actual numbers in SCM_VALIDATE_* and SCM_ASSERT
c751e5e3
GB
468 constructs must match the formal argument name,
469 but using SCM_ARG* avoids the test */
470
0f2d19dd
JB
471#define SCM_ARGn 0
472#define SCM_ARG1 1
473#define SCM_ARG2 2
474#define SCM_ARG3 3
475#define SCM_ARG4 4
476#define SCM_ARG5 5
1146b6cd 477#define SCM_ARG6 6
3dd84ef1 478#define SCM_ARG7 7
0f2d19dd 479
c751e5e3 480#endif /* SCM_MAGIC_SNARFER */
0f2d19dd 481
0f2d19dd
JB
482\f
483
484/* SCM_EXIT_SUCCESS is the default code to return from SCM if no errors
485 * were encountered. SCM_EXIT_FAILURE is the default code to return from
486 * SCM if errors were encountered. The return code can be explicitly
487 * specified in a SCM program with (scm_quit <n>).
488 */
489
490#ifndef SCM_EXIT_SUCCESS
491#ifdef vms
492#define SCM_EXIT_SUCCESS 1
493#else
494#define SCM_EXIT_SUCCESS 0
495#endif /* def vms */
496#endif /* ndef SCM_EXIT_SUCCESS */
497#ifndef SCM_EXIT_FAILURE
498#ifdef vms
499#define SCM_EXIT_FAILURE 2
500#else
501#define SCM_EXIT_FAILURE 1
502#endif /* def vms */
503#endif /* ndef SCM_EXIT_FAILURE */
504
570b6821
MV
505/* Define SCM_C_INLINE_KEYWORD so that it can be used as a replacement
506 for the "inline" keyword, expanding to nothing when "inline" is not
507 available.
508*/
509
510#ifdef SCM_C_INLINE
511#define SCM_C_INLINE_KEYWORD SCM_C_INLINE
512#else
513#define SCM_C_INLINE_KEYWORD
514#endif
515
705edb95
LC
516/* Handling thread-local storage (TLS). */
517
518#ifdef SCM_HAVE_THREAD_STORAGE_CLASS
519# define SCM_THREAD_LOCAL __thread
520#else
521# define SCM_THREAD_LOCAL
522#endif
523
729dbac3 524#endif /* SCM___SCM_H */
89e00824
ML
525
526/*
527 Local Variables:
528 c-file-style: "gnu"
529 End:
530*/