vm: fix walker
parent
2f024f8b5c
commit
9963d265ba
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue