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:
 | 
					    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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue