@@ -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 */
@@ -394,6 +398,7 @@ bodystmt : compstmt
394
398
compstmt : stmts opt_terms
395
399
{
396
400
void_stmts ($1 );
401
+ fixup_nodes (&deferred_nodes);
397
402
$$ = $1 ;
398
403
}
399
404
;
@@ -1080,26 +1085,20 @@ arg : lhs '=' arg
1080
1085
{
1081
1086
value_expr ($1 );
1082
1087
value_expr ($3 );
1088
+ $$ = NEW_DOT2($1 , $3 );
1083
1089
if (nd_type($1 ) == NODE_LIT && FIXNUM_P($1 ->nd_lit) &&
1084
1090
nd_type ($3 ) == NODE_LIT && FIXNUM_P($3 ->nd_lit)) {
1085
- $1 ->nd_lit = rb_range_new ($1 ->nd_lit , $3 ->nd_lit , Qfalse);
1086
- $$ = $1 ;
1087
- }
1088
- else {
1089
- $$ = NEW_DOT2($1 , $3 );
1091
+ deferred_nodes = list_append (deferred_nodes, $$);
1090
1092
}
1091
1093
}
1092
1094
| arg tDOT3 arg
1093
1095
{
1094
1096
value_expr ($1 );
1095
1097
value_expr ($3 );
1098
+ $$ = NEW_DOT3($1 , $3 );
1096
1099
if (nd_type($1 ) == NODE_LIT && FIXNUM_P($1 ->nd_lit) &&
1097
1100
nd_type ($3 ) == NODE_LIT && FIXNUM_P($3 ->nd_lit)) {
1098
- $1 ->nd_lit = rb_range_new ($1 ->nd_lit , $3 ->nd_lit , Qtrue);
1099
- $$ = $1 ;
1100
- }
1101
- else {
1102
- $$ = NEW_DOT3($1 , $3 );
1101
+ deferred_nodes = list_append (deferred_nodes, $$);
1103
1102
}
1104
1103
}
1105
1104
| arg ' +' arg
@@ -2689,6 +2688,7 @@ yycompile(f, line)
2689
2688
lex_strterm = 0 ;
2690
2689
ruby_current_node = 0 ;
2691
2690
ruby_sourcefile = rb_source_filename (f);
2691
+ deferred_nodes = 0 ;
2692
2692
n = yyparse ();
2693
2693
ruby_debug_lines = 0 ;
2694
2694
compile_for_eval = 0 ;
@@ -2700,6 +2700,7 @@ yycompile(f, line)
2700
2700
in_single = 0 ;
2701
2701
in_def = 0 ;
2702
2702
cur_mid = 0 ;
2703
+ deferred_nodes = 0 ;
2703
2704
2704
2705
vp = ruby_dyna_vars;
2705
2706
ruby_dyna_vars = vars;
@@ -5376,6 +5377,36 @@ warning_unless_e_option(node, str)
5376
5377
if (!e_option_supplied ()) parser_warning (node, str);
5377
5378
}
5378
5379
5380
+ static void
5381
+ fixup_nodes (rootnode)
5382
+ NODE **rootnode;
5383
+ {
5384
+ NODE *node, *next, *head;
5385
+
5386
+ for (node = *rootnode; node; node = next) {
5387
+ enum node_type type;
5388
+ VALUE val;
5389
+
5390
+ next = node->nd_next ;
5391
+ head = node->nd_head ;
5392
+ rb_gc_force_recycle ((VALUE)node);
5393
+ *rootnode = next;
5394
+ switch (type = nd_type (head)) {
5395
+ case NODE_DOT2:
5396
+ case NODE_DOT3:
5397
+ val = rb_range_new (head->nd_beg ->nd_lit , head->nd_end ->nd_lit ,
5398
+ type == NODE_DOT3 ? Qtrue : Qfalse);
5399
+ rb_gc_force_recycle ((VALUE)head->nd_beg );
5400
+ rb_gc_force_recycle ((VALUE)head->nd_end );
5401
+ nd_set_type (head, NODE_LIT);
5402
+ head->nd_lit = val;
5403
+ break ;
5404
+ default :
5405
+ break ;
5406
+ }
5407
+ }
5408
+ }
5409
+
5379
5410
static NODE *cond0 ();
5380
5411
5381
5412
static NODE*
@@ -5384,21 +5415,19 @@ range_op(node)
5384
5415
{
5385
5416
enum node_type type;
5386
5417
5387
- if (!e_option_supplied ()) return node;
5388
5418
if (node == 0 ) return 0 ;
5389
5419
5390
- value_expr (node);
5391
- node = cond0 (node);
5392
5420
type = nd_type (node);
5393
5421
if (type == NODE_NEWLINE) {
5394
5422
node = node->nd_next ;
5395
5423
type = nd_type (node);
5396
5424
}
5425
+ value_expr (node);
5397
5426
if (type == NODE_LIT && FIXNUM_P (node->nd_lit )) {
5398
5427
warn_unless_e_option (node, " integer literal in conditional range" );
5399
5428
return call_op (node,tEQ,1 ,NEW_GVAR (rb_intern (" $." )));
5400
5429
}
5401
- return node;
5430
+ return cond0 ( node) ;
5402
5431
}
5403
5432
5404
5433
static int
@@ -5919,6 +5948,7 @@ rb_gc_mark_parser()
5919
5948
rb_gc_mark (lex_lastline);
5920
5949
rb_gc_mark (lex_input);
5921
5950
rb_gc_mark ((VALUE)lex_strterm);
5951
+ rb_gc_mark ((VALUE)deferred_nodes);
5922
5952
}
5923
5953
5924
5954
void
0 commit comments