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;
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];
};
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) {
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);
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;
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();