vm: fix walker

db4
Slava Pestov 2009-12-02 17:57:39 -05:00
parent 2f024f8b5c
commit 9963d265ba
2 changed files with 16 additions and 12 deletions

View File

@ -86,6 +86,15 @@ cell factor_vm::frame_executing(stack_frame *frame)
return frame_code(frame)->owner; return frame_code(frame)->owner;
} }
cell factor_vm::frame_executing_quot(stack_frame *frame)
{
tagged<object> executing(frame_executing(frame));
code_block *compiled = frame_code(frame);
if(!compiled->optimized_p() && executing->type() == WORD_TYPE)
executing = executing.as<word>()->def;
return executing.value();
}
stack_frame *factor_vm::frame_successor(stack_frame *frame) stack_frame *factor_vm::frame_successor(stack_frame *frame)
{ {
check_frame(frame); check_frame(frame);
@ -133,7 +142,7 @@ struct stack_frame_accumulator {
void operator()(stack_frame *frame) void operator()(stack_frame *frame)
{ {
data_root<object> executing(parent->frame_executing(frame),parent); data_root<object> executing(parent->frame_executing_quot(frame),parent);
data_root<object> scan(parent->frame_scan(frame),parent); data_root<object> scan(parent->frame_scan(frame),parent);
frames.add(executing.value()); frames.add(executing.value());
@ -166,23 +175,18 @@ stack_frame *factor_vm::innermost_stack_frame(callstack *stack)
return frame; return frame;
} }
stack_frame *factor_vm::innermost_stack_frame_quot(callstack *callstack)
{
stack_frame *inner = innermost_stack_frame(callstack);
tagged<quotation>(frame_executing(inner)).untag_check(this);
return inner;
}
/* Some primitives implementing a limited form of callstack mutation. /* Some primitives implementing a limited form of callstack mutation.
Used by the single stepper. */ Used by the single stepper. */
void factor_vm::primitive_innermost_stack_frame_executing() void factor_vm::primitive_innermost_stack_frame_executing()
{ {
dpush(frame_executing(innermost_stack_frame(untag_check<callstack>(dpop())))); stack_frame *frame = innermost_stack_frame(untag_check<callstack>(dpop()));
dpush(frame_executing_quot(frame));
} }
void factor_vm::primitive_innermost_stack_frame_scan() void factor_vm::primitive_innermost_stack_frame_scan()
{ {
dpush(frame_scan(innermost_stack_frame_quot(untag_check<callstack>(dpop())))); stack_frame *frame = innermost_stack_frame(untag_check<callstack>(dpop()));
dpush(frame_scan(frame));
} }
void factor_vm::primitive_set_innermost_stack_frame_quot() 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); 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; cell offset = (char *)FRAME_RETURN_ADDRESS(inner,this) - (char *)inner->xt;
inner->xt = quot->xt; inner->xt = quot->xt;
FRAME_RETURN_ADDRESS(inner,this) = (char *)quot->xt + offset; FRAME_RETURN_ADDRESS(inner,this) = (char *)quot->xt + offset;

View File

@ -568,11 +568,11 @@ struct factor_vm
code_block *frame_code(stack_frame *frame); code_block *frame_code(stack_frame *frame);
code_block_type frame_type(stack_frame *frame); code_block_type frame_type(stack_frame *frame);
cell frame_executing(stack_frame *frame); cell frame_executing(stack_frame *frame);
cell frame_executing_quot(stack_frame *frame);
stack_frame *frame_successor(stack_frame *frame); stack_frame *frame_successor(stack_frame *frame);
cell frame_scan(stack_frame *frame); cell frame_scan(stack_frame *frame);
void primitive_callstack_to_array(); void primitive_callstack_to_array();
stack_frame *innermost_stack_frame(callstack *stack); 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_executing();
void primitive_innermost_stack_frame_scan(); void primitive_innermost_stack_frame_scan();
void primitive_set_innermost_stack_frame_quot(); void primitive_set_innermost_stack_frame_quot();