こんにちは、なかむら(う)です。

In message "[ruby-dev:36735] Re: Assertion failed in array.c on mswin32 Ruby (trunk)"
    on Oct.15,2008 12:47:40, <usa / garbagecollect.jp> wrote:
> で、なんとなく以下のパッチで問題は回避できるような気がするん
> ですが、なんでこれで直るのかは真面目に考えてないのでわかりま
> せん。
> # RESIZE_CAPA()の中でARY_SET_LEN()するパスがあるのもどうも気
> # にかかるんですが...

直感に頼らないで真面目に原因を考えてみたところ、RESIZE_CAPA()
の中で、capacityがlenより短い時にas.aryの終端を越えてコピーを
してしまうことがある、ということのようです。
例えば以下のパッチのようにすることが考えられますが、capacity
がlenより短い場合に何が起こるべきかは考えないといけないように
思います([BUG]とか)。

Index: array.c =================================================================== --- array.c (revision 19786) +++ array.c (working copy) @@ -145,9 +145,9 @@ if (!ARY_EMBED_P(ary)) { long len = RARRAY_LEN(ary); VALUE *ptr = RARRAY_PTR(ary); - MEMCPY(RARRAY(ary)->as.ary, ptr, VALUE, len); + MEMCPY(RARRAY(ary)->as.ary, ptr, VALUE, len > capacity ? capacity : len); FL_SET_EMBED(ary); - ARY_SET_LEN(ary, len); + if (len > capacity) ARY_SET_LEN(ary, capacity); xfree(ptr); } }
それでは。 -- U.Nakamura <usa / garbagecollect.jp>