summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1999-08-24 08:21:56 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1999-08-24 08:21:56 +0000
commita1b57d0add85a248666fb55c58aa8c0c772136fc (patch)
tree3d30e530b29103ce2884dff782592ddf7292f4df /eval.c
parenta281c996689240dc204f0c534cfe21ee6cbb6863 (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.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/eval.c b/eval.c
index 4f8f9f7c9e..4c2e85f228 100644
--- a/eval.c
+++ b/eval.c
@@ -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);