summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-05-03 09:12:36 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-05-03 09:12:36 +0000
commit4fcb855ff382db0f0f8d849b5af48a652bd3494a (patch)
tree5378dfdbb0b91c921215b5ee16bea3da5e5b5e14
parentb67fbc0789c5f9f3c84406a95ca8a0ccc2d77cdc (diff)
merges r26055 from trunk into ruby_1_9_1. This fixies #3164.
-- * parse.y (dyna_pop_gen): pop dvars. [ruby-dev:39861] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@27596 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--bootstraptest/test_syntax.rb7
-rw-r--r--parse.y19
3 files changed, 26 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 27974dd0d0..43953b499b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Thu Dec 10 01:12:55 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (dyna_pop_gen): pop dvars. [ruby-dev:39861]
+
Sat Dec 5 13:19:29 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* configure.in: default ac_cv_prog_CC to CC.
diff --git a/bootstraptest/test_syntax.rb b/bootstraptest/test_syntax.rb
index 2e8639b3f4..619a4cbdb1 100644
--- a/bootstraptest/test_syntax.rb
+++ b/bootstraptest/test_syntax.rb
@@ -877,3 +877,10 @@ assert_normal_exit %q{
end
end
}, bug2415
+
+assert_normal_exit %q{
+ a {
+ b {|c.d| }
+ e
+ }
+}, '[ruby-dev:39861]'
diff --git a/parse.y b/parse.y
index 62c23ad87e..b200d5c7ce 100644
--- a/parse.y
+++ b/parse.y
@@ -8951,13 +8951,10 @@ dyna_push_gen(struct parser_params *parser)
}
static void
-dyna_pop_gen(struct parser_params *parser, const struct vtable *lvargs)
+dyna_pop_1(struct parser_params *parser)
{
struct vtable *tmp;
- while (lvtbl->args != lvargs) {
- local_pop();
- }
tmp = lvtbl->args;
lvtbl->args = lvtbl->args->prev;
vtable_free(tmp);
@@ -8966,6 +8963,20 @@ dyna_pop_gen(struct parser_params *parser, const struct vtable *lvargs)
vtable_free(tmp);
}
+static void
+dyna_pop_gen(struct parser_params *parser, const struct vtable *lvargs)
+{
+ while (lvtbl->args != lvargs) {
+ dyna_pop_1(parser);
+ if (!lvtbl->args) {
+ struct local_vars *local = lvtbl->prev;
+ xfree(lvtbl);
+ lvtbl = local;
+ }
+ }
+ dyna_pop_1(parser);
+}
+
static int
dyna_in_block_gen(struct parser_params *parser)
{