VM: move the frame_predecessor() method to the code_heap class

db4
Björn Lindqvist 2015-08-12 20:32:04 +02:00 committed by John Benediktsson
parent f3c34e44d4
commit 2b1c6ca11a
5 changed files with 13 additions and 11 deletions

View File

@ -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];
};

View File

@ -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) {

View File

@ -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);

View File

@ -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;

View File

@ -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();