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