ふなばです。

判ったかも。gc_mark() が初期化の済んでない構造体のメンバを参照してしま
うからだと思います (gc.c:550)。


--- struct.c.orig	Wed Feb 18 11:31:16 1998
+++ struct.c	Tue Mar  3 08:04:56 1998
@@ -210,9 +210,9 @@
     else {
 	NEWOBJ(st, struct RStruct);
 	OBJSETUP(st, klass, T_STRUCT);
-	st->len = n;
-	st->ptr = 0;		/* avoid GC crashing  */
+	st->len = 0;		/* avoid GC crashing  */
 	st->ptr = ALLOC_N(VALUE, n);
+	st->len = n;
 	MEMCPY(st->ptr, RARRAY(values)->ptr, VALUE, RARRAY(values)->len);
 	memclear(st->ptr+RARRAY(values)->len, n - RARRAY(values)->len);
 
@@ -318,9 +318,9 @@
 {
     NEWOBJ(st, struct RStruct);
     CLONESETUP(st, s);
-    st->len = RSTRUCT(s)->len;
-    st->ptr = 0;		/* avoid GC crashing  */
+    st->len = 0;		/* avoid GC crashing  */
     st->ptr = ALLOC_N(VALUE, RSTRUCT(s)->len);
+    st->len = RSTRUCT(s)->len;
     MEMCPY(st->ptr, RSTRUCT(s)->ptr, VALUE, st->len);
 
     return (VALUE)st;


GC の振舞いから考えると、len のほうを 0 にしておかないとマズいんですよ
ね。一応、ptr もナルにしておいていいのかもしれないですけど。とりあえず、
うちでは解消されたみたいです。

--Tadayoshi Funaba