moved reallot_array into vm

db4
Phil Dawes 2009-08-17 21:37:10 +01:00
parent e678f6a681
commit 1b64155998
4 changed files with 21 additions and 14 deletions

View File

@ -102,16 +102,18 @@ PRIMITIVE(resize_array)
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()))
elements = reallot_array(elements.untagged(),count * 2);
elements = myvm->reallot_array(elements.untagged(),count * 2);
set_array_nth(elements.untagged(),count++,elt.value());
}
void growable_array::trim()
{
elements = reallot_array(elements.untagged(),count);
factorvm *myvm = elements.myvm;
elements = myvm->reallot_array(elements.untagged(),count);
}
}

View File

@ -52,9 +52,9 @@ PRIMITIVE(resize_byte_array)
void growable_byte_array::append_bytes(void *elts, cell len)
{
cell new_size = count + len;
factorvm *myvm = elements.myvm;
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);
@ -67,9 +67,9 @@ void growable_byte_array::append_byte_array(cell byte_array_)
cell len = array_capacity(byte_array.untagged());
cell new_size = count + len;
factorvm *myvm = elements.myvm;
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);
@ -78,7 +78,8 @@ void growable_byte_array::append_byte_array(cell byte_array_)
void growable_byte_array::trim()
{
elements = reallot_array(elements.untagged(),count);
factorvm *myvm = elements.myvm;
elements = myvm->reallot_array(elements.untagged(),count);
}
}

View File

@ -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);
}
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))
{
@ -46,11 +46,11 @@ template <typename T> T *reallot_array(T *array_, cell capacity)
if(capacity < to_copy)
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);
memset((char *)(new_array + 1) + to_copy * T::element_size,
0,(capacity - to_copy) * T::element_size);
memcpy(new_array + 1,array.untagged() + 1,to_copy * TYPE::element_size);
memset((char *)(new_array + 1) + to_copy * TYPE::element_size,
0,(capacity - to_copy) * TYPE::element_size);
return new_array;
}

View File

@ -191,6 +191,10 @@ struct factorvm {
std::vector<cell> gc_locals;
std::vector<cell> gc_bignums;
// generic arrays
template <typename TYPE> TYPE *reallot_array(TYPE *array_, cell capacity);
//debug
void print_chars(string* str);
void print_word(word* word, cell nesting);