summaryrefslogtreecommitdiff
path: root/src/ChezScheme/boot/pb/scheme.h
blob: e9afc4d619b0a768d2e57d46a4bae033f65411bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
/* scheme.h for Chez Scheme Version 9.5.5.5 (pb) */

/* Do not edit this file.  It is automatically generated and */
/* specifically tailored to the version of Chez Scheme named */
/* above.  Always be certain that you have the correct scheme.h */
/* for the version of Chez Scheme you are using. */

/* Warning: Some macros may evaluate arguments more than once. */

#ifndef _LARGEFILE64_SOURCE
# define _LARGEFILE64_SOURCE
#endif
#include <stdint.h>

/* Enable function prototypes by default. */
#ifndef PROTO
#define PROTO(x) x
#endif

/* Specify declaration of exports. */
#ifdef _WIN32
#  if __cplusplus
#    ifdef SCHEME_IMPORT
#      define EXPORT extern "C" __declspec (dllimport)
#    elif SCHEME_STATIC
#      define EXPORT extern "C"
#    else
#      define EXPORT extern "C" __declspec (dllexport)
#    endif
#  else
#    ifdef SCHEME_IMPORT
#      define EXPORT extern __declspec (dllimport)
#    elif SCHEME_STATIC
#      define EXPORT extern
#    else
#      define EXPORT extern __declspec (dllexport)
#    endif
#  endif
#else
#  if __cplusplus
#    define EXPORT extern "C"
#  else
#    define EXPORT extern
#  endif
#endif

/* Chez Scheme Version and machine type */
#define VERSION "9.5.5.5"
#define MACHINE_TYPE "pb"

/* All Scheme objects are of type ptr.  Type iptr and */
/* uptr are signed and unsigned ints of the same size */
/* as a ptr */
typedef uint64_t ptr;
typedef int64_t iptr;
typedef uint64_t uptr;
typedef ptr xptr;

/* The `uptr` and `ptr` types are the same width, but `ptr` */
/* can be either an integer type or a pointer type; it may */
/* be larger than a pointer type. */
/* Use `TO_VOIDP` to get from the `uptr`/`ptr` world to the */
/* C pointer worlds, and use `TO_PTR` to go the other way. */
#ifdef PORTABLE_BYTECODE
# define TO_VOIDP(p) ((void *)(intptr_t)(p))
# define TO_PTR(p) ((ptr)(intptr_t)(p))
#else
# define TO_VOIDP(p) ((void *)(p))
# define TO_PTR(p) ((ptr)(p))
#endif

/* String elements are 32-bit tagged char objects */
typedef uint32_t string_char;

/* Bytevector elements are 8-bit unsigned "octets" */
typedef unsigned char octet;

/* Type predicates */
#define Sfixnump(x) (((uptr)(x)&0x7)==0x0)
#define Scharp(x) (((uptr)(x)&0xFF)==0x16)
#define Snullp(x) ((uptr)(x)==0x26)
#define Seof_objectp(x) ((uptr)(x)==0x36)
#define Sbwp_objectp(x) ((uptr)(x)==0x4E)
#define Sbooleanp(x) (((uptr)(x)&0xF7)==0x6)
#define Spairp(x) (((uptr)(x)&0x7)==0x1)
#define Ssymbolp(x) (((uptr)(x)&0x7)==0x3)
#define Sprocedurep(x) (((uptr)(x)&0x7)==0x5)
#define Sflonump(x) (((uptr)(x)&0x7)==0x2)
#define Svectorp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0x7)==0x0))
#define Sfxvectorp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0xF)==0x3))
#define Sflvectorp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0xF)==0xB))
#define Sbytevectorp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0x3)==0x1))
#define Sstringp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0x7)==0x2))
#define Sstencil_vectorp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0x3F)==0x1E))
#define Sbignump(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0x1F)==0x6))
#define Sboxp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0x7F)==0xE))
#define Sinexactnump(x) ((((uptr)(x)&0x7)==0x7) &&\
    ((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))==0x36))
