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_) 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);
} }
} }

View File

@ -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);
} }
} }

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); 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;
} }

View File

@ -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);