6 byte_array* factor_vm::allot_byte_array(cell size) {
7 byte_array* array = allot_uninitialized_array<byte_array>(size);
8 memset(array + 1, 0, size);
13 void factor_vm::primitive_byte_array() {
14 cell size = unbox_array_size();
15 ctx->push(tag<byte_array>(allot_byte_array(size)));
19 void factor_vm::primitive_uninitialized_byte_array() {
20 cell size = unbox_array_size();
21 ctx->push(tag<byte_array>(allot_uninitialized_array<byte_array>(size)));
25 void factor_vm::primitive_resize_byte_array() {
26 data_root<byte_array> array(ctx->pop(), this);
28 cell capacity = unbox_array_size();
29 ctx->push(tag<byte_array>(reallot_array(array.untagged(), capacity)));
33 void growable_byte_array::grow_bytes(cell len) {
35 if (count >= array_capacity(elements.untagged()))
36 elements = elements.parent->reallot_array(elements.untagged(), count * 2);
40 void growable_byte_array::append_bytes(void* elts, cell len) {
41 cell old_count = count;
43 memcpy(&elements->data<uint8_t>()[old_count], elts, len);
47 void growable_byte_array::append_byte_array(cell byte_array_) {
48 data_root<byte_array> byte_array(byte_array_, elements.parent);
50 cell len = array_capacity(byte_array.untagged());
51 cell new_size = count + len;
52 factor_vm* parent = elements.parent;
53 if (new_size >= array_capacity(elements.untagged()))
54 elements = parent->reallot_array(elements.untagged(), new_size * 2);
56 memcpy(&elements->data<uint8_t>()[count], byte_array->data<uint8_t>(), len);
62 void growable_byte_array::trim() {
63 factor_vm* parent = elements.parent;
64 elements = parent->reallot_array(elements.untagged(), count);