6 array* factor_vm::allot_array(cell capacity, cell fill_) {
7 data_root<object> fill(fill_, this);
8 array* new_array = allot_uninitialized_array<array>(capacity);
9 memset_cell(new_array->data(), fill.value(), capacity * sizeof(cell));
14 void factor_vm::primitive_array() {
15 cell fill = ctx->pop();
16 cell capacity = unbox_array_size();
17 array* new_array = allot_array(capacity, fill);
18 ctx->push(tag<array>(new_array));
22 cell factor_vm::allot_array_4(cell v1_, cell v2_, cell v3_, cell v4_) {
23 data_root<object> v1(v1_, this);
24 data_root<object> v2(v2_, this);
25 data_root<object> v3(v3_, this);
26 data_root<object> v4(v4_, this);
27 data_root<array> a(allot_uninitialized_array<array>(4), this);
28 set_array_nth(a.untagged(), 0, v1.value());
29 set_array_nth(a.untagged(), 1, v2.value());
30 set_array_nth(a.untagged(), 2, v3.value());
31 set_array_nth(a.untagged(), 3, v4.value());
36 void factor_vm::primitive_resize_array() {
37 data_root<array> a(ctx->pop(), this);
39 cell capacity = unbox_array_size();
40 ctx->push(tag<array>(reallot_array(a.untagged(), capacity)));
44 cell factor_vm::std_vector_to_array(std::vector<cell>& elements) {
46 cell element_count = elements.size();
47 cell orig_size = data_roots.size();
48 data_roots.reserve(orig_size + element_count);
50 for (cell n = 0; n < element_count; n++) {
51 data_roots.push_back(&elements[n]);
54 tagged<array> objects(allot_uninitialized_array<array>(element_count));
55 memcpy(objects->data(), &elements[0], element_count * sizeof(cell));
56 data_roots.resize(orig_size);
57 return objects.value();
61 void growable_array::add(cell elt_) {
62 factor_vm* parent = elements.parent;
63 data_root<object> elt(elt_, parent);
64 if (count == array_capacity(elements.untagged()))
65 elements = parent->reallot_array(elements.untagged(), count * 2);
67 parent->set_array_nth(elements.untagged(), count++, elt.value());
71 void growable_array::append(array* elts_) {
72 factor_vm* parent = elements.parent;
73 data_root<array> elts(elts_, parent);
74 cell capacity = array_capacity(elts.untagged());
75 if (count + capacity > array_capacity(elements.untagged())) {
77 parent->reallot_array(elements.untagged(), (count + capacity) * 2);
80 for (cell index = 0; index < capacity; index++)
81 parent->set_array_nth(elements.untagged(), count++,
82 array_nth(elts.untagged(), index));
86 void growable_array::trim() {
87 factor_vm* parent = elements.parent;
88 elements = parent->reallot_array(elements.untagged(), count);