diff --git a/vm/arrays.cpp b/vm/arrays.cpp index 9e97221d81..2c0808b6a3 100644 --- a/vm/arrays.cpp +++ b/vm/arrays.cpp @@ -42,14 +42,18 @@ void factor_vm::primitive_resize_array() { /* Allocates memory */ cell factor_vm::std_vector_to_array(std::vector& elements) { + cell element_count = elements.size(); - data_roots.push_back(data_root_range(&elements[0], element_count)); + cell orig_size = data_roots.size(); + data_roots.reserve(orig_size + element_count); + + for (cell n = 0; n < element_count; n++) { + data_roots.push_back(&elements[n]); + } tagged objects(allot_uninitialized_array(element_count)); memcpy(objects->data(), &elements[0], element_count * sizeof(cell)); - - data_roots.pop_back(); - + data_roots.resize(orig_size); return objects.value(); } diff --git a/vm/data_roots.hpp b/vm/data_roots.hpp index 0d6d745c59..628733291a 100644 --- a/vm/data_roots.hpp +++ b/vm/data_roots.hpp @@ -4,7 +4,7 @@ template struct data_root : public tagged { factor_vm* parent; void push() { - parent->data_roots.push_back(data_root_range(&this->value_, 1)); + parent->data_roots.push_back(&this->value_); } data_root(cell value, factor_vm* parent) diff --git a/vm/layouts.hpp b/vm/layouts.hpp index 95d75c026e..701b100163 100644 --- a/vm/layouts.hpp +++ b/vm/layouts.hpp @@ -323,12 +323,4 @@ struct tuple : public object { cell* data() const { return (cell*)(this + 1); } }; -struct data_root_range { - cell* start; - cell len; - - data_root_range(cell* start, cell len) - : start(start), len(len) {} -}; - } diff --git a/vm/slot_visitor.hpp b/vm/slot_visitor.hpp index 7ac2c0c173..094a178a18 100644 --- a/vm/slot_visitor.hpp +++ b/vm/slot_visitor.hpp @@ -175,12 +175,14 @@ void slot_visitor::visit_stack_elements(segment* region, cell* top) { } template void slot_visitor::visit_data_roots() { - std::vector::const_iterator iter = + std::vector::const_iterator iter = parent->data_roots.begin(); - std::vector::const_iterator end = parent->data_roots.end(); + std::vector::const_iterator end = + parent->data_roots.end(); - for (; iter < end; iter++) - visit_object_array(iter->start, iter->start + iter->len); + for (; iter < end; iter++) { + visit_handle(*iter); + } } template void slot_visitor::visit_bignum_roots() { diff --git a/vm/vm.hpp b/vm/vm.hpp index 49499b5cbe..6bf51c40e9 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -112,7 +112,8 @@ struct factor_vm { allocates memory, it must wrap any references to the data and code heaps with data_root and code_root smart pointers, which register themselves here. See data_roots.hpp and code_roots.hpp */ - std::vector data_roots; + + std::vector data_roots; std::vector bignum_roots; std::vector code_roots;