* parse.y (stmt, mlhs_node, lhs, arg, var_ref): return dummy

NODE_BEGIN after errors.  [ruby-dev:31100], [ruby-dev:31118]

* parse.y (remove_begin): make empty NODE_BEGIN to NODE_NIL, instead
  of null.  [ruby-dev:31252], [ruby-dev:31263]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12819 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2007-07-20 01:39:30 +00:00
parent 327be4636e
commit bf27f224f0
3 changed files with 26 additions and 20 deletions

View File

@ -1,3 +1,11 @@
Fri Jul 20 10:39:28 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* parse.y (stmt, mlhs_node, lhs, arg, var_ref): return dummy
NODE_BEGIN after errors. [ruby-dev:31100], [ruby-dev:31118]
* parse.y (remove_begin): make empty NODE_BEGIN to NODE_NIL, instead
of null. [ruby-dev:31252], [ruby-dev:31263]
Fri Jul 20 09:50:40 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Jul 20 09:50:40 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* bootstraptest/runner.rb (get_result_string): check $?.coredump? * bootstraptest/runner.rb (get_result_string): check $?.coredump?

View File

@ -542,4 +542,4 @@ assert_equal %q{1}, %q{1.times{1+(1&&next)}} # [ruby-dev:31119]
assert_equal %q{1}, %q{x=-1;loop{x+=1&&redo if (x+=1).zero?}} # [ruby-dev:31119] assert_equal %q{1}, %q{x=-1;loop{x+=1&&redo if (x+=1).zero?}} # [ruby-dev:31119]
assert_syntax_error %q{syntax error, unexpected $end}, %q{!} # [ruby-dev:31243] assert_syntax_error %q{syntax error, unexpected $end}, %q{!} # [ruby-dev:31243]
assert_equal %q{[nil]}, %q{[()]} # [ruby-dev:31252] assert_equal %q{[nil]}, %q{[()]} # [ruby-dev:31252]
assert_equal %q{true}, %q{!_=()} # [ruby-dev:31253] assert_equal %q{true}, %q{!_=()} # [ruby-dev:31263]

36
parse.y
View File

