moved reallot_array into vm
parent
e678f6a681
commit
1b64155998
|
@ -102,16 +102,18 @@ PRIMITIVE(resize_array)
|
||||||
|
|
||||||
void growable_array::add(cell elt_)
|
void growable_array::add(cell elt_)
|
||||||
{
|
{
|
||||||
gc_root<object> elt(elt_,elements.myvm);
|
factorvm* myvm = elements.myvm;
|
||||||
|
gc_root<object> elt(elt_,myvm);
|
||||||
if(count == array_capacity(elements.untagged()))
|
if(count == array_capacity(elements.untagged()))
|
||||||
elements = reallot_array(elements.untagged(),count * 2);
|
elements = myvm->reallot_array(elements.untagged(),count * 2);
|
||||||
|
|
||||||
set_array_nth(elements.untagged(),count++,elt.value());
|
set_array_nth(elements.untagged(),count++,elt.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
void growable_array::trim()
|
void growable_array::trim()
|
||||||
{
|
{
|
||||||
elements = reallot_array(elements.untagged(),count);
|
factorvm *myvm = elements.myvm;
|
||||||
|
elements = myvm->reallot_array(elements.untagged(),count);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,9 +52,9 @@ PRIMITIVE(resize_byte_array)
|
||||||
void growable_byte_array::append_bytes(void *elts, cell len)
|
void growable_byte_array::append_bytes(void *elts, cell len)
|
||||||
{
|
{
|
||||||
cell new_size = count + len;
|
cell new_size = count + len;
|
||||||
|
factorvm *myvm = elements.myvm;
|
||||||
if(new_size >= array_capacity(elements.untagged()))
|
if(new_size >= array_capacity(elements.untagged()))
|
||||||
elements = reallot_array(elements.untagged(),new_size * 2);
|
elements = myvm->reallot_array(elements.untagged(),new_size * 2);
|
||||||
|
|
||||||
memcpy(&elements->data<u8>()[count],elts,len);
|
memcpy(&elements->data<u8>()[count],elts,len);
|
||||||
|
|
||||||
|
@ -67,9 +67,9 @@ void growable_byte_array::append_byte_array(cell byte_array_)
|
||||||
|
|
||||||
cell len = array_capacity(byte_array.untagged());
|
cell len = array_capacity(byte_array.untagged());
|
||||||
cell new_size = count + len;
|
cell new_size = count + len;
|
||||||
|
factorvm *myvm = elements.myvm;
|
||||||
if(new_size >= array_capacity(elements.untagged()))
|
if(new_size >= array_capacity(elements.untagged()))
|
||||||
elements = reallot_array(elements.untagged(),new_size * 2);
|
elements = myvm->reallot_array(elements.untagged(),new_size * 2);
|
||||||
|
|
||||||
memcpy(&elements->data<u8>()[count],byte_array->data<u8>(),len);
|
memcpy(&elements->data<u8>()[count],byte_array->data<u8>(),len);
|
||||||
|
|
||||||
|
@ -78,7 +78,8 @@ void growable_byte_array::append_byte_array(cell byte_array_)
|
||||||
|
|
||||||
void growable_byte_array::trim()
|
void growable_byte_array::trim()
|
||||||
{
|
{
|
||||||
elements = reallot_array(elements.untagged(),count);
|
factorvm *myvm = elements.myvm;
|
||||||
|
elements = myvm->reallot_array(elements.untagged(),count);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,9 +31,9 @@ template <typename T> bool reallot_array_in_place_p(T *array, cell capacity)
|
||||||
return in_zone(&nursery,array) && capacity <= array_capacity(array);
|
return in_zone(&nursery,array) && capacity <= array_capacity(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> T *reallot_array(T *array_, cell capacity)
|
template <typename TYPE> TYPE *factorvm::reallot_array(TYPE *array_, cell capacity)
|
||||||
{
|
{
|
||||||
gc_root<T> array(array_,vm);
|
gc_root<TYPE> array(array_,this);
|
||||||
|
|
||||||
if(reallot_array_in_place_p(array.untagged(),capacity))
|
if(reallot_array_in_place_p(array.untagged(),capacity))
|
||||||
{
|
{
|
||||||
|
@ -46,11 +46,11 @@ template <typename T> T *reallot_array(T *array_, cell capacity)
|
||||||
if(capacity < to_copy)
|
if(capacity < to_copy)
|
||||||
to_copy = capacity;
|
to_copy = capacity;
|
||||||
|
|
||||||
T *new_array = allot_array_internal<T>(capacity);
|
TYPE *new_array = allot_array_internal<TYPE>(capacity);
|
||||||
|
|
||||||
memcpy(new_array + 1,array.untagged() + 1,to_copy * T::element_size);
|
memcpy(new_array + 1,array.untagged() + 1,to_copy * TYPE::element_size);
|
||||||
memset((char *)(new_array + 1) + to_copy * T::element_size,
|
memset((char *)(new_array + 1) + to_copy * TYPE::element_size,
|
||||||
0,(capacity - to_copy) * T::element_size);
|
0,(capacity - to_copy) * TYPE::element_size);
|
||||||
|
|
||||||
return new_array;
|
return new_array;
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,6 +191,10 @@ struct factorvm {
|
||||||
std::vector<cell> gc_locals;
|
std::vector<cell> gc_locals;
|
||||||
std::vector<cell> gc_bignums;
|
std::vector<cell> gc_bignums;
|
||||||
|
|
||||||
|
// generic arrays
|
||||||
|
|
||||||
|
template <typename TYPE> TYPE *reallot_array(TYPE *array_, cell capacity);
|
||||||
|
|
||||||
//debug
|
//debug
|
||||||
void print_chars(string* str);
|
void print_chars(string* str);
|
||||||
void print_word(word* word, cell nesting);
|
void print_word(word* word, cell nesting);
|
||||||
|
|
Loading…
Reference in New Issue