From fb81dcb863e6a796b113212f6b3e6086b11bffb8 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 6 Jun 2003 11:29:20 +0000 Subject: * eval.c (error_print): needs to be exception proof. * eval.c (error_handle, rb_longjmp): bails out when exception reentered. (ruby-bugs-ja:PR#487), [ruby-core:01119], [ruby-core:01122] * eval.c (Init_Proc): pre-allocates critical error objects. * parse.y (cmd_brace_block, do_block, brace_block): initialize block variables at the beginning of the block. [ruby-talk:72521] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3916 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- parse.y | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index c5f5d8cea5..55b5a5fda2 100644 --- a/parse.y +++ b/parse.y @@ -165,6 +165,7 @@ static ID internal_id(); static struct RVarmap *dyna_push(); static void dyna_pop(); static int dyna_in_block(); +static NODE *dyna_init(); static void top_local_init(); static void top_local_setup(); @@ -645,11 +646,11 @@ cmd_brace_block : tLBRACE_ARG $$ = dyna_push(); $1 = ruby_sourceline; } - opt_block_var + opt_block_var {$$ = ruby_dyna_vars;} compstmt '}' { - $$ = NEW_ITER($3, 0, $4); + $$ = NEW_ITER($3, 0, dyna_init($5, $4)); nd_set_line($$, $1); dyna_pop($2); } @@ -1714,11 +1715,11 @@ do_block : kDO_BLOCK $$ = dyna_push(); $1 = ruby_sourceline; } - opt_block_var + opt_block_var {$$ = ruby_dyna_vars;} compstmt kEND { - $$ = NEW_ITER($3, 0, $4); + $$ = NEW_ITER($3, 0, dyna_init($5, $4)); nd_set_line($$, $1); dyna_pop($2); } @@ -1777,10 +1778,10 @@ brace_block : '{' $$ = dyna_push(); $1 = ruby_sourceline; } - opt_block_var + opt_block_var {$$ = ruby_dyna_vars;} compstmt '}' { - $$ = NEW_ITER($3, 0, $4); + $$ = NEW_ITER($3, 0, dyna_init($5, $4)); nd_set_line($$, $1); dyna_pop($2); } @@ -1789,10 +1790,10 @@ brace_block : '{' $$ = dyna_push(); $1 = ruby_sourceline; } - opt_block_var + opt_block_var {$$ = ruby_dyna_vars;} compstmt kEND { - $$ = NEW_ITER($3, 0, $4); + $$ = NEW_ITER($3, 0, dyna_init($5, $4)); nd_set_line($$, $1); dyna_pop($2); } @@ -5656,6 +5657,21 @@ dyna_in_block() return (lvtbl->dlev > 0); } +static NODE * +dyna_init(node, pre) + NODE *node; + struct RVarmap *pre; +{ + struct RVarmap *post = ruby_dyna_vars; + NODE *var; + + if (!node || !post || pre == post) return node; + for (var = 0; post != pre && post->id; post = post->next) { + var = NEW_DASGN_CURR(post->id, var); + } + return block_append(var, node); +} + int ruby_parser_stack_on_heap() { -- cgit v1.2.3