VM: undoing 22bb0cfecf (#1513)
				
					
				
			
							parent
							
								
									bbcd039c6c
								
							
						
					
					
						commit
						e9c72baf2e
					
				| 
						 | 
				
			
			@ -5,7 +5,7 @@ namespace factor {
 | 
			
		|||
// gets the address of an object representing a C pointer, with the
 | 
			
		||||
// intention of storing the pointer across code which may potentially GC.
 | 
			
		||||
char* factor_vm::pinned_alien_offset(cell obj) {
 | 
			
		||||
  switch (TAG(obj)) {
 | 
			
		||||
  switch (tagged<object>(obj).type()) {
 | 
			
		||||
    case ALIEN_TYPE: {
 | 
			
		||||
      alien* ptr = untag<alien>(obj);
 | 
			
		||||
      if (to_boolean(ptr->expired))
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +57,7 @@ void factor_vm::primitive_displaced_alien() {
 | 
			
		|||
  cell alien = ctx->pop();
 | 
			
		||||
  cell displacement = to_cell(ctx->pop());
 | 
			
		||||
 | 
			
		||||
  switch (TAG(alien)) {
 | 
			
		||||
  switch (tagged<object>(alien).type()) {
 | 
			
		||||
    case BYTE_ARRAY_TYPE:
 | 
			
		||||
    case ALIEN_TYPE:
 | 
			
		||||
    case F_TYPE:
 | 
			
		||||
| 
						 | 
				
			
			@ -163,7 +163,7 @@ void factor_vm::primitive_dll_validp() {
 | 
			
		|||
 | 
			
		||||
// gets the address of an object representing a C pointer
 | 
			
		||||
char* factor_vm::alien_offset(cell obj) {
 | 
			
		||||
  switch (TAG(obj)) {
 | 
			
		||||
  switch (tagged<object>(obj).type()) {
 | 
			
		||||
    case BYTE_ARRAY_TYPE:
 | 
			
		||||
      return untag<byte_array>(obj)->data<char>();
 | 
			
		||||
    case ALIEN_TYPE:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,23 +3,28 @@
 | 
			
		|||
namespace factor {
 | 
			
		||||
 | 
			
		||||
static cell code_block_owner(code_block* compiled) {
 | 
			
		||||
  cell owner = compiled->owner;
 | 
			
		||||
  tagged<object> 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;
 | 
			
		||||
  if (owner.type() == QUOTATION_TYPE) {
 | 
			
		||||
    tagged<quotation> quot(owner.as<quotation>());
 | 
			
		||||
    tagged<array> elements(quot->array);
 | 
			
		||||
 | 
			
		||||
  quotation* quot = untag<quotation>(owner);
 | 
			
		||||
  array* elements = untag<array>(quot->array);
 | 
			
		||||
    FACTOR_ASSERT(array_capacity(elements.untagged()) == 5);
 | 
			
		||||
    FACTOR_ASSERT(array_nth(elements.untagged(), 4) ==
 | 
			
		||||
                  special_objects[PIC_MISS_WORD] ||
 | 
			
		||||
                  array_nth(elements.untagged(), 4) ==
 | 
			
		||||
                  special_objects[PIC_MISS_TAIL_WORD]);
 | 
			
		||||
 | 
			
		||||
  FACTOR_ASSERT(array_capacity(elements) == 5);
 | 
			
		||||
  wrapper* wrap = untag<wrapper>(array_nth(elements, 0));
 | 
			
		||||
  return wrap->object;
 | 
			
		||||
    tagged<wrapper> word_wrapper(array_nth(elements.untagged(), 0));
 | 
			
		||||
    return word_wrapper->object;
 | 
			
		||||
  }
 | 
			
		||||
  return compiled->owner;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static cell compute_entry_point_address(cell obj) {
 | 
			
		||||
  switch (TAG(obj)) {
 | 
			
		||||
  switch (tagged<object>(obj).type()) {
 | 
			
		||||
    case WORD_TYPE:
 | 
			
		||||
      return untag<word>(obj)->entry_point;
 | 
			
		||||
    case QUOTATION_TYPE:
 | 
			
		||||
| 
						 | 
				
			
			@ -38,9 +43,10 @@ static cell compute_here_address(cell arg, cell offset, code_block* compiled) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
cell code_block::owner_quot() const {
 | 
			
		||||
  if (type() != CODE_BLOCK_OPTIMIZED && TAG(owner) == WORD_TYPE)
 | 
			
		||||
    return untag<word>(owner)->def;
 | 
			
		||||
  return owner;
 | 
			
		||||
  tagged<object> executing(owner);
 | 
			
		||||
  if (type() != CODE_BLOCK_OPTIMIZED && executing->type() == WORD_TYPE)
 | 
			
		||||
    executing = executing.as<word>()->def;
 | 
			
		||||
  return executing.value();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// If the code block is an unoptimized quotation, we can calculate the
 | 
			
		||||
| 
						 | 
				
			
			@ -51,13 +57,13 @@ cell code_block::scan(factor_vm* vm, cell addr) const {
 | 
			
		|||
    return tag_fixnum(-1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  cell ptr = owner;
 | 
			
		||||
  if (TAG(ptr) == WORD_TYPE)
 | 
			
		||||
    ptr = untag<word>(ptr)->def;
 | 
			
		||||
  if (TAG(ptr) != QUOTATION_TYPE)
 | 
			
		||||
  tagged<object> obj(owner);
 | 
			
		||||
  if (obj.type() == WORD_TYPE)
 | 
			
		||||
    obj = obj.as<word>()->def;
 | 
			
		||||
  if (obj.type() != QUOTATION_TYPE)
 | 
			
		||||
    return tag_fixnum(-1);
 | 
			
		||||
  cell ofs = offset(addr);
 | 
			
		||||
  return tag_fixnum(vm->quot_code_offset_to_scan(ptr, ofs));
 | 
			
		||||
  return tag_fixnum(vm->quot_code_offset_to_scan(obj.value(), ofs));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cell factor_vm::compute_entry_point_pic_address(word* w, cell tagged_quot) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -74,13 +74,11 @@ struct code_block {
 | 
			
		|||
  void flush_icache() { factor::flush_icache((cell)this, size()); }
 | 
			
		||||
 | 
			
		||||
  template <typename Iterator> void each_instruction_operand(Iterator& iter) {
 | 
			
		||||
    if (!to_boolean(relocation))
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
    byte_array* rels = untag<byte_array>(relocation);
 | 
			
		||||
    if (to_boolean(relocation)) {
 | 
			
		||||
      byte_array* rels = (byte_array*)UNTAG(relocation);
 | 
			
		||||
 | 
			
		||||
      cell index = 0;
 | 
			
		||||
    cell length = untag_fixnum(rels->capacity) / sizeof(relocation_entry);
 | 
			
		||||
      cell length = (rels->capacity >> TAG_BITS) / sizeof(relocation_entry);
 | 
			
		||||
 | 
			
		||||
      for (cell i = 0; i < length; i++) {
 | 
			
		||||
        relocation_entry rel = rels->data<relocation_entry>()[i];
 | 
			
		||||
| 
						 | 
				
			
			@ -88,6 +86,7 @@ struct code_block {
 | 
			
		|||
        index += rel.number_of_parameters();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  cell offset(cell addr) const { return addr - entry_point(); }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ cell factor_vm::lookup_tuple_method(cell obj, cell methods) {
 | 
			
		|||
  while (echelon >= 0) {
 | 
			
		||||
    cell echelon_methods = array_nth(echelons, echelon);
 | 
			
		||||
 | 
			
		||||
    if (TAG(echelon_methods) == WORD_TYPE)
 | 
			
		||||
    if (tagged<object>(echelon_methods).type() == WORD_TYPE)
 | 
			
		||||
      return echelon_methods;
 | 
			
		||||
    else if (to_boolean(echelon_methods)) {
 | 
			
		||||
      cell klass = nth_superclass(layout, echelon);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -93,10 +93,11 @@ void factor_vm::primitive_become() {
 | 
			
		|||
  std::map<object*, object*> become_map;
 | 
			
		||||
 | 
			
		||||
  for (cell i = 0; i < capacity; i++) {
 | 
			
		||||
    cell old_ptr = array_nth(old_objects, i);
 | 
			
		||||
    cell new_ptr = array_nth(new_objects, i);
 | 
			
		||||
    if (old_ptr != new_ptr)
 | 
			
		||||
      become_map[untag<object>(old_ptr)] = untag<object>(new_ptr);
 | 
			
		||||
    tagged<object> old_obj(array_nth(old_objects, i));
 | 
			
		||||
    tagged<object> new_obj(array_nth(new_objects, i));
 | 
			
		||||
 | 
			
		||||
    if (old_obj != new_obj)
 | 
			
		||||
      become_map[old_obj.untagged()] = new_obj.untagged();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Update all references to old objects to point to new objects
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue