https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1709775478
2010-02-11T14:13:22Z
Ruby Issue Tracking System
Ruby master - Bug #2732: rubyspec: ObjectSpace.define_finalizer doesn't call self-referencing finalizers FAILED
https://bugs.ruby-lang.org/issues/2732?journal_id=8248
2010-02-11T14:13:22Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>Category</strong> set to <i>core</i></li><li><strong>Priority</strong> changed from <i>3</i> to <i>5</i></li><li><strong>Target version</strong> set to <i>2.0.0</i></li><li><strong>ruby -v</strong> set to <i>ruby 1.9.2dev (2010-02-10 trunk 26632)</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Bug #2732: rubyspec: ObjectSpace.define_finalizer doesn't call self-referencing finalizers FAILED
https://bugs.ruby-lang.org/issues/2732?journal_id=8253
2010-02-11T19:08:30Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
遠藤です。</p>
<p>2010年2月11日0:29 Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a>:</p>
<blockquote>
<p>以下のようにすると T_ZOMBIE が見えてしまうのはバグでしょうか。</p>
<p>$ ./ruby -ve '<br>
obj = "test"<br>
ObjectSpace.define_finalizer(obj, proc { begin; p obj; ensure; p $!; end })<br>
'<br>
ruby 1.9.2dev (2010-02-10 trunk 26632) [i686-linux]<br>
#<NotImplementedError: method `inspect' called on unexpected<br>
T_ZOMBIE object (0x8248df0 flags=0x3e klass=0x0)></p>
</blockquote>
<p>「T_ZOMBIE が見えたらバグ」というなかださんとささださんの認定を<br>
頂きました。GC に興味ないので自信はないですが、一応調べました。</p>
<p>ruby 終了時に実行されそうな rb_objspace_call_finalizer の中で、<br>
/* run finalizers */ という箇所があり、chain_finalized_object<br>
してから run_final をする、というようなコードがあります。</p>
<p>chain_finalized_object の中では FL_FINALIZE なオブジェクトは無<br>
条件に T_ZOMBIE にされ、dfree が 0 にされます。そして run_final<br>
の中では T_ZOMBIE になったオブジェクトの finalizer を呼んでしま<br>
うようです。(間違ってたらすみません)</p>
<p>問題点 (疑問点) は 2 つあります。</p>
<ol>
<li>
<p>dfree が 0 にされてしまったら、free が呼べなくなる気がする<br>
けれどいいのか? (どうせ終了直前だからいい? MVM になったら<br>
困るかも)</p>
</li>
<li>
<p>対象オブジェクトが強制的に T_ZOMBIE になってから finalizer<br>
が呼ばれるので当然 T_ZOMBIE なオブジェクトが finalizer から<br>
見えるけれど、どうするのが正しい?</p>
</li>
</ol>
<p>GC に興味のある人に考えてほしいです。</p>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #2732: rubyspec: ObjectSpace.define_finalizer doesn't call self-referencing finalizers FAILED
https://bugs.ruby-lang.org/issues/2732?journal_id=8274
2010-02-12T22:32:47Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
遠藤です。</p>
<p>2010年2月11日19:08 Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a>:</p>
<blockquote>
<blockquote>
<p>以下のようにすると T_ZOMBIE が見えてしまうのはバグでしょうか。<br>
<em>snip</em><br>
GC に興味のある人に考えてほしいです。</p>
</blockquote>
</blockquote>
<p>期待していた wanabe さんに「見ない宣言」をされてしまったので、<br>
自分でいい加減に考えてみました。</p>
<p>r18398 で runs finalizers with the object terminated. という<br>
変更が入っていたので、これを revert するような感じでパッチを<br>
書いてみました。T_ZOMBIE は見えなくなったようです。</p>
<p>$ ./ruby -e '<br>
obj = "test"<br>
ObjectSpace.define_finalizer(obj, proc { begin; p obj; ensure; p $!; end })<br>
'</p>
<p>また、make check でも objectspace のエラーが 1 つ増えるだけの<br>
ようです。</p>
<p>けれど、以下の 2 つのよくわからない挙動に悩まされています。</p>
<ol>
<li>対象オブジェクトをトップレベルのローカル変数に代入すると<br>
ファイナライザが実行されない</li>
</ol>
<a name="回収されない"></a>
<h1 >回収されない<a href="#回収されない" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -e '<br>
def foo; proc { p :foo }; end<br>
s = "foo"<br>
ObjectSpace.define_finalizer(s, foo)<br>
'</p>
<a name="ローカル変数に入れなければ回収される"></a>
<h1 >ローカル変数に入れなければ回収される<a href="#ローカル変数に入れなければ回収される" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -e '<br>
def foo; proc { p :foo }; end<br>
ObjectSpace.define_finalizer("foo", foo)<br>
'<br>
:foo</p>
<a name="トップレベルでなければ回収される"></a>
<h1 >トップレベルでなければ回収される<a href="#トップレベルでなければ回収される" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -e '<br>
class C<br>
def self.foo; proc { p :foo }; end<br>
s = "foo"<br>
ObjectSpace.define_finalizer("foo", foo)<br>
end<br>
'</p>
<p>ファイナライザの proc からトップレベルのローカル変数がなぜか<br>
マークされるんでしょうか。<br>
test/ruby/test_objectspace.rb がこの挙動に依存して失敗する<br>
ようです。</p>
<ol start="2">
<li>Enumerator#next を使うと回収されない</li>
</ol>
<a name="回収されない-2"></a>
<h1 >回収されない<a href="#回収されない-2" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -e '<br>
module M<br>
def self.callback<br>
proc { p "finalized" }<br>
end<br>
def self.run<br>
@enum = 1.enum_for(:upto, 3)<br>
@enum.next<br>
ObjectSpace.define_finalizer("foo", callback)<br>
end<br>
end<br>
M.run<br>
'</p>
<a name="next-を使わなければ回収される"></a>
<h1 >next を使わなければ回収される<a href="#next-を使わなければ回収される" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -e '<br>
module M<br>
def self.callback<br>
proc { p "finalized" }<br>
end<br>
def self.run<br>
@enum = 1.enum_for(:upto, 3)<br>
#@enum.next<br>
ObjectSpace.define_finalizer("foo", callback)<br>
end<br>
end<br>
M.run<br>
'<br>
"finalized"</p>
<a name="Enumerator-をインスタンス変数に入れなければ回収される"></a>
<h1 >Enumerator をインスタンス変数に入れなければ回収される<a href="#Enumerator-をインスタンス変数に入れなければ回収される" class="wiki-anchor">¶</a></h1>
<p>$ ./ruby -e '<br>
module M<br>
def self.callback<br>
proc { p "finalized" }<br>
end<br>
def self.run<br>
enum = 1.enum_for(:upto, 3)<br>
enum.next<br>
ObjectSpace.define_finalizer("foo", callback)<br>
end<br>
end<br>
M.run<br>
'<br>
"finalized"</p>
<p>おそらく Fiber のマシンスタックの中に参照があるのではないかと<br>
思いますが、どう対処したものかわかりません。<br>
rubyspec がこの挙動に依存して失敗します (Enumerator の spec と<br>
あわせて実行したときだけ失敗する) 。</p>
<p>もう少し考えてみますが、それでも T_ZOMBIE が見えるよりはいいと<br>
思うので、反対がなければとりあえずコミットしようと思います。</p>
<p>diff --git a/gc.c b/gc.c<br>
index 4cfc23c..32b7436 100644<br>
--- a/gc.c<br>
+++ b/gc.c<br>
@@ -2652,7 +2652,7 @@ static int<br>
chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)<br>
{<br>
RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;</p>
<ul>
<li>if (p->as.basic.flags & FL_FINALIZE) {</li>
</ul>
<ul>
<li>if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {<br>
if (BUILTIN_TYPE(p) != T_ZOMBIE) {<br>
p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */<br>
RDATA(p)->dfree = 0;<br>
@@ -2661,9 +2661,7 @@ chain_finalized_object(st_data_t key, st_data_t<br>
val, st_data_t arg)<br>
*final_list = p;<br>
return ST_CONTINUE;<br>
}</li>
</ul>
<ul>
<li>else {</li>
<li>return ST_DELETE;</li>
<li>}</li>
</ul>
<ul>
<li>return ST_DELETE;<br>
}</li>
</ul>
<p>void<br>
@@ -2681,15 +2679,16 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)</p>
<pre><code> /* run finalizers */
if (finalizer_table) {
</code></pre>
<ul>
<li>finalize_deferred(objspace);</li>
<li>while (finalizer_table->num_entries > 0) {</li>
</ul>
<ul>
<li>do {</li>
<li>
<pre><code> finalize_deferred(objspace);
</code></pre>
</li>
<li>
<pre><code> mark_tbl(objspace, finalizer_table, 0);
st_foreach(finalizer_table, chain_finalized_object,
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> (st_data_t)&final_list);
</code></pre>
</li>
<li>
<pre><code> if (!(p = final_list)) break;
</code></pre>
</li>
<li>
<pre><code> do {
</code></pre>
</li>
<li>
<pre><code> final_list = p->as.free.next;
</code></pre>
</li>
<li>
<pre><code> run_final(objspace, (VALUE)p);
</code></pre>
</li>
<li>
<pre><code> } while ((p = final_list) != 0);
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> (st_data_t)&deferred_final_list);
</code></pre>
</li>
<li>} while (deferred_final_list);</li>
<li>if (finalizer_table->num_entries) {</li>
<li>
<pre><code> rb_warning("%d finalizer%s left not-invoked due to self-reference",
</code></pre>
</li>
<li>
<pre><code> finalizer_table->num_entries,
</code></pre>
</li>
<li>
<pre><code> finalizer_table->num_entries > 1 ? "s" : "");
</code></pre>
}<br>
st_free_table(finalizer_table);<br>
finalizer_table = 0;</li>
</ul>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #2732: rubyspec: ObjectSpace.define_finalizer doesn't call self-referencing finalizers FAILED
https://bugs.ruby-lang.org/issues/2732?journal_id=8278
2010-02-13T10:32:12Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
遠藤です。</p>
<p>2010年2月12日22:32 Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a>:</p>
<blockquote>
<p>2010年2月11日19:08 Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a>:</p>
<blockquote>
<blockquote>
<p>以下のようにすると T_ZOMBIE が見えてしまうのはバグでしょうか。<br>
<em>snip</em><br>
もう少し考えてみますが、それでも T_ZOMBIE が見えるよりはいいと<br>
思うので、反対がなければとりあえずコミットしようと思います。</p>
</blockquote>
</blockquote>
</blockquote>
<p>誰にも相手にされず寂しい限りですが、続報です。</p>
<p>このパッチをあてると、Enumerator#next と Tempfile を組み合わせた時に<br>
Tempfile が消されなくなりました。これは実用上弊害がありそうです。</p>
<p>require "tempfile"<br>
e = 1.enum_for(:upto, 3)<br>
e.next<br>
t = Tempfile.new("foo")<br>
p t.path</p>
<p>これ自体はひょっとしたらバグなのかもしれませんが、一般的に言って、<br>
conservative GC だとファイナライザが予期せずオブジェクト自体に参照を<br>
持ってしまう可能性があるので、self-referencial なファイナライザを<br>
実行しないという方針だと、ファイナライザが不可解に実行されない事態の<br>
発生を避けられないという結論に至りました。</p>
<p>終了時には、対象オブジェクトを回収する前に必ずファイナライザを走らせる<br>
というのはどうでしょうか。一応、make check と make test-rubyspec が<br>
完走することは確かめています。</p>
<p>反対がなければコミットして、rubyspec 側も修正します。</p>
<p>diff --git a/gc.c b/gc.c<br>
index 4cfc23c..759b14e 100644<br>
--- a/gc.c<br>
+++ b/gc.c<br>
@@ -2588,11 +2588,29 @@ run_single_final(VALUE arg)<br>
}</p>
<p>static void<br>
-run_final(rb_objspace_t *objspace, VALUE obj)<br>
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE objid, VALUE table)<br>
{<br>
long i;<br>
int status;</p>
<ul>
<li>VALUE args[3], table, objid;</li>
</ul>
<ul>
<li>VALUE args[3];</li>
<li>
<li>args[1] = 0;</li>
<li>args[2] = (VALUE)rb_safe_level();</li>
<li>if (!args[1] && RARRAY_LEN(table) > 0) {</li>
<li>
<pre><code> args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
</code></pre>
</li>
<li>}</li>
<li>for (i=0; i<RARRAY_LEN(table); i++) {</li>
<li>
<pre><code> VALUE final = RARRAY_PTR(table)[i];
</code></pre>
</li>
<li>
<pre><code> args[0] = RARRAY_PTR(final)[1];
</code></pre>
</li>
<li>
<pre><code> args[2] = FIX2INT(RARRAY_PTR(final)[0]);
</code></pre>
</li>
<li>
<pre><code> rb_protect(run_single_final, (VALUE)args, &status);
</code></pre>
</li>
<li>}<br>
+}</li>
<li>
</ul>
<p>+static void<br>
+run_final(rb_objspace_t *objspace, VALUE obj)<br>
+{</p>
<ul>
<li>
<p>VALUE table, objid;<br>
RUBY_DATA_FUNC free_func = 0;</p>
<p>objid = rb_obj_id(obj); /* make obj into id */<br>
@@ -2610,17 +2628,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)</p>
<p>if (finalizer_table &&<br>
st_delete(finalizer_table, (st_data_t*)&obj, &table)) {</p>
</li>
</ul>
<ul>
<li>args[1] = 0;</li>
<li>args[2] = (VALUE)rb_safe_level();</li>
<li>if (!args[1] && RARRAY_LEN(table) > 0) {</li>
<li>
<pre><code> args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
</code></pre>
</li>
<li>}</li>
<li>for (i=0; i<RARRAY_LEN(table); i++) {</li>
<li>
<pre><code> VALUE final = RARRAY_PTR(table)[i];
</code></pre>
</li>
<li>
<pre><code> args[0] = RARRAY_PTR(final)[1];
</code></pre>
</li>
<li>
<pre><code> args[2] = FIX2INT(RARRAY_PTR(final)[0]);
</code></pre>
</li>
<li>
<pre><code> rb_protect(run_single_final, (VALUE)args, &status);
</code></pre>
</li>
<li>}</li>
</ul>
<ul>
<li>run_finalizer(objspace, obj, objid, table);<br>
}<br>
}</li>
</ul>
<p>@@ -2652,18 +2660,33 @@ static int<br>
chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)<br>
{<br>
RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;</p>
<ul>
<li>if (p->as.basic.flags & FL_FINALIZE) {</li>
</ul>
<ul>
<li>if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {<br>
if (BUILTIN_TYPE(p) != T_ZOMBIE) {<br>
p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */<br>
RDATA(p)->dfree = 0;<br>
}<br>
p->as.free.next = *final_list;<br>
*final_list = p;</li>
</ul>
<ul>
<li>return ST_CONTINUE;</li>
<li>}</li>
<li>else {</li>
<li>return ST_DELETE;<br>
}</li>
</ul>
<ul>
<li>return ST_CONTINUE;<br>
+}</li>
<li>
</ul>
<p>+struct force_finalize_list {</p>
<ul>
<li>VALUE obj;</li>
<li>VALUE table;</li>
<li>struct force_finalize_list *next;<br>
+};</li>
<li>
</ul>
<p>+static int<br>
+force_chain_object(st_data_t key, st_data_t val, st_data_t arg)<br>
+{</p>
<ul>
<li>struct force_finalize_list **prev = (struct force_finalize_list **)arg;</li>
<li>struct force_finalize_list *curr = ALLOC(struct force_finalize_list);</li>
<li>curr->obj = key;</li>
<li>curr->table = val;</li>
<li>curr->next = *prev;</li>
<li>*prev = curr;</li>
<li>return ST_DELETE;<br>
}</li>
</ul>
<p>void<br>
@@ -2681,15 +2704,22 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)</p>
<pre><code> /* run finalizers */
if (finalizer_table) {
</code></pre>
<ul>
<li>finalize_deferred(objspace);</li>
<li>while (finalizer_table->num_entries > 0) {</li>
</ul>
<ul>
<li>do {</li>
<li>
<pre><code> finalize_deferred(objspace);
</code></pre>
</li>
<li>
<pre><code> mark_tbl(objspace, finalizer_table, 0);
st_foreach(finalizer_table, chain_finalized_object,
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> (st_data_t)&final_list);
</code></pre>
</li>
<li>
<pre><code> if (!(p = final_list)) break;
</code></pre>
</li>
<li>
<pre><code> do {
</code></pre>
</li>
<li>
<pre><code> final_list = p->as.free.next;
</code></pre>
</li>
<li>
<pre><code> run_final(objspace, (VALUE)p);
</code></pre>
</li>
<li>
<pre><code> } while ((p = final_list) != 0);
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> (st_data_t)&deferred_final_list);
</code></pre>
</li>
<li>} while (deferred_final_list);</li>
<li>/* force to run finalizer */</li>
<li>while (finalizer_table->num_entries) {</li>
<li>
<pre><code> struct force_finalize_list *list = 0;
</code></pre>
</li>
<li>
<pre><code> st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
</code></pre>
</li>
<li>
<pre><code> while (list) {
</code></pre>
</li>
<li>
<pre><code> struct force_finalize_list *curr = list;
</code></pre>
</li>
<li>
<pre><code> run_finalizer(objspace, curr->obj, rb_obj_id(curr->obj), curr->table);
</code></pre>
</li>
<li>
<pre><code> list = curr->next;
</code></pre>
</li>
<li>
<pre><code> xfree(curr);
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
}<br>
st_free_table(finalizer_table);<br>
finalizer_table = 0;</li>
</ul>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #2732: rubyspec: ObjectSpace.define_finalizer doesn't call self-referencing finalizers FAILED
https://bugs.ruby-lang.org/issues/2732?journal_id=8279
2010-02-13T11:19:13Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
遠藤です。</p>
<p>2010年2月13日10:40 Tanaka Akira <a href="mailto:akr@fsij.org" class="email">akr@fsij.org</a>:</p>
<blockquote>
<p>2010年2月13日10:31 Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a>:</p>
<blockquote>
<p>これ自体はひょっとしたらバグなのかもしれませんが、一般的に言って、<br>
conservative GC だとファイナライザが予期せずオブジェクト自体に参照を<br>
持ってしまう可能性があるので、self-referencial なファイナライザを<br>
実行しないという方針だと、ファイナライザが不可解に実行されない事態の<br>
発生を避けられないという結論に至りました。</p>
</blockquote>
<p>そういえば、1.8 の tempfile.rb は、ファイナライザとして<br>
Proc じゃなくて普通のオブジェクトを使うようにして、<br>
変な参照を持たないようにしてあるんですが、<br>
そうするのは関係ありますかね。</p>
</blockquote>
<p><a href="https://blade.ruby-lang.org/ruby-dev/40409">[ruby-dev:40409]</a> のパッチ + 単純に Tempfile::Remover を復活させてみた<br>
だけでは、やっぱり消えないようでした。どこかで不要な mark をしてるの<br>
かなあ。</p>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #2732: rubyspec: ObjectSpace.define_finalizer doesn't call self-referencing finalizers FAILED
https://bugs.ruby-lang.org/issues/2732?journal_id=8318
2010-02-16T20:40:01Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
遠藤です。</p>
<p>2010年2月16日11:25 KOSAKI Motohiro <a href="mailto:kosaki.motohiro@jp.fujitsu.com" class="email">kosaki.motohiro@jp.fujitsu.com</a>:</p>
<blockquote>
<p>忘れそうになるので、IRCの議論を転記</p>
<ol>
<li>objectはreferenceがある限り回収されない</li>
<li>finalizerはobjectが回収される時に呼ばれる</li>
<li>プロセス終了時はfinalizerが絶対呼ばれる</li>
</ol>
<p>の1,2と3が両立不可能という仕様バグの話だと思っています。</p>
</blockquote>
<p>はい。</p>
<blockquote>
<p>プロセス終了時に<br>
まだ参照されているオブジェクトは下記A)、B)どちらでもルール違反</p>
<p>A) 参照されていても強制的にファイナライザを呼ぶ<br>
(現状こちら。かつファイナライザ呼ぶ直前に)<br>
B) プロセス終了時にまだ参照されているオブジェクトはファイナライザ呼ばない<br>
(<a href="https://blade.ruby-lang.org/ruby-dev/40410">[ruby-dev:40410]</a>のようにtempfileが消えなくなる)</p>
<p>ので、仕様明確化が必要でしょう。</p>
</blockquote>
<ol>
<li>object は reference がある限り回収されない</li>
<li>finalizer は object が回収される時 <em>またはプロセス終了時</em> に呼ばれる</li>
</ol>
<p>という仕様でいいと思います。抽象的に言うなら、「それより先に object に<br>
対する操作を行う機会がなくなる時点」とかですかね。「それより先」の定義が<br>
微妙ですが。</p>
<p>そのようにするパッチが <a href="https://blade.ruby-lang.org/ruby-dev/40410">[ruby-dev:40410]</a> です。大きな反対はなかったので<br>
一旦コミットします。問題が起きたら言ってください。</p>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #2732: rubyspec: ObjectSpace.define_finalizer doesn't call self-referencing finalizers FAILED
https://bugs.ruby-lang.org/issues/2732?journal_id=8319
2010-02-16T21:37:05Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>=begin<br>
This issue was solved with changeset r26684.<br>
Yusuke, thank you for reporting this issue.<br>
Your contribution to Ruby is greatly appreciated.<br>
May Ruby be with you.</p>
<p>=end</p>