まつもと ゆきひろです

In message "[ruby-dev:11852] local variable extent problem?"
    on 00/12/26, Tanaka Akira <akr / m17n.org> writes:
|
|どうも、Ruby のバグのような気がするものを見つけたのですが、もしかした
|らそうでないような気もするので、教えて下さい。

バグです。ブロックが多重化されていた場合に必要以上にデータを
解放していました。パッチを用意しました。


Tue Dec 26 16:53:55 2000  Yukihiro Matsumoto  <matz / ruby-lang.org>

	* eval.c (rb_f_binding): recycling should be stopped for outer
	  scope too.

	* eval.c (proc_new): ditto.

--- eval.c	2000/12/25 07:55:04	1.1.1.1
+++ eval.c	2000/12/26 07:55:00
@@ -5982,3 +5982,3 @@
 {
-    struct BLOCK *data;
+    struct BLOCK *data, *p;
     struct RVarmap *vars;
@@ -6005,5 +6005,7 @@
 
-    for (vars = data->dyna_vars; vars; vars = vars->next) {
-	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
-	FL_SET(vars, DVAR_DONT_RECYCLE);
+    for (p = data; p; p = p->prev) {
+	for (vars = p->dyna_vars; vars; vars = vars->next) {
+	    if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
+	    FL_SET(vars, DVAR_DONT_RECYCLE);
+	}
     }
@@ -6065,3 +6067,3 @@
     volatile VALUE proc;
-    struct BLOCK *data;
+    struct BLOCK *data, *p;
     struct RVarmap *vars;
@@ -6087,5 +6089,7 @@
 
-    for (vars = data->dyna_vars; vars; vars = vars->next) {
-	if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
-	FL_SET(vars, DVAR_DONT_RECYCLE);
+    for (p = data; p; p = p->prev) {
+	for (vars = p->dyna_vars; vars; vars = vars->next) {
+	    if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
+	    FL_SET(vars, DVAR_DONT_RECYCLE);
+	}
     }