]> gitweb.factorcode.org Git - factor.git/blob - vm/byte_arrays.cpp
renamed myvm member variable to parent_vm
[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_array_internal<byte_array>(size);
9         memset(array + 1,0,size);
10         return array;
11 }
12
13 inline 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 PRIMITIVE(byte_array)
20 {
21         PRIMITIVE_GETVM()->primitive_byte_array();
22 }
23
24 inline void factor_vm::primitive_uninitialized_byte_array()
25 {
26         cell size = unbox_array_size();
27         dpush(tag<byte_array>(allot_array_internal<byte_array>(size)));
28 }
29
30 PRIMITIVE(uninitialized_byte_array)
31 {
32         PRIMITIVE_GETVM()->primitive_uninitialized_byte_array();
33 }
34
35 inline void factor_vm::primitive_resize_byte_array()
36 {
37         byte_array *array = untag_check<byte_array>(dpop());
38         cell capacity = unbox_array_size();
39         dpush(tag<byte_array>(reallot_array(array,capacity)));
40 }
41
42 PRIMITIVE(resize_byte_array)
43 {
44         PRIMITIVE_GETVM()->primitive_resize_byte_array();
45 }
46
47 void growable_byte_array::append_bytes(void *elts, cell len)
48 {
49         cell new_size = count + len;
50         factor_vm *parent_vm = elements.parent_vm;
51         if(new_size >= array_capacity(elements.untagged()))
52                 elements = parent_vm->reallot_array(elements.untagged(),new_size * 2);
53
54         memcpy(&elements->data<u8>()[count],elts,len);
55
56         count += len;
57 }
58
59 void growable_byte_array::append_byte_array(cell byte_array_)
60 {
61         gc_root<byte_array> byte_array(byte_array_,elements.parent_vm);
62
63         cell len = array_capacity(byte_array.untagged());
64         cell new_size = count + len;
65         factor_vm *parent_vm = elements.parent_vm;
66         if(new_size >= array_capacity(elements.untagged()))
67                 elements = parent_vm->reallot_array(elements.untagged(),new_size * 2);
68
69         memcpy(&elements->data<u8>()[count],byte_array->data<u8>(),len);
70
71         count += len;
72 }
73
74 void growable_byte_array::trim()
75 {
76         factor_vm *parent_vm = elements.parent_vm;
77         elements = parent_vm->reallot_array(elements.untagged(),count);
78 }
79
80 }