NEWHEAP ですが、たとえば、

#define NEWHEAP(cnt) rb_node_newnode(NODE_ALLOCA, 0, (VALUE)parserp->heap, cnt)
#define ADD2HEAP(n, ptr) ((parserp->heap = (n))->u1.node = (ptr))

void *
rb_parser_malloc(struct parser_params *parserp, size_t size)
{
    NODE *n = NEWHEAP(HEAPCNT(1, size));

    return ADD2HEAP(n, xmalloc(size));
}

というところで、xmalloc で GC が起こると、u1 が 0 の状態で
GC が起動してしまうのはよろしくないんじゃないでしょうか。
-- 
[田中 哲][たなか あきら][Tanaka Akira]