From: matz@... (Yukihiro Matsumoto) Date: 1998-06-12T16:32:27+09:00 Subject: [ruby-dev:2865] Re: experimental release 1.1b9_25 まつもと ゆきひろです In message "[ruby-dev:2862] Re: experimental release 1.1b9_25" on 98/06/12, Yukihiro Matsumoto writes: |まつもと ゆきひろです ||この2つのバグって繰り返してますので, make testに組み込んでくれると嬉し ||いなあ... | |そうですね.で,実装をよく見てみたらこの二つは排反になってい |たので,根本的な見直しが必要そうです.どーしたもんだか. あちこち修正してやっと思った通りに動いているような気がします. irbのような複雑なパターンで試してもらわないと意味ないですが. パッチを出しますので,試してみて下さい. --- eval.c 1998/06/11 10:02:57 1.1.1.2.2.61 +++ eval.c 1998/06/12 07:28:40 @@ -456,3 +456,3 @@ -static struct RVarmap* +static void push_dvar(id, value) @@ -461,6 +461,13 @@ { - struct RVarmap* vars = new_dvar(id, value); + the_dyna_vars = new_dvar(id, value); + if (the_dyna_vars->next && the_dyna_vars->next->id == 0) + the_dyna_vars->next = 0; +} - if (the_dyna_vars) { - vars->next = the_dyna_vars->next; +static void +mark_dvar(vars) + struct RVarmap* vars; +{ + if (!vars) { + the_dyna_vars = new_dvar(0, 0); the_dyna_vars->next = vars; @@ -468,8 +475,4 @@ else { - vars->id = id; - vars->val = 0; the_dyna_vars = vars; } - - return vars; } @@ -504,18 +507,2 @@ -static void -dvar_add_compiling(id) - ID id; -{ - struct RVarmap *vars = the_dyna_vars; - - while (vars) { - if (vars->id == 0) break; - if (vars->id == id) { - return; - } - vars = vars->next; - } - the_dyna_vars = new_dvar(id, 0); -} - VALUE @@ -525,6 +512,2 @@ { - if (id == 0) { - dvar_add_compiling((ID)value); - } - else { struct RVarmap *vars = the_dyna_vars; @@ -539,3 +522,2 @@ push_dvar(id, value); - } return value; @@ -2846,4 +2828,3 @@ the_block = block->prev; - the_dyna_vars = new_dvar(0, 0); - the_dyna_vars->next = block->d_vars; + mark_dvar(block->d_vars); the_class = block->klass; @@ -3020,3 +3001,2 @@ PUSH_BLOCK(0, node); - _block.d_vars = new_dvar(0,0); PUSH_TAG(PROT_NONE); @@ -3821,3 +3801,3 @@ old_d_vars = the_dyna_vars; - the_dyna_vars = data->d_vars; + mark_dvar(data->d_vars); old_vmode = scope_vmode; @@ -3858,2 +3838,4 @@ the_block = old_block; + if (the_dyna_vars->id != 0) + data->d_vars = the_dyna_vars; the_dyna_vars = old_d_vars; --- parse.y 1998/06/11 10:03:05 1.1.1.2.2.39 +++ parse.y 1998/06/12 04:06:49 @@ -238,2 +238,3 @@ program : { + $$ = the_dyna_vars; lex_state = EXPR_BEG; @@ -250,2 +251,3 @@ class_nest = 0; + the_dyna_vars = $1; } @@ -3426,3 +3428,3 @@ if (!dyna_var_defined(id)) { - dyna_var_asgn(0, id); + dyna_var_asgn(id, 0); }