From: Paul Brannan Date: 2004-02-10T03:57:08+09:00 Subject: Re: [BUG] unknown node type 0 On Mon, Feb 09, 2004 at 02:39:35AM +0900, ts wrote: > Well, if it's the same problem the modification is > > Thu Sep 4 00:06:14 2003 Yukihiro Matsumoto > > * eval.c (mark_frame_adj): need to adjust argv pointer if using > system's alloca. [ruby-core:01503] > > Compare thread_mark() in 1.6 and 1.8.1 Does that mean there is no patch? Is the following the right patch? (I had to make a change to mark_frame_adj, since there is no node member in FRAME in 1.6). --- ruby-1.6.8/eval.c Mon Dec 16 02:34:22 2002 +++ ruby-1.6.8-pb1/eval.c Mon Feb 9 13:55:38 2004 @@ -7299,6 +7299,25 @@ #define STACK(addr) (th->stk_pos<(VALUE*)(addr) && (VALUE*)(addr)stk_pos+th->stk_len) #define ADJ(addr) (void*)(STACK(addr)?(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr):(VALUE*)(addr)) +#ifdef C_ALLOCA +# define MARK_FRAME_ADJ(f) rb_gc_mark_frame(f) +#else +# define MARK_FRAME_ADJ(f) mark_frame_adj(f, th) +static void +mark_frame_adj(frame, th) + struct FRAME *frame; + rb_thread_t th; +{ + if (frame->flags & FRAME_MALLOC) { + rb_gc_mark_locations(frame->argv, frame->argv+frame->argc); + } + else { + VALUE *start = ADJ(frame->argv); + rb_gc_mark_locations(start, start+frame->argc); + } + rb_gc_mark((VALUE)frame->cbase); +} +#endif static void thread_mark(th) @@ -7335,13 +7354,13 @@ frame = th->frame; while (frame && frame != top_frame) { frame = ADJ(frame); - rb_gc_mark_frame(frame); + MARK_FRAME_ADJ(frame); if (frame->tmp) { struct FRAME *tmp = frame->tmp; while (tmp && tmp != top_frame) { tmp = ADJ(tmp); - rb_gc_mark_frame(tmp); + MARK_FRAME_ADJ(tmp); tmp = tmp->prev; } } @@ -7350,7 +7369,7 @@ block = th->block; while (block) { block = ADJ(block); - rb_gc_mark_frame(&block->frame); + MARK_FRAME_ADJ(&block->frame); block = block->prev; } }