diff --git a/vm/callbacks.cpp b/vm/callbacks.cpp index 36efbad450..e0ebbd1402 100644 --- a/vm/callbacks.cpp +++ b/vm/callbacks.cpp @@ -62,6 +62,23 @@ code_block *callback_heap::add(cell owner) return stub; } +struct callback_updater { + callback_heap *callbacks; + + explicit callback_updater(callback_heap *callbacks_) : callbacks(callbacks_) {} + + void operator()(code_block *stub) + { + callbacks->update(stub); + } +}; + +void callback_heap::update() +{ + callback_updater updater(this); + each_callback(updater); +} + void factor_vm::primitive_callback() { tagged w(dpop()); diff --git a/vm/callbacks.hpp b/vm/callbacks.hpp index c5900f4618..8662d3ccbb 100644 --- a/vm/callbacks.hpp +++ b/vm/callbacks.hpp @@ -41,6 +41,8 @@ struct callback_heap { void update(code_block *stub); code_block *add(cell owner); + void update(); + code_block *next(code_block *stub) { return (code_block *)((cell)stub + stub->size()); diff --git a/vm/compaction.cpp b/vm/compaction.cpp index 999e909fa1..ecc3eb8bba 100644 --- a/vm/compaction.cpp +++ b/vm/compaction.cpp @@ -206,6 +206,7 @@ void factor_vm::collect_compact_impl(bool trace_contexts_p) } update_code_roots_for_compaction(); + callbacks->update(); current_gc->event->ended_compaction(); } @@ -252,6 +253,7 @@ void factor_vm::collect_compact_code_impl(bool trace_contexts_p) code->allocator->compact(code_block_updater,code_block_sizer); update_code_roots_for_compaction(); + callbacks->update(); } void factor_vm::collect_compact(bool trace_contexts_p) diff --git a/vm/slot_visitor.hpp b/vm/slot_visitor.hpp index a423d74a54..dab9e22a1f 100644 --- a/vm/slot_visitor.hpp +++ b/vm/slot_visitor.hpp @@ -120,7 +120,6 @@ struct callback_slot_visitor { void operator()(code_block *stub) { visitor->visit_handle(&stub->owner); - callbacks->update(stub); } };