diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-12-09 16:12:57 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-12-09 16:12:57 +0000 |
commit | 770b05dd9b4cbe434c4d29aba28a66ed79e4d0b1 (patch) | |
tree | ab865250173acbe811025c13495aefd2729ad7a0 /parse.y | |
parent | 7cd9a5d363a74800a5043586e7fc908aaa3e6025 (diff) | |
download | ruby-770b05dd9b4cbe434c4d29aba28a66ed79e4d0b1.tar.gz |
* 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.y | 19 |
1 files changed, 15 insertions, 4 deletions
@@ -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) { |