4 template<typename Array> cell array_capacity(const Array *array)
7 FACTOR_ASSERT(array->type() == Array::type_number);
9 return array->capacity >> TAG_BITS;
12 template<typename Array> cell array_size(cell capacity)
14 return sizeof(Array) + capacity * Array::element_size;
17 template<typename Array> cell array_size(Array *array)
19 return array_size<Array>(array_capacity(array));
22 /* Allocates memory */
23 template<typename Array> Array *factor_vm::allot_uninitialized_array(cell capacity)
25 Array *array = allot<Array>(array_size<Array>(capacity));
26 array->capacity = tag_fixnum(capacity);
30 template<typename Array> bool factor_vm::reallot_array_in_place_p(Array *array, cell capacity)
32 return nursery.contains_p(array) && capacity <= array_capacity(array);
35 /* Allocates memory (sometimes) */
36 template<typename Array> Array *factor_vm::reallot_array(Array *array_, cell capacity)
38 data_root<Array> array(array_,this);
40 if (array_capacity(array.untagged()) == capacity)
41 return array.untagged();
43 if(reallot_array_in_place_p(array.untagged(),capacity))
45 array->capacity = tag_fixnum(capacity);
46 return array.untagged();
50 cell to_copy = array_capacity(array.untagged());
51 if(capacity < to_copy)
54 Array *new_array = allot_uninitialized_array<Array>(capacity);
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);