]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/byte_arrays.cpp
webapps.wiki: adding search bar
[factor.git] / vm / byte_arrays.cpp
index 4213ed45a8f4148bca34310a65fe4e39f2e9d1bb..4c83a9de7464ee8feb9d52f8d975da9ee0d44902 100644 (file)
@@ -1,80 +1,74 @@
 #include "master.hpp"
 
-namespace factor
-{
+namespace factor {
 
-byte_array *factor_vm::allot_byte_array(cell size)
-{
-       byte_array *array = allot_array_internal<byte_array>(size);
-       memset(array + 1,0,size);
-       return array;
+// Allocates memory
+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;
 }
 
-inline void factor_vm::primitive_byte_array()
-{
-       cell size = unbox_array_size();
-       dpush(tag<byte_array>(allot_byte_array(size)));
+// Allocates memory
+void factor_vm::primitive_byte_array() {
+  cell size = unbox_array_size();
+  ctx->push(tag<byte_array>(allot_byte_array(size)));
 }
 
-PRIMITIVE(byte_array)
-{
-       PRIMITIVE_GETVM()->primitive_byte_array();
+// Allocates memory
+void factor_vm::primitive_uninitialized_byte_array() {
+  cell size = unbox_array_size();
+  ctx->push(tag<byte_array>(allot_uninitialized_array<byte_array>(size)));
 }
 
-inline void factor_vm::primitive_uninitialized_byte_array()
-{
-       cell size = unbox_array_size();
-       dpush(tag<byte_array>(allot_array_internal<byte_array>(size)));
+// Allocates memory
+void factor_vm::primitive_resize_byte_array() {
+  data_root<byte_array> array(ctx->pop(), this);
+  check_tagged(array);
+  cell capacity = unbox_array_size();
+  ctx->push(tag<byte_array>(reallot_array(array.untagged(), capacity)));
 }
 
-PRIMITIVE(uninitialized_byte_array)
-{
-       PRIMITIVE_GETVM()->primitive_uninitialized_byte_array();
+// Allocates memory
+void growable_byte_array::reallot_array(cell count) {
+  byte_array *ba_old = elements.untagged();
+  byte_array *ba_new = elements.parent->reallot_array(ba_old, count);
+  elements.set_untagged(ba_new);
 }
 
-inline void factor_vm::primitive_resize_byte_array()
-{
-       byte_array *array = untag_check<byte_array>(dpop());
-       cell capacity = unbox_array_size();
-       dpush(tag<byte_array>(reallot_array(array,capacity)));
+// Allocates memory
+void growable_byte_array::grow_bytes(cell len) {
+  count += len;
+  if (count >= array_capacity(elements.untagged())) {
+    reallot_array(2 * count);
+  }
 }
 
-PRIMITIVE(resize_byte_array)
-{
-       PRIMITIVE_GETVM()->primitive_resize_byte_array();
+// Allocates memory
+void growable_byte_array::append_bytes(void* elts, cell len) {
+  cell old_count = count;
+  grow_bytes(len);
+  memcpy(&elements->data<uint8_t>()[old_count], elts, len);
 }
 
-void growable_byte_array::append_bytes(void *elts, cell len)
-{
-       cell new_size = count + len;
-       factor_vm *parent_vm = elements.parent_vm;
-       if(new_size >= array_capacity(elements.untagged()))
-               elements = parent_vm->reallot_array(elements.untagged(),new_size * 2);
+// Allocates memory
+void growable_byte_array::append_byte_array(cell byte_array_) {
+  data_root<byte_array> byte_array(byte_array_, elements.parent);
 
-       memcpy(&elements->data<u8>()[count],elts,len);
+  cell len = array_capacity(byte_array.untagged());
+  cell new_size = count + len;
+  if (new_size >= array_capacity(elements.untagged())) {
+    reallot_array(2 * new_size);
+  }
 
-       count += len;
-}
-
-void growable_byte_array::append_byte_array(cell byte_array_)
-{
-       gc_root<byte_array> byte_array(byte_array_,elements.parent_vm);
-
-       cell len = array_capacity(byte_array.untagged());
-       cell new_size = count + len;
-       factor_vm *parent_vm = elements.parent_vm;
-       if(new_size >= array_capacity(elements.untagged()))
-               elements = parent_vm->reallot_array(elements.untagged(),new_size * 2);
-
-       memcpy(&elements->data<u8>()[count],byte_array->data<u8>(),len);
+  memcpy(&elements->data<uint8_t>()[count], byte_array->data<uint8_t>(), len);
 
-       count += len;
+  count += len;
 }
 
-void growable_byte_array::trim()
-{
-       factor_vm *parent_vm = elements.parent_vm;
-       elements = parent_vm->reallot_array(elements.untagged(),count);
+// Allocates memory
+void growable_byte_array::trim() {
+  reallot_array(count);
 }
 
 }