ruby-changes:6840
From: nobu <ko1@a...>
Date: Mon, 4 Aug 2008 16:49:16 +0900 (JST)
Subject: [ruby-changes:6840] Ruby:r18356 (ruby_1_8, trunk): * parse.y (deferred_nodes, compstmt, arg, fixup_nodes, range_op): fix
nobu 2008-08-04 16:48:52 +0900 (Mon, 04 Aug 2008) New Revision: 18356 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18356 Log: * parse.y (deferred_nodes, compstmt, arg, fixup_nodes, range_op): fix up fixnum range literal in conditional as automagical line number comparison. [ruby-core:12124], [ruby-dev:35731] Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/parse.y trunk/ChangeLog trunk/parse.y Index: ChangeLog =================================================================== --- ChangeLog (revision 18355) +++ ChangeLog (revision 18356) @@ -1,3 +1,9 @@ +Mon Aug 4 16:48:50 2008 Nobuyoshi Nakada <nobu@r...> + + * parse.y (deferred_nodes, compstmt, arg, fixup_nodes, range_op): fix + up fixnum range literal in conditional as automagical line number + comparison. [ruby-core:12124], [ruby-dev:35731] + Mon Aug 4 14:41:25 2008 URABE Shyouhei <shyouhei@r...> * lib/net/smtp.rb (Net::SMTP::rcptto): fix a typo. a patch from Index: parse.y =================================================================== --- parse.y (revision 18355) +++ parse.y (revision 18356) @@ -229,6 +229,7 @@ const char *parser_lex_pend; int parser_heredoc_end; int parser_command_start; + NODE *parser_deferred_nodes; int parser_lex_gets_ptr; VALUE (*parser_lex_gets)(struct parser_params*,VALUE); struct local_vars *parser_lvtbl; @@ -309,6 +310,7 @@ #define lex_pend (parser->parser_lex_pend) #define heredoc_end (parser->parser_heredoc_end) #define command_start (parser->parser_command_start) +#define deferred_nodes (parser->parser_deferred_nodes) #define lex_gets_ptr (parser->parser_lex_gets_ptr) #define lex_gets (parser->parser_lex_gets) #define lvtbl (parser->parser_lvtbl) @@ -434,6 +436,8 @@ static int dvar_curr_gen(struct parser_params*,ID); #define dvar_curr(id) dvar_curr_gen(parser, id) +static void fixup_nodes(NODE **); + extern int rb_dvar_defined(ID); extern int rb_local_defined(ID); extern int rb_parse_in_eval(void); @@ -807,6 +811,7 @@ { /*%%%*/ void_stmts($1); + fixup_nodes(&deferred_nodes); /*% %*/ $$ = $1; @@ -1969,14 +1974,11 @@ /*%%%*/ value_expr($1); value_expr($3); + $$ = NEW_DOT2($1, $3); if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) && nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) { - $1->nd_lit = rb_range_new($1->nd_lit, $3->nd_lit, Qfalse); - $$ = $1; + deferred_nodes = list_append(deferred_nodes, $$); } - else { - $$ = NEW_DOT2($1, $3); - } /*% $$ = dispatch2(dot2, $1, $3); %*/ @@ -1986,14 +1988,11 @@ /*%%%*/ value_expr($1); value_expr($3); + $$ = NEW_DOT3($1, $3); if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) && nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) { - $1->nd_lit = rb_range_new($1->nd_lit, $3->nd_lit, Qtrue); - $$ = $1; + deferred_nodes = list_append(deferred_nodes, $$); } - else { - $$ = NEW_DOT3($1, $3); - } /*% $$ = dispatch2(dot3, $1, $3); %*/ @@ -4716,6 +4715,7 @@ } parser_prepare(parser); + deferred_nodes = 0; n = yyparse((void*)parser); ruby_debug_lines = 0; ruby_coverage = 0; @@ -8173,6 +8173,35 @@ if (!e_option_supplied(parser)) parser_warning(node, str); } +static void +fixup_nodes(NODE **rootnode) +{ + NODE *node, *next, *head; + + for (node = *rootnode; node; node = next) { + enum node_type type; + VALUE val; + + next = node->nd_next; + head = node->nd_head; + rb_gc_force_recycle((VALUE)node); + *rootnode = next; + switch (type = nd_type(head)) { + case NODE_DOT2: + case NODE_DOT3: + val = rb_range_new(head->nd_beg->nd_lit, head->nd_end->nd_lit, + type == NODE_DOT3 ? Qtrue : Qfalse); + rb_gc_force_recycle((VALUE)head->nd_beg); + rb_gc_force_recycle((VALUE)head->nd_end); + nd_set_type(head, NODE_LIT); + head->nd_lit = val; + break; + default: + break; + } + } +} + static NODE *cond0(struct parser_params*,NODE*); static NODE* @@ -8180,17 +8209,15 @@ { enum node_type type; - if (!e_option_supplied(parser)) return node; if (node == 0) return 0; + type = nd_type(node); value_expr(node); - node = cond0(parser, node); - type = nd_type(node); if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) { warn_unless_e_option(parser, node, "integer literal in conditional range"); return NEW_CALL(node, tEQ, NEW_LIST(NEW_GVAR(rb_intern("$.")))); } - return node; + return cond0(parser, node); } static int @@ -9296,6 +9323,7 @@ parser->parser_toksiz = 0; parser->parser_heredoc_end = 0; parser->parser_command_start = Qtrue; + parser->parser_deferred_nodes = 0; parser->parser_lex_pbeg = 0; parser->parser_lex_p = 0; parser->parser_lex_pend = 0; @@ -9332,6 +9360,7 @@ struct parser_params *p = (struct parser_params*)ptr; rb_gc_mark((VALUE)p->parser_lex_strterm); + rb_gc_mark((VALUE)p->parser_deferred_nodes); rb_gc_mark(p->parser_lex_input); rb_gc_mark(p->parser_lex_lastline); rb_gc_mark(p->parser_lex_nextline); Index: ruby_1_8/parse.y =================================================================== --- ruby_1_8/parse.y (revision 18355) +++ ruby_1_8/parse.y (revision 18356) @@ -124,6 +124,8 @@ static ID cur_mid = 0; static int command_start = Qtrue; +static NODE *deferred_nodes; + static NODE *cond(); static NODE *logop(); static int cond_negative(); @@ -181,6 +183,8 @@ static void top_local_init(); static void top_local_setup(); +static void fixup_nodes(); + #define RE_OPTION_ONCE 0x80 #define NODE_STRTERM NODE_ZARRAY /* nothing to gc */ @@ -394,6 +398,7 @@ compstmt : stmts opt_terms { void_stmts($1); + fixup_nodes(&deferred_nodes); $$ = $1; } ; @@ -1080,27 +1085,21 @@ { value_expr($1); value_expr($3); + $$ = NEW_DOT2($1, $3); if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) && nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) { - $1->nd_lit = rb_range_new($1->nd_lit, $3->nd_lit, Qfalse); - $$ = $1; + deferred_nodes = list_append(deferred_nodes, $$); } - else { - $$ = NEW_DOT2($1, $3); - } } | arg tDOT3 arg { value_expr($1); value_expr($3); + $$ = NEW_DOT3($1, $3); if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) && nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) { - $1->nd_lit = rb_range_new($1->nd_lit, $3->nd_lit, Qtrue); - $$ = $1; + deferred_nodes = list_append(deferred_nodes, $$); } - else { - $$ = NEW_DOT3($1, $3); - } } | arg '+' arg { @@ -2689,6 +2688,7 @@ lex_strterm = 0; ruby_current_node = 0; ruby_sourcefile = rb_source_filename(f); + deferred_nodes = 0; n = yyparse(); ruby_debug_lines = 0; compile_for_eval = 0; @@ -2700,6 +2700,7 @@ in_single = 0; in_def = 0; cur_mid = 0; + deferred_nodes = 0; vp = ruby_dyna_vars; ruby_dyna_vars = vars; @@ -5376,6 +5377,36 @@ if (!e_option_supplied()) parser_warning(node, str); } +static void +fixup_nodes(rootnode) + NODE **rootnode; +{ + NODE *node, *next, *head; + + for (node = *rootnode; node; node = next) { + enum node_type type; + VALUE val; + + next = node->nd_next; + head = node->nd_head; + rb_gc_force_recycle((VALUE)node); + *rootnode = next; + switch (type = nd_type(head)) { + case NODE_DOT2: + case NODE_DOT3: + val = rb_range_new(head->nd_beg->nd_lit, head->nd_end->nd_lit, + type == NODE_DOT3 ? Qtrue : Qfalse); + rb_gc_force_recycle((VALUE)head->nd_beg); + rb_gc_force_recycle((VALUE)head->nd_end); + nd_set_type(head, NODE_LIT); + head->nd_lit = val; + break; + default: + break; + } + } +} + static NODE *cond0(); static NODE* @@ -5384,21 +5415,19 @@ { enum node_type type; - if (!e_option_supplied()) return node; if (node == 0) return 0; - value_expr(node); - node = cond0(node); type = nd_type(node); if (type == NODE_NEWLINE) { node = node->nd_next; type = nd_type(node); } + value_expr(node); if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) { warn_unless_e_option(node, "integer literal in conditional range"); return call_op(node,tEQ,1,NEW_GVAR(rb_intern("$."))); } - return node; + return cond0(node); } static int @@ -5919,6 +5948,7 @@ rb_gc_mark(lex_lastline); rb_gc_mark(lex_input); rb_gc_mark((VALUE)lex_strterm); + rb_gc_mark((VALUE)deferred_nodes); } void Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 18355) +++ ruby_1_8/ChangeLog (revision 18356) @@ -1,3 +1,9 @@ +Mon Aug 4 16:48:50 2008 Nobuyoshi Nakada <nobu@r...> + + * parse.y (deferred_nodes, compstmt, arg, fixup_nodes, range_op): fix + up fixnum range literal in conditional as automagical line number + comparison. [ruby-core:12124], [ruby-dev:35731] + Mon Aug 4 15:04:36 2008 Nobuyoshi Nakada <nobu@r...> * eval.c (timeofday): use monotonic clock. based on a patch -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/