まつもと ゆきひろです

In message "[ruby-dev:23960] Re: ruby 1.8.2 preview1"
    on 04/07/23, "U.Nakamura" <usa / garbagecollect.jp> writes:

|以前は、ファイナライザを格納していたArrayの各要素はProcだった
|のに、以下の変更で各要素がNodeになってしまったのが原因です。
|ObjectSpace.each_objectでこのNodeがそのまま出てきてしまうため
|にSEGVとなっています。
|
|どう直すのがいいでしょうね。
|# なかださんはちょうど旅行中なんだよなあ...

原因が分かれば直すのは難しくありません。こんな感じで直るので
はないでしょうか。

--- gc.c	8 Jul 2004 10:27:23 -0000	1.181
+++ gc.c	23 Jul 2004 07:42:20 -0000
@@ -1687,4 +1687,2 @@ undefine_final(os, obj)
 
-#define NODE_FINAL NODE_LIT
-
 /*
@@ -1717,3 +1715,3 @@ define_final(argc, argv, os)
 
-    block = (VALUE)rb_node_newnode(NODE_FINAL, block, ruby_safe_level, 0);
+    block = rb_ary_new3(2, INT2FIX(ruby_safe_level), block);
 
@@ -1770,5 +1768,5 @@ run_final(obj)
 	for (i=0; i<RARRAY(table)->len; i++) {
-	    NODE *final = (NODE *)RARRAY(table)->ptr[i];
-	    args[0] = final->nd_lit;
-	    args[2] = final->nd_nth;
+	    VALUE final = RARRAY(table)->ptr[i];
+	    args[0] = FIX2INT(RARRAY(final)->ptr[0]);
+	    args[2] = RARRAY(final)->ptr[1];
 	    rb_protect((VALUE(*)_((VALUE)))run_single_final, (VALUE)args, &status);