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

ruby-changes:14511

From: mame <ko1@a...>
Date: Tue, 19 Jan 2010 01:43:47 +0900 (JST)
Subject: [ruby-changes:14511] Ruby:r26347 (trunk): * parse.y (top_compstmt, top_stmts, top_stmt): prohibit BEGIN {} in

mame	2010-01-19 01:43:29 +0900 (Tue, 19 Jan 2010)

  New Revision: 26347

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

  Log:
    * parse.y (top_compstmt, top_stmts, top_stmt): prohibit BEGIN {} in
      non-toplevel scope.  [ruby-core:21657]
    
    * test/ruby/test_beginendblock.rb (test_begininclass): add a test for
      above.

  Modified files:
    trunk/ChangeLog
    trunk/parse.y
    trunk/test/ruby/test_beginendblock.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26346)
+++ ChangeLog	(revision 26347)
@@ -1,3 +1,11 @@
+Tue Jan 19 01:42:36 2010  Yusuke Endoh  <mame@t...>
+
+	* parse.y (top_compstmt, top_stmts, top_stmt): prohibit BEGIN {} in
+	  non-toplevel scope.  [ruby-core:21657]
+
+	* test/ruby/test_beginendblock.rb (test_begininclass): add a test for
+	  above.
+
 Mon Jan 18 17:16:03 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/webrick/httpservlet/filehandler.rb (make_partial_content):
Index: parse.y
===================================================================
--- parse.y	(revision 26346)
+++ parse.y	(revision 26347)
@@ -686,6 +686,7 @@
 %type <node> string_contents xstring_contents string_content
 %type <node> words qwords word_list qword_list word
 %type <node> literal numeric dsym cpath
+%type <node> top_compstmt top_stmts top_stmt
 %type <node> bodystmt compstmt stmts stmt expr arg primary command command_call method_call
 %type <node> expr_value arg_value primary_value
 %type <node> if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure
@@ -788,7 +789,7 @@
 			local_push(0);
 		    %*/
 		    }
-		  compstmt
+		  top_compstmt
 		    {
 		    /*%%%*/
 			if ($2 && !$<num>1) {
@@ -811,6 +812,73 @@
 		    }
 		;
 
+top_compstmt	: top_stmts opt_terms
+		    {
+		    /*%%%*/
+			void_stmts($1);
+			fixup_nodes(&deferred_nodes);
+		    /*%
+		    %*/
+			$$ = $1;
+		    }
+		;
+
+top_stmts	: none
+                    {
+		    /*%%%*/
+			$$ = NEW_BEGIN(0);
+		    /*%
+			$$ = dispatch2(stmts_add, dispatch0(stmts_new),
+						  dispatch0(void_stmt));
+		    %*/
+		    }
+		| top_stmt
+		    {
+		    /*%%%*/
+			$$ = newline_node($1);
+		    /*%
+			$$ = dispatch2(stmts_add, dispatch0(stmts_new), $1);
+		    %*/
+		    }
+		| top_stmts terms top_stmt
+		    {
+		    /*%%%*/
+			$$ = block_append($1, newline_node($3));
+		    /*%
+			$$ = dispatch2(stmts_add, $1, $3);
+		    %*/
+		    }
+		| error top_stmt
+		    {
+			$$ = remove_begin($2);
+		    }
+		;
+
+top_stmt	: stmt
+		| keyword_BEGIN
+		    {
+			if (in_def || in_single) {
+			    yyerror("BEGIN in method");
+			}
+		    /*%%%*/
+			/* local_push(0); */
+		    /*%
+		    %*/
+		    }
+		  '{' top_compstmt '}'
+		    {
+		    /*%%%*/
+			ruby_eval_tree_begin = block_append(ruby_eval_tree_begin,
+							    $4);
+			/* NEW_PREEXE($4)); */
+			/* local_pop(); */
+			$$ = NEW_BEGIN(0);
+		    /*%
+			$$ = dispatch1(BEGIN, $4);
+		    %*/
+		    }
+		;
+
 bodystmt	: compstmt
 		  opt_rescue
 		  opt_else
@@ -984,25 +1052,6 @@
 			$$ = dispatch2(rescue_mod, $3, $1);
 		    %*/
 		    }
-		| keyword_BEGIN
-		    {
-			if (in_def || in_single) {
-			    yyerror("BEGIN in method");
-			}
-			/* local_push(0); */
-		    }
-		  '{' compstmt '}'
-		    {
-		    /*%%%*/
-			ruby_eval_tree_begin = block_append(ruby_eval_tree_begin,
-							    $4);
-			/* NEW_PREEXE($4)); */
-			$$ = NEW_BEGIN(0);
-		    /*%
-			$$ = dispatch1(BEGIN, $4);
-		    %*/
-			/* local_pop(); */
-		    }
 		| keyword_END '{' compstmt '}'
 		    {
 			if (in_def || in_single) {
Index: test/ruby/test_beginendblock.rb
===================================================================
--- test/ruby/test_beginendblock.rb	(revision 26346)
+++ test/ruby/test_beginendblock.rb	(revision 26347)
@@ -41,6 +41,12 @@
     end
   end
 
+  def test_begininclass
+    assert_raise(SyntaxError) do
+      eval("class TestBeginEndBlock; BEGIN {}; end")
+    end
+  end
+
   def test_endblockwarn
     ruby = EnvUtil.rubybin
     # Use Tempfile to create temporary file path.

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

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