rubinius-melbourne 2.1.0.0 → 2.2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -32,17 +32,12 @@ VALUE MELBOURNE_FILE_TO_AST(VALUE self, VALUE fname, VALUE start) {
32
32
  }
33
33
 
34
34
  void Init_melbourne(void) {
35
- VALUE rb_cMelbourne, rb_mToolSets, rb_mToolSet;
35
+ VALUE rb_mCodeTools, rb_cMelbourne;
36
36
 
37
37
  MELBOURNE::init_symbols();
38
38
 
39
- #ifndef RUBINIUS
40
- VALUE rb_mRubinius = rb_const_get(rb_cObject, rb_intern("Rubinius"));
41
- #endif
42
-
43
- rb_mToolSets = rb_const_get(rb_mRubinius, rb_intern("ToolSets"));
44
- rb_mToolSet = rb_funcall(rb_mToolSets, rb_intern("current"), 0);
45
- rb_cMelbourne = rb_define_class_under(rb_mToolSet, "Melbourne", rb_cObject);
39
+ rb_mCodeTools = rb_const_get(rb_cObject, rb_intern("CodeTools"));
40
+ rb_cMelbourne = rb_define_class_under(rb_mCodeTools, "Melbourne", rb_cObject);
46
41
  rb_define_method(rb_cMelbourne, "string_to_ast",
47
42
  RUBY_METHOD_FUNC(MELBOURNE_STRING_TO_AST), 3);
48
43
  rb_define_method(rb_cMelbourne, "file_to_ast",
@@ -37,11 +37,30 @@ namespace MELBOURNE {
37
37
  struct RNode *node;
38
38
  ID id;
39
39
  long state;
40
+ struct rb_args_info *args;
40
41
  long cnt;
41
42
  VALUE value;
42
43
  } u3;
43
44
  } NODE;
44
45
 
46
+ struct rb_args_info {
47
+ NODE *pre_init;
48
+ NODE *post_init;
49
+
50
+ int pre_args_num; /* count of mandatory pre-arguments */
51
+ int post_args_num; /* count of mandatory post-arguments */
52
+
53
+ ID first_post_arg;
54
+
55
+ ID rest_arg;
56
+ ID block_arg;
57
+
58
+ NODE *kw_args;
59
+ NODE *kw_rest_arg;
60
+
61
+ NODE *opt_args;
62
+ };
63
+
45
64
  #define RNODE(obj) ((NODE*)(obj))
46
65
 
47
66
  /* 0..4:T_TYPES, 5:FL_MARK, 6:reserved, 7:NODE_FL_NEWLINE */
@@ -105,6 +124,7 @@ namespace MELBOURNE {
105
124
  #define nd_recv u1.node
106
125
  #define nd_mid u2.id
107
126
  #define nd_args u3.node
127
+ #define nd_ainfo u3.args
108
128
 
109
129
  #define nd_noex u3.id
110
130
  #define nd_defn u3.node
@@ -162,7 +182,7 @@ namespace MELBOURNE {
162
182
  #define NEW_UNTIL(c,b,n) NEW_NODE(NODE_UNTIL,c,b,n)
163
183
  #define NEW_FOR(v,i,b) NEW_NODE(NODE_FOR,v,b,i)
164
184
  #define NEW_ITER(a,b) NEW_NODE(NODE_ITER,0,NEW_SCOPE(a,b),0)
165
- #define NEW_LAMBDA(a) NEW_NODE(NODE_LAMBDA,a,0,0)
185
+ #define NEW_LAMBDA(a,b) NEW_NODE(NODE_LAMBDA,0,NEW_SCOPE(a,b),0)
166
186
  #define NEW_BREAK(s) NEW_NODE(NODE_BREAK,s,0,0)
167
187
  #define NEW_NEXT(s) NEW_NODE(NODE_NEXT,s,0,0)
168
188
  #define NEW_REDO() NEW_NODE(NODE_REDO,0,0,0)
@@ -192,6 +212,7 @@ namespace MELBOURNE {
192
212
  #define NEW_OP_ASGN22(i,o) NEW_NODE(NODE_OP_ASGN2,i,o,rb_id_attrset(i))
193
213
  #define NEW_OP_ASGN_OR(i,val) NEW_NODE(NODE_OP_ASGN_OR,i,val,0)
194
214
  #define NEW_OP_ASGN_AND(i,val) NEW_NODE(NODE_OP_ASGN_AND,i,val,0)
215
+ #define NEW_OP_CDECL(v,op,val) NEW_NODE(NODE_OP_CDECL,v,val,op)
195
216
  #define NEW_GVAR(v) NEW_NODE(NODE_GVAR,v,0,0)
196
217
  #define NEW_LVAR(v) NEW_NODE(NODE_LVAR,v,0,0)
197
218
  #define NEW_DVAR(v) NEW_NODE(NODE_DVAR,v,0,0)
@@ -218,6 +239,7 @@ namespace MELBOURNE {
218
239
  #define NEW_ARGS(m,o) NEW_NODE(NODE_ARGS,o,m,0)
219
240
  #define NEW_ARGS_AUX(r,b) NEW_NODE(NODE_ARGS_AUX,r,b,0)
220
241
  #define NEW_OPT_ARG(i,v) NEW_NODE(NODE_OPT_ARG,i,v,0)
242
+ #define NEW_KW_ARG(i,v) NEW_NODE(NODE_KW_ARG,i,v,0)
221
243
  #define NEW_POSTARG(i,v) NEW_NODE(NODE_POSTARG,i,v,0)
222
244
  #define NEW_ARGSCAT(a,b) NEW_NODE(NODE_ARGSCAT,a,b,0)
223
245
  #define NEW_ARGSPUSH(a,b) NEW_NODE(NODE_ARGSPUSH,a,b,0)
@@ -251,6 +273,8 @@ namespace MELBOURNE {
251
273
  #define NEW_FILE() NEW_NODE(NODE_FILE,0,0,0)
252
274
  #define NEW_NUMBER(l) NEW_NODE(NODE_NUMBER,REF(l),0,0)
253
275
  #define NEW_FLOAT(l) NEW_NODE(NODE_FLOAT,REF(l),0,0)
276
+ #define NEW_RATIONAL(l) NEW_NODE(NODE_RATIONAL,REF(l),0,0)
277
+ #define NEW_IMAGINARY(l) NEW_NODE(NODE_IMAGINARY,REF(l),0,0)
254
278
  #define NEW_ENCODING(n) NEW_NODE(NODE_ENCODING,REF(n),0,0)
255
279
 
256
280
  #define NOEX_PUBLIC 0x00,
@@ -41,6 +41,7 @@ namespace MELBOURNE {
41
41
  "op_asgn2\0"
42
42
  "op_asgn_and\0"
43
43
  "op_asgn_or\0"
44
+ "op_cdecl\0"
44
45
  "call\0"
45
46
  "fcall\0"
46
47
  "vcall\0"
@@ -74,6 +75,7 @@ namespace MELBOURNE {
74
75
  "args\0"
75
76
  "args_aux\0"
76
77
  "opt_arg\0"
78
+ "kw_arg\0"
77
79
  "postarg\0"
78
80
  "argscat\0"
79
81
  "argspush\0"
@@ -118,6 +120,8 @@ namespace MELBOURNE {
118
120
  "float\0"
119
121
  "encoding\0"
120
122
  "preexe\0"
123
+ "rational\0"
124
+ "imaginary\0"
121
125
  };
122
126
 
123
127
  static const unsigned short node_types_offsets[] = {
@@ -156,87 +160,91 @@ namespace MELBOURNE {
156
160
  195,
157
161
  207,
158
162
  218,
159
- 223,
160
- 229,
161
- 235,
162
- 241,
163
- 248,
164
- 254,
165
- 261,
166
- 268,
167
- 273,
168
- 280,
169
- 286,
170
- 291,
171
- 296,
172
- 301,
173
- 306,
174
- 312,
175
- 317,
176
- 325,
163
+ 227,
164
+ 232,
165
+ 238,
166
+ 244,
167
+ 250,
168
+ 257,
169
+ 263,
170
+ 270,
171
+ 277,
172
+ 282,
173
+ 289,
174
+ 295,
175
+ 300,
176
+ 305,
177
+ 310,
178
+ 315,
179
+ 321,
180
+ 326,
177
181
  334,
178
- 340,
179
- 347,
180
- 354,
181
- 358,
182
- 362,
182
+ 343,
183
+ 349,
184
+ 356,
185
+ 363,
183
186
  367,
184
- 372,
185
- 378,
186
- 384,
187
- 390,
188
- 401,
189
- 406,
187
+ 371,
188
+ 376,
189
+ 381,
190
+ 387,
191
+ 393,
192
+ 399,
193
+ 410,
190
194
  415,
191
- 423,
192
- 431,
195
+ 424,
196
+ 432,
193
197
  439,
194
- 448,
195
- 454,
196
- 461,
197
- 471,
198
- 482,
198
+ 447,
199
+ 455,
200
+ 464,
201
+ 470,
202
+ 477,
199
203
  487,
200
- 492,
201
204
  498,
202
- 505,
203
- 511,
204
- 517,
205
- 524,
206
- 531,
207
- 538,
208
- 545,
209
- 550,
210
- 555,
205
+ 503,
206
+ 508,
207
+ 514,
208
+ 521,
209
+ 527,
210
+ 533,
211
+ 540,
212
+ 547,
213
+ 554,
211
214
  561,
212
- 567,
213
- 572,
214
- 576,
215
- 581,
216
- 587,
217
- 595,
215
+ 566,
216
+ 571,
217
+ 577,
218
+ 583,
219
+ 588,
220
+ 592,
221
+ 597,
218
222
  603,
219
223
  611,
220
- 618,
221
- 626,
222
- 631,
223
- 637,
224
+ 619,
225
+ 627,
226
+ 634,
224
227
  642,
225
- 651,
226
- 659,
227
- 666,
228
+ 647,
229
+ 653,
230
+ 658,
231
+ 667,
228
232
  675,
229
- 680,
230
- 685,
233
+ 682,
231
234
  691,
232
- 698,
233
- 704,
234
- 713,
235
- 720
235
+ 696,
236
+ 701,
237
+ 707,
238
+ 714,
239
+ 720,
240
+ 729,
241
+ 736,
242
+ 745,
243
+ 755
236
244
  };
237
245
 
238
246
  const char *get_node_type_string(enum node_type node) {
239
- if(node < 111) {
247
+ if(node < 115) {
240
248
  return node_types + node_types_offsets[node];
241
249
  } else {
242
250
  #define NODE_STRING_MESSAGE_LEN 20
@@ -38,6 +38,7 @@ namespace MELBOURNE {
38
38
  NODE_OP_ASGN2,
39
39
  NODE_OP_ASGN_AND,
40
40
  NODE_OP_ASGN_OR,
41
+ NODE_OP_CDECL,
41
42
  NODE_CALL,
42
43
  NODE_FCALL,
43
44
  NODE_VCALL,
@@ -71,6 +72,7 @@ namespace MELBOURNE {
71
72
  NODE_ARGS,
72
73
  NODE_ARGS_AUX,
73
74
  NODE_OPT_ARG,
75
+ NODE_KW_ARG,
74
76
  NODE_POSTARG,
75
77
  NODE_ARGSCAT,
76
78
  NODE_ARGSPUSH,
@@ -114,7 +116,9 @@ namespace MELBOURNE {
114
116
  NODE_NUMBER,
115
117
  NODE_FLOAT,
116
118
  NODE_ENCODING,
117
- NODE_PREEXE
119
+ NODE_PREEXE,
120
+ NODE_RATIONAL,
121
+ NODE_IMAGINARY
118
122
  };
119
123
 
120
124
  const char *get_node_type_string(enum node_type nt);
@@ -33,6 +33,7 @@ node_types = %w[
33
33
  op_asgn2
34
34
  op_asgn_and
35
35
  op_asgn_or
36
+ op_cdecl
36
37
  call
37
38
  fcall
38
39
  vcall
@@ -66,6 +67,7 @@ node_types = %w[
66
67
  args
67
68
  args_aux
68
69
  opt_arg
70
+ kw_arg
69
71
  postarg
70
72
  argscat
71
73
  argspush
@@ -110,6 +112,8 @@ node_types = %w[
110
112
  float
111
113
  encoding
112
114
  preexe
115
+ rational
116
+ imaginary
113
117
  ]
114
118
 
115
119
  def write_node_types(list)
@@ -117,6 +121,7 @@ def write_node_types(list)
117
121
  f.puts <<EOF
118
122
  /* This file is generated by node_types.rb. Do not edit. */
119
123
 
124
+ #include "namespace.h"
120
125
  #include "node_types.hpp"
121
126
 
122
127
  #include <stdio.h>
@@ -12,21 +12,42 @@
12
12
 
13
13
  namespace MELBOURNE {
14
14
 
15
- enum lex_state_e {
16
- EXPR_BEG, /* ignore newline, +/- is a sign. */
17
- EXPR_END, /* newline significant, +/- is an operator. */
18
- EXPR_ENDARG, /* ditto, and unbound braces. */
19
- EXPR_ENDFN, /* ditto, and unbound braces. */
20
- EXPR_ARG, /* newline significant, +/- is an operator. */
21
- EXPR_CMDARG, /* newline significant, +/- is an operator. */
22
- EXPR_MID, /* newline significant, +/- is an operator. */
23
- EXPR_FNAME, /* ignore newline, no reserved words. */
24
- EXPR_DOT, /* right after `.' or `::', no reserved words. */
25
- EXPR_CLASS, /* immediate after `class', no here document. */
26
- EXPR_VALUE, /* like EXPR_BEG but label is disallowed. */
15
+ enum lex_state_bits {
16
+ EXPR_BEG_BIT = 0, /* ignore newline, +/- is a sign. */
17
+ EXPR_END_BIT, /* newline significant, +/- is an operator. */
18
+ EXPR_ENDARG_BIT, /* ditto, and unbound braces. */
19
+ EXPR_ENDFN_BIT, /* ditto, and unbound braces. */
20
+ EXPR_ARG_BIT, /* newline significant, +/- is an operator. */
21
+ EXPR_CMDARG_BIT, /* newline significant, +/- is an operator. */
22
+ EXPR_MID_BIT, /* newline significant, +/- is an operator. */
23
+ EXPR_FNAME_BIT, /* ignore newline, no reserved words. */
24
+ EXPR_DOT_BIT, /* right after `.' or `::', no reserved words. */
25
+ EXPR_CLASS_BIT, /* immediate after `class', no here document. */
26
+ EXPR_VALUE_BIT, /* like EXPR_BEG but label is disallowed. */
27
27
  EXPR_MAX_STATE
28
28
  };
29
29
 
30
+ enum lex_state_e {
31
+ #define EXPR(e) EXPR_##e = (1 << EXPR_##e##_BIT)
32
+ EXPR(BEG),
33
+ EXPR(END),
34
+ EXPR(ENDARG),
35
+ EXPR(ENDFN),
36
+ EXPR(ARG),
37
+ EXPR(CMDARG),
38
+ EXPR(MID),
39
+ EXPR(FNAME),
40
+ EXPR(DOT),
41
+ EXPR(CLASS),
42
+ EXPR(VALUE),
43
+ EXPR_BEG_ANY = (EXPR_BEG | EXPR_VALUE | EXPR_MID | EXPR_CLASS),
44
+ EXPR_ARG_ANY = (EXPR_ARG | EXPR_CMDARG),
45
+ EXPR_END_ANY = (EXPR_END | EXPR_ENDARG | EXPR_ENDFN)
46
+ };
47
+
48
+ #define lex_state_of_p(x, s) ((x) & (s))
49
+ #define lex_state_p(s) lex_state_of_p(lex_state, s)
50
+
30
51
  typedef VALUE stack_type;
31
52
 
32
53
  struct StartPosition {
@@ -50,11 +71,13 @@ typedef VALUE stack_type;
50
71
  int class_nest;
51
72
  int in_single;
52
73
  int in_def;
74
+ int brace_nest;
53
75
  int compile_for_eval;
54
76
  ID cur_mid;
55
77
  char *token_buffer;
56
78
  int tokidx;
57
79
  int toksiz;
80
+ int tokline;
58
81
  int emit_warnings;
59
82
  /* Mirror'ing the 1.8 parser, There are 2 input methods,
60
83
  from IO and directly from a string. */
@@ -77,9 +100,9 @@ typedef VALUE stack_type;
77
100
  VALUE lex_lastline;
78
101
  VALUE lex_nextline;
79
102
 
80
- char *lex_pbeg;
81
- char *lex_p;
82
- char *lex_pend;
103
+ const char *lex_pbeg;
104
+ const char *lex_p;
105
+ const char *lex_pend;
83
106
  int lex_str_used;
84
107
 
85
108
  enum lex_state_e lex_state;
@@ -143,11 +166,13 @@ typedef VALUE stack_type;
143
166
  #define class_nest PARSER_VAR(class_nest)
144
167
  #define in_single PARSER_VAR(in_single)
145
168
  #define in_def PARSER_VAR(in_def)
169
+ #define brace_nest PARSER_VAR(brace_nest)
146
170
  #define compile_for_eval PARSER_VAR(compile_for_eval)
147
171
  #define cur_mid PARSER_VAR(cur_mid)
148
172
  #define tokenbuf PARSER_VAR(token_buffer)
149
173
  #define tokidx PARSER_VAR(tokidx)
150
174
  #define toksiz PARSER_VAR(toksiz)
175
+ #define tokline PARSER_VAR(tokline)
151
176
  #define emit_warnings PARSER_VAR(emit_warnings)
152
177
  #define lex_gets PARSER_VAR(lex_gets)
153
178
  #define line_buffer PARSER_VAR(line_buffer)
@@ -57,8 +57,10 @@ namespace MELBOURNE {
57
57
  ID rb_sHash;
58
58
  ID rb_sIAsgn;
59
59
  ID rb_sIf;
60
+ ID rb_sImaginary;
60
61
  ID rb_sIter;
61
62
  ID rb_sIVar;
63
+ ID rb_sKwArg;
62
64
  ID rb_sLAsgn;
63
65
  ID rb_sLambda;
64
66
  ID rb_sLit;
@@ -83,6 +85,7 @@ namespace MELBOURNE {
83
85
  ID rb_sPostExe;
84
86
  ID rb_sPostArg;
85
87
  ID rb_sPreExe;
88
+ ID rb_sRational;
86
89
  ID rb_sRedo;
87
90
  ID rb_sRegex;
88
91
  ID rb_sResbody;
@@ -169,8 +172,10 @@ namespace MELBOURNE {
169
172
  rb_sHash = rb_intern("process_hash");
170
173
  rb_sIAsgn = rb_intern("process_iasgn");
171
174
  rb_sIf = rb_intern("process_if");
175
+ rb_sImaginary = rb_intern("process_imaginary");
172
176
  rb_sIter = rb_intern("process_iter");
173
177
  rb_sIVar = rb_intern("process_ivar");
178
+ rb_sKwArg = rb_intern("process_kw_arg");
174
179
  rb_sLAsgn = rb_intern("process_lasgn");
175
180
  rb_sLambda = rb_intern("process_lambda");
176
181
  rb_sLit = rb_intern("process_lit");
@@ -195,6 +200,7 @@ namespace MELBOURNE {
195
200
  rb_sPostExe = rb_intern("process_postexe");
196
201
  rb_sPostArg = rb_intern("process_postarg");
197
202
  rb_sPreExe = rb_intern("process_preexe");
203
+ rb_sRational = rb_intern("process_rational");
198
204
  rb_sRedo = rb_intern("process_redo");
199
205
  rb_sRegex = rb_intern("process_regex");
200
206
  rb_sResbody = rb_intern("process_resbody");