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 operator()(instruction_operand op) { cell old_offset = op.rel_offset() + (cell)old_address->entry_point(); switch(op.rel_type()) { case RT_LITERAL: { cell value = op.load_value(old_offset); if(immediate_p(value)) op.store_value(value); else op.store_value(RETAG(fixup.fixup_data(untag<object>(value)),TAG(value))); break; } case RT_ENTRY_POINT: case RT_ENTRY_POINT_PIC: case RT_ENTRY_POINT_PIC_TAIL: case RT_HERE: { cell value = op.load_value(old_offset); cell offset = TAG(value); code_block *compiled = (code_block *)UNTAG(value); op.store_value((cell)fixup.fixup_code(compiled) + offset); break; } case RT_THIS: case RT_CARDS_OFFSET: case RT_DECKS_OFFSET: parent->store_external_address(op); break; default: op.store_value(op.load_value(old_offset)); break; } }
void operator()(code_block *compiled, cell size) { parent->update_word_references(compiled,reset_inline_caches); }
void push() { parent_vm->check_tagged_pointer(tagged<Type>::value()); parent_vm->gc_locals.push_back((cell)this); }
gc_bignum(bignum **addr_, factor_vm *vm) : addr(addr_), parent_vm(vm) { if(*addr_) parent_vm->check_data_pointer(*addr_); parent_vm->gc_bignums.push_back((cell)addr); }
void operator()(code_block *compiled) { parent->update_word_references(compiled); }
void operator()(code_block *compiled) { myvm->trace_literal_references(compiled); }
void operator()(code_block *compiled) { myvm->fixup_code_block(compiled,data_relocation_base); }
void operator()(cell *scan) { myvm->data_fixup(scan,data_relocation_base); }
void operator()(stack_frame *frame) { myvm->code_fixup(&frame->xt,code_relocation_base); myvm->code_fixup(&FRAME_RETURN_ADDRESS(frame,myvm),code_relocation_base); }