ふなばです。
判ったかも。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