]> gitweb.factorcode.org Git - factor.git/blob - vm/byte_arrays.cpp
VM: undoing 0274e889b94323fdde6919a77c494ffcfbcb2166 (#1513)
[factor.git] / vm / byte_arrays.cpp
1 #include "master.hpp"
2
3 namespace factor {
4
5 // Allocates memory
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);
9   return array;
10 }
11
12 // Allocates memory
13 void factor_vm::primitive_byte_array() {
14   cell size = unbox_array_size();
15   ctx->push(tag<byte_array>(allot_byte_array(size)));
16 }
17
18 // Allocates memory
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)));
22 }
23
24 // Allocates memory
25 void factor_vm::primitive_resize_byte_array() {
26   data_root<byte_array> array(ctx->pop(), this);
27   array.untag_check(this);
28   cell capacity = unbox_array_size();
29   ctx->push(tag<byte_array>(reallot_array(array.untagged(), capacity)));
30 }
31
32 // Allocates memory
33 void growable_byte_array::grow_bytes(cell len) {
34   count += len;
35   if (count >= array_capacity(elements.untagged()))
36     elements = elements.parent->reallot_array(elements.untagged(), count * 2);
37 }
38
39 // Allocates memory
40 void growable_byte_array::append_bytes(void* elts, cell len) {
41   cell old_count = count;
42   grow_bytes(len);
43   memcpy(&elements->data<uint8_t>()[old_count], elts, len);
44 }
45
46 // Allocates memory
47 void growable_byte_array::append_byte_array(cell byte_array_) {
48   data_root<byte_array> byte_array(byte_array_, elements.parent);
49
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);
55
56   memcpy(&elements->data<uint8_t>()[count], byte_array->data<uint8_t>(), len);
57
58   count += len;
59 }
60
61 // Allocates memory
62 void growable_byte_array::trim() {
63   factor_vm* parent = elements.parent;
64   elements = parent->reallot_array(elements.untagged(), count);
65 }
66
67 }