VM: object_size, compute_entry_point_address, code_block_owner made into
functions It is to make the vm class less heavylocals-and-roots
parent
82658e184f
commit
c55af9b957
|
@ -2,6 +2,34 @@
|
|||
|
||||
namespace factor {
|
||||
|
||||
cell code_block_owner(code_block* compiled) {
|
||||
cell owner = compiled->owner;
|
||||
|
||||
/* Cold generic word call sites point to quotations that call the
|
||||
inline-cache-miss and inline-cache-miss-tail primitives. */
|
||||
if (TAG(owner) != QUOTATION_TYPE)
|
||||
return owner;
|
||||
|
||||
quotation* quot = untag<quotation>(owner);
|
||||
array* elements = untag<array>(quot->array);
|
||||
|
||||
FACTOR_ASSERT(array_capacity(elements) == 5);
|
||||
wrapper* wrap = untag<wrapper>(array_nth(elements, 0));
|
||||
return wrap->object;
|
||||
}
|
||||
|
||||
cell compute_entry_point_address(cell obj) {
|
||||
switch (TAG(obj)) {
|
||||
case WORD_TYPE:
|
||||
return untag<word>(obj)->entry_point;
|
||||
case QUOTATION_TYPE:
|
||||
return untag<quotation>(obj)->entry_point;
|
||||
default:
|
||||
critical_error("Expected word or quotation", obj);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
cell code_block::owner_quot() const {
|
||||
if (!optimized_p() && TAG(owner) == WORD_TYPE)
|
||||
return untag<word>(owner)->def;
|
||||
|
@ -24,18 +52,6 @@ cell code_block::scan(factor_vm* vm, cell addr) const {
|
|||
return tag_fixnum(vm->quot_code_offset_to_scan(ptr, ofs));
|
||||
}
|
||||
|
||||
cell factor_vm::compute_entry_point_address(cell obj) {
|
||||
switch (TAG(obj)) {
|
||||
case WORD_TYPE:
|
||||
return untag<word>(obj)->entry_point;
|
||||
case QUOTATION_TYPE:
|
||||
return untag<quotation>(obj)->entry_point;
|
||||
default:
|
||||
critical_error("Expected word or quotation", obj);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
cell factor_vm::compute_entry_point_pic_address(word* w, cell tagged_quot) {
|
||||
if (!to_boolean(tagged_quot) || max_pic_size == 0)
|
||||
return w->entry_point;
|
||||
|
@ -55,24 +71,6 @@ cell factor_vm::compute_entry_point_pic_tail_address(cell w_) {
|
|||
return compute_entry_point_pic_address(w.untagged(), w->pic_tail_def);
|
||||
}
|
||||
|
||||
cell factor_vm::code_block_owner(code_block* compiled) {
|
||||
cell owner = compiled->owner;
|
||||
|
||||
/* Cold generic word call sites point to quotations that call the
|
||||
inline-cache-miss and inline-cache-miss-tail primitives. */
|
||||
if (TAG(owner) != QUOTATION_TYPE)
|
||||
return owner;
|
||||
|
||||
quotation* quot = untag<quotation>(owner);
|
||||
array* elements = untag<array>(quot->array);
|
||||
|
||||
FACTOR_ASSERT(array_capacity(elements) == 5);
|
||||
FACTOR_ASSERT(array_nth(elements, 4) == special_objects[PIC_MISS_WORD] ||
|
||||
array_nth(elements, 4) == special_objects[PIC_MISS_TAIL_WORD]);
|
||||
wrapper* wrap = untag<wrapper>(array_nth(elements, 0));
|
||||
return wrap->object;
|
||||
}
|
||||
|
||||
struct update_word_references_relocation_visitor {
|
||||
factor_vm* parent;
|
||||
bool reset_inline_caches;
|
||||
|
@ -87,12 +85,12 @@ struct update_word_references_relocation_visitor {
|
|||
case RT_ENTRY_POINT: {
|
||||
cell owner = compiled->owner;
|
||||
if (to_boolean(owner))
|
||||
op.store_value(parent->compute_entry_point_address(owner));
|
||||
op.store_value(compute_entry_point_address(owner));
|
||||
break;
|
||||
}
|
||||
case RT_ENTRY_POINT_PIC: {
|
||||
if (reset_inline_caches || !compiled->pic_p()) {
|
||||
cell owner = parent->code_block_owner(compiled);
|
||||
cell owner = code_block_owner(compiled);
|
||||
if (to_boolean(owner))
|
||||
op.store_value(parent->compute_entry_point_pic_address(owner));
|
||||
}
|
||||
|
@ -100,7 +98,7 @@ struct update_word_references_relocation_visitor {
|
|||
}
|
||||
case RT_ENTRY_POINT_PIC_TAIL: {
|
||||
if (reset_inline_caches || !compiled->pic_p()) {
|
||||
cell owner = parent->code_block_owner(compiled);
|
||||
cell owner = code_block_owner(compiled);
|
||||
if (to_boolean(owner))
|
||||
op.store_value(parent->compute_entry_point_pic_tail_address(owner));
|
||||
}
|
||||
|
@ -239,7 +237,7 @@ struct initial_code_block_visitor {
|
|||
case RT_LITERAL:
|
||||
return next_literal();
|
||||
case RT_ENTRY_POINT:
|
||||
return parent->compute_entry_point_address(next_literal());
|
||||
return compute_entry_point_address(next_literal());
|
||||
case RT_ENTRY_POINT_PIC:
|
||||
return parent->compute_entry_point_pic_address(next_literal());
|
||||
case RT_ENTRY_POINT_PIC_TAIL:
|
||||
|
|
|
@ -4,6 +4,9 @@ VM_C_API void init_globals();
|
|||
factor_vm* new_factor_vm();
|
||||
VM_C_API void start_standalone_factor(int argc, vm_char** argv);
|
||||
|
||||
// objects
|
||||
cell object_size(cell tagged);
|
||||
|
||||
// os-*
|
||||
void open_console();
|
||||
void close_console();
|
||||
|
|
|
@ -2,6 +2,13 @@
|
|||
|
||||
namespace factor {
|
||||
|
||||
/* 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();
|
||||
}
|
||||
|
||||
void factor_vm::primitive_special_object() {
|
||||
fixnum n = untag_fixnum(ctx->peek());
|
||||
ctx->replace(special_objects[n]);
|
||||
|
@ -57,13 +64,6 @@ cell factor_vm::clone_object(cell obj_) {
|
|||
/* Allocates memory */
|
||||
void factor_vm::primitive_clone() { ctx->replace(clone_object(ctx->peek())); }
|
||||
|
||||
/* Size of the object pointed to by a tagged pointer */
|
||||
cell factor_vm::object_size(cell tagged) {
|
||||
if (immediate_p(tagged))
|
||||
return 0;
|
||||
return untag<object>(tagged)->size();
|
||||
}
|
||||
|
||||
/* Allocates memory */
|
||||
void factor_vm::primitive_size() {
|
||||
ctx->replace(from_unsigned_cell(object_size(ctx->peek())));
|
||||
|
|
|
@ -186,7 +186,6 @@ struct factor_vm {
|
|||
void primitive_identity_hashcode();
|
||||
void compute_identity_hashcode(object* obj);
|
||||
void primitive_compute_identity_hashcode();
|
||||
cell object_size(cell tagged);
|
||||
cell clone_object(cell obj_);
|
||||
void primitive_clone();
|
||||
void primitive_become();
|
||||
|
@ -559,13 +558,11 @@ struct factor_vm {
|
|||
void primitive_fclose();
|
||||
|
||||
// code_block
|
||||
cell compute_entry_point_address(cell obj);
|
||||
cell compute_entry_point_pic_address(word* w, cell tagged_quot);
|
||||
cell compute_entry_point_pic_address(cell w_);
|
||||
cell compute_entry_point_pic_tail_address(cell w_);
|
||||
cell compute_external_address(instruction_operand op);
|
||||
|
||||
cell code_block_owner(code_block* compiled);
|
||||
void update_word_references(code_block* compiled, bool reset_inline_caches);
|
||||
void undefined_symbol();
|
||||
cell compute_dlsym_address(array* literals, cell index, bool toc);
|
||||
|
|
Loading…
Reference in New Issue