~ubuntu-branches/ubuntu/intrepid/ruby1.9/intrepid-updates

« back to all changes in this revision

Viewing changes to node.h

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2007-09-04 16:01:17 UTC
  • mfrom: (1.1.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20070904160117-i15zckg2nhxe9fyw
Tags: 1.9.0+20070830-2ubuntu1
* Sync from Debian; remaining changes:
  - Add -g to CFLAGS.
* Fixes build failure on ia64.
* Fixes build failure with gcc-4.2 on lpia.
* Robustify check for target_os, fixing build failure on lpia.
* Set Ubuntu maintainer address.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/**********************************************************************
2
 
 
3
 
  node.h -
4
 
 
5
 
  $Author: ko1 $
6
 
  $Date: 2007-04-19 19:37:08 +0900 (木, 19  4月 2007) $
7
 
  created at: Fri May 28 15:14:02 JST 1993
8
 
 
9
 
  Copyright (C) 1993-2003 Yukihiro Matsumoto
10
 
 
11
 
**********************************************************************/
12
 
 
13
 
#ifndef NODE_H
14
 
#define NODE_H
15
 
 
16
 
#if defined(__cplusplus)
17
 
extern "C" {
18
 
#endif
19
 
 
20
 
enum node_type {
21
 
    NODE_METHOD,
22
 
    NODE_FBODY,
23
 
    NODE_CFUNC,
24
 
    NODE_SCOPE,
25
 
    NODE_BLOCK,
26
 
    NODE_IF,
27
 
    NODE_CASE,
28
 
    NODE_WHEN,
29
 
    NODE_OPT_N,
30
 
    NODE_WHILE,
31
 
    NODE_UNTIL,
32
 
    NODE_ITER,
33
 
    NODE_FOR,
34
 
    NODE_BREAK,
35
 
    NODE_NEXT,
36
 
    NODE_REDO,
37
 
    NODE_RETRY,
38
 
    NODE_BEGIN,
39
 
    NODE_RESCUE,
40
 
    NODE_RESBODY,
41
 
    NODE_ENSURE,
42
 
    NODE_AND,
43
 
    NODE_OR,
44
 
    NODE_NOT,
45
 
    NODE_MASGN,
46
 
    NODE_LASGN,
47
 
    NODE_DASGN,
48
 
    NODE_DASGN_CURR,
49
 
    NODE_GASGN,
50
 
    NODE_IASGN,
51
 
    NODE_IASGN2,
52
 
    NODE_CDECL,
53
 
    NODE_CVASGN,
54
 
    NODE_CVDECL,
55
 
    NODE_OP_ASGN1,
56
 
    NODE_OP_ASGN2,
57
 
    NODE_OP_ASGN_AND,
58
 
    NODE_OP_ASGN_OR,
59
 
    NODE_CALL,
60
 
    NODE_FCALL,
61
 
    NODE_VCALL,
62
 
    NODE_SUPER,
63
 
    NODE_ZSUPER,
64
 
    NODE_ARRAY,
65
 
    NODE_ZARRAY,
66
 
    NODE_VALUES,
67
 
    NODE_HASH,
68
 
    NODE_RETURN,
69
 
    NODE_YIELD,
70
 
    NODE_LVAR,
71
 
    NODE_DVAR,
72
 
    NODE_GVAR,
73
 
    NODE_IVAR,
74
 
    NODE_CONST,
75
 
    NODE_CVAR,
76
 
    NODE_NTH_REF,
77
 
    NODE_BACK_REF,
78
 
    NODE_MATCH,
79
 
    NODE_MATCH2,
80
 
    NODE_MATCH3,
81
 
    NODE_LIT,
82
 
    NODE_STR,
83
 
    NODE_DSTR,
84
 
    NODE_XSTR,
85
 
    NODE_DXSTR,
86
 
    NODE_EVSTR,
87
 
    NODE_DREGX,
88
 
    NODE_DREGX_ONCE,
89
 
    NODE_ARGS,
90
 
    NODE_ARGS_AUX,
91
 
    NODE_OPT_ARG,
92
 
    NODE_POSTARG,
93
 
    NODE_ARGSCAT,
94
 
    NODE_ARGSPUSH,
95
 
    NODE_SPLAT,
96
 
    NODE_TO_ARY,
97
 
    NODE_BLOCK_ARG,
98
 
    NODE_BLOCK_PASS,
99
 
    NODE_DEFN,
100
 
    NODE_DEFS,
101
 
    NODE_ALIAS,
102
 
    NODE_VALIAS,
103
 
    NODE_UNDEF,
104
 
    NODE_CLASS,
105
 
    NODE_MODULE,
106
 
    NODE_SCLASS,
107
 
    NODE_COLON2,
108
 
    NODE_COLON3,
109
 
    NODE_CREF,
110
 
    NODE_DOT2,
111
 
    NODE_DOT3,
112
 
    NODE_FLIP2,
113
 
    NODE_FLIP3,
114
 
    NODE_ATTRSET,
115
 
    NODE_SELF,
116
 
    NODE_NIL,
117
 
    NODE_TRUE,
118
 
    NODE_FALSE,
119
 
    NODE_ERRINFO,
120
 
    NODE_DEFINED,
121
 
    NODE_POSTEXE,
122
 
    NODE_ALLOCA,
123
 
    NODE_BMETHOD,
124
 
    NODE_MEMO,
125
 
    NODE_IFUNC,
126
 
    NODE_DSYM,
127
 
    NODE_ATTRASGN,
128
 
    NODE_PRELUDE,
129
 
    NODE_LAMBDA,
130
 
    NODE_OPTBLOCK,
131
 
    NODE_LAST
132
 
};
133
 
 
134
 
typedef struct RNode {
135
 
    unsigned long flags;
136
 
    char *nd_file;
137
 
    union {
138
 
        struct RNode *node;
139
 
        ID id;
140
 
        VALUE value;
141
 
        VALUE (*cfunc)(ANYARGS);
142
 
        ID *tbl;
143
 
    } u1;
144
 
    union {
145
 
        struct RNode *node;
146
 
        ID id;
147
 
        long argc;
148
 
        VALUE value;
149
 
    } u2;
150
 
    union {
151
 
        struct RNode *node;
152
 
        ID id;
153
 
        long state;
154
 
        struct global_entry *entry;
155
 
        long cnt;
156
 
        VALUE value;
157
 
    } u3;
158
 
} NODE;
159
 
 
160
 
#define RNODE(obj)  (R_CAST(RNode)(obj))
161
 
 
162
 
/* 0..4:T_TYPES, 5:FL_MARK, 6:reserved, 7:NODE_NEWLINE */
163
 
#define NODE_NEWLINE (1<<7)
164
 
 
165
 
#define NODE_TYPESHIFT 8
166
 
#define NODE_TYPEMASK  (0x7f<<NODE_TYPESHIFT)
167
 
 
168
 
#define nd_type(n) ((int) (((RNODE(n))->flags & NODE_TYPEMASK)>>NODE_TYPESHIFT))
169
 
#define nd_set_type(n,t) \
170
 
    RNODE(n)->flags=((RNODE(n)->flags&~NODE_TYPEMASK)|(((t)<<NODE_TYPESHIFT)&NODE_TYPEMASK))
171
 
 
172
 
#define NODE_LSHIFT (NODE_TYPESHIFT+7)
173
 
#define NODE_LMASK  (((long)1<<(sizeof(NODE*)*CHAR_BIT-NODE_LSHIFT))-1)
174
 
#define nd_line(n) ((unsigned int)(((RNODE(n))->flags>>NODE_LSHIFT)&NODE_LMASK))
175
 
#define nd_set_line(n,l) \
176
 
    RNODE(n)->flags=((RNODE(n)->flags&~(-1<<NODE_LSHIFT))|(((l)&NODE_LMASK)<<NODE_LSHIFT))
177
 
 
178
 
#define nd_head  u1.node
179
 
#define nd_alen  u2.argc
180
 
#define nd_next  u3.node
181
 
 
182
 
#define nd_cond  u1.node
183
 
#define nd_body  u2.node
184
 
#define nd_else  u3.node
185
 
 
186
 
#define nd_orig  u3.value
187
 
 
188
 
#define nd_resq  u2.node
189
 
#define nd_ensr  u3.node
190
 
 
191
 
#define nd_1st   u1.node
192
 
#define nd_2nd   u2.node
193
 
 
194
 
#define nd_stts  u1.node
195
 
 
196
 
#define nd_entry u3.entry
197
 
#define nd_vid   u1.id
198
 
#define nd_cflag u2.id
199
 
#define nd_cval  u3.value
200
 
 
201
 
#define nd_oid   u1.id
202
 
#define nd_cnt   u3.cnt
203
 
#define nd_tbl   u1.tbl
204
 
 
205
 
#define nd_var   u1.node
206
 
#define nd_iter  u3.node
207
 
 
208
 
#define nd_value u2.node
209
 
#define nd_aid   u3.id
210
 
 
211
 
#define nd_lit   u1.value
212
 
 
213
 
#define nd_frml  u2.argc
214
 
#define nd_rest  u1.id
215
 
#define nd_opt   u1.node
216
 
#define nd_pid   u1.id
217
 
#define nd_plen  u2.argc
218
 
 
219
 
#define nd_recv  u1.node
220
 
#define nd_mid   u2.id
221
 
#define nd_args  u3.node
222
 
 
223
 
#define nd_noex  u3.id
224
 
#define nd_defn  u3.node
225
 
 
226
 
#define nd_cfnc  u1.cfunc
227
 
#define nd_argc  u2.argc
228
 
 
229
 
#define nd_cpath u1.node
230
 
#define nd_super u3.node
231
 
 
232
 
#define nd_modl  u1.id
233
 
#define nd_clss  u1.value
234
 
 
235
 
#define nd_beg   u1.node
236
 
#define nd_end   u2.node
237
 
#define nd_state u3.state
238
 
#define nd_rval  u2.value
239
 
 
240
 
#define nd_nth   u2.argc
241
 
 
242
 
#define nd_tag   u1.id
243
 
#define nd_tval  u2.value
244
 
 
245
 
#define nd_visi  u2.argc
246
 
 
247
 
#define NEW_NODE(t,a0,a1,a2) rb_node_newnode((t),(VALUE)(a0),(VALUE)(a1),(VALUE)(a2))
248
 
 
249
 
#define NEW_METHOD(n,x,v) NEW_NODE(NODE_METHOD,x,n,v)
250
 
#define NEW_FBODY(n,i) NEW_NODE(NODE_FBODY,i,n,0)
251
 
#define NEW_DEFN(i,a,d,p) NEW_NODE(NODE_DEFN,0,i,NEW_SCOPE(a,d))
252
 
#define NEW_DEFS(r,i,a,d) NEW_NODE(NODE_DEFS,r,i,NEW_SCOPE(a,d))
253
 
#define NEW_CFUNC(f,c) NEW_NODE(NODE_CFUNC,f,c,0)
254
 
#define NEW_IFUNC(f,c) NEW_NODE(NODE_IFUNC,f,c,0)
255
 
#define NEW_SCOPE(a,b) NEW_NODE(NODE_SCOPE,local_tbl(),b,a)
256
 
#define NEW_BLOCK(a) NEW_NODE(NODE_BLOCK,a,0,0)
257
 
#define NEW_IF(c,t,e) NEW_NODE(NODE_IF,c,t,e)
258
 
#define NEW_UNLESS(c,t,e) NEW_IF(c,e,t)
259
 
#define NEW_CASE(h,b) NEW_NODE(NODE_CASE,h,b,0)
260
 
#define NEW_WHEN(c,t,e) NEW_NODE(NODE_WHEN,c,t,e)
261
 
#define NEW_OPT_N(b) NEW_NODE(NODE_OPT_N,0,b,0)
262
 
#define NEW_WHILE(c,b,n) NEW_NODE(NODE_WHILE,c,b,n)
263
 
#define NEW_UNTIL(c,b,n) NEW_NODE(NODE_UNTIL,c,b,n)
264
 
#define NEW_FOR(v,i,b) NEW_NODE(NODE_FOR,v,b,i)
265
 
#define NEW_ITER(a,b) NEW_NODE(NODE_ITER,0,NEW_SCOPE(a,b),0)
266
 
#define NEW_LAMBDA(a) NEW_NODE(NODE_LAMBDA,a,0,0)
267
 
#define NEW_BREAK(s) NEW_NODE(NODE_BREAK,s,0,0)
268
 
#define NEW_NEXT(s) NEW_NODE(NODE_NEXT,s,0,0)
269
 
#define NEW_REDO() NEW_NODE(NODE_REDO,0,0,0)
270
 
#define NEW_RETRY() NEW_NODE(NODE_RETRY,0,0,0)
271
 
#define NEW_BEGIN(b) NEW_NODE(NODE_BEGIN,0,b,0)
272
 
#define NEW_RESCUE(b,res,e) NEW_NODE(NODE_RESCUE,b,res,e)
273
 
#define NEW_RESBODY(a,ex,n) NEW_NODE(NODE_RESBODY,n,ex,a)
274
 
#define NEW_ENSURE(b,en) NEW_NODE(NODE_ENSURE,b,0,en)
275
 
#define NEW_RETURN(s) NEW_NODE(NODE_RETURN,s,0,0)
276
 
#define NEW_YIELD(a,s) NEW_NODE(NODE_YIELD,a,0,s)
277
 
#define NEW_LIST(a)  NEW_ARRAY(a)
278
 
#define NEW_ARRAY(a) NEW_NODE(NODE_ARRAY,a,1,0)
279
 
#define NEW_ZARRAY() NEW_NODE(NODE_ZARRAY,0,0,0)
280
 
#define NEW_HASH(a)  NEW_NODE(NODE_HASH,a,0,0)
281
 
#define NEW_NOT(a)   NEW_NODE(NODE_NOT,0,a,0)
282
 
#define NEW_MASGN(l,r)   NEW_NODE(NODE_MASGN,l,0,r)
283
 
#define NEW_GASGN(v,val) NEW_NODE(NODE_GASGN,v,val,rb_global_entry(v))
284
 
#define NEW_LASGN(v,val) NEW_NODE(NODE_LASGN,v,val,0)
285
 
#define NEW_DASGN(v,val) NEW_NODE(NODE_DASGN,v,val,0)
286
 
#define NEW_DASGN_CURR(v,val) NEW_NODE(NODE_DASGN_CURR,v,val,0)
287
 
#define NEW_IASGN(v,val) NEW_NODE(NODE_IASGN,v,val,0)
288
 
#define NEW_IASGN2(v,val) NEW_NODE(NODE_IASGN2,v,val,0)
289
 
#define NEW_CDECL(v,val,path) NEW_NODE(NODE_CDECL,v,val,path)
290
 
#define NEW_CVASGN(v,val) NEW_NODE(NODE_CVASGN,v,val,0)
291
 
#define NEW_CVDECL(v,val) NEW_NODE(NODE_CVDECL,v,val,0)
292
 
#define NEW_OP_ASGN1(p,id,a) NEW_NODE(NODE_OP_ASGN1,p,id,a)
293
 
#define NEW_OP_ASGN2(r,i,o,val) NEW_NODE(NODE_OP_ASGN2,r,val,NEW_OP_ASGN22(i,o))
294
 
#define NEW_OP_ASGN22(i,o) NEW_NODE(NODE_OP_ASGN2,i,o,rb_id_attrset(i))
295
 
#define NEW_OP_ASGN_OR(i,val) NEW_NODE(NODE_OP_ASGN_OR,i,val,0)
296
 
#define NEW_OP_ASGN_AND(i,val) NEW_NODE(NODE_OP_ASGN_AND,i,val,0)
297
 
#define NEW_GVAR(v) NEW_NODE(NODE_GVAR,v,0,rb_global_entry(v))
298
 
#define NEW_LVAR(v) NEW_NODE(NODE_LVAR,v,0,0)
299
 
#define NEW_DVAR(v) NEW_NODE(NODE_DVAR,v,0,0)
300
 
#define NEW_IVAR(v) NEW_NODE(NODE_IVAR,v,0,0)
301
 
#define NEW_CONST(v) NEW_NODE(NODE_CONST,v,0,0)
302
 
#define NEW_CVAR(v) NEW_NODE(NODE_CVAR,v,0,0)
303
 
#define NEW_NTH_REF(n)  NEW_NODE(NODE_NTH_REF,0,n,0)
304
 
#define NEW_BACK_REF(n) NEW_NODE(NODE_BACK_REF,0,n,0)
305
 
#define NEW_MATCH(c) NEW_NODE(NODE_MATCH,c,0,0)
306
 
#define NEW_MATCH2(n1,n2) NEW_NODE(NODE_MATCH2,n1,n2,0)
307
 
#define NEW_MATCH3(r,n2) NEW_NODE(NODE_MATCH3,r,n2,0)
308
 
#define NEW_LIT(l) NEW_NODE(NODE_LIT,l,0,0)
309
 
#define NEW_STR(s) NEW_NODE(NODE_STR,s,0,0)
310
 
#define NEW_DSTR(s) NEW_NODE(NODE_DSTR,s,1,0)
311
 
#define NEW_XSTR(s) NEW_NODE(NODE_XSTR,s,0,0)
312
 
#define NEW_DXSTR(s) NEW_NODE(NODE_DXSTR,s,0,0)
313
 
#define NEW_DSYM(s) NEW_NODE(NODE_DSYM,s,0,0)
314
 
#define NEW_EVSTR(n) NEW_NODE(NODE_EVSTR,0,(n),0)
315
 
#define NEW_CALL(r,m,a) NEW_NODE(NODE_CALL,r,m,a)
316
 
#define NEW_FCALL(m,a) NEW_NODE(NODE_FCALL,0,m,a)
317
 
#define NEW_VCALL(m) NEW_NODE(NODE_VCALL,0,m,0)
318
 
#define NEW_SUPER(a) NEW_NODE(NODE_SUPER,0,0,a)
319
 
#define NEW_ZSUPER() NEW_NODE(NODE_ZSUPER,0,0,0)
320
 
#define NEW_ARGS(m,o) NEW_NODE(NODE_ARGS,o,m,0)
321
 
#define NEW_ARGS_AUX(r,b) NEW_NODE(NODE_ARGS_AUX,r,b,0)
322
 
#define NEW_OPT_ARG(i,v) NEW_NODE(NODE_OPT_ARG,i,v,0)
323
 
#define NEW_POSTARG(i,v) NEW_NODE(NODE_POSTARG,i,v,0)
324
 
#define NEW_ARGSCAT(a,b) NEW_NODE(NODE_ARGSCAT,a,b,0)
325
 
#define NEW_ARGSPUSH(a,b) NEW_NODE(NODE_ARGSPUSH,a,b,0)
326
 
#define NEW_SPLAT(a) NEW_NODE(NODE_SPLAT,a,0,0)
327
 
#define NEW_TO_ARY(a) NEW_NODE(NODE_TO_ARY,a,0,0)
328
 
#define NEW_BLOCK_ARG(v) NEW_NODE(NODE_BLOCK_ARG,v,0,local_cnt(v))
329
 
#define NEW_BLOCK_PASS(b) NEW_NODE(NODE_BLOCK_PASS,0,b,0)
330
 
#define NEW_ALIAS(n,o) NEW_NODE(NODE_ALIAS,n,o,0)
331
 
#define NEW_VALIAS(n,o) NEW_NODE(NODE_VALIAS,n,o,0)
332
 
#define NEW_UNDEF(i) NEW_NODE(NODE_UNDEF,0,i,0)
333
 
#define NEW_CLASS(n,b,s) NEW_NODE(NODE_CLASS,n,NEW_SCOPE(0,b),(s))
334
 
#define NEW_SCLASS(r,b) NEW_NODE(NODE_SCLASS,r,NEW_SCOPE(0,b),0)
335
 
#define NEW_MODULE(n,b) NEW_NODE(NODE_MODULE,n,NEW_SCOPE(0,b),0)
336
 
#define NEW_COLON2(c,i) NEW_NODE(NODE_COLON2,c,i,0)
337
 
#define NEW_COLON3(i) NEW_NODE(NODE_COLON3,0,i,0)
338
 
#define NEW_CREF(c) (NEW_NODE(NODE_CREF,0,0,c))
339
 
#define NEW_DOT2(b,e) NEW_NODE(NODE_DOT2,b,e,0)
340
 
#define NEW_DOT3(b,e) NEW_NODE(NODE_DOT3,b,e,0)
341
 
#define NEW_ATTRSET(a) NEW_NODE(NODE_ATTRSET,a,0,0)
342
 
#define NEW_SELF() NEW_NODE(NODE_SELF,0,0,0)
343
 
#define NEW_NIL() NEW_NODE(NODE_NIL,0,0,0)
344
 
#define NEW_TRUE() NEW_NODE(NODE_TRUE,0,0,0)
345
 
#define NEW_FALSE() NEW_NODE(NODE_FALSE,0,0,0)
346
 
#define NEW_ERRINFO() NEW_NODE(NODE_ERRINFO,0,0,0)
347
 
#define NEW_DEFINED(e) NEW_NODE(NODE_DEFINED,e,0,0)
348
 
#define NEW_PREEXE(b) NEW_SCOPE(b)
349
 
#define NEW_POSTEXE(b) NEW_NODE(NODE_POSTEXE,0,b,0)
350
 
#define NEW_BMETHOD(b) NEW_NODE(NODE_BMETHOD,0,0,b)
351
 
#define NEW_ATTRASGN(r,m,a) NEW_NODE(NODE_ATTRASGN,r,m,a)
352
 
#define NEW_PRELUDE(p,b) NEW_NODE(NODE_PRELUDE,p,b,0)
353
 
#define NEW_OPTBLOCK(a) NEW_NODE(NODE_OPTBLOCK,a,0,0)
354
 
 
355
 
#define NOEX_PUBLIC    0x00
356
 
#define NOEX_NOSUPER   0x01
357
 
#define NOEX_PRIVATE   0x02
358
 
#define NOEX_PROTECTED 0x04
359
 
#define NOEX_LOCAL     0x08
360
 
#define NOEX_MASK      0x0E /* 1110 */
361
 
 
362
 
#define NOEX_UNDEF     NOEX_NOSUPER
363
 
 
364
 
#define NOEX_MODFUNC   0x10
365
 
#define NOEX_SUPER     0x20
366
 
#define NOEX_VCALL     0x40
367
 
 
368
 
VALUE rb_parser_new(void);
369
 
VALUE rb_parser_end_seen_p(VALUE);
370
 
 
371
 
NODE *rb_parser_compile_cstr(volatile VALUE, const char*, const char*, int, int);
372
 
NODE *rb_parser_compile_string(volatile VALUE, const char*, VALUE, int);
373
 
NODE *rb_parser_compile_file(volatile VALUE, const char*, VALUE, int);
374
 
 
375
 
NODE *rb_compile_cstr(const char*, const char*, int, int);
376
 
NODE *rb_compile_string(const char*, VALUE, int);
377
 
NODE *rb_compile_file(const char*, VALUE, int);
378
 
 
379
 
void rb_add_method(VALUE, ID, NODE *, int);
380
 
NODE *rb_node_newnode(enum node_type,VALUE,VALUE,VALUE);
381
 
 
382
 
NODE* rb_method_node(VALUE klass, ID id);
383
 
int rb_node_arity(NODE* node);
384
 
 
385
 
struct global_entry *rb_global_entry(ID);
386
 
VALUE rb_gvar_get(struct global_entry *);
387
 
VALUE rb_gvar_set(struct global_entry *, VALUE);
388
 
VALUE rb_gvar_defined(struct global_entry *);
389
 
 
390
 
#if defined(__cplusplus)
391
 
}  /* extern "C" { */
392
 
#endif
393
 
 
394
 
#endif