[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]