vm: update callback stub machine code at the end of compaction to prevent it from seeing an inconsistent data stack

db4
Slava Pestov 2009-12-02 03:31:57 -06:00
parent d49c86ba11
commit 147edb1ce9
4 changed files with 21 additions and 1 deletions

View File

@ -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<word> w(dpop());

View File

@ -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());

View File

@ -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)

View File

@ -120,7 +120,6 @@ struct callback_slot_visitor {
void operator()(code_block *stub)
{
visitor->visit_handle(&stub->owner);
callbacks->update(stub);
}
};