]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: move the frame_predecessor() method to the code_heap class
authorBjörn Lindqvist <bjourne@gmail.com>
Wed, 12 Aug 2015 18:32:04 +0000 (20:32 +0200)
committerJohn Benediktsson <mrjbq7@gmail.com>
Sat, 15 Aug 2015 03:19:54 +0000 (20:19 -0700)
vm/callstack.cpp
vm/code_heap.cpp
vm/code_heap.hpp
vm/cpu-x86.cpp
vm/vm.hpp

index 46570df6cfc6ae4b6526e2105c7b21ac0feaf8ac..487cb0b413d1f3cc27e8e98a745c47b568ae4eac 100644 (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];
 };
index 84740f5f0b455550b7c96374b8fceddd6e0acf7e..20afd023d460346cd96c315362a811e500cdf49a 100644 (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) {
index 4927a8c774215116dff6bd2edcdbab1cee6fb090..bf1237f81874e071da26fd1828d2e4eb83c04070 100644 (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);
index 5ea316169b89c1a3af8fd66dfccc850da25ade51..9696b52ebebb3548516d13c246a1ba8142521c1c 100644 (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;
index ac9153fb29081cd9451ae6fcd31bf36f3bdf574c..0e1a6e404ae9759f5529665568e4aea8f8ba77ab 100644 (file)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -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();