コード例 #1
0
ファイル: image.cpp プロジェクト: tylergreen/factor
	void operator()(object *obj, cell size)
	{
		parent->data->tenured->starts.record_object_start_offset(obj);

		switch(obj->type())
		{
		case ALIEN_TYPE:
			{
				cell payload_start = obj->binary_payload_start();
				data_visitor.visit_slots(obj,payload_start);

				alien *ptr = (alien *)obj;

				if(to_boolean(ptr->base))
					ptr->update_address();
				else
					ptr->expired = parent->true_object;
				break;
			}
		case DLL_TYPE:
			{
				cell payload_start = obj->binary_payload_start();
				data_visitor.visit_slots(obj,payload_start);

				parent->ffi_dlopen((dll *)obj);
				break;
			}
		case TUPLE_TYPE:
			{
				cell payload_start = tuple_size_with_fixup(data_offset,obj);
				data_visitor.visit_slots(obj,payload_start);
				break;
			}
		default:
			{
				cell payload_start = obj->binary_payload_start();
				data_visitor.visit_slots(obj,payload_start);
				code_visitor.visit_object_code_block(obj);
				break;
			}
		}
	}
コード例 #2
0
ファイル: compaction.cpp プロジェクト: HalfMadDad/factor
	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;
		}
	}
コード例 #3
0
ファイル: code_heap.cpp プロジェクト: 8byte-jose/factor
	void operator()(code_block *compiled, cell size)
	{
		parent->update_word_references(compiled,reset_inline_caches);
	}
コード例 #4
0
ファイル: local_roots.hpp プロジェクト: chris-ream/factor
	void push() { parent_vm->check_tagged_pointer(tagged<Type>::value()); parent_vm->gc_locals.push_back((cell)this); }
コード例 #5
0
ファイル: local_roots.hpp プロジェクト: chris-ream/factor
	gc_bignum(bignum **addr_, factor_vm *vm) : addr(addr_), parent_vm(vm) {
		if(*addr_)
			parent_vm->check_data_pointer(*addr_);
		parent_vm->gc_bignums.push_back((cell)addr);
	}
コード例 #6
0
ファイル: code_heap.cpp プロジェクト: azteca/factor
	void operator()(code_block *compiled)
	{
		parent->update_word_references(compiled);
	}
コード例 #7
0
ファイル: code_heap.cpp プロジェクト: chris-ream/factor
	void operator()(code_block *compiled)
	{
		myvm->trace_literal_references(compiled);
	}
コード例 #8
0
ファイル: image.cpp プロジェクト: harold/factor
	void operator()(code_block *compiled)
	{
		myvm->fixup_code_block(compiled,data_relocation_base);
	}
コード例 #9
0
ファイル: image.cpp プロジェクト: harold/factor
	void operator()(cell *scan)
	{
		myvm->data_fixup(scan,data_relocation_base);
	}
コード例 #10
0
ファイル: image.cpp プロジェクト: harold/factor
	void operator()(stack_frame *frame)
	{
		myvm->code_fixup(&frame->xt,code_relocation_base);
		myvm->code_fixup(&FRAME_RETURN_ADDRESS(frame,myvm),code_relocation_base);
	}