// 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); } }
/* make an alien */ CELL allot_alien(CELL delegate, CELL displacement) { REGISTER_ROOT(delegate); F_ALIEN *alien = allot_object(ALIEN_TYPE,sizeof(F_ALIEN)); UNREGISTER_ROOT(delegate); if(type_of(delegate) == ALIEN_TYPE) { F_ALIEN *delegate_alien = untag_object(delegate); displacement += delegate_alien->displacement; alien->alien = delegate_alien->alien; } else alien->alien = delegate; alien->displacement = displacement; alien->expired = F; return tag_object(alien); }
template<typename TYPE> TYPE *factorvm::allot(cell size) { return (TYPE *)allot_object(header(TYPE::type_number),size); }