まつもと ゆきひろです

ruby-listから持ってきました.

In message "[ruby-list:8291] Re: proc scope"
    on 98/06/11, 石塚圭樹 <keiju / rational.com> 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);
 	    }