]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: each_object() can't iterate the nursery so instead we assume it's empty
authorBjörn Lindqvist <bjourne@gmail.com>
Thu, 20 Nov 2014 22:30:43 +0000 (23:30 +0100)
committerDoug Coleman <doug.coleman@gmail.com>
Fri, 21 Nov 2014 10:16:03 +0000 (02:16 -0800)
core/memory/memory-tests.factor
vm/data_heap.cpp
vm/objects.cpp
vm/vm.hpp

index 74e002faa9f9013cdd04b3dc10ecbfacb68f203b..c7ec6ee8d6957ef5f89d252d5292807785f6e348 100644 (file)
@@ -13,6 +13,25 @@ IN: memory.tests
 ! Tests for 'become'
 [ ] [ { } { } become ] unit-test
 
+! Become something when it's on the data stack.
+{ "replacer" } [
+    "original" dup 1array { "replacer" } become
+] unit-test
+
+! Nested in aging
+{ "replacer" } [
+    "original" [ 5 [ 1array ] times ] [ 1array ] bi
+    minor-gc
+    { "replacer" } become 5 [ first ] times
+] unit-test
+
+! Also when it is nested in nursery
+{ "replacer" } [
+    minor-gc
+    "original" [ 5 [ 1array ] times ] [ 1array ] bi { "replacer" } become
+    5 [ first ] times
+] unit-test
+
 ! Bug found on Windows build box, having too many words in the
 ! image breaks 'become'
 [ ] [ 100000 [ f <uninterned-word> ] replicate { } { } become drop ] unit-test
@@ -45,12 +64,12 @@ SYMBOL: foo
     gc
 
     data-room tenured>> size>>
-    
+
     10 [
         4 [ 120 1024 * f <array> ] replicate foo set-global
         100 [ 256 1024 * f <array> drop ] times
     ] times
-    
+
     data-room tenured>> size>>
     assert=
 ] unit-test
index 89d1c4c8d0c2ee6db5d57835f91d70f21226cd36..fe49761011591d373b1025475fb68fb4dffa869c 100644 (file)
@@ -149,6 +149,7 @@ struct object_accumulator {
 
 /* Allocates memory */
 cell factor_vm::instances(cell type) {
+  primitive_full_gc();
   object_accumulator accum(type);
   each_object(accum);
   return std_vector_to_array(accum.objects);
@@ -156,7 +157,6 @@ cell factor_vm::instances(cell type) {
 
 /* Allocates memory */
 void factor_vm::primitive_all_instances() {
-  primitive_full_gc();
   ctx->push(instances(TYPE_COUNT));
 }
 
index 587f4592cbca7294345a130aaae3c166975b097d..6d97ab719988c18ce07724e14ad3aea91c48182f 100644 (file)
@@ -122,6 +122,7 @@ struct code_block_write_barrier_visitor {
 /* classes.tuple uses this to reshape tuples; tools.deploy.shaker uses this
    to coalesce equal but distinct quotations and wrappers. */
 void factor_vm::primitive_become() {
+  primitive_minor_gc();
   array* new_objects = untag_check<array>(ctx->pop());
   array* old_objects = untag_check<array>(ctx->pop());
 
index 87a8c878e245cde4e9ac5529f37a80779d0f3626..d17a0e9bad8dc12dbb1b05e279497ac013ed20dd 100644 (file)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -327,12 +327,15 @@ struct factor_vm {
   }
 
   template <typename Iterator> inline void each_object(Iterator& iterator) {
-    gc_off = true;
 
+    /* The nursery can't be iterated because there may be gaps between
+       the objects (see factor_vm::reallot_array) so we require it to
+       be empty first. */
+    FACTOR_ASSERT(nursery.occupied_space() == 0);
+
+    gc_off = true;
     each_object(data->tenured, iterator);
     each_object(data->aging, iterator);
-    each_object(data->nursery, iterator);
-
     gc_off = false;
   }