VM: move the frame_predecessor() method to the code_heap class
parent
f3c34e44d4
commit
2b1c6ca11a
|
@ -20,7 +20,7 @@ be calling it at all, so we leave it as it is for now. */
|
|||
cell factor_vm::second_from_top_stack_frame(context* ctx) {
|
||||
cell frame_top = ctx->callstack_top;
|
||||
for (cell i = 0; i < 2; ++i) {
|
||||
cell pred = frame_predecessor(frame_top);
|
||||
cell pred = code->frame_predecessor(frame_top);
|
||||
if (pred >= ctx->callstack_bottom)
|
||||
return frame_top;
|
||||
frame_top = pred;
|
||||
|
@ -49,14 +49,6 @@ void factor_vm::primitive_callstack_for() {
|
|||
ctx->replace(capture_callstack(other_ctx));
|
||||
}
|
||||
|
||||
cell factor_vm::frame_predecessor(cell frame_top) {
|
||||
cell addr = *(cell*)frame_top;
|
||||
FACTOR_ASSERT(addr != 0);
|
||||
code_block* owner = code->code_block_for_address(addr);
|
||||
cell frame_size = owner->stack_frame_size_for_address(addr);
|
||||
return frame_top + frame_size;
|
||||
}
|
||||
|
||||
struct stack_frame_in_array {
|
||||
cell cells[3];
|
||||
};
|
||||
|
|
|
@ -83,6 +83,16 @@ code_block* code_heap::code_block_for_address(cell address) {
|
|||
return found_block;
|
||||
}
|
||||
|
||||
cell code_heap::frame_predecessor(cell frame_top) {
|
||||
cell addr = *(cell*)frame_top;
|
||||
FACTOR_ASSERT(seg->in_segment_p(addr));
|
||||
//FACTOR_ASSERT(addr != 0);
|
||||
code_block* owner = code_block_for_address(addr);
|
||||
cell frame_size = owner->stack_frame_size_for_address(addr);
|
||||
return frame_top + frame_size;
|
||||
}
|
||||
|
||||
/* Recomputes the all_blocks set of code blocks */
|
||||
void code_heap::initialize_all_blocks_set() {
|
||||
all_blocks.clear();
|
||||
auto all_blocks_set_inserter = [&](code_block* block, cell size) {
|
||||
|
|
|
@ -47,6 +47,7 @@ struct code_heap {
|
|||
void sweep();
|
||||
|
||||
code_block* code_block_for_address(cell address);
|
||||
cell frame_predecessor(cell frame_top);
|
||||
|
||||
bool safepoint_p(cell addr) {
|
||||
cell page_mask = ~(getpagesize() - 1);
|
||||
|
|
|
@ -17,7 +17,7 @@ void factor_vm::dispatch_signal_handler(cell* sp, cell* pc, cell handler) {
|
|||
cell frame_top = ctx->callstack_top;
|
||||
|
||||
while (frame_top < ctx->callstack_bottom && frame_top < callstack_limit) {
|
||||
frame_top = frame_predecessor(frame_top);
|
||||
frame_top = code->frame_predecessor(frame_top);
|
||||
}
|
||||
|
||||
*sp = frame_top;
|
||||
|
|
|
@ -628,7 +628,6 @@ struct factor_vm {
|
|||
cell capture_callstack(context* ctx);
|
||||
void primitive_callstack();
|
||||
void primitive_callstack_for();
|
||||
cell frame_predecessor(cell frame_top);
|
||||
void primitive_callstack_to_array();
|
||||
void primitive_innermost_stack_frame_executing();
|
||||
void primitive_innermost_stack_frame_scan();
|
||||
|
|
Loading…
Reference in New Issue