void factor_vm::data_fixup(cell *handle, cell data_relocation_base) { if(immediate_p(*handle)) return; *handle += (data->tenured->start - data_relocation_base); }
/* Size of the object pointed to by a tagged pointer */ cell factor_vm::object_size(cell tagged) { if(immediate_p(tagged)) return 0; else return untag<object>(tagged)->size(); }
cell slot_visitor<Fixup>::visit_pointer(cell pointer) { if (immediate_p(pointer)) return pointer; object* untagged = fixup.fixup_data(untag<object>(pointer)); return RETAG(untagged, TAG(pointer)); }
static void data_fixup(cell *cell) { if(immediate_p(*cell)) return; zone *tenured = &data->generations[data->tenured()]; *cell += (tenured->start - data_relocation_base); }
cell slot_visitor<Visitor>::visit_pointer(cell pointer) { if(immediate_p(pointer)) return pointer; object *untagged = untag<object>(pointer); untagged = visitor(untagged); return RETAG(untagged,TAG(pointer)); }
inline void factorvm::check_tagged_pointer(cell tagged) { #ifdef FACTOR_DEBUG if(!immediate_p(tagged)) { object *obj = untag<object>(tagged); check_data_pointer(obj); obj->h.hi_tag(); } #endif }
// Allocates memory void factor_vm::primitive_clone() { data_root<object> obj(ctx->peek(), this); if (immediate_p(obj.value())) return; cell size = object_size(obj.value()); object* new_obj = allot_object(obj.type(), size); memcpy(new_obj, obj.untagged(), size); new_obj->set_hashcode(0); ctx->replace(tag_dynamic(new_obj)); }
cell factor_vm::clone_object(cell obj_) { data_root<object> obj(obj_,this); if(immediate_p(obj.value())) return obj.value(); else { cell size = object_size(obj.value()); object *new_obj = allot_object(obj.type(),size); memcpy(new_obj,obj.untagged(),size); new_obj->set_hashcode(0); return tag_dynamic(new_obj); } }
void operator()(cell* slot_ptr) { if (immediate_p(*slot_ptr)) return; generation target = generation_of(parent, untag<object>(*slot_ptr)); if (gen == aging_generation && target == nursery_generation) { check_write_barrier(slot_ptr, target, card_points_to_nursery); } else if (gen == tenured_generation) { if (target == nursery_generation) { check_write_barrier(slot_ptr, target, card_points_to_nursery); } else if (target == aging_generation) { check_write_barrier(slot_ptr, target, card_points_to_aging); } } }
void operator()(cell *slot_ptr) { if(!immediate_p(*slot_ptr)) { generation target = generation_of(parent,untag<object>(*slot_ptr)); switch(gen) { case nursery_generation: break; case aging_generation: if(target == nursery_generation) check_write_barrier(slot_ptr,target,card_points_to_nursery); break; case tenured_generation: if(target == nursery_generation) check_write_barrier(slot_ptr,target,card_points_to_nursery); else if(target == aging_generation) check_write_barrier(slot_ptr,target,card_points_to_aging); 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; } }
// Size of the object pointed to by a tagged pointer cell object_size(cell tagged) { if (immediate_p(tagged)) return 0; return untag<object>(tagged)->size(); }