#define Sexactnump(x) ((((uptr)(x)&0x7)==0x7) &&\
    ((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))==0x56))
#define Sratnump(x) ((((uptr)(x)&0x7)==0x7) &&\
    ((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))==0x16))
#define Sinputportp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0x1FF)==0x1CE))
#define Soutputportp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0x2FF)==0x2CE))
#define Srecordp(x) ((((uptr)(x)&0x7)==0x7) &&\
    (((uptr)((*((ptr *)TO_VOIDP((uptr)(x)+1))))&0x7)==0x7))

/* Accessors */
#define Sfixnum_value(x) ((iptr)(x)/8)
#define Schar_value(x) ((string_char)((uptr)(x)>>8))
#define Sboolean_value(x) ((x) != Sfalse)
#define Scar(x) (*((ptr *)TO_VOIDP((uptr)(x)+7)))
#define Scdr(x) (*((ptr *)TO_VOIDP((uptr)(x)+15)))
#define Sflonum_value(x) (*((double *)TO_VOIDP((uptr)(x)+6)))
#define Svector_length(x) ((iptr)((uptr)(*((iptr *)TO_VOIDP((uptr)(x)+1)))>>4))
#define Svector_ref(x,i) (((ptr *)TO_VOIDP((uptr)(x)+9))[i])
#define Sfxvector_length(x) ((iptr)((uptr)(*((iptr *)TO_VOIDP((uptr)(x)+1)))>>4))
#define Sfxvector_ref(x,i) (((ptr *)TO_VOIDP((uptr)(x)+9))[i])
#define Sflvector_length(x) ((iptr)((uptr)(*((iptr *)TO_VOIDP((uptr)(x)+1)))>>4))
#define Sflvector_ref(x,i) (((double *)TO_VOIDP((uptr)(x)+9))[i])
#define Sbytevector_length(x) ((iptr)((uptr)(*((iptr *)TO_VOIDP((uptr)(x)+1)))>>3))
#define Sbytevector_u8_ref(x,i) (((octet *)TO_VOIDP((uptr)(x)+9))[i])
/* Warning: Sbytevector_data(x) returns a pointer into x. */
#define Sbytevector_data(x) &Sbytevector_u8_ref(x,0)
#define Sstring_length(x) ((iptr)((uptr)(*((iptr *)TO_VOIDP((uptr)(x)+1)))>>4))
#define Sstring_ref(x,i) Schar_value(((string_char *)TO_VOIDP((uptr)(x)+9))[i])
#define Sunbox(x) (*((ptr *)TO_VOIDP((uptr)(x)+9)))
#define Sstencil_vector_length(x) Spopcount(((uptr)(*((iptr *)TO_VOIDP((uptr)(x)+1))))>>6)
#define Sstencil_vector_ref(x,i) (((ptr *)TO_VOIDP((uptr)(x)+9))[i])
EXPORT iptr Sinteger_value PROTO((ptr));
#define Sunsigned_value(x) (uptr)Sinteger_value(x)
EXPORT int32_t Sinteger32_value PROTO((ptr));
#define Sunsigned32_value(x) (uint32_t)Sinteger32_value(x)
EXPORT int64_t Sinteger64_value PROTO((ptr));
#define Sunsigned64_value(x) (uint64_t)Sinteger64_value(x)

/* Mutators */
EXPORT void Sset_box PROTO((ptr, ptr));
EXPORT void Sset_car PROTO((ptr, ptr));
EXPORT void Sset_cdr PROTO((ptr, ptr));
#define Sstring_set(x,i,c) ((void)((((string_char *)TO_VOIDP((uptr)(x)+9))[i]) = (string_char)(uptr)Schar(c)))
#define Sfxvector_set(x,i,n) ((void)(Sfxvector_ref(x,i) = (n)))
#define Sflvector_set(x,i,n) ((void)(Sflvector_ref(x,i) = (n)))
#define Sbytevector_u8_set(x,i,n) ((void)(Sbytevector_u8_ref(x,i) = (n)))
EXPORT void Svector_set PROTO((ptr, iptr, ptr));

