107 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
#include "master.hpp"
 | 
						|
 | 
						|
namespace factor {
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
array* factor_vm::allot_array(cell capacity, cell fill_) {
 | 
						|
  data_root<object> fill(fill_, this);
 | 
						|
  array* new_array = allot_uninitialized_array<array>(capacity);
 | 
						|
  memset_cell(new_array->data(), fill.value(), capacity * sizeof(cell));
 | 
						|
  return new_array;
 | 
						|
}
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
void factor_vm::primitive_array() {
 | 
						|
  data_root<object> fill(ctx->pop(), this);
 | 
						|
  cell capacity = unbox_array_size();
 | 
						|
  array* new_array = allot_uninitialized_array<array>(capacity);
 | 
						|
  memset_cell(new_array->data(), fill.value(), capacity * sizeof(cell));
 | 
						|
  ctx->push(tag<array>(new_array));
 | 
						|
}
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
cell factor_vm::allot_array_1(cell obj_) {
 | 
						|
  data_root<object> obj(obj_, this);
 | 
						|
  data_root<array> a(allot_uninitialized_array<array>(1), this);
 | 
						|
  set_array_nth(a.untagged(), 0, obj.value());
 | 
						|
  return a.value();
 | 
						|
}
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
cell factor_vm::allot_array_2(cell v1_, cell v2_) {
 | 
						|
  data_root<object> v1(v1_, this);
 | 
						|
  data_root<object> v2(v2_, this);
 | 
						|
  data_root<array> a(allot_uninitialized_array<array>(2), this);
 | 
						|
  set_array_nth(a.untagged(), 0, v1.value());
 | 
						|
  set_array_nth(a.untagged(), 1, v2.value());
 | 
						|
  return a.value();
 | 
						|
}
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
cell factor_vm::allot_array_4(cell v1_, cell v2_, cell v3_, cell v4_) {
 | 
						|
  data_root<object> v1(v1_, this);
 | 
						|
  data_root<object> v2(v2_, this);
 | 
						|
  data_root<object> v3(v3_, this);
 | 
						|
  data_root<object> v4(v4_, this);
 | 
						|
  data_root<array> a(allot_uninitialized_array<array>(4), this);
 | 
						|
  set_array_nth(a.untagged(), 0, v1.value());
 | 
						|
  set_array_nth(a.untagged(), 1, v2.value());
 | 
						|
  set_array_nth(a.untagged(), 2, v3.value());
 | 
						|
  set_array_nth(a.untagged(), 3, v4.value());
 | 
						|
  return a.value();
 | 
						|
}
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
void factor_vm::primitive_resize_array() {
 | 
						|
  data_root<array> a(ctx->pop(), this);
 | 
						|
  a.untag_check(this);
 | 
						|
  cell capacity = unbox_array_size();
 | 
						|
  ctx->push(tag<array>(reallot_array(a.untagged(), capacity)));
 | 
						|
}
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
cell factor_vm::std_vector_to_array(std::vector<cell>& elements) {
 | 
						|
  cell element_count = elements.size();
 | 
						|
  data_roots.push_back(data_root_range(&elements[0], element_count));
 | 
						|
 | 
						|
  tagged<array> objects(allot_uninitialized_array<array>(element_count));
 | 
						|
  memcpy(objects->data(), &elements[0], element_count * sizeof(cell));
 | 
						|
 | 
						|
  data_roots.pop_back();
 | 
						|
 | 
						|
  return objects.value();
 | 
						|
}
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
void growable_array::add(cell elt_) {
 | 
						|
  factor_vm* parent = elements.parent;
 | 
						|
  data_root<object> elt(elt_, parent);
 | 
						|
  if (count == array_capacity(elements.untagged()))
 | 
						|
    elements = parent->reallot_array(elements.untagged(), count * 2);
 | 
						|
 | 
						|
  parent->set_array_nth(elements.untagged(), count++, elt.value());
 | 
						|
}
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
void growable_array::append(array* elts_) {
 | 
						|
  factor_vm* parent = elements.parent;
 | 
						|
  data_root<array> elts(elts_, parent);
 | 
						|
  cell capacity = array_capacity(elts.untagged());
 | 
						|
  if (count + capacity > array_capacity(elements.untagged())) {
 | 
						|
    elements =
 | 
						|
        parent->reallot_array(elements.untagged(), (count + capacity) * 2);
 | 
						|
  }
 | 
						|
 | 
						|
  for (cell index = 0; index < capacity; index++)
 | 
						|
    parent->set_array_nth(elements.untagged(), count++,
 | 
						|
                          array_nth(elts.untagged(), index));
 | 
						|
}
 | 
						|
 | 
						|
/* Allocates memory */
 | 
						|
void growable_array::trim() {
 | 
						|
  factor_vm* parent = elements.parent;
 | 
						|
  elements = parent->reallot_array(elements.untagged(), count);
 | 
						|
}
 | 
						|
 | 
						|
}
 |