factor/vm/byte_arrays.cpp

66 lines
1.6 KiB
C++
Raw Normal View History

2009-05-02 05:04:19 -04:00
#include "master.hpp"
2009-05-04 02:46:13 -04:00
namespace factor
{
2009-09-23 14:05:46 -04:00
byte_array *factor_vm::allot_byte_array(cell size)
2009-05-02 05:04:19 -04:00
{
2009-10-20 13:45:00 -04:00
byte_array *array = allot_uninitialized_array<byte_array>(size);
2009-05-02 05:04:19 -04:00
memset(array + 1,0,size);
return array;
}
void factor_vm::primitive_byte_array()
2009-05-02 05:04:19 -04:00
{
2009-05-04 05:50:24 -04:00
cell size = unbox_array_size();
dpush(tag<byte_array>(allot_byte_array(size)));
2009-05-02 05:04:19 -04:00
}
void factor_vm::primitive_uninitialized_byte_array()
2009-05-02 05:04:19 -04:00
{
2009-05-04 05:50:24 -04:00
cell size = unbox_array_size();
2009-10-20 13:45:00 -04:00
dpush(tag<byte_array>(allot_uninitialized_array<byte_array>(size)));
2009-05-02 05:04:19 -04:00
}
void factor_vm::primitive_resize_byte_array()
2009-05-02 05:04:19 -04:00
{
2009-05-04 05:50:24 -04:00
byte_array *array = untag_check<byte_array>(dpop());
cell capacity = unbox_array_size();
dpush(tag<byte_array>(reallot_array(array,capacity)));
2009-05-02 05:04:19 -04:00
}
2009-05-04 05:50:24 -04:00
void growable_byte_array::append_bytes(void *elts, cell len)
2009-05-02 05:04:19 -04:00
{
2009-05-04 05:50:24 -04:00
cell new_size = count + len;
factor_vm *parent = elements.parent;
2009-05-04 05:50:24 -04:00
if(new_size >= array_capacity(elements.untagged()))
elements = parent->reallot_array(elements.untagged(),new_size * 2);
2009-05-02 05:04:19 -04:00
2009-05-04 05:50:24 -04:00
memcpy(&elements->data<u8>()[count],elts,len);
2009-05-02 05:04:19 -04:00
2009-05-02 10:19:09 -04:00
count += len;
}
2009-05-04 05:50:24 -04:00
void growable_byte_array::append_byte_array(cell byte_array_)
2009-05-02 10:19:09 -04:00
{
data_root<byte_array> byte_array(byte_array_,elements.parent);
2009-05-02 10:19:09 -04:00
2009-05-04 05:50:24 -04:00
cell len = array_capacity(byte_array.untagged());
cell new_size = count + len;
factor_vm *parent = elements.parent;
2009-05-04 05:50:24 -04:00
if(new_size >= array_capacity(elements.untagged()))
elements = parent->reallot_array(elements.untagged(),new_size * 2);
2009-05-02 10:19:09 -04:00
2009-05-04 05:50:24 -04:00
memcpy(&elements->data<u8>()[count],byte_array->data<u8>(),len);
2009-05-02 10:19:09 -04:00
count += len;
}
void growable_byte_array::trim()
{
factor_vm *parent = elements.parent;
elements = parent->reallot_array(elements.untagged(),count);
2009-05-02 05:04:19 -04:00
}
2009-05-04 02:46:13 -04:00
}