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/