/* Constructors */
#define Sfixnum(x) ((ptr)(uptr)((x)*8))
#define Schar(x) ((ptr)(uptr)((x)<<8|0x16))
#define Snil ((ptr)0x26)
#define Strue ((ptr)0xE)
#define Sfalse ((ptr)0x6)
#define Sboolean(x) ((x)?Strue:Sfalse)
#define Sbwp_object ((ptr)0x4E)
#define Seof_object ((ptr)0x36)
#define Svoid ((ptr)0x3E)
EXPORT ptr Scons PROTO((ptr, ptr));
EXPORT ptr Sstring_to_symbol PROTO((const char *));
EXPORT ptr Ssymbol_to_string PROTO((ptr));
EXPORT ptr Sflonum PROTO((double));
EXPORT ptr Smake_vector PROTO((iptr, ptr));
EXPORT ptr Smake_fxvector PROTO((iptr, ptr));
EXPORT ptr Smake_flvector PROTO((iptr, ptr));
EXPORT ptr Smake_bytevector PROTO((iptr, int));
EXPORT ptr Smake_string PROTO((iptr, int));
EXPORT ptr Smake_uninitialized_string PROTO((iptr));
EXPORT ptr Sstring PROTO((const char *));
EXPORT ptr Sstring_of_length PROTO((const char *, iptr));
EXPORT ptr Sstring_utf8 PROTO((const char*, iptr));
EXPORT ptr Sbox PROTO((ptr));
EXPORT ptr Sinteger PROTO((iptr));
EXPORT ptr Sunsigned PROTO((uptr));
EXPORT ptr Sinteger32 PROTO((int32_t));
EXPORT ptr Sunsigned32 PROTO((uint32_t));
EXPORT ptr Sinteger64 PROTO((int64_t));
EXPORT ptr Sunsigned64 PROTO((uint64_t));

/* Records */
#define Srecord_uniform_ref(x,i) (((ptr *)TO_VOIDP((uptr)(x)+9))[i])
EXPORT ptr Srecord_type PROTO((ptr));
EXPORT ptr Srecord_type_parent PROTO((ptr));
EXPORT int Srecord_type_uniformp PROTO((ptr));
EXPORT uptr Srecord_type_size PROTO((ptr));

/* Miscellaneous */
EXPORT ptr Stop_level_value PROTO((ptr));
EXPORT void Sset_top_level_value PROTO((ptr, ptr));
EXPORT void Slock_object PROTO((ptr));
EXPORT void Sunlock_object PROTO((ptr));
EXPORT int Slocked_objectp PROTO((ptr));
EXPORT void Sforeign_symbol PROTO((const char *, void *));
EXPORT void Sregister_symbol PROTO((const char *, void *));

/* Support for calls into Scheme */
EXPORT ptr Scall0 PROTO((ptr));
EXPORT ptr Scall1 PROTO((ptr, ptr));
EXPORT ptr Scall2 PROTO((ptr, ptr, ptr));
EXPORT ptr Scall3 PROTO((ptr, ptr, ptr, ptr));
EXPORT void Sinitframe PROTO((iptr));
EXPORT void Sput_arg PROTO((iptr, ptr));
EXPORT ptr Scall PROTO((ptr, iptr));
/* Warning: Sforeign_callable_entry_point(x) returns a pointer into x. */
#define Sforeign_callable_entry_point(x) ((void (*) PROTO((void)))TO_VOIDP((uptr)(x)+65))
#define Sforeign_callable_code_object(x) ((ptr)TO_VOIDP((uptr)(x)-65))

