diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-08-24 08:21:56 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-08-24 08:21:56 +0000 |
commit | a1b57d0add85a248666fb55c58aa8c0c772136fc (patch) | |
tree | 3d30e530b29103ce2884dff782592ddf7292f4df /eval.c | |
parent | a281c996689240dc204f0c534cfe21ee6cbb6863 (diff) |
1.4.1 to be
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@525 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 9 |
1 files changed, 5 insertions, 4 deletions
@@ -5359,7 +5359,7 @@ blk_copy_prev(block) MEMCPY(tmp, block->prev, struct BLOCK, 1); if (tmp->frame.argc > 0) { tmp->frame.argv = ALLOC_N(VALUE, tmp->frame.argc); - MEMCPY(tmp->frame.argv, block->frame.argv, VALUE, tmp->frame.argc); + MEMCPY(tmp->frame.argv, block->prev->frame.argv, VALUE, tmp->frame.argc); } scope_dup(tmp->scope); block->prev = tmp; @@ -6016,8 +6016,8 @@ timeofday() static thread_t main_thread; -#define ADJ(addr) (void*)(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr) -#define STACK(addr) (th->stk_pos<(addr) && (addr)<th->stk_pos+th->stk_len) +#define STACK(addr) (th->stk_pos<(VALUE*)(addr) && (VALUE*)(addr)<th->stk_pos+th->stk_len) +#define ADJ(addr) (void*)(STACK(addr)?(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr):(VALUE*)(addr)) static void thread_mark(th) @@ -6041,6 +6041,7 @@ thread_mark(th) rb_mark_tbl(th->locals); /* mark data in copied stack */ + if (th == curr_thread) return; if (th->status == THREAD_KILLED) return; if (th->stk_len == 0) return; /* stack not active, no need to mark. */ if (th->stk_ptr) { @@ -6054,7 +6055,7 @@ thread_mark(th) frame = ADJ(frame); rb_gc_mark_frame(frame); if (frame->tmp) { - struct FRAME *tmp = ADJ(frame->tmp); + struct FRAME *tmp = frame->tmp; while (tmp && tmp != top_frame) { tmp = ADJ(tmp); |