]> gitweb.factorcode.org Git - factor.git/blob - vm/byte_arrays.cpp
Merge branch 'monotonic' of git://factorcode.org/git/factor into monotonic
[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 void factor_vm::primitive_byte_array()
14 {
15         cell size = unbox_array_size();
16         dpush(tag<byte_array>(allot_byte_array(size)));
17 }
18
19 void factor_vm::primitive_uninitialized_byte_array()
20 {
21         cell size = unbox_array_size();
22         dpush(tag<byte_array>(allot_uninitialized_array<byte_array>(size)));
23 }
24
25 void factor_vm::primitive_resize_byte_array()
26 {
27         data_root<byte_array> array(dpop(),this);
28         array.untag_check(this);
29         cell capacity = unbox_array_size();
30         dpush(tag<byte_array>(reallot_array(array.untagged(),capacity)));
31 }
32
33 void growable_byte_array::append_bytes(void *elts, cell len)
34 {
35         cell new_size = count + len;
36         factor_vm *parent = elements.parent;
37         if(new_size >= array_capacity(elements.untagged()))
38                 elements = parent->reallot_array(elements.untagged(),new_size * 2);
39
40         memcpy(&elements->data<u8>()[count],elts,len);
41
42         count += len;
43 }
44
45 void growable_byte_array::append_byte_array(cell byte_array_)
46 {
47         data_root<byte_array> byte_array(byte_array_,elements.parent);
48
49         cell len = array_capacity(byte_array.untagged());
50         cell new_size = count + len;
51         factor_vm *parent = elements.parent;
52         if(new_size >= array_capacity(elements.untagged()))
53                 elements = parent->reallot_array(elements.untagged(),new_size * 2);
54
55         memcpy(&elements->data<u8>()[count],byte_array->data<u8>(),len);
56
57         count += len;
58 }
59
60 void growable_byte_array::trim()
61 {
62         factor_vm *parent = elements.parent;
63         elements = parent->reallot_array(elements.untagged(),count);
64 }
65
66 }