]> gitweb.factorcode.org Git - factor.git/blob - vm/byte_arrays.cpp
added byte_arrays fns to vm
[factor.git] / vm / byte_arrays.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 byte_array *factorvm::allot_byte_array(cell size)
7 {
8         byte_array *array = allot_array_internal<byte_array>(size);
9         memset(array + 1,0,size);
10         return array;
11 }
12
13 byte_array *allot_byte_array(cell size)
14 {
15         return vm->allot_byte_array(size);
16 }
17
18 inline void factorvm::vmprim_byte_array()
19 {
20         cell size = unbox_array_size();
21         dpush(tag<byte_array>(allot_byte_array(size)));
22 }
23
24 PRIMITIVE(byte_array)
25 {
26         PRIMITIVE_GETVM()->vmprim_byte_array();
27 }
28
29 inline void factorvm::vmprim_uninitialized_byte_array()
30 {
31         cell size = unbox_array_size();
32         dpush(tag<byte_array>(allot_array_internal<byte_array>(size)));
33 }
34
35 PRIMITIVE(uninitialized_byte_array)
36 {
37         PRIMITIVE_GETVM()->vmprim_uninitialized_byte_array();
38 }
39
40 inline void factorvm::vmprim_resize_byte_array()
41 {
42         byte_array *array = untag_check<byte_array>(dpop());
43         cell capacity = unbox_array_size();
44         dpush(tag<byte_array>(reallot_array(array,capacity)));
45 }
46
47 PRIMITIVE(resize_byte_array)
48 {
49         PRIMITIVE_GETVM()->vmprim_resize_byte_array();
50 }
51
52 void growable_byte_array::append_bytes(void *elts, cell len)
53 {
54         cell new_size = count + len;
55
56         if(new_size >= array_capacity(elements.untagged()))
57                 elements = reallot_array(elements.untagged(),new_size * 2);
58
59         memcpy(&elements->data<u8>()[count],elts,len);
60
61         count += len;
62 }
63
64 void growable_byte_array::append_byte_array(cell byte_array_)
65 {
66         gc_root<byte_array> byte_array(byte_array_);
67
68         cell len = array_capacity(byte_array.untagged());
69         cell new_size = count + len;
70
71         if(new_size >= array_capacity(elements.untagged()))
72                 elements = reallot_array(elements.untagged(),new_size * 2);
73
74         memcpy(&elements->data<u8>()[count],byte_array->data<u8>(),len);
75
76         count += len;
77 }
78
79 void growable_byte_array::trim()
80 {
81         elements = reallot_array(elements.untagged(),count);
82 }
83
84 }