From da3de080ee24cc7f75825ad6dbb34243e3528c22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Mon, 31 Aug 2015 02:10:05 +0200 Subject: [PATCH] VM: callback_entry_point() and update() can be removed --- vm/callbacks.cpp | 20 ++++---------------- vm/callbacks.hpp | 6 ------ vm/compaction.cpp | 9 ++++++++- 3 files changed, 12 insertions(+), 23 deletions(-) diff --git a/vm/callbacks.cpp b/vm/callbacks.cpp index 85e74d2457..5a86cbf3f4 100644 --- a/vm/callbacks.cpp +++ b/vm/callbacks.cpp @@ -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(), 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()); diff --git a/vm/callbacks.hpp b/vm/callbacks.hpp index 421c1f07a7..17b9f39760 100644 --- a/vm/callbacks.hpp +++ b/vm/callbacks.hpp @@ -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(); }; } diff --git a/vm/compaction.cpp b/vm/compaction.cpp index 3e606ca52b..25ddfe6f96 100644 --- a/vm/compaction.cpp +++ b/vm/compaction.cpp @@ -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();