summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-09 16:12:57 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-09 16:12:57 +0000
commit770b05dd9b4cbe434c4d29aba28a66ed79e4d0b1 (patch)
treeab865250173acbe811025c13495aefd2729ad7a0 /parse.y
parent7cd9a5d363a74800a5043586e7fc908aaa3e6025 (diff)
* parse.y (dyna_pop_gen): pop dvars. [ruby-dev:39861]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26055 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y19
1 files changed, 15 insertions, 4 deletions
diff --git a/parse.y b/parse.y
index 8451eb17d5..78e66ee240 100644
--- a/parse.y
+++ b/parse.y
@@ -8892,13 +8892,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);
@@ -8907,6 +8904,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)
{