まつもと ゆきひろです
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);