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

ruby-changes:14150

From: nobu <ko1@a...>
Date: Tue, 1 Dec 2009 06:16:52 +0900 (JST)
Subject: [ruby-changes:14150] Ruby:r25967 (trunk): * parse.y (dyna_push_gen, dyna_pop_gen): adjust local vtable level

nobu	2009-12-01 06:16:31 +0900 (Tue, 01 Dec 2009)

  New Revision: 25967

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25967

  Log:
    * parse.y (dyna_push_gen, dyna_pop_gen): adjust local vtable level
      for the case of syntax errors in method name or argument inside
      do block.   [ruby-core:26961]

  Modified files:
    trunk/ChangeLog
    trunk/bootstraptest/test_syntax.rb
    trunk/parse.y
    trunk/version.h

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 25966)
+++ ChangeLog	(revision 25967)
@@ -1,3 +1,9 @@
+Tue Dec  1 06:16:29 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* parse.y (dyna_push_gen, dyna_pop_gen): adjust local vtable level
+	  for the case of syntax errors in method name or argument inside
+	  do block.   [ruby-core:26961]
+
 Mon Nov 30 16:57:45 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* ext/extmk.rb (command_output): $makeflags are already quoted.
Index: bootstraptest/test_syntax.rb
===================================================================
--- bootstraptest/test_syntax.rb	(revision 25966)
+++ bootstraptest/test_syntax.rb	(revision 25967)
@@ -836,3 +836,44 @@
 assert_equal 'ok', %q{
   "o" "#{}k"
 }, '[ruby-dev:38980]'
+
+bug2415 = '[ruby-core:26961]'
+assert_normal_exit %q{
+  0.times do
+    0.times do
+      def x(a=1, b, *rest); nil end
+    end
+  end
+}, bug2415
+
+assert_normal_exit %q{
+  0.times do
+    0.times do
+      def x@; nil end
+    end
+  end
+}, bug2415
+
+assert_normal_exit %q{
+  0.times do
+    0.times do
+      def x(a = 0.times do
+              def y(a=1, b, *rest); nil; end
+            end)
+        nil
+      end
+    end
+  end
+}, bug2415
+
+assert_normal_exit %q{
+  0.times do
+    0.times do
+      def x(a = 0.times do
+              def x@; nil; end
+            end)
+        nil
+      end
+    end
+  end
+}, bug2415
Index: parse.y
===================================================================
--- parse.y	(revision 25966)
+++ parse.y	(revision 25967)
@@ -453,10 +453,10 @@
 static ID   internal_id_gen(struct parser_params*);
 #define internal_id() internal_id_gen(parser)
 
-static void dyna_push_gen(struct parser_params*);
-#define dyna_push() dyna_push_gen(parser)
-static void dyna_pop_gen(struct parser_params*);
-#define dyna_pop() dyna_pop_gen(parser)
+static NODE *dyna_push_gen(struct parser_params*, VALUE);
+#define dyna_push(x) dyna_push_gen(parser, x)
+static void dyna_pop_gen(struct parser_params*, NODE *);
+#define dyna_pop(node) dyna_pop_gen(parser, node)
 static int dyna_in_block_gen(struct parser_params*);
 #define dyna_in_block() dyna_in_block_gen(parser)
 #define dyna_var(id) local_var(id)
@@ -1254,11 +1254,7 @@
 
 cmd_brace_block	: tLBRACE_ARG
 		    {
-			dyna_push();
-		    /*%%%*/
-			$<num>$ = ruby_sourceline;
-		    /*%
-		    %*/
+			$<node>$ = dyna_push(0);
 		    }
 		  opt_block_param
 		  compstmt
@@ -1266,11 +1262,11 @@
 		    {
 		    /*%%%*/
 			$$ = NEW_ITER($3,$4);
-			nd_set_line($$, $<num>2);
+			nd_set_line($$, nd_line($<node>2));
 		    /*%
 			$$ = dispatch2(brace_block, escape_Qundef($3), $4);
 		    %*/
-			dyna_pop();
+			dyna_pop($<node>2);
 		    }
 		;
 
