// 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()(object *obj) { if(type == TYPE_COUNT || obj->type() == type) objects.push_back(tag_dynamic(obj)); }