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; 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() void factor_vm::primitive_callback()
{ {
tagged<word> w(dpop()); tagged<word> w(dpop());

View File

@ -41,6 +41,8 @@ struct callback_heap {
void update(code_block *stub); void update(code_block *stub);
code_block *add(cell owner); code_block *add(cell owner);
void update();
code_block *next(code_block *stub) code_block *next(code_block *stub)
{ {
return (code_block *)((cell)stub + stub->size()); 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(); update_code_roots_for_compaction();
callbacks->update();
current_gc->event->ended_compaction(); 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); code->allocator->compact(code_block_updater,code_block_sizer);
update_code_roots_for_compaction(); update_code_roots_for_compaction();
callbacks->update();
} }
void factor_vm::collect_compact(bool trace_contexts_p) void factor_vm::collect_compact(bool trace_contexts_p)

View File

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