まつもと ゆきひろです

In message "[ruby-list:9083] GC touches an array which is failed to be allocated."
    on 98/08/12, SHUDOH Kazuyuki <shudoh / muraoka.info.waseda.ac.jp> writes:

|首藤です。

|手元の ruby を 1.1c1 から 1.1c2 にしたところ、
|多量の配列を扱うスクリプトが
|  `[BUG] Segmentation fault'
|と動かなくなりました。

バグがありました.

|xmalloc() 中で malloc() に失敗すると、gc_gc() と GC を起動するようです。
|このごみ集めの最中に、GC が作りかけの配列オブジェクトを触ります。
|gc.c l.508 gc_mark(*ptr++) と、作りかけの配列の要素を mark しようとして、
|SIGSEGV が発生します。

的確なレポート感謝します.パッチを付けておきます.

|自分の好きにできる、自分好みな言語をお持ちのまつもとさん、
|心底うらやましいです。

でしょぉ? 首藤さんも作りませんか?
# 私の場合,10年以上掛かりましたけど.

--- array.c	1998/07/29 09:50:23	1.1.1.2.2.28
+++ array.c	1998/08/13 05:59:18
@@ -169,2 +169,3 @@
 {
+    int len = 0;
     VALUE size, val;
@@ -188,6 +189,7 @@
 	ary->capa = capa;
-	ary->len = capa;
+	len = capa;
     }
     ary->ptr = ALLOC_N(VALUE, ary->capa);
-    memfill(ary->ptr, ary->len, val);
+    memfill(ary->ptr, len, val);
+    ary->len = len;
     obj_call_init((VALUE)ary);