ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/microscheme/scheme-private.h
Revision: 1.9
Committed: Mon Nov 30 13:07:34 2015 UTC (8 years, 6 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.8: +6 -0 lines
Log Message:
intcache

File Contents

# User Rev Content
1 root 1.4 /*
2     * µscheme
3     *
4     * Copyright (C) 2015 Marc Alexander Lehmann <uscheme@schmorp.de>
5     * do as you want with this, attribution appreciated.
6     */
7 root 1.1
8     /* scheme-private.h */
9    
10     #ifndef SCHEME_PRIVATE_H
11 root 1.2 #define SCHEME_PRIVATE_H
12 root 1.1
13 root 1.2 #include "scheme.h"
14    
15 root 1.1 /*------------------ Ugly internals -----------------------------------*/
16    
17     /*------------------ Of interest only to FFI users --------------------*/
18    
19     # ifdef __cplusplus
20     extern "C"
21     {
22     # endif
23    
24     enum scheme_port_kind
25     {
26     port_free = 0,
27     port_file = 1,
28     port_string = 2,
29     port_srfi6 = 4,
30     port_input = 16,
31     port_output = 32,
32     port_saw_EOF = 64
33     };
34    
35     typedef struct port
36     {
37     unsigned char kind;
38     int16_t unget;
39     union
40     {
41     struct
42     {
43     int file;
44     int closeit;
45     # if SHOW_ERROR_LINE
46     int curr_line;
47     char *filename;
48     # endif
49     } stdio;
50     struct
51     {
52     char *start;
53     char *past_the_end;
54     char *curr;
55     } string;
56     } rep;
57     } port;
58    
59     /* cell structure */
60     struct cell
61     {
62     union
63     {
64     struct
65     {
66 root 1.7 uint8_t *svalue;
67 root 1.3 uint32_t length;
68 root 1.1 } string;
69    
70 root 1.3 struct {
71     struct cell **vvalue;
72     uint32_t length;
73     } vector;
74    
75 root 1.6 intptr_t ivalue;
76     #if USE_REAL
77     double rvalue;
78     #endif
79 root 1.1
80     port *port;
81    
82     foreign_func ff;
83    
84     struct
85     {
86     struct cell *car;
87     struct cell *cdr;
88     } cons;
89    
90     } object;
91    
92 root 1.3 uint8_t flag;
93 root 1.1 };
94    
95     /* frequently accessed members are near the beginning, reducing codesize esp. on CISC */
96     struct scheme
97     {
98     /* NIL is the most commonly accessed value */
99     struct cell xNIL; /* special cell representing empty cell */
100    
101     /* We use 4 registers. */
102     pointer args; /* register for arguments of function */
103     pointer envir; /* stack register for current environment */
104     pointer code; /* register for current code */
105     pointer dump; /* stack register for next evaluation */
106    
107     struct cell xT; /* special cell representing #t */
108     struct cell xF; /* special cell representing #f */
109     struct cell xEOF_OBJ; /* special cell representing end-of-file object */
110     struct cell xsink; /* when mem. alloc. fails */
111    
112     /* arrays for segments */
113     #ifndef CELL_SEGSIZE
114     # define CELL_SEGSIZE 128 /* # of cells in one segment */
115     #endif
116     #ifndef CELL_NSEGMENT
117 root 1.8 # define CELL_NSEGMENT 20 /* # of segments for cells */
118 root 1.1 #endif
119     char *alloc_seg[CELL_NSEGMENT];
120     pointer cell_seg[CELL_NSEGMENT];
121     int cell_segsize[CELL_NSEGMENT];
122     int last_cell_seg;
123    
124     int interactive_repl; /* are we in an interactive REPL? */
125    
126     pointer oblist; /* pointer to symbol table */
127     pointer global_env; /* pointer to global environment */
128     pointer c_nest; /* stack for nested calls from C */
129    
130     /* global pointers to special symbols */
131     pointer LAMBDA; /* pointer to syntax lambda */
132     pointer QUOTE; /* pointer to syntax quote */
133    
134     pointer QQUOTE; /* pointer to symbol quasiquote */
135     pointer UNQUOTE; /* pointer to symbol unquote */
136     pointer UNQUOTESP; /* pointer to symbol unquote-splicing */
137     pointer FEED_TO; /* => */
138     pointer COLON_HOOK; /* *colon-hook* */
139     pointer ERROR_HOOK; /* *error-hook* */
140     pointer SHARP_HOOK; /* *sharp-hook* */
141     pointer COMPILE_HOOK; /* *compile-hook* */
142    
143     pointer free_cell; /* pointer to top of free cells */
144     long fcells; /* # of free cells */
145    
146     /* return code */
147     int retcode;
148     int tracing;
149    
150     pointer inport;
151     pointer outport;
152     pointer save_inport;
153     pointer loadport;
154    
155 root 1.6 #define MAXFIL 8
156 root 1.1 port load_stack[MAXFIL]; /* Stack of open files for port -1 (LOADing) */
157     int nesting_stack[MAXFIL];
158     int file_i;
159     int nesting;
160    
161     char gc_verbose; /* if gc_verbose is not zero, print gc status */
162     char no_memory; /* Whether mem. alloc. has failed */
163    
164 root 1.5 #define LINESIZE 1024
165 root 1.1 char linebuff[LINESIZE];
166 root 1.5 #define STRBUFFSIZE 256
167 root 1.1 char strbuff[STRBUFFSIZE];
168    
169     int tmpfp;
170     int tok;
171     int print_flag;
172     pointer value;
173     int op;
174    
175     void *ext_data; /* For the benefit of foreign functions */
176     long gensym_cnt;
177    
178 root 1.9 #if USE_INTCACHE
179     #define INTCACHE_MIN -10
180     #define INTCACHE_MAX 32
181     pointer intcache[INTCACHE_MAX - INTCACHE_MIN + 1];
182     #endif
183    
184 root 1.1 struct scheme_interface *vptr;
185     struct dump_stack_frame *dump_base; /* pointer to base of allocated dump stack */
186     int dump_size; /* number of frames allocated for dump stack */
187     };
188    
189     /* operator code */
190     enum scheme_opcodes
191     {
192 root 1.5 #define OP_DEF(func,name,minarity,maxarity,argtest,op) op,
193     #include "opdefines.h"
194     #undef OP_DEF
195 root 1.1 OP_MAXDEFINED
196     };
197    
198 root 1.6 typedef struct num num;
199    
200 root 1.5 #define cons(a,b) xcons(SCHEME_A_ a,b,0)
201     #define immutable_cons(a,b) xcons(SCHEME_A_ a,b,1)
202 root 1.1
203     INTERFACE int is_string (pointer p);
204     INTERFACE char *string_value (pointer p);
205     INTERFACE int is_number (pointer p);
206     INTERFACE num nvalue (pointer p);
207     INTERFACE int is_integer (pointer p);
208     INTERFACE int is_real (pointer p);
209     INTERFACE int is_character (pointer p);
210     INTERFACE long charvalue (pointer p);
211     INTERFACE int is_vector (pointer p);
212    
213     INTERFACE int is_port (pointer p);
214    
215     INTERFACE int is_pair (pointer p);
216     INTERFACE pointer pair_car (pointer p);
217     INTERFACE pointer pair_cdr (pointer p);
218     INTERFACE void set_car (pointer p, pointer q);
219     INTERFACE void set_cdr (pointer p, pointer q);
220    
221     INTERFACE int is_symbol (pointer p);
222     INTERFACE char *symname (pointer p);
223     INTERFACE int hasprop (pointer p);
224    
225     INTERFACE int is_syntax (pointer p);
226     INTERFACE int is_proc (pointer p);
227     INTERFACE int is_foreign (pointer p);
228     INTERFACE char *syntaxname (pointer p);
229     INTERFACE int is_closure (pointer p);
230 root 1.5 #ifdef USE_MACRO
231 root 1.1 INTERFACE int is_macro (pointer p);
232 root 1.5 #endif
233 root 1.1 INTERFACE pointer closure_code (pointer p);
234     INTERFACE pointer closure_env (pointer p);
235    
236     INTERFACE int is_continuation (pointer p);
237     INTERFACE int is_promise (pointer p);
238     INTERFACE int is_environment (pointer p);
239     INTERFACE int is_immutable (pointer p);
240     INTERFACE void setimmutable (pointer p);
241    
242 root 1.2 #ifdef __cplusplus
243 root 1.1 }
244 root 1.2 #endif
245 root 1.1
246     #endif
247    
248     /*
249     Local variables:
250     c-file-style: "k&r"
251     End:
252     */