@@ -124,6 +124,8 @@ static int compile_for_eval = 0;
124
124
static ID cur_mid = 0 ;
125
125
static int command_start = Qtrue;
126
126
127
+ static NODE *deferred_nodes;
128
+
127
129
static NODE *cond ();
128
130
static NODE *logop ();
129
131
static int cond_negative ();
@@ -181,6 +183,8 @@ static NODE *dyna_init();
181
183
static void top_local_init ();
182
184
static void top_local_setup ();
183
185
186
+ static void fixup_nodes ();
187
+
184
188
#define RE_OPTION_ONCE 0x80
185
189
186
190
#define NODE_STRTERM NODE_ZARRAY /* nothing to gc */
@@ -391,6 +395,7 @@ bodystmt : compstmt
391
395
compstmt : stmts opt_terms
392
396
{
393
397
void_stmts ($1 );
398
+ fixup_nodes (&deferred_nodes);
394
399
$$ = $1 ;
395
400
}
396
401
;
@@ -1077,26 +1082,20 @@ arg : lhs '=' arg
1077
1082
{
1078
1083
value_expr ($1 );
1079
1084
value_expr ($3 );
1085
+ $$ = NEW_DOT2($1 , $3 );
1080
1086
if (nd_type($1 ) == NODE_LIT && FIXNUM_P($1 ->nd_lit) &&
1081
1087
nd_type ($3 ) == NODE_LIT && FIXNUM_P($3 ->nd_lit)) {
1082
- $1 ->nd_lit = rb_range_new ($1 ->nd_lit , $3 ->nd_lit , Qfalse);
1083
- $$ = $1 ;
1084
- }
1085
- else {
1086
- $$ = NEW_DOT2($1 , $3 );
1088
+ deferred_nodes = list_append (deferred_nodes, $$);
1087
1089
}
1088
1090
}
1089
1091
| arg tDOT3 arg
1090
1092
{
1091
1093
value_expr ($1 );
1092
1094
value_expr ($3 );
1095
+ $$ = NEW_DOT3($1 , $3 );
1093
1096
if (nd_type($1 ) == NODE_LIT && FIXNUM_P($1 ->nd_lit) &&
1094
1097
nd_type ($3 ) == NODE_LIT && FIXNUM_P($3 ->nd_lit)) {
1095
- $1 ->nd_lit = rb_range_new ($1 ->nd_lit , $3 ->nd_lit , Qtrue);
1096
- $$ = $1 ;
1097
- }
1098
- else {
1099
- $$ = NEW_DOT3($1 , $3 );
1098
+ deferred_nodes = list_append (deferred_nodes, $$);
1100
1099
}
1101
1100
}
1102
1101
| arg ' +' arg
@@ -2621,6 +2620,7 @@ yycompile(f, line)
2621
2620
lex_strterm = 0 ;
2622
2621
ruby_current_node = 0 ;
2623
2622
ruby_sourcefile = rb_source_filename (f);
2623
+ deferred_nodes = 0 ;
2624
2624
n = yyparse ();
2625
2625
ruby_debug_lines = 0 ;
2626
2626
compile_for_eval = 0 ;
@@ -2632,6 +2632,7 @@ yycompile(f, line)
2632
2632
in_single = 0 ;
2633
2633
in_def = 0 ;
2634
2634
cur_mid = 0 ;
2635
+ deferred_nodes = 0 ;
2635
2636
2636
2637
vp = ruby_dyna_vars;
2637
2638
ruby_dyna_vars = vars;
@@ -5308,6 +5309,36 @@ warning_unless_e_option(node, str)
5308
5309
if (!e_option_supplied ()) parser_warning (node, str);
5309
5310
}
5310
5311
5312
+ static void
5313
+ fixup_nodes (rootnode)
5314
+ NODE **rootnode;
5315
+ {
5316
+ NODE *node, *next, *head;
5317
+
5318
+ for (node = *rootnode; node; node = next) {
5319
+ enum node_type type;
5320
+ VALUE val;
5321
+
5322
+ next = node->nd_next ;
5323
+ head = node->nd_head ;
5324
+ rb_gc_force_recycle ((VALUE)node);
5325
+ *rootnode = next;
5326
+ switch (type = nd_type (head)) {
5327
+ case NODE_DOT2:
5328
+ case NODE_DOT3:
5329
+ val = rb_range_new (head->nd_beg ->nd_lit , head->nd_end ->nd_lit ,
5330
+ type == NODE_DOT3 ? Qtrue : Qfalse);
5331
+ rb_gc_force_recycle ((VALUE)head->nd_beg );
5332
+ rb_gc_force_recycle ((VALUE)head->nd_end );
5333
+ nd_set_type (head, NODE_LIT);
5334
+ head->nd_lit = val;
5335
+ break ;
5336
+ default :
5337
+ break ;
5338
+ }
5339
+ }
5340
+ }
5341
+
5311
5342
static NODE *cond0 ();
5312
5343
5313
5344
static NODE*
@@ -5316,21 +5347,19 @@ range_op(node)
5316
5347
{
5317
5348
enum node_type type;
5318
5349
5319
- if (!e_option_supplied ()) return node;
5320
5350
if (node == 0 ) return 0 ;
5321
5351
5322
- value_expr (node);
5323
- node = cond0 (node);
5324
5352
type = nd_type (node);
5325
5353
if (type == NODE_NEWLINE) {
5326
5354
node = node->nd_next ;
5327
5355
type = nd_type (node);
5328
5356
}
5357
+ value_expr (node);
5329
5358
if (type == NODE_LIT && FIXNUM_P (node->nd_lit )) {
5330
5359
warn_unless_e_option (node, " integer literal in conditional range" );
5331
5360
return call_op (node,tEQ,1 ,NEW_GVAR (rb_intern (" $." )));
5332
5361
}
5333
- return node;
5362
+ return cond0 ( node) ;
5334
5363
}
5335
5364
5336
5365
static int
@@ -5847,6 +5876,7 @@ rb_gc_mark_parser()
5847
5876
rb_gc_mark (lex_lastline);
5848
5877
rb_gc_mark (lex_input);
5849
5878
rb_gc_mark ((VALUE)lex_strterm);
5879
+ rb_gc_mark ((VALUE)deferred_nodes);
5850
5880
}
5851
5881
5852
5882
void
0 commit comments