@ -520,8 +520,10 @@ static void ripper_warn0(struct parser_params*, const char*);
static void ripper_warnI(struct parser_params*, const char*, int); static void ripper_warnI(struct parser_params*, const char*, int);
static void ripper_warnS(struct parser_params*, const char*, const char*); static void ripper_warnS(struct parser_params*, const char*, const char*);
static void ripper_warning0(struct parser_params*, const char*); static void ripper_warning0(struct parser_params*, const char*);
#if 0 /* unused in ripper right now */
static void ripper_warningS(struct parser_params*, const char*, const char*); static void ripper_warningS(struct parser_params*, const char*, const char*);
#endif #endif
#endif
#ifdef RIPPER #ifdef RIPPER
static void ripper_compile_error(struct parser_params*, const char *fmt, ...); static void ripper_compile_error(struct parser_params*, const char *fmt, ...);
@ -843,7 +845,7 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
{ {
/*%%%*/ /*%%%*/
yyerror("can't make alias for the number variables"); yyerror("can't make alias for the number variables");
$$ = 0; $$ = NEW_BEGIN(0);
/*% /*%
$$ = dispatch2(var_alias, $2, $3); $$ = dispatch2(var_alias, $2, $3);
$$ = dispatch1(alias_error, $$); $$ = dispatch1(alias_error, $$);
@ -998,7 +1000,7 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
} }
} }
else { else {
$$ = 0; $$ = NEW_BEGIN(0);
} }
/*% /*%
$$ = dispatch3(opassign, $1, $2, $3); $$ = dispatch3(opassign, $1, $2, $3);
@ -1080,7 +1082,7 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
{ {
/*%%%*/ /*%%%*/
rb_backref_error($1); rb_backref_error($1);
$$ = 0; $$ = NEW_BEGIN(0);
/*% /*%
$$ = dispatch2(assign, dispatch1(var_field, $1), $3); $$ = dispatch2(assign, dispatch1(var_field, $1), $3);
$$ = dispatch1(assign_error, $$); $$ = dispatch1(assign_error, $$);
@ -1530,7 +1532,7 @@ mlhs_node : variable
{ {
/*%%%*/ /*%%%*/
rb_backref_error($1); rb_backref_error($1);
$$ = 0; $$ = NEW_BEGIN(0);
/*% /*%
$$ = dispatch1(var_field, $1); $$ = dispatch1(var_field, $1);
$$ = dispatch1(assign_error, $$); $$ = dispatch1(assign_error, $$);
@ -1541,7 +1543,7 @@ mlhs_node : variable
lhs : variable lhs : variable
{ {
/*%%%*/ /*%%%*/
$$ = assignable($1, 0); if (!($$ = assignable($1, 0))) $$ = NEW_BEGIN(0);
/*% /*%
$$ = dispatch1(var_field, $1); $$ = dispatch1(var_field, $1);
%*/ %*/
@ -1608,7 +1610,7 @@ lhs : variable
{ {
/*%%%*/ /*%%%*/
rb_backref_error($1); rb_backref_error($1);
$$ = 0; $$ = NEW_BEGIN(0);
/*% /*%
$$ = dispatch1(assign_error, $1); $$ = dispatch1(assign_error, $1);
%*/ %*/
@ -1790,7 +1792,7 @@ arg : lhs '=' arg
} }
} }
else { else {
$$ = 0; $$ = NEW_BEGIN(0);
} }
/*% /*%
$$ = dispatch3(opassign, $1, $2, $3); $$ = dispatch3(opassign, $1, $2, $3);
@ -1872,7 +1874,7 @@ arg : lhs '=' arg
{ {
/*%%%*/ /*%%%*/
yyerror("constant re-assignment"); yyerror("constant re-assignment");
$$ = 0; $$ = NEW_BEGIN(0);
/*% /*%
$$ = dispatch2(constpath_field, $1, $3); $$ = dispatch2(constpath_field, $1, $3);
$$ = dispatch3(opassign, $$, $4, $5); $$ = dispatch3(opassign, $$, $4, $5);
@ -1883,7 +1885,7 @@ arg : lhs '=' arg
{ {
/*%%%*/ /*%%%*/
yyerror("constant re-assignment"); yyerror("constant re-assignment");
$$ = 0; $$ = NEW_BEGIN(0);
/*% /*%
$$ = dispatch1(topconst_field, $2); $$ = dispatch1(topconst_field, $2);
$$ = dispatch3(opassign, $$, $3, $4); $$ = dispatch3(opassign, $$, $3, $4);
@ -1894,7 +1896,7 @@ arg : lhs '=' arg
{ {
/*%%%*/ /*%%%*/
rb_backref_error($1); rb_backref_error($1);
$$ = 0; $$ = NEW_BEGIN(0);
/*% /*%
$$ = dispatch1(var_field, $1); $$ = dispatch1(var_field, $1);
$$ = dispatch3(opassign, $$, $2, $3); $$ = dispatch3(opassign, $$, $2, $3);
@ -2511,8 +2513,7 @@ primary : literal
| tLPAREN compstmt ')' | tLPAREN compstmt ')'
{ {
/*%%%*/ /*%%%*/
if (!$2) $$ = NEW_NIL(); $$ = $2;
else $$ = $2;
/*% /*%
$$ = dispatch1(paren, $2); $$ = dispatch1(paren, $2);
%*/ %*/
@ -3915,7 +3916,7 @@ variable : tIDENTIFIER
var_ref : variable var_ref : variable
{ {
/*%%%*/ /*%%%*/
$$ = gettable($1); if (!($$ = gettable($1))) $$ = NEW_BEGIN(0);
/*% /*%
$$ = dispatch1(var_ref, $1); $$ = dispatch1(var_ref, $1);
%*/ %*/
@ -7598,12 +7599,9 @@ void_stmts_gen(struct parser_params *parser, NODE *node)
static NODE * static NODE *
remove_begin(NODE *node) remove_begin(NODE *node)
{ {
NODE **n = &node; NODE **n = &node, *n1 = node;
while (*n) { while (n1 && nd_type(n1) == NODE_BEGIN && n1->nd_body) {
if (nd_type(*n) != NODE_BEGIN) { *n = n1 = n1->nd_body;
return node;
}
*n = (*n)->nd_body;
} }
return node; return node;
} }