factor/vmpp/byte_arrays.cpp

44 lines
1.0 KiB
C++
Raw Normal View History

2009-05-02 05:04:19 -04:00
#include "master.hpp"
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;
}
void primitive_byte_array(void)
{
CELL size = unbox_array_size();
dpush(tag_object(allot_byte_array(size)));
}
void primitive_uninitialized_byte_array(void)
{
CELL size = unbox_array_size();
2009-05-02 05:43:58 -04:00
dpush(tag_object(allot_array_internal<F_BYTE_ARRAY>(size)));
2009-05-02 05:04:19 -04:00
}
void primitive_resize_byte_array(void)
{
2009-05-02 05:43:58 -04:00
F_BYTE_ARRAY *array = untag_byte_array(dpop());
2009-05-02 05:04:19 -04:00
CELL capacity = unbox_array_size();
2009-05-02 05:43:58 -04:00
dpush(tag_object(reallot_array(array,capacity)));
2009-05-02 05:04:19 -04:00
}
void growable_byte_array_append(F_GROWABLE_BYTE_ARRAY *array, void *elts, CELL len)
{
CELL new_size = array->count + len;
F_BYTE_ARRAY *underlying = untag_byte_array_fast(array->array);
2009-05-02 05:43:58 -04:00
if(new_size >= array_capacity(underlying))
2009-05-02 05:04:19 -04:00
{
2009-05-02 05:43:58 -04:00
underlying = reallot_array(underlying,new_size * 2);
2009-05-02 05:04:19 -04:00
array->array = tag_object(underlying);
}
memcpy((void *)BREF(underlying,array->count),elts,len);
array->count += len;
}