VM: refactors slot_visitor by removing a lot of one-use methods

I think it's easier to see the code flow if small method bodies that are
only called once are inlined into visit_all_roots() instead
db4
Björn Lindqvist 2015-07-31 20:45:11 +02:00
parent f5f8ce1501
commit e565b0291f
1 changed files with 25 additions and 51 deletions

View File

@ -30,7 +30,8 @@ cell object::base_size(Fixup fixup) const {
case WRAPPER_TYPE: case WRAPPER_TYPE:
return sizeof(wrapper); return sizeof(wrapper);
case CALLSTACK_TYPE: { case CALLSTACK_TYPE: {
return callstack_object_size(untag_fixnum(((callstack*)this)->length)); cell callstack_length = untag_fixnum(((callstack*)this)->length);
return callstack_object_size(callstack_length);
} }
default: default:
critical_error("Invalid header in base_size", (cell)this); critical_error("Invalid header in base_size", (cell)this);
@ -128,18 +129,12 @@ template <typename Fixup> struct slot_visitor {
void visit_object_array(cell* start, cell* end); void visit_object_array(cell* start, cell* end);
void visit_slots(object* ptr); void visit_slots(object* ptr);
void visit_stack_elements(segment* region, cell* top); void visit_stack_elements(segment* region, cell* top);
void visit_data_roots();
void visit_callback_roots();
void visit_literal_table_roots();
void visit_all_roots(); void visit_all_roots();
void visit_callstack_object(callstack* stack); void visit_callstack_object(callstack* stack);
void visit_callstack(context* ctx); void visit_callstack(context* ctx);
void visit_context(context *ctx); void visit_context(context *ctx);
void visit_contexts();
void visit_code_block_objects(code_block* compiled); void visit_code_block_objects(code_block* compiled);
void visit_embedded_literals(code_block* compiled); void visit_embedded_literals(code_block* compiled);
void visit_sample_callstacks();
void visit_sample_threads();
void visit_object_code_block(object* obj); void visit_object_code_block(object* obj);
void visit_context_code_blocks(); void visit_context_code_blocks();
void visit_uninitialized_code_blocks(); void visit_uninitialized_code_blocks();
@ -182,54 +177,39 @@ void slot_visitor<Fixup>::visit_stack_elements(segment* region, cell* top) {
visit_object_array((cell*)region->start, top + 1); visit_object_array((cell*)region->start, top + 1);
} }
template <typename Fixup> void slot_visitor<Fixup>::visit_data_roots() {
FACTOR_FOR_EACH(parent->data_roots) {
visit_handle(*iter);
}
}
template <typename Fixup> void slot_visitor<Fixup>::visit_callback_roots() {
auto callback_slot_visitor = [&](code_block* stub, cell size) {
visit_handle(&stub->owner);
};
parent->callbacks->allocator->iterate(callback_slot_visitor);
}
template <typename Fixup>
void slot_visitor<Fixup>::visit_literal_table_roots() {
FACTOR_FOR_EACH(parent->code->uninitialized_blocks) {
iter->second = visit_pointer(iter->second);
}
}
template <typename Fixup> void slot_visitor<Fixup>::visit_sample_callstacks() {
FACTOR_FOR_EACH(parent->sample_callstacks) {
visit_handle(&*iter);
}
}
template <typename Fixup> void slot_visitor<Fixup>::visit_sample_threads() {
FACTOR_FOR_EACH(parent->samples) {
visit_handle(&iter->thread);
}
}
template <typename Fixup> void slot_visitor<Fixup>::visit_all_roots() { template <typename Fixup> void slot_visitor<Fixup>::visit_all_roots() {
visit_handle(&parent->true_object); visit_handle(&parent->true_object);
visit_handle(&parent->bignum_zero); visit_handle(&parent->bignum_zero);
visit_handle(&parent->bignum_pos_one); visit_handle(&parent->bignum_pos_one);
visit_handle(&parent->bignum_neg_one); visit_handle(&parent->bignum_neg_one);
visit_data_roots(); FACTOR_FOR_EACH(parent->data_roots) {
visit_callback_roots(); visit_handle(*iter);
visit_literal_table_roots(); }
visit_sample_callstacks();
visit_sample_threads(); auto callback_slot_visitor = [&](code_block* stub, cell size) {
visit_handle(&stub->owner);
};
parent->callbacks->allocator->iterate(callback_slot_visitor);
FACTOR_FOR_EACH(parent->code->uninitialized_blocks) {
iter->second = visit_pointer(iter->second);
}
FACTOR_FOR_EACH(parent->sample_callstacks) {
visit_handle(&*iter);
}
FACTOR_FOR_EACH(parent->samples) {
visit_handle(&iter->thread);
}
visit_object_array(parent->special_objects, visit_object_array(parent->special_objects,
parent->special_objects + special_object_count); parent->special_objects + special_object_count);
visit_contexts(); FACTOR_FOR_EACH(parent->active_contexts) {
visit_context(*iter);
}
} }
/* primitive_minor_gc() is invoked by inline GC checks, and it needs to fill in /* primitive_minor_gc() is invoked by inline GC checks, and it needs to fill in
@ -367,12 +347,6 @@ void slot_visitor<Fixup>::visit_context(context* ctx) {
ctx->fill_stack_seg(rs_ptr, rs_seg, 0xdaabdaab); ctx->fill_stack_seg(rs_ptr, rs_seg, 0xdaabdaab);
} }
template <typename Fixup> void slot_visitor<Fixup>::visit_contexts() {
FACTOR_FOR_EACH(parent->active_contexts) {
visit_context(*iter);
}
}
template <typename Fixup> template <typename Fixup>
void slot_visitor<Fixup>::visit_code_block_objects(code_block* compiled) { void slot_visitor<Fixup>::visit_code_block_objects(code_block* compiled) {
visit_handle(&compiled->owner); visit_handle(&compiled->owner);