]> gitweb.factorcode.org Git - factor.git/blob - vm/byte_arrays.cpp
vm: Add more comments about functions that allocate.
[factor.git] / vm / byte_arrays.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 /* Allocates memory */
7 byte_array *factor_vm::allot_byte_array(cell size)
8 {
9         byte_array *array = allot_uninitialized_array<byte_array>(size);
10         memset(array + 1,0,size);
11         return array;
12 }
13
14 /* Allocates memory */
15 void factor_vm::primitive_byte_array()
16 {
17         cell size = unbox_array_size();
18         ctx->push(tag<byte_array>(allot_byte_array(size)));
19 }
20
21 /* Allocates memory */
22 void factor_vm::primitive_uninitialized_byte_array()
23 {
24         cell size = unbox_array_size();
25         ctx->push(tag<byte_array>(allot_uninitialized_array<byte_array>(size)));
26 }
27
28 /* Allocates memory */
29 void factor_vm::primitive_resize_byte_array()
30 {
31         data_root<byte_array> array(ctx->pop(),this);
32         array.untag_check(this);
33         cell capacity = unbox_array_size();
34         ctx->push(tag<byte_array>(reallot_array(array.untagged(),capacity)));
35 }
36
37 /* Allocates memory */
38 void growable_byte_array::grow_bytes(cell len)
39 {
40         count += len;
41         if(count >= array_capacity(elements.untagged()))
42                 elements = elements.parent->reallot_array(elements.untagged(),count * 2);
43 }
44
45 /* Allocates memory */
46 void growable_byte_array::append_bytes(void *elts, cell len)
47 {
48         cell old_count = count;
49         grow_bytes(len);
50         memcpy(&elements->data<u8>()[old_count],elts,len);
51 }
52
53 /* Allocates memory */
54 void growable_byte_array::append_byte_array(cell byte_array_)
55 {
56         data_root<byte_array> byte_array(byte_array_,elements.parent);
57
58         cell len = array_capacity(byte_array.untagged());
59         cell new_size = count + len;
60         factor_vm *parent = elements.parent;
61         if(new_size >= array_capacity(elements.untagged()))
62                 elements = parent->reallot_array(elements.untagged(),new_size * 2);
63
64         memcpy(&elements->data<u8>()[count],byte_array->data<u8>(),len);
65
66         count += len;
67 }
68
69 /* Allocates memory */
70 void growable_byte_array::trim()
71 {
72         factor_vm *parent = elements.parent;
73         elements = parent->reallot_array(elements.untagged(),count);
74 }
75
76 }