Revert "VM: undoing 22bb0cfecf (#1513)"

This reverts commit e9c72baf2e.
char-rename
Björn Lindqvist 2016-11-07 23:43:50 +01:00
parent e9c72baf2e
commit 2308ca06e0
5 changed files with 35 additions and 41 deletions

View File

@ -5,7 +5,7 @@ namespace factor {
// gets the address of an object representing a C pointer, with the // gets the address of an object representing a C pointer, with the
// intention of storing the pointer across code which may potentially GC. // intention of storing the pointer across code which may potentially GC.
char* factor_vm::pinned_alien_offset(cell obj) { char* factor_vm::pinned_alien_offset(cell obj) {
switch (tagged<object>(obj).type()) { switch (TAG(obj)) {
case ALIEN_TYPE: { case ALIEN_TYPE: {
alien* ptr = untag<alien>(obj); alien* ptr = untag<alien>(obj);
if (to_boolean(ptr->expired)) if (to_boolean(ptr->expired))
@ -57,7 +57,7 @@ void factor_vm::primitive_displaced_alien() {
cell alien = ctx->pop(); cell alien = ctx->pop();
cell displacement = to_cell(ctx->pop()); cell displacement = to_cell(ctx->pop());
switch (tagged<object>(alien).type()) { switch (TAG(alien)) {
case BYTE_ARRAY_TYPE: case BYTE_ARRAY_TYPE:
case ALIEN_TYPE: case ALIEN_TYPE:
case F_TYPE: case F_TYPE:
@ -163,7 +163,7 @@ void factor_vm::primitive_dll_validp() {
// gets the address of an object representing a C pointer // gets the address of an object representing a C pointer
char* factor_vm::alien_offset(cell obj) { char* factor_vm::alien_offset(cell obj) {
switch (tagged<object>(obj).type()) { switch (TAG(obj)) {
case BYTE_ARRAY_TYPE: case BYTE_ARRAY_TYPE:
return untag<byte_array>(obj)->data<char>(); return untag<byte_array>(obj)->data<char>();
case ALIEN_TYPE: case ALIEN_TYPE:

View File

@ -3,28 +3,23 @@
namespace factor { namespace factor {
static cell code_block_owner(code_block* compiled) { static cell code_block_owner(code_block* compiled) {
tagged<object> owner(compiled->owner); cell owner = compiled->owner;
// Cold generic word call sites point to quotations that call the // Cold generic word call sites point to quotations that call the
// inline-cache-miss and inline-cache-miss-tail primitives. // inline-cache-miss and inline-cache-miss-tail primitives.
if (owner.type() == QUOTATION_TYPE) { if (TAG(owner) != QUOTATION_TYPE)
tagged<quotation> quot(owner.as<quotation>()); return owner;
tagged<array> elements(quot->array);
FACTOR_ASSERT(array_capacity(elements.untagged()) == 5); quotation* quot = untag<quotation>(owner);
FACTOR_ASSERT(array_nth(elements.untagged(), 4) == array* elements = untag<array>(quot->array);
special_objects[PIC_MISS_WORD] ||
array_nth(elements.untagged(), 4) ==
special_objects[PIC_MISS_TAIL_WORD]);
tagged<wrapper> word_wrapper(array_nth(elements.untagged(), 0)); FACTOR_ASSERT(array_capacity(elements) == 5);
return word_wrapper->object; wrapper* wrap = untag<wrapper>(array_nth(elements, 0));
} return wrap->object;
return compiled->owner;
} }
static cell compute_entry_point_address(cell obj) { static cell compute_entry_point_address(cell obj) {
switch (tagged<object>(obj).type()) { switch (TAG(obj)) {
case WORD_TYPE: case WORD_TYPE:
return untag<word>(obj)->entry_point; return untag<word>(obj)->entry_point;
case QUOTATION_TYPE: case QUOTATION_TYPE:
@ -43,10 +38,9 @@ static cell compute_here_address(cell arg, cell offset, code_block* compiled) {
} }
cell code_block::owner_quot() const { cell code_block::owner_quot() const {
tagged<object> executing(owner); if (type() != CODE_BLOCK_OPTIMIZED && TAG(owner) == WORD_TYPE)
if (type() != CODE_BLOCK_OPTIMIZED && executing->type() == WORD_TYPE) return untag<word>(owner)->def;
executing = executing.as<word>()->def; return owner;
return executing.value();
} }
// If the code block is an unoptimized quotation, we can calculate the // If the code block is an unoptimized quotation, we can calculate the
@ -57,13 +51,13 @@ cell code_block::scan(factor_vm* vm, cell addr) const {
return tag_fixnum(-1); return tag_fixnum(-1);
} }
tagged<object> obj(owner); cell ptr = owner;
if (obj.type() == WORD_TYPE) if (TAG(ptr) == WORD_TYPE)
obj = obj.as<word>()->def; ptr = untag<word>(ptr)->def;
if (obj.type() != QUOTATION_TYPE) if (TAG(ptr) != QUOTATION_TYPE)
return tag_fixnum(-1); return tag_fixnum(-1);
cell ofs = offset(addr); cell ofs = offset(addr);
return tag_fixnum(vm->quot_code_offset_to_scan(obj.value(), ofs)); return tag_fixnum(vm->quot_code_offset_to_scan(ptr, ofs));
} }
cell factor_vm::compute_entry_point_pic_address(word* w, cell tagged_quot) { cell factor_vm::compute_entry_point_pic_address(word* w, cell tagged_quot) {

View File

@ -74,11 +74,13 @@ struct code_block {
void flush_icache() { factor::flush_icache((cell)this, size()); } void flush_icache() { factor::flush_icache((cell)this, size()); }
template <typename Iterator> void each_instruction_operand(Iterator& iter) { template <typename Iterator> void each_instruction_operand(Iterator& iter) {
if (to_boolean(relocation)) { if (!to_boolean(relocation))
byte_array* rels = (byte_array*)UNTAG(relocation); return;
byte_array* rels = untag<byte_array>(relocation);
cell index = 0; cell index = 0;
cell length = (rels->capacity >> TAG_BITS) / sizeof(relocation_entry); cell length = untag_fixnum(rels->capacity) / sizeof(relocation_entry);
for (cell i = 0; i < length; i++) { for (cell i = 0; i < length; i++) {
relocation_entry rel = rels->data<relocation_entry>()[i]; relocation_entry rel = rels->data<relocation_entry>()[i];
@ -86,7 +88,6 @@ struct code_block {
index += rel.number_of_parameters(); index += rel.number_of_parameters();
} }
} }
}
cell offset(cell addr) const { return addr - entry_point(); } cell offset(cell addr) const { return addr - entry_point(); }

View File

@ -40,7 +40,7 @@ cell factor_vm::lookup_tuple_method(cell obj, cell methods) {
while (echelon >= 0) { while (echelon >= 0) {
cell echelon_methods = array_nth(echelons, echelon); cell echelon_methods = array_nth(echelons, echelon);
if (tagged<object>(echelon_methods).type() == WORD_TYPE) if (TAG(echelon_methods) == WORD_TYPE)
return echelon_methods; return echelon_methods;
else if (to_boolean(echelon_methods)) { else if (to_boolean(echelon_methods)) {
cell klass = nth_superclass(layout, echelon); cell klass = nth_superclass(layout, echelon);

View File

@ -93,11 +93,10 @@ void factor_vm::primitive_become() {
std::map<object*, object*> become_map; std::map<object*, object*> become_map;
for (cell i = 0; i < capacity; i++) { for (cell i = 0; i < capacity; i++) {
tagged<object> old_obj(array_nth(old_objects, i)); cell old_ptr = array_nth(old_objects, i);
tagged<object> new_obj(array_nth(new_objects, i)); cell new_ptr = array_nth(new_objects, i);
if (old_ptr != new_ptr)
if (old_obj != new_obj) become_map[untag<object>(old_ptr)] = untag<object>(new_ptr);
become_map[old_obj.untagged()] = new_obj.untagged();
} }
// Update all references to old objects to point to new objects // Update all references to old objects to point to new objects