void visit_embedded_code_pointers(code_block *compiled);
void visit_context_code_blocks();
void visit_uninitialized_code_blocks();
+ void visit_sample_callstacks();
+
+ void visit_code_roots();
};
template<typename Fixup>
parent->code->uninitialized_blocks = new_uninitialized_blocks;
}
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_sample_callstacks()
+{
+ for (std::vector<code_block *>::const_iterator iter = parent->sample_callstacks.begin();
+ iter != parent->sample_callstacks.end();
+ ++iter)
+ {
+ fixup.fixup_code(*iter);
+ }
+}
+
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_code_roots()
+{
+ visit_uninitialized_code_blocks();
+ visit_sample_callstacks();
+}
+
}
slot_visitor<compaction_fixup> data_forwarder(this,fixup);
code_block_visitor<compaction_fixup> code_forwarder(this,fixup);
- code_forwarder.visit_uninitialized_code_blocks();
+ code_forwarder.visit_code_roots();
/* Object start offsets get recomputed by the object_compaction_updater */
data->tenured->starts.clear_object_start_offsets();
slot_visitor<code_compaction_fixup> data_forwarder(this,fixup);
code_block_visitor<code_compaction_fixup> code_forwarder(this,fixup);
- code_forwarder.visit_uninitialized_code_blocks();
+ code_forwarder.visit_code_roots();
if(trace_contexts_p)
code_forwarder.visit_context_code_blocks();
code_visitor.visit_context_code_blocks();
}
-void full_collector::trace_uninitialized_code_blocks()
+void full_collector::trace_code_roots()
{
- code_visitor.visit_uninitialized_code_blocks();
+ code_visitor.visit_code_roots();
}
void full_collector::trace_object_code_block(object *obj)
{
collector.trace_contexts();
collector.trace_context_code_blocks();
- collector.trace_uninitialized_code_blocks();
+ collector.trace_code_roots();
}
while(!mark_stack.empty())
explicit full_collector(factor_vm *parent_);
void trace_code_block(code_block *compiled);
void trace_context_code_blocks();
- void trace_uninitialized_code_blocks();
+ void trace_code_roots();
void trace_object_code_block(object *obj);
};