aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-12 13:43:56 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-12 13:43:56 +0000
commit900b4a6db63012d9ce32a1019a7c9d5b014a0047 (patch)
tree0ecc0563750b343b1ce214634be5ab98a146db5b
parentcc006d368c64ec3fdf51280f93b23155d95e1884 (diff)
downloadruby-900b4a6db63012d9ce32a1019a7c9d5b014a0047.tar.gz
* parse.y (stmt_or_begin): changed the error message for BEGIN not
at toplevel. [ruby-dev:44963] [Bug #5738] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34016 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--parse.y34
-rw-r--r--test/ruby/test_beginendblock.rb9
3 files changed, 39 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index ce7d55ab8e..b5c306b0b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Dec 12 22:35:39 2011 Shugo Maeda <shugo@ruby-lang.org>
+
+ * parse.y (stmt_or_begin): changed the error message for BEGIN not
+ at toplevel. [ruby-dev:44963] [Bug #5738]
+
Mon Dec 12 17:29:01 2011 NARUSE, Yui <naruse@ruby-lang.org>
* README: Fixed SupportedPlatforms URL in the README.
diff --git a/parse.y b/parse.y
index 3061ed86e0..1cae0e5fe8 100644
--- a/parse.y
+++ b/parse.y
@@ -686,7 +686,7 @@ static void token_info_pop(struct parser_params*, const char *token);
%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> bodystmt compstmt stmts stmt_or_begin 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
%type <node> args call_args opt_call_args
@@ -855,9 +855,6 @@ top_stmts : none
top_stmt : stmt
| keyword_BEGIN
{
- if (in_def || in_single) {
- yyerror("BEGIN in method");
- }
/*%%%*/
/* local_push(0); */
/*%
@@ -930,7 +927,7 @@ stmts : none
dispatch0(void_stmt));
%*/
}
- | stmt
+ | stmt_or_begin
{
/*%%%*/
$$ = newline_node($1);
@@ -938,7 +935,7 @@ stmts : none
$$ = dispatch2(stmts_add, dispatch0(stmts_new), $1);
%*/
}
- | stmts terms stmt
+ | stmts terms stmt_or_begin
{
/*%%%*/
$$ = block_append($1, newline_node($3));
@@ -952,6 +949,31 @@ stmts : none
}
;
+stmt_or_begin : stmt
+ {
+ $$ = $1;
+ }
+ | keyword_BEGIN
+ {
+ yyerror("BEGIN is permitted only at toplevel");
+ /*%%%*/
+ /* 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);
+ %*/
+ }
+
stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
{
/*%%%*/
diff --git a/test/ruby/test_beginendblock.rb b/test/ruby/test_beginendblock.rb
index 7e460b989d..18649ffbd4 100644
--- a/test/ruby/test_beginendblock.rb
+++ b/test/ruby/test_beginendblock.rb
@@ -33,19 +33,22 @@ class TestBeginEndBlock < Test::Unit::TestCase
end
def test_begininmethod
- assert_raise(SyntaxError) do
+ e = assert_raise(SyntaxError) do
eval("def foo; BEGIN {}; end")
end
+ assert_match(/BEGIN is permitted only at toplevel/, e.message)
- assert_raise(SyntaxError) do
+ e = assert_raise(SyntaxError) do
eval('eval("def foo; BEGIN {}; end")')
end
+ assert_match(/BEGIN is permitted only at toplevel/, e.message)
end
def test_begininclass
- assert_raise(SyntaxError) do
+ e = assert_raise(SyntaxError) do
eval("class TestBeginEndBlock; BEGIN {}; end")
end
+ assert_match(/BEGIN is permitted only at toplevel/, e.message)
end
def test_endblockwarn