Revision: 1281 http://trac.macosforge.org/projects/ruby/changeset/1281 Author: vincent.isambart@gmail.com Date: 2009-03-31 04:05:18 -0700 (Tue, 31 Mar 2009) Log Message: ----------- x=42; 1.times { 1.times { p x } } should now work Modified Paths: -------------- MacRuby/branches/experimental/parse.y Modified: MacRuby/branches/experimental/parse.y =================================================================== --- MacRuby/branches/experimental/parse.y 2009-03-31 09:55:27 UTC (rev 1280) +++ MacRuby/branches/experimental/parse.y 2009-03-31 11:05:18 UTC (rev 1281) @@ -8899,12 +8899,41 @@ dyna_pop_gen(struct parser_params *parser) { struct vtable *tmp; + struct vtable *prev_vars = NULL, *prev_args = NULL; + prev_vars = lvtbl->vars->prev; + prev_args = lvtbl->args->prev; + + if ((prev_vars != NULL) && (prev_vars->prev != NULL)) { + // copy vars in the outer block if they are not already there + // and if they are in an even outer scope + int i; + for (i = 0; i < lvtbl->vars->pos; ++i) { + struct vtable *pprev_vars = NULL, *pprev_args = NULL; + ID id = lvtbl->vars->tbl[i]; + + if (vtable_included(prev_vars, id) || vtable_included(prev_args, id)) { + continue; + } + + pprev_vars = prev_vars->prev; + pprev_args = prev_args->prev; + while (pprev_vars != NULL) { + if (vtable_included(pprev_vars, id) || vtable_included(pprev_args, id)) { + vtable_add(prev_vars, id); + break; + } + pprev_vars = pprev_vars->prev; + pprev_args = pprev_args->prev; + } + } + } + tmp = lvtbl->args; - GC_WB(&lvtbl->args, lvtbl->args->prev); + GC_WB(&lvtbl->args, prev_args); vtable_free(tmp); tmp = lvtbl->vars; - GC_WB(&lvtbl->vars, lvtbl->vars->prev); + GC_WB(&lvtbl->vars, prev_vars); vtable_free(tmp); }
participants (1)
-
source_changes@macosforge.org