moved reallot_array into vm
							parent
							
								
									e678f6a681
								
							
						
					
					
						commit
						1b64155998
					
				| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue