factor/vm/byte_arrays.cpp

65 lines
1.3 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-05-02 05:04:19 -04:00
F_BYTE_ARRAY *allot_byte_array(CELL size)
{
2009-05-02 05:43:58 -04:00
F_BYTE_ARRAY *array = allot_array_internal<F_BYTE_ARRAY>(size);
2009-05-02 05:04:19 -04:00
memset(array + 1,0,size);
return array;
}
PRIMITIVE(byte_array)
2009-05-02 05:04:19 -04:00
{
CELL size = unbox_array_size();
dpush(tag<F_BYTE_ARRAY>(allot_byte_array(size)));
2009-05-02 05:04:19 -04:00
}
PRIMITIVE(uninitialized_byte_array)
2009-05-02 05:04:19 -04:00
{
CELL size = unbox_array_size();
dpush(tag<F_BYTE_ARRAY>(allot_array_internal<F_BYTE_ARRAY>(size)));
2009-05-02 05:04:19 -04:00
}
PRIMITIVE(resize_byte_array)
2009-05-02 05:04:19 -04:00
{
F_BYTE_ARRAY *array = untag_check<F_BYTE_ARRAY>(dpop());
2009-05-02 05:04:19 -04:00
CELL capacity = unbox_array_size();
dpush(tag<F_BYTE_ARRAY>(reallot_array(array,capacity)));
2009-05-02 05:04:19 -04:00
}
2009-05-02 10:19:09 -04:00
void growable_byte_array::append_bytes(void *elts, CELL len)
2009-05-02 05:04:19 -04:00
{
2009-05-02 10:19:09 -04:00
CELL new_size = count + len;
2009-05-02 05:04:19 -04:00
2009-05-02 10:19:09 -04:00
if(new_size >= array_capacity(array.untagged()))
array = reallot_array(array.untagged(),new_size * 2);
2009-05-02 05:04:19 -04:00
memcpy(&array->data<u8>()[count],elts,len);
2009-05-02 05:04:19 -04:00
2009-05-02 10:19:09 -04:00
count += len;
}
void growable_byte_array::append_byte_array(CELL byte_array_)
{
gc_root<F_BYTE_ARRAY> byte_array(byte_array_);
CELL len = array_capacity(byte_array.untagged());
CELL new_size = count + len;
if(new_size >= array_capacity(array.untagged()))
array = reallot_array(array.untagged(),new_size * 2);
memcpy(&array->data<u8>()[count],byte_array->data<u8>(),len);
2009-05-02 10:19:09 -04:00
count += len;
}
void growable_byte_array::trim()
{
array = reallot_array(array.untagged(),count);
2009-05-02 05:04:19 -04:00
}
2009-05-04 02:46:13 -04:00
}