Ejemplo n.º 1
0
// 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));
}
Ejemplo n.º 2
0
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);
	}
}
Ejemplo n.º 3
0
Archivo: alien.c Proyecto: glguy/factor
/* 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);
}
Ejemplo n.º 4
0
template<typename TYPE> TYPE *factorvm::allot(cell size)
{
	return (TYPE *)allot_object(header(TYPE::type_number),size);
}