void operator()(object *obj, cell size) { parent->data->tenured->starts.record_object_start_offset(obj); switch(obj->type()) { case ALIEN_TYPE: { cell payload_start = obj->binary_payload_start(); data_visitor.visit_slots(obj,payload_start); alien *ptr = (alien *)obj; if(to_boolean(ptr->base)) ptr->update_address(); else ptr->expired = parent->true_object; break; } case DLL_TYPE: { cell payload_start = obj->binary_payload_start(); data_visitor.visit_slots(obj,payload_start); parent->ffi_dlopen((dll *)obj); break; } case TUPLE_TYPE: { cell payload_start = tuple_size_with_fixup(data_offset,obj); data_visitor.visit_slots(obj,payload_start); break; } default: { cell payload_start = obj->binary_payload_start(); data_visitor.visit_slots(obj,payload_start); code_visitor.visit_object_code_block(obj); break; } } }
void trace_object(object *ptr) { data_visitor.visit_slots(ptr); if(ptr->type() == ALIEN_TYPE) ((alien *)ptr)->update_address(); }
void operator()(object *obj) { workhorse->visit_slots(obj); }