]> gitweb.factorcode.org Git - factor.git/blob - vm/generic_arrays.hpp
VM: Remove exec bit from VM source files
[factor.git] / vm / generic_arrays.hpp
1 namespace factor
2 {
3
4 template<typename Array> cell array_capacity(const Array *array)
5 {
6 #ifdef FACTOR_DEBUG
7         FACTOR_ASSERT(array->type() == Array::type_number);
8 #endif
9         return array->capacity >> TAG_BITS;
10 }
11
12 template<typename Array> cell array_size(cell capacity)
13 {
14         return sizeof(Array) + capacity * Array::element_size;
15 }
16
17 template<typename Array> cell array_size(Array *array)
18 {
19         return array_size<Array>(array_capacity(array));
20 }
21
22 /* Allocates memory */
23 template<typename Array> Array *factor_vm::allot_uninitialized_array(cell capacity)
24 {
25         Array *array = allot<Array>(array_size<Array>(capacity));
26         array->capacity = tag_fixnum(capacity);
27         return array;
28 }
29
30 template<typename Array> bool factor_vm::reallot_array_in_place_p(Array *array, cell capacity)
31 {
32         return nursery.contains_p(array) && capacity <= array_capacity(array);
33 }
34
35 /* Allocates memory (sometimes) */
36 template<typename Array> Array *factor_vm::reallot_array(Array *array_, cell capacity)
37 {
38         data_root<Array> array(array_,this);
39
40         if (array_capacity(array.untagged()) == capacity)
41                 return array.untagged();
42
43         if(reallot_array_in_place_p(array.untagged(),capacity))
44         {
45                 array->capacity = tag_fixnum(capacity);
46                 return array.untagged();
47         }
48         else
49         {
50                 cell to_copy = array_capacity(array.untagged());
51                 if(capacity < to_copy)
52                         to_copy = capacity;
53
54                 Array *new_array = allot_uninitialized_array<Array>(capacity);
55
56                 memcpy(new_array + 1,array.untagged() + 1,to_copy * Array::element_size);
57                 memset((char *)(new_array + 1) + to_copy * Array::element_size,
58                        0,(capacity - to_copy) * Array::element_size);
59
60                 return new_array;
61         }
62 }
63
64 }