VM: replacing the copy assignment operators of the smart pointers
Little more to write, but much easier to see what is going on with methods rather than assignment operator overloading.char-rename
							parent
							
								
									3b3cc151e9
								
							
						
					
					
						commit
						7661ed3b57
					
				| 
						 | 
					@ -57,13 +57,20 @@ cell factor_vm::std_vector_to_array(std::vector<cell>& elements) {
 | 
				
			||||||
  return objects.value();
 | 
					  return objects.value();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Allocates memory
 | 
				
			||||||
 | 
					void growable_array::reallot_array(cell count) {
 | 
				
			||||||
 | 
					  array *a_old = elements.untagged();
 | 
				
			||||||
 | 
					  array *a_new = elements.parent->reallot_array(a_old, count);
 | 
				
			||||||
 | 
					  elements.set_untagged(a_new);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Allocates memory
 | 
					// Allocates memory
 | 
				
			||||||
void growable_array::add(cell elt_) {
 | 
					void growable_array::add(cell elt_) {
 | 
				
			||||||
  factor_vm* parent = elements.parent;
 | 
					  factor_vm* parent = elements.parent;
 | 
				
			||||||
  data_root<object> elt(elt_, parent);
 | 
					  data_root<object> elt(elt_, parent);
 | 
				
			||||||
  if (count == array_capacity(elements.untagged()))
 | 
					  if (count == array_capacity(elements.untagged())) {
 | 
				
			||||||
    elements = parent->reallot_array(elements.untagged(), count * 2);
 | 
					    reallot_array(2 * count);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  parent->set_array_nth(elements.untagged(), count++, elt.value());
 | 
					  parent->set_array_nth(elements.untagged(), count++, elt.value());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,8 +80,7 @@ void growable_array::append(array* elts_) {
 | 
				
			||||||
  data_root<array> elts(elts_, parent);
 | 
					  data_root<array> elts(elts_, parent);
 | 
				
			||||||
  cell capacity = array_capacity(elts.untagged());
 | 
					  cell capacity = array_capacity(elts.untagged());
 | 
				
			||||||
  if (count + capacity > array_capacity(elements.untagged())) {
 | 
					  if (count + capacity > array_capacity(elements.untagged())) {
 | 
				
			||||||
    elements =
 | 
					    reallot_array(2 * (count + capacity));
 | 
				
			||||||
        parent->reallot_array(elements.untagged(), (count + capacity) * 2);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (cell index = 0; index < capacity; index++)
 | 
					  for (cell index = 0; index < capacity; index++)
 | 
				
			||||||
| 
						 | 
					@ -84,8 +90,7 @@ void growable_array::append(array* elts_) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Allocates memory
 | 
					// Allocates memory
 | 
				
			||||||
void growable_array::trim() {
 | 
					void growable_array::trim() {
 | 
				
			||||||
  factor_vm* parent = elements.parent;
 | 
					  reallot_array(count);
 | 
				
			||||||
  elements = parent->reallot_array(elements.untagged(), count);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@ struct growable_array {
 | 
				
			||||||
      : count(0),
 | 
					      : count(0),
 | 
				
			||||||
        elements(parent->allot_array(capacity, false_object), parent) {}
 | 
					        elements(parent->allot_array(capacity, false_object), parent) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void reallot_array(cell count);
 | 
				
			||||||
  void add(cell elt);
 | 
					  void add(cell elt);
 | 
				
			||||||
  void append(array* elts);
 | 
					  void append(array* elts);
 | 
				
			||||||
  void trim();
 | 
					  void trim();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -797,7 +797,7 @@ void factor_vm::bignum_divide_unsigned_large_denominator(
 | 
				
			||||||
        bignum_destructive_unnormalization(u.untagged(), shift);
 | 
					        bignum_destructive_unnormalization(u.untagged(), shift);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    q = bignum_trim(q.untagged());
 | 
					    q.set_untagged(bignum_trim(q.untagged()));
 | 
				
			||||||
    *quotient = q.untagged();
 | 
					    *quotient = q.untagged();
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -821,7 +821,7 @@ void factor_vm::bignum_divide_unsigned_large_denominator(
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  u = bignum_trim(u.untagged());
 | 
					  u.set_untagged(bignum_trim(u.untagged()));
 | 
				
			||||||
  if (remainder != NULL)
 | 
					  if (remainder != NULL)
 | 
				
			||||||
    *remainder = u.untagged();
 | 
					    *remainder = u.untagged();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -996,7 +996,7 @@ void factor_vm::bignum_divide_unsigned_medium_denominator(
 | 
				
			||||||
      (*scan) = qj;
 | 
					      (*scan) = qj;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    q = bignum_trim(q.untagged());
 | 
					    q.set_untagged(bignum_trim(q.untagged()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (remainder != ((bignum**)0)) {
 | 
					    if (remainder != ((bignum**)0)) {
 | 
				
			||||||
      if (shift != 0)
 | 
					      if (shift != 0)
 | 
				
			||||||
| 
						 | 
					@ -1179,7 +1179,7 @@ void factor_vm::bignum_divide_unsigned_small_denominator(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bignum_digit_type r = bignum_destructive_scale_down(q.untagged(), denominator);
 | 
					  bignum_digit_type r = bignum_destructive_scale_down(q.untagged(), denominator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  q = bignum_trim(q.untagged());
 | 
					  q.set_untagged(bignum_trim(q.untagged()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (remainder != ((bignum**)0))
 | 
					  if (remainder != ((bignum**)0))
 | 
				
			||||||
    (*remainder) = bignum_digit_to_bignum(r, r_negative_p);
 | 
					    (*remainder) = bignum_digit_to_bignum(r, r_negative_p);
 | 
				
			||||||
| 
						 | 
					@ -1797,7 +1797,7 @@ bignum* factor_vm::bignum_gcd(bignum* a_, bignum* b_) {
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      data_root<bignum> e(bignum_trim(a.untagged()), this);
 | 
					      data_root<bignum> e(bignum_trim(a.untagged()), this);
 | 
				
			||||||
      data_root<bignum> f(bignum_trim(b.untagged()), this);
 | 
					      data_root<bignum> f(bignum_trim(b.untagged()), this);
 | 
				
			||||||
      c = bignum_remainder(e.untagged(), f.untagged());
 | 
					      c.set_untagged(bignum_remainder(e.untagged(), f.untagged()));
 | 
				
			||||||
      if (c.untagged() == BIGNUM_OUT_OF_BAND) {
 | 
					      if (c.untagged() == BIGNUM_OUT_OF_BAND) {
 | 
				
			||||||
        return c.untagged();
 | 
					        return c.untagged();
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,11 +29,19 @@ void factor_vm::primitive_resize_byte_array() {
 | 
				
			||||||
  ctx->push(tag<byte_array>(reallot_array(array.untagged(), capacity)));
 | 
					  ctx->push(tag<byte_array>(reallot_array(array.untagged(), capacity)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Allocates memory
 | 
				
			||||||
 | 
					void growable_byte_array::reallot_array(cell count) {
 | 
				
			||||||
 | 
					  byte_array *ba_old = elements.untagged();
 | 
				
			||||||
 | 
					  byte_array *ba_new = elements.parent->reallot_array(ba_old, count);
 | 
				
			||||||
 | 
					  elements.set_untagged(ba_new);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Allocates memory
 | 
					// Allocates memory
 | 
				
			||||||
void growable_byte_array::grow_bytes(cell len) {
 | 
					void growable_byte_array::grow_bytes(cell len) {
 | 
				
			||||||
  count += len;
 | 
					  count += len;
 | 
				
			||||||
  if (count >= array_capacity(elements.untagged()))
 | 
					  if (count >= array_capacity(elements.untagged())) {
 | 
				
			||||||
    elements = elements.parent->reallot_array(elements.untagged(), count * 2);
 | 
					    reallot_array(2 * count);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Allocates memory
 | 
					// Allocates memory
 | 
				
			||||||
| 
						 | 
					@ -49,9 +57,9 @@ void growable_byte_array::append_byte_array(cell byte_array_) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cell len = array_capacity(byte_array.untagged());
 | 
					  cell len = array_capacity(byte_array.untagged());
 | 
				
			||||||
  cell new_size = count + len;
 | 
					  cell new_size = count + len;
 | 
				
			||||||
  factor_vm* parent = elements.parent;
 | 
					  if (new_size >= array_capacity(elements.untagged())) {
 | 
				
			||||||
  if (new_size >= array_capacity(elements.untagged()))
 | 
					    reallot_array(2 * new_size);
 | 
				
			||||||
    elements = parent->reallot_array(elements.untagged(), new_size * 2);
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  memcpy(&elements->data<uint8_t>()[count], byte_array->data<uint8_t>(), len);
 | 
					  memcpy(&elements->data<uint8_t>()[count], byte_array->data<uint8_t>(), len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,8 +68,7 @@ void growable_byte_array::append_byte_array(cell byte_array_) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Allocates memory
 | 
					// Allocates memory
 | 
				
			||||||
void growable_byte_array::trim() {
 | 
					void growable_byte_array::trim() {
 | 
				
			||||||
  factor_vm* parent = elements.parent;
 | 
					  reallot_array(count);
 | 
				
			||||||
  elements = parent->reallot_array(elements.untagged(), count);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,7 @@ struct growable_byte_array {
 | 
				
			||||||
  growable_byte_array(factor_vm* parent, cell capacity = 40)
 | 
					  growable_byte_array(factor_vm* parent, cell capacity = 40)
 | 
				
			||||||
      : count(0), elements(parent->allot_byte_array(capacity), parent) {}
 | 
					      : count(0), elements(parent->allot_byte_array(capacity), parent) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void reallot_array(cell count);
 | 
				
			||||||
  void grow_bytes(cell len);
 | 
					  void grow_bytes(cell len);
 | 
				
			||||||
  void append_bytes(void* elts, cell len);
 | 
					  void append_bytes(void* elts, cell len);
 | 
				
			||||||
  void append_byte_array(cell elts);
 | 
					  void append_byte_array(cell elts);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,15 +18,6 @@ template <typename Type> struct data_root : public tagged<Type> {
 | 
				
			||||||
    push();
 | 
					    push();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const data_root<Type>& operator=(const Type* x) {
 | 
					 | 
				
			||||||
    tagged<Type>::operator=(x);
 | 
					 | 
				
			||||||
    return *this;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  const data_root<Type>& operator=(const cell& x) {
 | 
					 | 
				
			||||||
    tagged<Type>::operator=(x);
 | 
					 | 
				
			||||||
    return *this;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ~data_root() {
 | 
					  ~data_root() {
 | 
				
			||||||
    parent->data_roots.pop_back();
 | 
					    parent->data_roots.pop_back();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,7 @@ inline cell quotation_jit::nth(cell index) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void quotation_jit::init_quotation(cell quot) {
 | 
					void quotation_jit::init_quotation(cell quot) {
 | 
				
			||||||
  elements = untag<quotation>(quot)->array;
 | 
					  elements.set_value(untag<quotation>(quot)->array);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool quotation_jit::fast_if_p(cell i, cell length) {
 | 
					bool quotation_jit::fast_if_p(cell i, cell length) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,18 +32,17 @@ template <typename Type> struct tagged {
 | 
				
			||||||
  explicit tagged(cell tagged) : value_(tagged) {}
 | 
					  explicit tagged(cell tagged) : value_(tagged) {}
 | 
				
			||||||
  explicit tagged(Type* untagged) : value_(factor::tag(untagged)) {}
 | 
					  explicit tagged(Type* untagged) : value_(factor::tag(untagged)) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void set_value(const cell ptr) {
 | 
				
			||||||
 | 
					    value_ = ptr;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void set_untagged(const Type *untagged) {
 | 
				
			||||||
 | 
					    set_value(tag(untagged));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Type* operator->() const { return untagged(); }
 | 
					  Type* operator->() const { return untagged(); }
 | 
				
			||||||
  cell* operator&() const { return &value_; }
 | 
					  cell* operator&() const { return &value_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const tagged<Type>& operator=(const Type* x) {
 | 
					 | 
				
			||||||
    value_ = tag(x);
 | 
					 | 
				
			||||||
    return *this;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  const tagged<Type>& operator=(const cell& x) {
 | 
					 | 
				
			||||||
    value_ = x;
 | 
					 | 
				
			||||||
    return *this;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bool operator==(const tagged<Type>& x) { return value_ == x.value_; }
 | 
					  bool operator==(const tagged<Type>& x) { return value_ == x.value_; }
 | 
				
			||||||
  bool operator!=(const tagged<Type>& x) { return value_ != x.value_; }
 | 
					  bool operator!=(const tagged<Type>& x) { return value_ != x.value_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue