Esempio n. 1
0
void factor_vm::data_fixup(cell *handle, cell data_relocation_base)
{
	if(immediate_p(*handle))
		return;

	*handle += (data->tenured->start - data_relocation_base);
}
Esempio n. 2
0
/* 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();
}
Esempio n. 3
0
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));
}
Esempio n. 4
0
static void data_fixup(cell *cell)
{
	if(immediate_p(*cell))
		return;

	zone *tenured = &data->generations[data->tenured()];
	*cell += (tenured->start - data_relocation_base);
}
Esempio n. 5
0
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));
}
Esempio n. 6
0
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
}
Esempio n. 7
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));
}
Esempio n. 8
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);
	}
}
Esempio n. 9
0
  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;
			}
		}
	}
Esempio n. 11
0
	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;
		}
	}
Esempio n. 12
0
// 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();
}