@@ -3410,21 +3406,20 @@
 		;
 
 lambda		:   {
-			dyna_push();
-			$<num>$ = lpar_beg;
+			$<node>$ = dyna_push((VALUE)lpar_beg);
 			lpar_beg = ++paren_nest;
 		    }
 		  f_larglist
 		  lambda_body
 		    {
-			lpar_beg = $<num>1;
+			lpar_beg = (int)$<node>1->u1.value;
 		    /*%%%*/
 			$$ = $2;
 			$$->nd_body = NEW_SCOPE($2->nd_head, $3);
 		    /*%
 			$$ = dispatch2(lambda, $2, $3);
 		    %*/
-			dyna_pop();
+			dyna_pop($<node>1);
 		    }
 		;
 
@@ -3458,10 +3453,7 @@
 
 do_block	: keyword_do_block
 		    {
-			dyna_push();
-		    /*%%%*/
-			$<num>$ = ruby_sourceline;
-		    /*% %*/
+			$<node>$ = dyna_push(0);
 		    }
 		  opt_block_param
 		  compstmt
@@ -3469,11 +3461,11 @@
 		    {
 		    /*%%%*/
 			$$ = NEW_ITER($3,$4);
-			nd_set_line($$, $<num>2);
+			nd_set_line($$, nd_line($<node>2));
 		    /*%
 			$$ = dispatch2(do_block, escape_Qundef($3), $4);
 		    %*/
-			dyna_pop();
+			dyna_pop($<node>2);
 		    }
 		;
 
@@ -3604,41 +3596,33 @@
 
 brace_block	: '{'
 		    {
-			dyna_push();
-		    /*%%%*/
-			$<num>$ = ruby_sourceline;
-		    /*%
-                    %*/
+			$<node>$ = dyna_push(0);
 		    }
 		  opt_block_param
 		  compstmt '}'
 		    {
 		    /*%%%*/
 			$$ = NEW_ITER($3,$4);
-			nd_set_line($$, $<num>2);
+			nd_set_line($$, nd_line($<node>2));
 		    /*%
 			$$ = dispatch2(brace_block, escape_Qundef($3), $4);
 		    %*/
-			dyna_pop();
+			dyna_pop($<node>2);
 		    }
 		| keyword_do
 		    {
-			dyna_push();
-		    /*%%%*/
-			$<num>$ = ruby_sourceline;
-		    /*%
-                    %*/
+			$<node>$ = dyna_push(0);
 		    }
 		  opt_block_param
 		  compstmt keyword_end
 		    {
 		    /*%%%*/
 			$$ = NEW_ITER($3,$4);
-			nd_set_line($$, $<num>2);
+			nd_set_line($$, nd_line($<node>2));
 		    /*%
 			$$ = dispatch2(do_block, escape_Qundef($3), $4);
 		    %*/
-			dyna_pop();
+			dyna_pop($<node>2);
 		    }
 		;
 
@@ -8876,18 +8860,23 @@
     }
 }
 
-static void
-dyna_push_gen(struct parser_params *parser)
+static NODE *
+dyna_push_gen(struct parser_params *parser, VALUE x)
 {
     lvtbl->args = vtable_alloc(lvtbl->args);
     lvtbl->vars = vtable_alloc(lvtbl->vars);
+    return node_newnode(parser, NODE_ZSUPER, (VALUE)lvtbl->args, (VALUE)lvtbl->vars, x);
 }
 
 static void
-dyna_pop_gen(struct parser_params *parser)
+dyna_pop_gen(struct parser_params *parser, NODE *dv)
 {
     struct vtable *tmp;
 
+    while (lvtbl->args != (struct vtable *)dv->u1.value) {
+	local_pop();
+    }
+    rb_gc_force_recycle((VALUE)dv);
     tmp = lvtbl->args;
     lvtbl->args = lvtbl->args->prev;
     vtable_free(tmp);
Index: version.h
===================================================================
--- version.h	(revision 25966)
+++ version.h	(revision 25967)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.2"
-#define RUBY_RELEASE_DATE "2009-11-30"
+#define RUBY_RELEASE_DATE "2009-12-01"
 #define RUBY_PATCHLEVEL -1
 #define RUBY_BRANCH_NAME "trunk"
 
@@ -7,8 +7,8 @@
 #define RUBY_VERSION_MINOR 9
 #define RUBY_VERSION_TEENY 1
 #define RUBY_RELEASE_YEAR 2009
-#define RUBY_RELEASE_MONTH 11
-#define RUBY_RELEASE_DAY 30
+#define RUBY_RELEASE_MONTH 12
+#define RUBY_RELEASE_DAY 1
 
 #include "ruby/version.h"
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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