/* Customization support. */
EXPORT const char * Skernel_version PROTO((void));
EXPORT void Sretain_static_relocation PROTO((void));
EXPORT void Sset_verbose PROTO((int));
EXPORT void Sscheme_init PROTO((void (*)(void)));
EXPORT void Sregister_boot_file PROTO((const char *));
EXPORT void Sregister_boot_direct_file PROTO((const char *));
EXPORT void Sregister_boot_file_fd PROTO((const char *, int fd));
EXPORT void Sregister_boot_file_fd_region PROTO((const char *, int fd, iptr offset, iptr len, int close_after));
EXPORT void Sregister_heap_file PROTO((const char *));
EXPORT void Scompact_heap PROTO((void));
EXPORT void Ssave_heap PROTO((const char *, int));
EXPORT void Sbuild_heap PROTO((const char *, void (*)(void)));
EXPORT void Senable_expeditor PROTO((const char *));
EXPORT int Sscheme_start PROTO((int, const char *[]));
EXPORT int Sscheme_script PROTO((const char *, int, const char *[]));
EXPORT int Sscheme_program PROTO((const char *, int, const char *[]));
EXPORT void Sscheme_deinit PROTO((void));
EXPORT void Sscheme_register_signal_registerer PROTO((void (*f)(int)));

/* Features. */

