sydparse 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Manifest.txt +26 -0
- data/Rakefile +34 -0
- data/bin/syd_pt_show +23 -0
- data/env.h +66 -0
- data/extconf.rb +12 -0
- data/internal.h +716 -0
- data/lex.c.tab +136 -0
- data/lib/sydparse.rb +247 -0
- data/node.h +365 -0
- data/parse_override.h +14 -0
- data/runtime.c +968 -0
- data/runtime.h +195 -0
- data/state.h +140 -0
- data/sydparse.c +10325 -0
- data/sydparse.y +6427 -0
- data/test/class.rb +7 -0
- data/test/pt.rb +19 -0
- data/test/show.rb +20 -0
- data/test/t.rb +53 -0
- data/test/t3.rb +6 -0
- data/test/t4.rb +4 -0
- data/test/test.rb +2 -0
- data/test/ubs.rb +1 -0
- metadata +70 -0
data/Manifest.txt
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
env.h
|
2
|
+
extconf.rb
|
3
|
+
internal.h
|
4
|
+
lex.c.tab
|
5
|
+
lib
|
6
|
+
bin/syd_pt_show
|
7
|
+
lib/sydparse
|
8
|
+
lib/sydparse.rb
|
9
|
+
Manifest.txt
|
10
|
+
node.h
|
11
|
+
parse_override.h
|
12
|
+
Rakefile
|
13
|
+
runtime.c
|
14
|
+
runtime.h
|
15
|
+
state.h
|
16
|
+
sydparse.c
|
17
|
+
sydparse.y
|
18
|
+
test
|
19
|
+
test/class.rb
|
20
|
+
test/pt.rb
|
21
|
+
test/show.rb
|
22
|
+
test/t.rb
|
23
|
+
test/t3.rb
|
24
|
+
test/t4.rb
|
25
|
+
test/test.rb
|
26
|
+
test/ubs.rb
|
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
|
5
|
+
$VERBOSE = nil
|
6
|
+
|
7
|
+
spec = Gem::Specification.new do |s|
|
8
|
+
s.name = 'sydparse'
|
9
|
+
s.version = '1.0.0'
|
10
|
+
s.summary = 'A standalone ruby parser with sexp support.'
|
11
|
+
s.author = 'Evan Webb'
|
12
|
+
s.email = 'evan@fallingsnow.net'
|
13
|
+
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.files = File.read('Manifest.txt').split($/)
|
16
|
+
s.require_path = 'lib'
|
17
|
+
s.executables = ['syd_pt_show']
|
18
|
+
s.default_executable = ''
|
19
|
+
s.extensions = ['extconf.rb']
|
20
|
+
end
|
21
|
+
|
22
|
+
desc 'Build Gem'
|
23
|
+
Rake::GemPackageTask.new spec do |pkg|
|
24
|
+
pkg.need_tar = true
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'Clean up'
|
28
|
+
task :clean => [ :clobber_package ]
|
29
|
+
|
30
|
+
desc 'Clean up'
|
31
|
+
task :clobber => [ :clean ]
|
32
|
+
|
33
|
+
# vim: syntax=Ruby
|
34
|
+
|
data/bin/syd_pt_show
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'sydparse'
|
5
|
+
require 'pp'
|
6
|
+
|
7
|
+
if ARGV.first == "-l"
|
8
|
+
newlines = true
|
9
|
+
ARGV.shift
|
10
|
+
elsif ARGV.first == "-u"
|
11
|
+
unified = true
|
12
|
+
ARGV.shift
|
13
|
+
end
|
14
|
+
|
15
|
+
name = ARGV.shift
|
16
|
+
File.open(name, "r") do |fd|
|
17
|
+
if unified
|
18
|
+
pp SydneyParser.unified_sexp(fd)
|
19
|
+
else
|
20
|
+
syd = SydneyParser.load_file fd
|
21
|
+
pp syd.sexp(false, newlines)
|
22
|
+
end
|
23
|
+
end
|
data/env.h
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
/**********************************************************************
|
2
|
+
|
3
|
+
env.h -
|
4
|
+
|
5
|
+
$Author: matz $
|
6
|
+
$Date: 2003/10/20 08:33:48 $
|
7
|
+
created at: Mon Jul 11 11:53:03 JST 1994
|
8
|
+
|
9
|
+
Copyright (C) 1993-2003 Yukihiro Matsumoto
|
10
|
+
|
11
|
+
**********************************************************************/
|
12
|
+
|
13
|
+
#ifndef ENV_H
|
14
|
+
#define ENV_H
|
15
|
+
|
16
|
+
struct FRAME {
|
17
|
+
VALUE self;
|
18
|
+
int argc;
|
19
|
+
VALUE *argv;
|
20
|
+
ID last_func;
|
21
|
+
ID orig_func;
|
22
|
+
VALUE last_class;
|
23
|
+
struct FRAME *prev;
|
24
|
+
struct FRAME *tmp;
|
25
|
+
struct RNode *node;
|
26
|
+
int iter;
|
27
|
+
int flags;
|
28
|
+
unsigned long uniq;
|
29
|
+
struct SCOPE *scope;
|
30
|
+
VALUE metadata;
|
31
|
+
};
|
32
|
+
|
33
|
+
/*
|
34
|
+
// VALUE rb_cFrame;
|
35
|
+
// VALUE rb_cBacktrace;
|
36
|
+
// VALUE rb_cMain;
|
37
|
+
*/
|
38
|
+
void rb_gc_mark_frame _((struct FRAME *));
|
39
|
+
|
40
|
+
#define FRAME_ALLOCA 0
|
41
|
+
#define FRAME_MALLOC 1
|
42
|
+
|
43
|
+
struct SCOPE {
|
44
|
+
struct RBasic super;
|
45
|
+
ID *local_tbl;
|
46
|
+
VALUE *local_vars;
|
47
|
+
int flags;
|
48
|
+
};
|
49
|
+
|
50
|
+
#define SCOPE_ALLOCA 0
|
51
|
+
#define SCOPE_MALLOC 1
|
52
|
+
#define SCOPE_NOSTACK 2
|
53
|
+
#define SCOPE_DONT_RECYCLE 4
|
54
|
+
|
55
|
+
/* extern int ruby_in_eval;
|
56
|
+
|
57
|
+
// extern VALUE ruby_class;
|
58
|
+
*/
|
59
|
+
struct RVarmap {
|
60
|
+
struct RBasic super;
|
61
|
+
ID id;
|
62
|
+
VALUE val;
|
63
|
+
struct RVarmap *next;
|
64
|
+
};
|
65
|
+
|
66
|
+
#endif /* ENV_H */
|
data/extconf.rb
ADDED
data/internal.h
ADDED
@@ -0,0 +1,716 @@
|
|
1
|
+
#ifndef __INTERNAL_H__
|
2
|
+
#define __INTERNAL_H__
|
3
|
+
|
4
|
+
#include "st.h"
|
5
|
+
#include "re.h"
|
6
|
+
#include "node.h"
|
7
|
+
#include "env.h"
|
8
|
+
|
9
|
+
struct gc_list {
|
10
|
+
VALUE *varptr;
|
11
|
+
struct gc_list *next;
|
12
|
+
};
|
13
|
+
|
14
|
+
struct global_entry {
|
15
|
+
struct global_variable *var;
|
16
|
+
ID id;
|
17
|
+
};
|
18
|
+
|
19
|
+
|
20
|
+
#undef GC_DEBUG
|
21
|
+
/* #define GC_DEBUG */
|
22
|
+
|
23
|
+
typedef struct RVALUE {
|
24
|
+
union {
|
25
|
+
struct {
|
26
|
+
unsigned long flags; /* always 0 for freed obj */
|
27
|
+
struct RVALUE *next;
|
28
|
+
} free;
|
29
|
+
struct RBasic basic;
|
30
|
+
struct RObject object;
|
31
|
+
struct RClass klass;
|
32
|
+
struct RFloat flonum;
|
33
|
+
struct RString string;
|
34
|
+
struct RArray array;
|
35
|
+
struct RRegexp regexp;
|
36
|
+
struct RHash hash;
|
37
|
+
struct RData data;
|
38
|
+
struct RStruct rstruct;
|
39
|
+
struct RBignum bignum;
|
40
|
+
struct RFile file;
|
41
|
+
struct RNode node;
|
42
|
+
struct RMatch match;
|
43
|
+
struct RVarmap varmap;
|
44
|
+
struct SCOPE scope;
|
45
|
+
} as;
|
46
|
+
#ifdef GC_DEBUG
|
47
|
+
char *file;
|
48
|
+
int line;
|
49
|
+
#endif
|
50
|
+
} RVALUE;
|
51
|
+
|
52
|
+
#define HEAP_MIN_SLOTS 10000
|
53
|
+
|
54
|
+
struct heaps_slot {
|
55
|
+
RVALUE *slot;
|
56
|
+
int limit;
|
57
|
+
};
|
58
|
+
|
59
|
+
#define MARK_STACK_MAX 1024
|
60
|
+
|
61
|
+
/* from eval.c */
|
62
|
+
|
63
|
+
struct cache_entry { /* method hash table. */
|
64
|
+
ID mid; /* method's id */
|
65
|
+
ID mid0; /* method's original id */
|
66
|
+
VALUE klass; /* receiver's class */
|
67
|
+
VALUE origin; /* where method defined */
|
68
|
+
NODE *method;
|
69
|
+
int noex;
|
70
|
+
};
|
71
|
+
|
72
|
+
#define CACHE_SIZE 0x800
|
73
|
+
#define CACHE_MASK 0x7ff
|
74
|
+
#define EXPR1(c,m) ((((c)>>3)^(m))&CACHE_MASK)
|
75
|
+
|
76
|
+
struct BLOCK {
|
77
|
+
NODE *var;
|
78
|
+
NODE *body;
|
79
|
+
VALUE self;
|
80
|
+
struct FRAME frame;
|
81
|
+
struct SCOPE *scope;
|
82
|
+
VALUE klass;
|
83
|
+
NODE *cref;
|
84
|
+
int iter;
|
85
|
+
int vmode;
|
86
|
+
int flags;
|
87
|
+
int uniq;
|
88
|
+
struct RVarmap *dyna_vars;
|
89
|
+
VALUE orig_thread;
|
90
|
+
VALUE wrapper;
|
91
|
+
VALUE block_obj;
|
92
|
+
struct BLOCK *outer;
|
93
|
+
struct BLOCK *prev;
|
94
|
+
};
|
95
|
+
|
96
|
+
struct iter {
|
97
|
+
int iter;
|
98
|
+
struct iter *prev;
|
99
|
+
};
|
100
|
+
|
101
|
+
|
102
|
+
#define ITER_NOT 0
|
103
|
+
#define ITER_PRE 1
|
104
|
+
#define ITER_CUR 2
|
105
|
+
|
106
|
+
#define PUSH_ITER(i) do { \
|
107
|
+
struct iter _iter; \
|
108
|
+
_iter.prev = ruby_iter; \
|
109
|
+
_iter.iter = (i); \
|
110
|
+
ruby_iter = &_iter
|
111
|
+
|
112
|
+
#define POP_ITER() \
|
113
|
+
ruby_iter = _iter.prev; \
|
114
|
+
} while (0)
|
115
|
+
|
116
|
+
#define CSTAT_PRIV 1
|
117
|
+
#define CSTAT_PROT 2
|
118
|
+
#define CSTAT_VCALL 4
|
119
|
+
#define CSTAT_SUPER 8
|
120
|
+
|
121
|
+
#define BLOCK_D_SCOPE 1
|
122
|
+
#define BLOCK_LAMBDA 2
|
123
|
+
|
124
|
+
#define PUSH_BLOCK(v,b) do { \
|
125
|
+
struct BLOCK _block; \
|
126
|
+
_block.var = (v); \
|
127
|
+
_block.body = (b); \
|
128
|
+
_block.self = self; \
|
129
|
+
_block.frame = *ruby_frame; \
|
130
|
+
_block.klass = ruby_class; \
|
131
|
+
_block.cref = ruby_cref; \
|
132
|
+
_block.frame.node = ruby_current_node;\
|
133
|
+
_block.scope = ruby_scope; \
|
134
|
+
_block.prev = ruby_block; \
|
135
|
+
_block.outer = ruby_block; \
|
136
|
+
_block.iter = ruby_iter->iter; \
|
137
|
+
_block.vmode = scope_vmode; \
|
138
|
+
_block.flags = BLOCK_D_SCOPE; \
|
139
|
+
_block.dyna_vars = ruby_dyna_vars; \
|
140
|
+
_block.wrapper = ruby_wrapper; \
|
141
|
+
_block.block_obj = 0; \
|
142
|
+
_block.uniq = (b)?block_unique++:0; \
|
143
|
+
if (b) { \
|
144
|
+
prot_tag->blkid = _block.uniq; \
|
145
|
+
} \
|
146
|
+
ruby_block = &_block
|
147
|
+
|
148
|
+
#define POP_BLOCK() \
|
149
|
+
ruby_block = _block.prev; \
|
150
|
+
} while (0)
|
151
|
+
|
152
|
+
/* eval.c */
|
153
|
+
#if defined(HAVE_GETCONTEXT) && defined(HAVE_SETCONTEXT)
|
154
|
+
|
155
|
+
#include <signal.h>
|
156
|
+
#include <ucontext.h>
|
157
|
+
typedef struct {
|
158
|
+
ucontext_t context;
|
159
|
+
volatile int status;
|
160
|
+
} rb_jmpbuf_t[1];
|
161
|
+
#else
|
162
|
+
#include <setjmp.h>
|
163
|
+
typedef jmp_buf rb_jmpbuf_t;
|
164
|
+
#endif
|
165
|
+
|
166
|
+
struct tag {
|
167
|
+
rb_jmpbuf_t buf;
|
168
|
+
struct FRAME *frame;
|
169
|
+
struct iter *iter;
|
170
|
+
VALUE tag;
|
171
|
+
VALUE retval;
|
172
|
+
struct SCOPE *scope;
|
173
|
+
VALUE dst;
|
174
|
+
struct tag *prev;
|
175
|
+
int blkid;
|
176
|
+
};
|
177
|
+
|
178
|
+
typedef struct thread * rb_thread_t;
|
179
|
+
|
180
|
+
#ifndef MAXPATHLEN
|
181
|
+
# define MAXPATHLEN 1024
|
182
|
+
#endif
|
183
|
+
|
184
|
+
struct end_proc_data {
|
185
|
+
void (*func)();
|
186
|
+
VALUE data;
|
187
|
+
int safe;
|
188
|
+
struct end_proc_data *next;
|
189
|
+
};
|
190
|
+
|
191
|
+
struct local_vars {
|
192
|
+
ID *tbl;
|
193
|
+
int nofree;
|
194
|
+
int cnt;
|
195
|
+
int dlev;
|
196
|
+
struct RVarmap* dyna_vars;
|
197
|
+
struct local_vars *prev;
|
198
|
+
};
|
199
|
+
|
200
|
+
#include <signal.h>
|
201
|
+
#ifdef __BEOS__
|
202
|
+
#undef SIGBUS
|
203
|
+
#endif
|
204
|
+
|
205
|
+
#ifndef NSIG
|
206
|
+
# ifdef DJGPP
|
207
|
+
# define NSIG SIGMAX
|
208
|
+
# else
|
209
|
+
# define NSIG (_SIGMAX + 1) /* For QNX */
|
210
|
+
# endif
|
211
|
+
#endif
|
212
|
+
|
213
|
+
struct trap_list_struct {
|
214
|
+
VALUE cmd;
|
215
|
+
int safe;
|
216
|
+
};
|
217
|
+
|
218
|
+
#ifndef GC_MALLOC_LIMIT
|
219
|
+
#if defined(MSDOS) || defined(__human68k__)
|
220
|
+
#define GC_MALLOC_LIMIT 200000
|
221
|
+
#else
|
222
|
+
#define GC_MALLOC_LIMIT 8000000
|
223
|
+
#endif
|
224
|
+
#endif
|
225
|
+
|
226
|
+
#ifdef _WIN32
|
227
|
+
typedef LONG rb_atomic_t;
|
228
|
+
#else
|
229
|
+
typedef int rb_atomic_t;
|
230
|
+
#endif
|
231
|
+
|
232
|
+
enum thread_status {
|
233
|
+
THREAD_TO_KILL,
|
234
|
+
THREAD_RUNNABLE,
|
235
|
+
THREAD_STOPPED,
|
236
|
+
THREAD_KILLED,
|
237
|
+
THREAD_RUNNING,
|
238
|
+
THREAD_GC,
|
239
|
+
THREAD_PAUSE
|
240
|
+
};
|
241
|
+
#define FOREACH_THREAD_FROM(f,x) x = f; do { x = x->next;
|
242
|
+
#define END_FOREACH_FROM(f,x) } while (x != f)
|
243
|
+
|
244
|
+
#define FOREACH_THREAD(x) FOREACH_THREAD_FROM(curr_thread,x)
|
245
|
+
#define END_FOREACH(x) END_FOREACH_FROM(curr_thread,x)
|
246
|
+
|
247
|
+
#define FOREACH_ARY(ary, val) do { \
|
248
|
+
int __foreach_idx; \
|
249
|
+
VALUE val; \
|
250
|
+
for(__foreach_idx = 0; __foreach_idx < RARRAY(ary)->len; __foreach_idx++) { \
|
251
|
+
val = RARRAY(ary)->ptr[__foreach_idx];
|
252
|
+
#define END_FOREACH_ARY } } while(0)
|
253
|
+
|
254
|
+
/* for fd_set, etc */
|
255
|
+
#include <sys/select.h>
|
256
|
+
|
257
|
+
struct thread {
|
258
|
+
struct thread *next, *prev;
|
259
|
+
rb_jmpbuf_t context;
|
260
|
+
#ifdef SAVE_WIN32_EXCEPTION_LIST
|
261
|
+
DWORD win32_exception_list;
|
262
|
+
#endif
|
263
|
+
|
264
|
+
VALUE result;
|
265
|
+
|
266
|
+
long stk_len;
|
267
|
+
long stk_max;
|
268
|
+
VALUE *stk_ptr;
|
269
|
+
VALUE *stk_pos;
|
270
|
+
#ifdef __ia64__
|
271
|
+
VALUE *bstr_ptr;
|
272
|
+
long bstr_len;
|
273
|
+
#endif
|
274
|
+
|
275
|
+
struct FRAME *frame;
|
276
|
+
struct SCOPE *scope;
|
277
|
+
struct RVarmap *dyna_vars;
|
278
|
+
struct BLOCK *block;
|
279
|
+
struct iter *iter;
|
280
|
+
struct tag *tag;
|
281
|
+
VALUE klass;
|
282
|
+
VALUE wrapper;
|
283
|
+
NODE *cref;
|
284
|
+
|
285
|
+
int flags; /* misc. states (vmode/rb_trap_immediate/raised) */
|
286
|
+
|
287
|
+
NODE *node;
|
288
|
+
|
289
|
+
int thl_tracing;
|
290
|
+
VALUE errinfo;
|
291
|
+
VALUE last_status;
|
292
|
+
VALUE last_line;
|
293
|
+
VALUE last_match;
|
294
|
+
|
295
|
+
int safe;
|
296
|
+
|
297
|
+
enum thread_status status;
|
298
|
+
int wait_for;
|
299
|
+
int fd;
|
300
|
+
fd_set readfds;
|
301
|
+
fd_set writefds;
|
302
|
+
fd_set exceptfds;
|
303
|
+
int select_value;
|
304
|
+
double delay;
|
305
|
+
rb_thread_t join;
|
306
|
+
|
307
|
+
int abort;
|
308
|
+
int priority;
|
309
|
+
VALUE thgroup;
|
310
|
+
|
311
|
+
st_table *locals;
|
312
|
+
|
313
|
+
VALUE thread;
|
314
|
+
|
315
|
+
VALUE (*schedule)();
|
316
|
+
};
|
317
|
+
|
318
|
+
#define THREAD_RAISED 0x200 /* temporary flag */
|
319
|
+
#define THREAD_TERMINATING 0x400 /* persistent flag */
|
320
|
+
#define THREAD_FLAGS_MASK 0x400 /* mask for persistent flags */
|
321
|
+
|
322
|
+
|
323
|
+
struct thread_status_t {
|
324
|
+
NODE *node;
|
325
|
+
|
326
|
+
int thl_tracing;
|
327
|
+
VALUE errinfo;
|
328
|
+
VALUE last_status;
|
329
|
+
VALUE last_line;
|
330
|
+
VALUE last_match;
|
331
|
+
|
332
|
+
int safe;
|
333
|
+
|
334
|
+
enum thread_status status;
|
335
|
+
int wait_for;
|
336
|
+
int fd;
|
337
|
+
fd_set readfds;
|
338
|
+
fd_set writefds;
|
339
|
+
fd_set exceptfds;
|
340
|
+
int select_value;
|
341
|
+
double delay;
|
342
|
+
rb_thread_t join;
|
343
|
+
};
|
344
|
+
|
345
|
+
struct gc_state {
|
346
|
+
int dont_gc;
|
347
|
+
int during_gc;
|
348
|
+
int need_call_final;
|
349
|
+
st_table *finalizer_table;
|
350
|
+
struct gc_list *global_List;
|
351
|
+
VALUE globals;
|
352
|
+
RVALUE *freelist;
|
353
|
+
RVALUE *deferred_final_list;
|
354
|
+
struct heaps_slot *heaps;
|
355
|
+
int heaps_length;
|
356
|
+
int heaps_used;
|
357
|
+
int heap_slots;
|
358
|
+
unsigned long num_objects;
|
359
|
+
RVALUE *gc_himem;
|
360
|
+
RVALUE *gc_lomem;
|
361
|
+
VALUE mark_stack[MARK_STACK_MAX];
|
362
|
+
VALUE *mark_stack_ptr;
|
363
|
+
int mark_stack_overflow;
|
364
|
+
st_table *source_filenames;
|
365
|
+
VALUE finalizers;
|
366
|
+
unsigned long malloc_increase;
|
367
|
+
unsigned long malloc_limit;
|
368
|
+
int grow_direction;
|
369
|
+
int memerror_recurse;
|
370
|
+
|
371
|
+
pthread_mutex_t lock;
|
372
|
+
pthread_t lock_owner;
|
373
|
+
pthread_mutex_t heap_modification;
|
374
|
+
};
|
375
|
+
|
376
|
+
struct lock_table_entry {
|
377
|
+
VALUE object;
|
378
|
+
};
|
379
|
+
|
380
|
+
typedef struct ruby_state {
|
381
|
+
|
382
|
+
int state;
|
383
|
+
char **environment;
|
384
|
+
int binmode;
|
385
|
+
VALUE signal_overriding;
|
386
|
+
int saved_group_id;
|
387
|
+
int saved_user_id;
|
388
|
+
int under_uid_switch;
|
389
|
+
int under_gid_switch;
|
390
|
+
|
391
|
+
VALUE time_struct;
|
392
|
+
|
393
|
+
int case_cache;
|
394
|
+
int kcode_cache;
|
395
|
+
int curr_kcode;
|
396
|
+
VALUE reg_cache;
|
397
|
+
int reg_kcode;
|
398
|
+
int ignorecase;
|
399
|
+
int reg_recompile_p;
|
400
|
+
|
401
|
+
struct re_registers reg_regs;
|
402
|
+
|
403
|
+
int uid;
|
404
|
+
int euid;
|
405
|
+
int gid;
|
406
|
+
int egid;
|
407
|
+
|
408
|
+
int original_argc;
|
409
|
+
char **original_argv;
|
410
|
+
int argv_len;
|
411
|
+
char *script;
|
412
|
+
|
413
|
+
/* from random.c */
|
414
|
+
|
415
|
+
int rand_init;
|
416
|
+
int rand_inc;
|
417
|
+
int rand_left;
|
418
|
+
int rand_initf;
|
419
|
+
unsigned long rand_state[624]; /* FIXME 624 is N from random.c */
|
420
|
+
unsigned long *rand_next;
|
421
|
+
unsigned long rand_saved_seed;
|
422
|
+
|
423
|
+
/* from pack.c */
|
424
|
+
int pack_b64_init;
|
425
|
+
int pack_b64_xtable[256];
|
426
|
+
|
427
|
+
/* from ruby.c */
|
428
|
+
VALUE progname;
|
429
|
+
VALUE argv;
|
430
|
+
VALUE argv0;
|
431
|
+
VALUE ruby_debug;
|
432
|
+
VALUE ruby_verbose;
|
433
|
+
int sflag;
|
434
|
+
int xflag;
|
435
|
+
VALUE do_loop;
|
436
|
+
VALUE do_print;
|
437
|
+
VALUE do_check;
|
438
|
+
VALUE do_line;
|
439
|
+
VALUE do_split;
|
440
|
+
VALUE init_requires;
|
441
|
+
int end_seen;
|
442
|
+
|
443
|
+
/* from gc.c */
|
444
|
+
VALUE *gc_stack_start;
|
445
|
+
st_table *rb_class_tbl;
|
446
|
+
VALUE nomem_error;
|
447
|
+
|
448
|
+
struct gc_state *gc;
|
449
|
+
VALUE gc_start_hook;
|
450
|
+
|
451
|
+
/* from eval.c */
|
452
|
+
char **original_environ;
|
453
|
+
int initialized;
|
454
|
+
int ruby_in_compile;
|
455
|
+
int scope_vmode;
|
456
|
+
NODE *ruby_current_node;
|
457
|
+
int safe_level;
|
458
|
+
struct cache_entry cache[CACHE_SIZE];
|
459
|
+
int cache_hits;
|
460
|
+
int cache_misses;
|
461
|
+
int ruby_running;
|
462
|
+
struct FRAME initial_frame;
|
463
|
+
struct FRAME *frames;
|
464
|
+
struct SCOPE *ruby_scope;
|
465
|
+
struct FRAME *top_frame;
|
466
|
+
struct SCOPE *top_scope;
|
467
|
+
VALUE ruby_top_self;
|
468
|
+
unsigned long frame_unique;
|
469
|
+
|
470
|
+
struct BLOCK *ruby_block;
|
471
|
+
unsigned long block_unique;
|
472
|
+
|
473
|
+
struct RVarmap *ruby_dyna_vars;
|
474
|
+
struct iter initial_iter;
|
475
|
+
struct iter *ruby_iter;
|
476
|
+
struct tag *prot_tag;
|
477
|
+
|
478
|
+
VALUE ruby_class;
|
479
|
+
VALUE ruby_wrapper;
|
480
|
+
|
481
|
+
NODE *ruby_cref;
|
482
|
+
NODE *top_cref;
|
483
|
+
rb_thread_t current_thread;
|
484
|
+
rb_thread_t main_thread;
|
485
|
+
|
486
|
+
VALUE trace_func;
|
487
|
+
int tracing;
|
488
|
+
|
489
|
+
pthread_t primary_thid;
|
490
|
+
|
491
|
+
int ruby_in_eval;
|
492
|
+
VALUE rb_load_path;
|
493
|
+
VALUE ruby_dln_librefs;
|
494
|
+
VALUE rb_features;
|
495
|
+
st_table *loading_tbl;
|
496
|
+
|
497
|
+
int thread_pending;
|
498
|
+
VALUE th_raise_exception;
|
499
|
+
NODE *th_raise_node;
|
500
|
+
VALUE th_cmd;
|
501
|
+
int th_sig, th_safe;
|
502
|
+
char *th_signm;
|
503
|
+
int thread_init;
|
504
|
+
#if defined(_THREAD_SAFE)
|
505
|
+
pthread_t time_thread;
|
506
|
+
#endif
|
507
|
+
int thread_critical;
|
508
|
+
int prohibit_interrupt;
|
509
|
+
int exception_interrupt;
|
510
|
+
int trap_pending;
|
511
|
+
int trap_immediate;
|
512
|
+
VALUE cont_protect;
|
513
|
+
|
514
|
+
VALUE ruby_errinfo;
|
515
|
+
VALUE ruby_errhandler;
|
516
|
+
NODE *ruby_eval_tree_begin;
|
517
|
+
NODE *ruby_eval_tree;
|
518
|
+
int ruby_nerrs;
|
519
|
+
|
520
|
+
VALUE cObject;
|
521
|
+
VALUE cClass;
|
522
|
+
VALUE cModule;
|
523
|
+
VALUE output_field_seperator;
|
524
|
+
VALUE record_seperator;
|
525
|
+
VALUE default_record_seperator;
|
526
|
+
VALUE output_record_seperator;
|
527
|
+
VALUE ruby_stderr;
|
528
|
+
VALUE ruby_stdin;
|
529
|
+
VALUE ruby_stdout;
|
530
|
+
VALUE ruby_deferr;
|
531
|
+
VALUE orig_stdout;
|
532
|
+
VALUE orig_stderr;
|
533
|
+
VALUE fatal_exception;
|
534
|
+
VALUE sysstack_error;
|
535
|
+
NODE *basic_respond_to;
|
536
|
+
|
537
|
+
int thread_abort;
|
538
|
+
VALUE thgroup_default;
|
539
|
+
|
540
|
+
VALUE argf;
|
541
|
+
|
542
|
+
char *ruby_inplace_mode;
|
543
|
+
int stack_overflowing;
|
544
|
+
int eval_tick;
|
545
|
+
int thread_tick;
|
546
|
+
|
547
|
+
VALUE thread_save_value;
|
548
|
+
|
549
|
+
rb_thread_t thread_restore;
|
550
|
+
int thread_restore_state;
|
551
|
+
VALUE thread_restore_value;
|
552
|
+
|
553
|
+
/* from parse.y */
|
554
|
+
int parse_debug;
|
555
|
+
char *ruby_sourcefile;
|
556
|
+
int ruby_sourceline;
|
557
|
+
struct local_vars *lvtbl;
|
558
|
+
st_table *sym_tbl;
|
559
|
+
st_table *sym_rev_tbl;
|
560
|
+
int last_call_status;
|
561
|
+
struct end_proc_data *end_procs, *ephemeral_end_procs, *tmp_end_procs;
|
562
|
+
|
563
|
+
VALUE rb_last_status;
|
564
|
+
|
565
|
+
ID last_id;
|
566
|
+
int maxgroups;
|
567
|
+
|
568
|
+
/* from dir.c */
|
569
|
+
int chdir_blocking;
|
570
|
+
VALUE chdir_thread;
|
571
|
+
|
572
|
+
/* from dln.c */
|
573
|
+
int dln_errno;
|
574
|
+
int dln_init_p;
|
575
|
+
st_table *dln_sym_tbl;
|
576
|
+
st_table *dln_undef_tbl;
|
577
|
+
st_table *dln_reloc_tbl;
|
578
|
+
int link_no;
|
579
|
+
|
580
|
+
int target_offset;
|
581
|
+
char fbuf[MAXPATHLEN];
|
582
|
+
st_table *syserr_tbl;
|
583
|
+
|
584
|
+
/* from hash.c */
|
585
|
+
VALUE envtbl;
|
586
|
+
int path_tainted;
|
587
|
+
|
588
|
+
/* from variable.c */
|
589
|
+
st_table *rb_global_tbl;
|
590
|
+
|
591
|
+
VALUE current_file, filename;
|
592
|
+
int gets_lineno;
|
593
|
+
int init_p, next_p;
|
594
|
+
VALUE lineno;
|
595
|
+
|
596
|
+
int special_generic_ivar;
|
597
|
+
st_table *generic_iv_tbl;
|
598
|
+
|
599
|
+
|
600
|
+
/* from file.c */
|
601
|
+
VALUE separator;
|
602
|
+
|
603
|
+
/* from string.c */
|
604
|
+
VALUE rb_fs;
|
605
|
+
|
606
|
+
/* from signal.c */
|
607
|
+
struct trap_list_struct trap_list[NSIG];
|
608
|
+
rb_atomic_t trap_pending_list[NSIG];
|
609
|
+
|
610
|
+
# ifdef HAVE_SIGPROCMASK
|
611
|
+
sigset_t trap_last_mask;
|
612
|
+
# else
|
613
|
+
int trap_last_mask;
|
614
|
+
# endif
|
615
|
+
|
616
|
+
pthread_mutex_t xcritical;
|
617
|
+
pthread_t xcritical_owner;
|
618
|
+
|
619
|
+
struct ruby_state *pristine;
|
620
|
+
|
621
|
+
VALUE thread;
|
622
|
+
pthread_t main_osthread;
|
623
|
+
VALUE os_threads;
|
624
|
+
VALUE sub_states;
|
625
|
+
VALUE on_switch;
|
626
|
+
VALUE interrupt;
|
627
|
+
|
628
|
+
struct ruby_state *parent;
|
629
|
+
|
630
|
+
struct lock_table_entry *locks;
|
631
|
+
struct lock_table_entry *lock_entry;
|
632
|
+
|
633
|
+
int load_depth;
|
634
|
+
|
635
|
+
/* for behavior.c */
|
636
|
+
int behavior_disabled;
|
637
|
+
VALUE default_behavior;
|
638
|
+
NODE *current_call_node;
|
639
|
+
struct BLOCK *current_call_block;
|
640
|
+
struct SCOPE *current_call_scope;
|
641
|
+
} ruby_state;
|
642
|
+
|
643
|
+
#define GET_THREAD(self) ((struct rb_os_thread_t*)(DATA_PTR(self)))
|
644
|
+
|
645
|
+
struct rb_os_thread_t {
|
646
|
+
VALUE result;
|
647
|
+
VALUE group;
|
648
|
+
VALUE locals;
|
649
|
+
VALUE error;
|
650
|
+
ruby_state *state;
|
651
|
+
pthread_t os_thread;
|
652
|
+
enum thread_status status;
|
653
|
+
};
|
654
|
+
|
655
|
+
ruby_state *rb_get_state();
|
656
|
+
ruby_state *inherit_from_state(ruby_state*);
|
657
|
+
void rb_set_state(ruby_state *st);
|
658
|
+
ruby_state *rb_dup_state(ruby_state *state);
|
659
|
+
void init_ruby_state();
|
660
|
+
int rb_lock_xcritical();
|
661
|
+
int rb_unlock_xcritical();
|
662
|
+
void rb_state_run_interrupt();
|
663
|
+
void rb_modify();
|
664
|
+
void rb_end_modify();
|
665
|
+
|
666
|
+
#define ENTER_CRITICAL do { \
|
667
|
+
int __thr_critical = rb_thread_critical; \
|
668
|
+
rb_thread_critical = Qtrue; \
|
669
|
+
rb_lock_xcritical(__FILE__,__LINE__)
|
670
|
+
|
671
|
+
#define LEAVE_CRITICAL \
|
672
|
+
rb_thread_critical = __thr_critical; \
|
673
|
+
rb_unlock_xcritical(); } while(0)
|
674
|
+
|
675
|
+
#ifdef GC_DEBUG
|
676
|
+
|
677
|
+
#define GC_LOCK fprintf(stderr, "locked at %s:%d\n", __FILE__, __LINE__); pthread_mutex_lock(&GC_VAR(lock)); \
|
678
|
+
GC_VAR(lock_owner) = pthread_self()
|
679
|
+
|
680
|
+
#define GC_UNLOCK pthread_mutex_unlock(&GC_VAR(lock)); fprintf(stderr, "unlocked at %s:%d\n", __FILE__, __LINE__)
|
681
|
+
|
682
|
+
#define HEAP_LOCK fprintf(stderr, "heap locked at %s:%d\n", __FILE__, __LINE__); pthread_mutex_lock(&GC_VAR(heap_modification));
|
683
|
+
#define HEAP_UNLOCK pthread_mutex_unlock(&GC_VAR(heap_modification)); fprintf(stderr, "heap unlocked at %s:%d\n", __FILE__, __LINE__)
|
684
|
+
|
685
|
+
#else
|
686
|
+
|
687
|
+
#if 0
|
688
|
+
|
689
|
+
#define GC_LOCK if(!pthread_equal(pthread_self(), GC_VAR(lock_owner))) { \
|
690
|
+
pthread_mutex_lock(&GC_VAR(lock)); GC_VAR(lock_owner) = pthread_self(); }
|
691
|
+
|
692
|
+
#define GC_UNLOCK if(!pthread_equal(pthread_self(), GC_VAR(lock_owner))) pthread_mutex_unlock(&GC_VAR(lock))
|
693
|
+
|
694
|
+
#endif
|
695
|
+
|
696
|
+
#define GC_LOCK pthread_mutex_lock(&GC_VAR(lock))
|
697
|
+
|
698
|
+
#define GC_UNLOCK pthread_mutex_unlock(&GC_VAR(lock))
|
699
|
+
|
700
|
+
#define HEAP_LOCK pthread_mutex_lock(&GC_VAR(heap_modification))
|
701
|
+
#define HEAP_UNLOCK pthread_mutex_unlock(&GC_VAR(heap_modification))
|
702
|
+
|
703
|
+
#endif
|
704
|
+
|
705
|
+
#define MODIFY(value) rb_modify(value)
|
706
|
+
|
707
|
+
#define END_MODIFY(value) rb_end_modify(value)
|
708
|
+
void __place_exit(char*, int, int);
|
709
|
+
|
710
|
+
#define RUBY_STATE ((ruby_state*)rb_get_state())
|
711
|
+
#define STATE_VAR(obj) (RUBY_STATE->obj)
|
712
|
+
#define GC_VAR(obj) STATE_VAR(gc->obj)
|
713
|
+
// #define rb_cObject STATE_VAR(cObject)
|
714
|
+
// #define rb_cClass STATE_VAR(cClass)
|
715
|
+
|
716
|
+
#endif
|