2009-05-02 05:04:19 -04:00
|
|
|
#include "master.hpp"
|
|
|
|
|
2013-05-11 21:46:08 -04:00
|
|
|
namespace factor {
|
2009-05-04 02:46:13 -04:00
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Allocates memory
|
2013-05-11 21:46:08 -04:00
|
|
|
byte_array* factor_vm::allot_byte_array(cell size) {
|
|
|
|
byte_array* array = allot_uninitialized_array<byte_array>(size);
|
|
|
|
memset(array + 1, 0, size);
|
|
|
|
return array;
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Allocates memory
|
2013-05-11 21:46:08 -04:00
|
|
|
void factor_vm::primitive_byte_array() {
|
|
|
|
cell size = unbox_array_size();
|
|
|
|
ctx->push(tag<byte_array>(allot_byte_array(size)));
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Allocates memory
|
2013-05-11 21:46:08 -04:00
|
|
|
void factor_vm::primitive_uninitialized_byte_array() {
|
|
|
|
cell size = unbox_array_size();
|
|
|
|
ctx->push(tag<byte_array>(allot_uninitialized_array<byte_array>(size)));
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Allocates memory
|
2013-05-11 21:46:08 -04:00
|
|
|
void factor_vm::primitive_resize_byte_array() {
|
|
|
|
data_root<byte_array> array(ctx->pop(), this);
|
2016-11-08 20:07:56 -05:00
|
|
|
check_tagged(array);
|
2013-05-11 21:46:08 -04:00
|
|
|
cell capacity = unbox_array_size();
|
|
|
|
ctx->push(tag<byte_array>(reallot_array(array.untagged(), capacity)));
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Allocates memory
|
2013-05-11 21:46:08 -04:00
|
|
|
void growable_byte_array::grow_bytes(cell len) {
|
|
|
|
count += len;
|
|
|
|
if (count >= array_capacity(elements.untagged()))
|
|
|
|
elements = elements.parent->reallot_array(elements.untagged(), count * 2);
|
2010-06-11 20:06:00 -04:00
|
|
|
}
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Allocates memory
|
2013-05-11 21:46:08 -04:00
|
|
|
void growable_byte_array::append_bytes(void* elts, cell len) {
|
|
|
|
cell old_count = count;
|
|
|
|
grow_bytes(len);
|
2013-05-13 00:28:25 -04:00
|
|
|
memcpy(&elements->data<uint8_t>()[old_count], elts, len);
|
2009-05-02 10:19:09 -04:00
|
|
|
}
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Allocates memory
|
2013-05-11 21:46:08 -04:00
|
|
|
void growable_byte_array::append_byte_array(cell byte_array_) {
|
|
|
|
data_root<byte_array> byte_array(byte_array_, elements.parent);
|
2009-05-02 10:19:09 -04:00
|
|
|
|
2013-05-11 21:46:08 -04:00
|
|
|
cell len = array_capacity(byte_array.untagged());
|
|
|
|
cell new_size = count + len;
|
|
|
|
factor_vm* parent = elements.parent;
|
|
|
|
if (new_size >= array_capacity(elements.untagged()))
|
|
|
|
elements = parent->reallot_array(elements.untagged(), new_size * 2);
|
2009-05-02 10:19:09 -04:00
|
|
|
|
2013-05-13 00:28:25 -04:00
|
|
|
memcpy(&elements->data<uint8_t>()[count], byte_array->data<uint8_t>(), len);
|
2009-05-02 10:19:09 -04:00
|
|
|
|
2013-05-11 21:46:08 -04:00
|
|
|
count += len;
|
2009-05-02 10:19:09 -04:00
|
|
|
}
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// Allocates memory
|
2013-05-11 21:46:08 -04:00
|
|
|
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
|
|
|
|
|
|
|
}
|