From 9963d265ba00e932e53f34189614c2aed9cba024 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 2 Dec 2009 17:57:39 -0500 Subject: [PATCH] vm: fix walker --- vm/callstack.cpp | 26 +++++++++++++++----------- vm/vm.hpp | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/vm/callstack.cpp b/vm/callstack.cpp index 7165539a89..28197db64d 100755 --- a/vm/callstack.cpp +++ b/vm/callstack.cpp @@ -86,6 +86,15 @@ cell factor_vm::frame_executing(stack_frame *frame) return frame_code(frame)->owner; } +cell factor_vm::frame_executing_quot(stack_frame *frame) +{ + tagged executing(frame_executing(frame)); + code_block *compiled = frame_code(frame); + if(!compiled->optimized_p() && executing->type() == WORD_TYPE) + executing = executing.as()->def; + return executing.value(); +} + stack_frame *factor_vm::frame_successor(stack_frame *frame) { check_frame(frame); @@ -133,7 +142,7 @@ struct stack_frame_accumulator { void operator()(stack_frame *frame) { - data_root executing(parent->frame_executing(frame),parent); + data_root executing(parent->frame_executing_quot(frame),parent); data_root scan(parent->frame_scan(frame),parent); frames.add(executing.value()); @@ -166,23 +175,18 @@ stack_frame *factor_vm::innermost_stack_frame(callstack *stack) return frame; } -stack_frame *factor_vm::innermost_stack_frame_quot(callstack *callstack) -{ - stack_frame *inner = innermost_stack_frame(callstack); - tagged(frame_executing(inner)).untag_check(this); - return inner; -} - /* Some primitives implementing a limited form of callstack mutation. Used by the single stepper. */ void factor_vm::primitive_innermost_stack_frame_executing() { - dpush(frame_executing(innermost_stack_frame(untag_check(dpop())))); + stack_frame *frame = innermost_stack_frame(untag_check(dpop())); + dpush(frame_executing_quot(frame)); } void factor_vm::primitive_innermost_stack_frame_scan() { - dpush(frame_scan(innermost_stack_frame_quot(untag_check(dpop())))); + stack_frame *frame = innermost_stack_frame(untag_check(dpop())); + dpush(frame_scan(frame)); } void factor_vm::primitive_set_innermost_stack_frame_quot() @@ -195,7 +199,7 @@ void factor_vm::primitive_set_innermost_stack_frame_quot() jit_compile_quot(quot.value(),true); - stack_frame *inner = innermost_stack_frame_quot(callstack.untagged()); + stack_frame *inner = innermost_stack_frame(callstack.untagged()); cell offset = (char *)FRAME_RETURN_ADDRESS(inner,this) - (char *)inner->xt; inner->xt = quot->xt; FRAME_RETURN_ADDRESS(inner,this) = (char *)quot->xt + offset; diff --git a/vm/vm.hpp b/vm/vm.hpp index d19aa63c19..2d78bae709 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -568,11 +568,11 @@ struct factor_vm code_block *frame_code(stack_frame *frame); code_block_type frame_type(stack_frame *frame); cell frame_executing(stack_frame *frame); + cell frame_executing_quot(stack_frame *frame); stack_frame *frame_successor(stack_frame *frame); cell frame_scan(stack_frame *frame); void primitive_callstack_to_array(); stack_frame *innermost_stack_frame(callstack *stack); - stack_frame *innermost_stack_frame_quot(callstack *callstack); void primitive_innermost_stack_frame_executing(); void primitive_innermost_stack_frame_scan(); void primitive_set_innermost_stack_frame_quot();