/* C call prototypes. */
#include <stdint.h>
typedef void (*pb_void_t)();
typedef void (*pb_void_uptr_t)(uptr);
typedef void (*pb_void_int32_t)(int32_t);
typedef void (*pb_void_uint32_t)(uint32_t);
typedef void (*pb_void_voids_t)(void*);
typedef void (*pb_void_uptr_uint32_t)(uptr, uint32_t);
typedef void (*pb_void_int32_uptr_t)(int32_t, uptr);
typedef void (*pb_void_int32_int32_t)(int32_t, int32_t);
typedef void (*pb_void_uptr_uptr_t)(uptr, uptr);
typedef void (*pb_void_int32_voids_t)(int32_t, void*);
typedef void (*pb_void_uptr_voids_t)(uptr, void*);
typedef void (*pb_void_voids_voids_t)(void*, void*);
typedef void (*pb_void_uptr_uptr_uptr_t)(uptr, uptr, uptr);
typedef void (*pb_void_uptr_uptr_uptr_uptr_uptr_t)(uptr, uptr, uptr, uptr, uptr);
typedef int32_t (*pb_int32_t)();
typedef int32_t (*pb_int32_int32_t)(int32_t);
typedef int32_t (*pb_int32_uptr_t)(uptr);
typedef int32_t (*pb_int32_voids_t)(void*);
typedef int32_t (*pb_int32_int32_uptr_t)(int32_t, uptr);
typedef int32_t (*pb_int32_uptr_int32_t)(uptr, int32_t);
typedef int32_t (*pb_int32_uptr_uptr_t)(uptr, uptr);
typedef int32_t (*pb_int32_int32_int32_t)(int32_t, int32_t);
typedef int32_t (*pb_int32_int32_voids_t)(int32_t, void*);
typedef int32_t (*pb_int32_voids_int32_t)(void*, int32_t);
typedef int32_t (*pb_int32_double_double_double_double_double_double_t)(double, double, double, double, double, double);
typedef int32_t (*pb_int32_voids_voids_voids_voids_uptr_t)(void*, void*, void*, void*, uptr);
typedef uint32_t (*pb_uint32_t)();
typedef double (*pb_double_double_t)(double);
typedef double (*pb_double_uptr_t)(uptr);
typedef double (*pb_double_double_double_t)(double, double);
typedef int32_t (*pb_int32_uptr_uptr_uptr_uptr_uptr_t)(uptr, uptr, uptr, uptr, uptr);
typedef uptr (*pb_uptr_t)();
typedef uptr (*pb_uptr_uptr_t)(uptr);
typedef uptr (*pb_uptr_int32_t)(int32_t);
typedef uptr (*pb_uptr_voids_t)(void*);
typedef uptr (*pb_uptr_uptr_uptr_t)(uptr, uptr);
typedef uptr (*pb_uptr_uptr_int32_t)(uptr, int32_t);
typedef uptr (*pb_uptr_int32_uptr_t)(int32_t, uptr);
typedef uptr (*pb_uptr_uptr_int64_t)(uptr, int64_t);
typedef uptr (*pb_uptr_uptr_voids_t)(uptr, void*);
typedef uptr (*pb_uptr_voids_uptr_t)(void*, uptr);
typedef uptr (*pb_uptr_voids_int32_t)(void*, int32_t);
typedef uptr (*pb_uptr_voids_voids_t)(void*, void*);
typedef uptr (*pb_uptr_uptr_int32_int32_t)(uptr, int32_t, int32_t);
typedef uptr (*pb_uptr_uptr_uptr_int32_t)(uptr, uptr, int32_t);
typedef uptr (*pb_uptr_uptr_uptr_uptr_t)(uptr, uptr, uptr);
typedef uptr (*pb_uptr_int32_int32_uptr_t)(int32_t, int32_t, uptr);
typedef uptr (*pb_uptr_voids_int32_int32_t)(void*, int32_t, int32_t);
typedef uptr (*pb_uptr_voids_uptr_uptr_t)(void*, uptr, uptr);
typedef uptr (*pb_uptr_int32_uptr_uptr_uptr_t)(int32_t, uptr, uptr, uptr);
typedef uptr (*pb_uptr_int32_int32_uptr_uptr_t)(int32_t, int32_t, uptr, uptr);
typedef uptr (*pb_uptr_int32_voids_uptr_uptr_t)(int32_t, void*, uptr, uptr);
typedef uptr (*pb_uptr_uptr_uptr_uptr_uptr_t)(uptr, uptr, uptr, uptr);
typedef uptr (*pb_uptr_int32_int32_int32_uptr_t)(int32_t, int32_t, int32_t, uptr);
typedef uptr (*pb_uptr_uptr_voids_uptr_uptr_t)(uptr, void*, uptr, uptr);
typedef uptr (*pb_uptr_uptr_uptr_uptr_uptr_int32_t)(uptr, uptr, uptr, uptr, int32_t);
typedef uptr (*pb_uptr_uptr_uptr_uptr_uptr_uptr_t)(uptr, uptr, uptr, uptr, uptr);
typedef uptr (*pb_uptr_voids_voids_voids_voids_uptr_t)(void*, void*, void*, void*, uptr);
typedef uptr (*pb_uptr_uptr_int32_uptr_uptr_uptr_uptr_t)(uptr, int32_t, uptr, uptr, uptr, uptr);
typedef uptr (*pb_uptr_uptr_uptr_uptr_uptr_uptr_uptr_t)(uptr, uptr, uptr, uptr, uptr, uptr);
typedef uptr (*pb_uptr_uptr_uptr_uptr_uptr_uptr_uptr_int32_t)(uptr, uptr, uptr, uptr, uptr, uptr, int32_t);
typedef uptr (*pb_uptr_uptr_uptr_uptr_uptr_uptr_uptr_uptr_t)(uptr, uptr, uptr, uptr, uptr, uptr, uptr);
typedef uptr (*pb_uptr_double_double_double_double_double_double_t)(double, double, double, double, double, double);
typedef void* (*pb_voids_t)();
typedef void* (*pb_voids_uptr_t)(uptr);

/* Locking macros. */
#define INITLOCK(addr) (*((long *) addr) = 0)
#define SPINLOCK(addr) (*((long *) addr) = 1)
#define UNLOCK(addr) (*((long *) addr) = 0)
#define LOCKED_INCR(addr, res) (res = ((*(uptr*)addr)-- == 1))
#define LOCKED_DECR(addr, res) (res = ((*(uptr*)addr)-- == 1))