From: matz@... (Yukihiro Matsumoto) Date: 1998-06-11T18:44:39+09:00 Subject: [ruby-dev:2853] Re: proc scope まつもと ゆきひろです ruby-listから持ってきました. In message "[ruby-list:8291] Re: proc scope" on 98/06/11, 石塚圭樹 writes: |けいじゅ@日本ラショナルソフトウェアです. |ということでバグ報告: | | def foo (a); p a; end | p = proc{proc{}}.call | eval "(0..9).each{|i| x[i] = proc{foo i}}", p | x[4].call | |が思った通りの動作をしていません(;_; すいません.次のパッチはどうでしょう? いちおう make test くらいは通りますが. diff -w -u -1 -r1.1.1.2.2.60 eval.c --- eval.c 1998/06/02 10:05:18 1.1.1.2.2.60 +++ eval.c 1998/06/11 09:34:45 @@ -452,2 +452,13 @@ vars->next = the_dyna_vars; + + return vars; +} + +static struct RVarmap* +push_dvar(id, value) + ID id; + VALUE value; +{ + struct RVarmap* vars = new_dvar(id, value); + if (the_dyna_vars) { @@ -493,2 +504,18 @@ +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 @@ -498,2 +525,6 @@ { + if (id == 0) { + dvar_add_compiling((ID)value); + } + else { struct RVarmap *vars = the_dyna_vars; @@ -507,3 +538,4 @@ } - new_dvar(id, value); + push_dvar(id, value); + } return value; --- parse.y 1998/05/27 09:31:52 1.1.1.2.2.38 +++ parse.y 1998/06/11 09:29:02 @@ -3425,3 +3426,3 @@ if (!dyna_var_defined(id)) { - dyna_var_asgn(id, 0); + dyna_var_asgn(0, id); }