]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: callback_entry_point() and update() can be removed
authorBjörn Lindqvist <bjourne@gmail.com>
Mon, 31 Aug 2015 00:10:05 +0000 (02:10 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Wed, 2 Sep 2015 19:54:39 +0000 (21:54 +0200)
vm/callbacks.cpp
vm/callbacks.hpp
vm/compaction.cpp

index 85e74d24579c76edebf8f5b776bf6b806f702299..5a86cbf3f46ac4dcab7fcd53c26f2adb22c6b132 100644 (file)
@@ -16,7 +16,6 @@ callback_heap::~callback_heap() {
   allocator = NULL;
   delete seg;
   seg = NULL;
-
 }
 
 void factor_vm::init_callbacks(cell size) {
@@ -48,12 +47,12 @@ void callback_heap::store_callback_operand(code_block* stub, cell index,
 }
 
 void callback_heap::update(code_block* stub) {
-  store_callback_operand(stub, 1, callback_entry_point(stub));
+  word* w = (word*)UNTAG(stub->owner);
+  store_callback_operand(stub, 1, w->entry_point);
   stub->flush_icache();
 }
 
 code_block* callback_heap::add(cell owner, cell return_rewind) {
-
   /* code_template is a 2-tuple where the first element contains the
      relocations and the second a byte array of compiled assembly
      code. The code assumes that there are four relocations on x86 and
@@ -69,7 +68,6 @@ code_block* callback_heap::add(cell owner, cell return_rewind) {
                           false_object,
                           false_object);
   }
-
   stub->header = bump & ~7;
   stub->owner = owner;
   stub->parameters = false_object;
@@ -77,11 +75,9 @@ code_block* callback_heap::add(cell owner, cell return_rewind) {
 
   memcpy((void*)stub->entry_point(), insns->data<void>(), size);
 
-  /* Store VM pointer */
+  /* Store VM pointer in two relocations. */
   store_callback_operand(stub, 0, (cell)parent);
-
-  /* Store VM pointer */
-  store_callback_operand(stub, 2, (cell) parent);
+  store_callback_operand(stub, 2, (cell)parent);
 
   /* On x86, the RET instruction takes an argument which depends on
      the callback's calling convention */
@@ -89,17 +85,9 @@ code_block* callback_heap::add(cell owner, cell return_rewind) {
     store_callback_operand(stub, 3, return_rewind);
 
   update(stub);
-
   return stub;
 }
 
-void callback_heap::update() {
-  auto callback_updater = [&](code_block* stub, cell size) {
-    update(stub);
-  };
-  allocator->iterate(callback_updater);
-}
-
 /* Allocates memory (add(), allot_alien())*/
 void factor_vm::primitive_callback() {
   cell return_rewind = to_cell(ctx->pop());
index 421c1f07a719e73ba009e3e85f655aed4985a016..17b9f397604c940e480a0f54cb552b528e4fd143 100644 (file)
@@ -31,17 +31,11 @@ struct callback_heap {
   callback_heap(cell size, factor_vm* parent);
   ~callback_heap();
 
-  cell callback_entry_point(code_block* stub) {
-    word* w = (word*)UNTAG(stub->owner);
-    return w->entry_point;
-  }
-
   bool return_takes_param_p();
   instruction_operand callback_operand(code_block* stub, cell index);
   void store_callback_operand(code_block* stub, cell index, cell value);
   void update(code_block* stub);
   code_block* add(cell owner, cell return_rewind);
-  void update();
 };
 
 }
index 3e606ca52b59e872f42252ec5b8eea47c19012b1..25ddfe6f966d8ad8447d0044bef881a129aa7022 100644 (file)
@@ -131,7 +131,14 @@ void factor_vm::collect_compact_impl() {
   }
 
   update_code_roots_for_compaction();
-  callbacks->update();
+
+  /* Each callback has a relocation with a pointer to a code block in
+     the code heap. Since the code heap has now been compacted, those
+     pointers are invalid and we need to update them. */
+  auto callback_updater = [&](code_block* stub, cell size) {
+    callbacks->update(stub);
+  };
+  callbacks->allocator->iterate(callback_updater);
 
   code->initialize_all_blocks_set();