aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--bootstraptest/test_syntax.rb2
-rw-r--r--parse.y36
3 files changed, 26 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 8a397bc4a1..26ab54c1f6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
* bootstraptest/runner.rb (get_result_string): check $?.coredump?
diff --git a/bootstraptest/test_syntax.rb b/bootstraptest/test_syntax.rb
index b4fc0ae939..476311d3d7 100644
--- a/bootstraptest/test_syntax.rb
+++ b/bootstraptest/test_syntax.rb
@@ -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_syntax_error %q{syntax error, unexpected $end}, %q{!} # [ruby-dev:31243]
assert_equal %q{[nil]}, %q{[()]} # [ruby-dev:31252]
-assert_equal %q{true}, %q{!_=()} # [ruby-dev:31253]
+assert_equal %q{true}, %q{!_=()} # [ruby-dev:31263]
diff --git a/parse.y b/parse.y
index d31a2c82e4..f60fd6df7b 100644
--- a/parse.y
+++ b/parse.y
@@ -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_warnS(struct parser_params*, const char*, 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*);
#endif
+#endif
#ifdef RIPPER
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");
- $$ = 0;
+ $$ = NEW_BEGIN(0);
/*%
$$ = dispatch2(var_alias, $2, $3);
$$ = dispatch1(alias_error, $$);
@@ -998,7 +1000,7 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
}
}
else {
- $$ = 0;
+ $$ = NEW_BEGIN(0);
}
/*%
$$ = dispatch3(opassign, $1, $2, $3);
@@ -1080,7 +1082,7 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
{
/*%%%*/
rb_backref_error($1);
- $$ = 0;
+ $$ = NEW_BEGIN(0);
/*%
$$ = dispatch2(assign, dispatch1(var_field, $1), $3);
$$ = dispatch1(assign_error, $$);
@@ -1530,7 +1532,7 @@ mlhs_node : variable
{
/*%%%*/
rb_backref_error($1);
- $$ = 0;
+ $$ = NEW_BEGIN(0);
/*%
$$ = dispatch1(var_field, $1);
$$ = dispatch1(assign_error, $$);
@@ -1541,7 +1543,7 @@ mlhs_node : variable
lhs : variable
{
/*%%%*/
- $$ = assignable($1, 0);
+ if (!($$ = assignable($1, 0))) $$ = NEW_BEGIN(0);
/*%
$$ = dispatch1(var_field, $1);
%*/
@@ -1608,7 +1610,7 @@ lhs : variable
{
/*%%%*/
rb_backref_error($1);
- $$ = 0;
+ $$ = NEW_BEGIN(0);
/*%
$$ = dispatch1(assign_error, $1);
%*/
@@ -1790,7 +1792,7 @@ arg : lhs '=' arg
}
}
else {
- $$ = 0;
+ $$ = NEW_BEGIN(0);
}
/*%
$$ = dispatch3(opassign, $1, $2, $3);
@@ -1872,7 +1874,7 @@ arg : lhs '=' arg
{
/*%%%*/
yyerror("constant re-assignment");
- $$ = 0;
+ $$ = NEW_BEGIN(0);
/*%
$$ = dispatch2(constpath_field, $1, $3);
$$ = dispatch3(opassign, $$, $4, $5);
@@ -1883,7 +1885,7 @@ arg : lhs '=' arg
{
/*%%%*/
yyerror("constant re-assignment");
- $$ = 0;
+ $$ = NEW_BEGIN(0);
/*%
$$ = dispatch1(topconst_field, $2);
$$ = dispatch3(opassign, $$, $3, $4);
@@ -1894,7 +1896,7 @@ arg : lhs '=' arg
{
/*%%%*/
rb_backref_error($1);
- $$ = 0;
+ $$ = NEW_BEGIN(0);
/*%
$$ = dispatch1(var_field, $1);
$$ = dispatch3(opassign, $$, $2, $3);
@@ -2511,8 +2513,7 @@ primary : literal
| tLPAREN compstmt ')'
{
/*%%%*/
- if (!$2) $$ = NEW_NIL();
- else $$ = $2;
+ $$ = $2;
/*%
$$ = dispatch1(paren, $2);
%*/
@@ -3915,7 +3916,7 @@ variable : tIDENTIFIER
var_ref : variable
{
/*%%%*/
- $$ = gettable($1);
+ if (!($$ = gettable($1))) $$ = NEW_BEGIN(0);
/*%
$$ = dispatch1(var_ref, $1);
%*/
@@ -7598,12 +7599,9 @@ void_stmts_gen(struct parser_params *parser, NODE *node)
static NODE *
remove_begin(NODE *node)
{
- NODE **n = &node;
- while (*n) {
- if (nd_type(*n) != NODE_BEGIN) {
- return node;
- }
- *n = (*n)->nd_body;
+ NODE **n = &node, *n1 = node;
+ while (n1 && nd_type(n1) == NODE_BEGIN && n1->nd_body) {
+ *n = n1 = n1->nd_body;
}
return node;
}