まつもと ゆきひろです

In message "[ruby-dev:2862] Re: experimental release 1.1b9_25"
    on 98/06/12, Yukihiro Matsumoto <matz / netlab.co.jp> 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		:  {
+		        $<vars>$ = the_dyna_vars;
 			lex_state = EXPR_BEG;
@@ -250,2 +251,3 @@
 			class_nest = 0;
+		        the_dyna_vars = $<vars>1;
 		    }
@@ -3426,3 +3428,3 @@
 	    if (!dyna_var_defined(id)) {
-		dyna_var_asgn(0, id);
+		dyna_var_asgn(id, 0);
 	    }