vm: update callback stub machine code at the end of compaction to prevent it from seeing an inconsistent data stack
parent
d49c86ba11
commit
147edb1ce9
|
@ -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());
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -120,7 +120,6 @@ struct callback_slot_visitor {
|
|||
void operator()(code_block *stub)
|
||||
{
|
||||
visitor->visit_handle(&stub->owner);
|
||||
callbacks->update(stub);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue