2009-05-02 05:04:19 -04:00
|
|
|
#include "master.hpp"
|
|
|
|
|
2009-05-04 02:46:13 -04:00
|
|
|
namespace factor
|
|
|
|
{
|
|
|
|
|
2009-08-17 16:37:06 -04:00
|
|
|
byte_array *factorvm::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 13:05:17 -04:00
|
|
|
inline void factorvm::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-08-17 16:37:06 -04:00
|
|
|
PRIMITIVE(byte_array)
|
|
|
|
{
|
2009-09-23 13:05:17 -04:00
|
|
|
PRIMITIVE_GETVM()->primitive_byte_array();
|
2009-08-17 16:37:06 -04:00
|
|
|
}
|
|
|
|
|
2009-09-23 13:05:17 -04:00
|
|
|
inline void factorvm::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-08-17 16:37:06 -04:00
|
|
|
PRIMITIVE(uninitialized_byte_array)
|
|
|
|
{
|
2009-09-23 13:05:17 -04:00
|
|
|
PRIMITIVE_GETVM()->primitive_uninitialized_byte_array();
|
2009-08-17 16:37:06 -04:00
|
|
|
}
|
|
|
|
|
2009-09-23 13:05:17 -04:00
|
|
|
inline void factorvm::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-08-17 16:37:06 -04:00
|
|
|
PRIMITIVE(resize_byte_array)
|
|
|
|
{
|
2009-09-23 13:05:17 -04:00
|
|
|
PRIMITIVE_GETVM()->primitive_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-08-17 16:37:10 -04:00
|
|
|
factorvm *myvm = elements.myvm;
|
2009-05-04 05:50:24 -04:00
|
|
|
if(new_size >= array_capacity(elements.untagged()))
|
2009-08-17 16:37:10 -04:00
|
|
|
elements = myvm->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-08-17 16:37:09 -04:00
|
|
|
gc_root<byte_array> byte_array(byte_array_,elements.myvm);
|
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-08-17 16:37:10 -04:00
|
|
|
factorvm *myvm = elements.myvm;
|
2009-05-04 05:50:24 -04:00
|
|
|
if(new_size >= array_capacity(elements.untagged()))
|
2009-08-17 16:37:10 -04:00
|
|
|
elements = myvm->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-08-17 16:37:10 -04:00
|
|
|
factorvm *myvm = elements.myvm;
|
|
|
|
elements = myvm->reallot_array(elements.untagged(),count);
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
2009-05-04 02:46:13 -04:00
|
|
|
|
|
|
|
}
|