[#14922] alias $gvar — Koji Arai <JCA02266@...>

新井です。

19 messages 2001/10/14

[#15006] Re: eval.c (rb_stack_check): prohibit recursive raising error — WATANABE Hirofumi <eban@...>

わたなべです。

13 messages 2001/10/26
[#15008] Re: eval.c (rb_stack_check): prohibit recursive raising error — Shugo Maeda <shugo@...> 2001/10/26

前田です。

[ruby-dev:14975] Re: alias var and trace_var

From: nobu.nakada@...
Date: 2001-10-22 07:35:04 UTC
List: ruby-dev #14975
なかだです。

At Mon, 22 Oct 2001 14:49:02 +0900,
K.Kosako <kosako@sofnec.co.jp> wrote:
> <200110220417.NAA08543@zeus.sofnec.co.jp>から
> > ただ、global_variable構造体のメモリ開放漏れがあるようなので、
> > 中田さんの修正の上に、参照カウンタを追加してみました。
> > (これも1.47からの差分です。)

 あぅ。すいません。途中ちらっとObjectにしちゃおうかと思ったん
ですが、入り切らないので止めにしてそのまま忘れてました。

> 未公認パッチではありますが、
> 修正量が多いのでChangeLogを付けておきます。

 どうするのがいいのかな。

 それと新しく変数を作るときにglobal_variableを割り当ててからす
ぐ解放するのも無駄なので、これでどうでしょうか。trace_varもとく
にremovedを立てずに即解放するようにしてみました。

 [ruby-dev:14971]からの差分です。


--- variable.c~	Mon Oct 22 16:12:16 2001
+++ variable.c	Mon Oct 22 16:17:41 2001
@@ -740,7 +740,11 @@ rb_alias_variable(name1, name2)
 	rb_raise(rb_eSecurityError, "Insecure: can't alias global variable");
 
-    entry1 = rb_global_entry(name1);
     entry2 = rb_global_entry(name2);
-    if (entry1->var != entry2->var) {
+    if (!st_lookup(rb_global_tbl, name1, &entry1)) {
+	entry = ALLOC(struct global_entry);
+	st_add_direct(rb_global_tbl, name1, entry1);
+	entry->id = id;
+    }
+    else if (entry1->var != entry2->var) {
 	struct global_variable *var = entry1->var;
 	if (var->block_trace) {
@@ -751,13 +755,16 @@ rb_alias_variable(name1, name2)
 	    struct trace_var *trace = var->trace;
 	    while (trace) {
-		trace->removed = 1;
-		trace = trace->next;
+		struct trace_var *next = trace->next;
+		free(trace);
+		trace = next;
 	    }
-	    remove_trace(var);
 	    free(var);
 	}
-	entry2->var->counter++;
-	entry1->var = entry2->var;
     }
+    else {
+	return;
+    }
+    entry2->var->counter++;
+    entry1->var = entry2->var;
 }
 


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread