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-05-04 05:50:24 -04:00
|
|
|
byte_array *array = allot_array_internal<byte_array>(size);
|
2009-05-02 05:04:19 -04:00
|
|
|
memset(array + 1,0,size);
|
|
|
|
return array;
|
|
|
|
}
|
|
|
|
|
2009-09-23 14:05:46 -04:00
|
|
|
inline 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
|
|
|
}
|
|
|
|
|
2009-09-25 15:43:01 -04:00
|
|
|
PRIMITIVE_FORWARD(byte_array)
|
2009-08-17 16:37:06 -04:00
|
|
|
|
2009-09-23 14:05:46 -04:00
|
|
|
inline 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();
|
|
|
|
dpush(tag<byte_array>(allot_array_internal<byte_array>(size)));
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
|
|
|
|
2009-09-25 15:43:01 -04:00
|
|
|
PRIMITIVE_FORWARD(uninitialized_byte_array)
|
2009-08-17 16:37:06 -04:00
|
|
|
|
2009-09-23 14:05:46 -04:00
|
|
|
inline 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-09-25 15:43:01 -04:00
|
|
|
PRIMITIVE_FORWARD(resize_byte_array)
|
2009-08-17 16:37:06 -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;
|
2009-09-23 14:26:54 -04:00
|
|
|
factor_vm *parent_vm = elements.parent_vm;
|
2009-05-04 05:50:24 -04:00
|
|
|
if(new_size >= array_capacity(elements.untagged()))
|
2009-09-23 14:26:54 -04:00
|
|
|
elements = parent_vm->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
|
|
|
{
|
2009-09-23 14:26:54 -04:00
|
|
|
gc_root<byte_array> byte_array(byte_array_,elements.parent_vm);
|
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;
|
2009-09-23 14:26:54 -04:00
|
|
|
factor_vm *parent_vm = elements.parent_vm;
|
2009-05-04 05:50:24 -04:00
|
|
|
if(new_size >= array_capacity(elements.untagged()))
|
2009-09-23 14:26:54 -04:00
|
|
|
elements = parent_vm->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()
|
|
|
|
{
|
2009-09-23 14:26:54 -04:00
|
|
|
factor_vm *parent_vm = elements.parent_vm;
|
|
|
|
elements = parent_vm->reallot_array(elements.untagged(),count);
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
2009-05-04 02:46:13 -04:00
|
|
|
|
|
|
|
}
|