summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-05 09:40:17 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-05 09:40:17 +0000
commit223a28467635983ed1caa26a71157521daa81a43 (patch)
treeb89cba3211fd0fbe01737e05612a19a348ed7c3b
parentc5a533a5cf49904ec1544bd22dba079abcd0e7be (diff)
merges r25967, r25968 and r25969 from trunk into ruby_1_9_1. fixes a backport task #2099.
-- * parse.y (dyna_push_gen, dyna_pop_gen): adjust local vtable level for the case of syntax errors in method name or argument inside do block. [ruby-core:26961] -- * parse.y (dyna_push_gen): use rb_node_newnode() for ripper. [ruby-core:26961] -- * parse.y (dyna_push_gen, dyna_pop_gen): no needs to save both of args and vars. [ruby-core:26961] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@26014 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog12
-rw-r--r--bootstraptest/test_syntax.rb46
-rw-r--r--parse.y45
-rw-r--r--version.h2
4 files changed, 85 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index e1022ef21e..10d14deb55 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Tue Dec 1 12:01:13 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (dyna_push_gen, dyna_pop_gen): no needs to save both of
+ args and vars. [ruby-core:26961]
+
+ * parse.y (dyna_push_gen): use rb_node_newnode() for ripper.
+ [ruby-core:26961]
+
+ * parse.y (dyna_push_gen, dyna_pop_gen): adjust local vtable level
+ for the case of syntax errors in method name or argument inside
+ do block. [ruby-core:26961]
+
Tue Oct 20 15:28:49 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* parse.y (method_call): dispatch symbols. a patch from Andy Keep in
diff --git a/bootstraptest/test_syntax.rb b/bootstraptest/test_syntax.rb
index 131625ea6b..2e8639b3f4 100644
--- a/bootstraptest/test_syntax.rb
+++ b/bootstraptest/test_syntax.rb
@@ -831,3 +831,49 @@ assert_normal_exit %q{
assert_equal 'ok', %q{
"#{}""#{}ok"
}, '[ruby-dev:38968]'
+
+
+assert_equal 'ok', %q{
+ "o" "#{}k"
+}, '[ruby-dev:38980]'
+
+bug2415 = '[ruby-core:26961]'
+assert_normal_exit %q{
+ 0.times do
+ 0.times do
+ def x(a=1, b, *rest); nil end
+ end
+ end
+}, bug2415
+
+assert_normal_exit %q{
+ 0.times do
+ 0.times do
+ def x@; nil end
+ end
+ end
+}, bug2415
+
+assert_normal_exit %q{
+ 0.times do
+ 0.times do
+ def x(a = 0.times do
+ def y(a=1, b, *rest); nil; end
+ end)
+ nil
+ end
+ end
+ end
+}, bug2415
+
+assert_normal_exit %q{
+ 0.times do
+ 0.times do
+ def x(a = 0.times do
+ def x@; nil; end
+ end)
+ nil
+ end
+ end
+ end
+}, bug2415
diff --git a/parse.y b/parse.y
index 0779bc2235..a552767674 100644
--- a/parse.y
+++ b/parse.y
@@ -455,10 +455,10 @@ static int local_id_gen(struct parser_params*, ID);
static ID internal_id_gen(struct parser_params*);
#define internal_id() internal_id_gen(parser)
-static void dyna_push_gen(struct parser_params*);
+static const struct vtable *dyna_push_gen(struct parser_params *);
#define dyna_push() dyna_push_gen(parser)
-static void dyna_pop_gen(struct parser_params*);
-#define dyna_pop() dyna_pop_gen(parser)
+static void dyna_pop_gen(struct parser_params*, const struct vtable *);
+#define dyna_pop(node) dyna_pop_gen(parser, node)
static int dyna_in_block_gen(struct parser_params*);
#define dyna_in_block() dyna_in_block_gen(parser)
#define dyna_var(id) local_var(id)
@@ -617,6 +617,7 @@ static void token_info_pop(struct parser_params*, const char *token);
NODE *node;
ID id;
int num;
+ const struct vtable *vars;
}
/*%%%*/
@@ -1321,7 +1322,7 @@ block_command : block_call
cmd_brace_block : tLBRACE_ARG
{
- dyna_push();
+ $<vars>1 = dyna_push();
/*%%%*/
$<num>$ = ruby_sourceline;
/*%
@@ -1337,7 +1338,7 @@ cmd_brace_block : tLBRACE_ARG
/*%
$$ = dispatch2(brace_block, escape_Qundef($3), $4);
%*/
- dyna_pop();
+ dyna_pop($<vars>1);
}
;
@@ -3469,21 +3470,23 @@ bvar : tIDENTIFIER
;
lambda : {
- dyna_push();
+ $<vars>$ = dyna_push();
+ }
+ {
$<num>$ = lpar_beg;
lpar_beg = ++paren_nest;
}
f_larglist
lambda_body
{
- lpar_beg = $<num>1;
+ lpar_beg = $<num>2;
/*%%%*/
- $$ = $2;
- $$->nd_body = NEW_SCOPE($2->nd_head, $3);
+ $$ = $3;
+ $$->nd_body = NEW_SCOPE($3->nd_head, $4);
/*%
- $$ = dispatch2(lambda, $2, $3);
+ $$ = dispatch2(lambda, $3, $4);
%*/
- dyna_pop();
+ dyna_pop($<vars>1);
}
;
@@ -3517,7 +3520,7 @@ lambda_body : tLAMBEG compstmt '}'
do_block : keyword_do_block
{
- dyna_push();
+ $<vars>1 = dyna_push();
/*%%%*/
$<num>$ = ruby_sourceline;
/*% %*/
@@ -3532,7 +3535,7 @@ do_block : keyword_do_block
/*%
$$ = dispatch2(do_block, escape_Qundef($3), $4);
%*/
- dyna_pop();
+ dyna_pop($<vars>1);
}
;
@@ -3663,7 +3666,7 @@ method_call : operation paren_args
brace_block : '{'
{
- dyna_push();
+ $<vars>1 = dyna_push();
/*%%%*/
$<num>$ = ruby_sourceline;
/*%
@@ -3678,11 +3681,11 @@ brace_block : '{'
/*%
$$ = dispatch2(brace_block, escape_Qundef($3), $4);
%*/
- dyna_pop();
+ dyna_pop($<vars>1);
}
| keyword_do
{
- dyna_push();
+ $<vars>1 = dyna_push();
/*%%%*/
$<num>$ = ruby_sourceline;
/*%
@@ -3697,7 +3700,7 @@ brace_block : '{'
/*%
$$ = dispatch2(do_block, escape_Qundef($3), $4);
%*/
- dyna_pop();
+ dyna_pop($<vars>1);
}
;
@@ -8939,18 +8942,22 @@ local_id_gen(struct parser_params *parser, ID id)
}
}
-static void
+static const struct vtable *
dyna_push_gen(struct parser_params *parser)
{
lvtbl->args = vtable_alloc(lvtbl->args);
lvtbl->vars = vtable_alloc(lvtbl->vars);
+ return lvtbl->args;
}
static void
-dyna_pop_gen(struct parser_params *parser)
+dyna_pop_gen(struct parser_params *parser, const struct vtable *lvargs)
{
struct vtable *tmp;
+ while (lvtbl->args != lvargs) {
+ local_pop();
+ }
tmp = lvtbl->args;
lvtbl->args = lvtbl->args->prev;
vtable_free(tmp);
diff --git a/version.h b/version.h
index 4065833c58..c98fb83874 100644
--- a/version.h
+++ b/version.h
@@ -1,5 +1,5 @@
#define RUBY_VERSION "1.9.1"
-#define RUBY_PATCHLEVEL 367
+#define RUBY_PATCHLEVEL 368
#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 9
#define RUBY_VERSION_TEENY 1