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() insteaddb4
							parent
							
								
									f5f8ce1501
								
							
						
					
					
						commit
						e565b0291f
					
				| 
						 | 
				
			
			@ -30,7 +30,8 @@ cell object::base_size(Fixup fixup) const {
 | 
			
		|||
    case WRAPPER_TYPE:
 | 
			
		||||
      return sizeof(wrapper);
 | 
			
		||||
    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:
 | 
			
		||||
      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_slots(object* ptr);
 | 
			
		||||
  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_callstack_object(callstack* stack);
 | 
			
		||||
  void visit_callstack(context* ctx);
 | 
			
		||||
  void visit_context(context *ctx);
 | 
			
		||||
  void visit_contexts();
 | 
			
		||||
  void visit_code_block_objects(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_context_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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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() {
 | 
			
		||||
  visit_handle(&parent->true_object);
 | 
			
		||||
  visit_handle(&parent->bignum_zero);
 | 
			
		||||
  visit_handle(&parent->bignum_pos_one);
 | 
			
		||||
  visit_handle(&parent->bignum_neg_one);
 | 
			
		||||
 | 
			
		||||
  visit_data_roots();
 | 
			
		||||
  visit_callback_roots();
 | 
			
		||||
  visit_literal_table_roots();
 | 
			
		||||
  visit_sample_callstacks();
 | 
			
		||||
  visit_sample_threads();
 | 
			
		||||
  FACTOR_FOR_EACH(parent->data_roots) {
 | 
			
		||||
    visit_handle(*iter);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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,
 | 
			
		||||
                     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
 | 
			
		||||
| 
						 | 
				
			
			@ -367,12 +347,6 @@ void slot_visitor<Fixup>::visit_context(context* ctx) {
 | 
			
		|||
  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>
 | 
			
		||||
void slot_visitor<Fixup>::visit_code_block_objects(code_block* compiled) {
 | 
			
		||||
  visit_handle(&compiled->owner);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue