]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/to_tenured_collector.hpp
Put brackets around ipv6 addresses in `inet6 present`
[factor.git] / vm / to_tenured_collector.hpp
index 55561252bcec2f22bc8bb1790be546b584622fff..a46d982c3046772e19eb75fed48cf4ea1830561e 100644 (file)
@@ -1,21 +1,39 @@
-namespace factor
-{
+namespace factor {
 
-struct to_tenured_policy {
-       factor_vm *myvm;
-       zone *tenured;
+struct from_tenured_refs_copier : no_fixup {
+  tenured_space* tenured;
+  std::vector<cell> *mark_stack;
 
-       to_tenured_policy(factor_vm *myvm_) : myvm(myvm_), tenured(myvm->data->tenured) {}
+  from_tenured_refs_copier(tenured_space* tenured,
+                           std::vector<cell> *mark_stack)
+      : tenured(tenured), mark_stack(mark_stack) { }
 
-       bool should_copy_p(object *untagged)
-       {
-               return !tenured->contains_p(untagged);
-       }
-};
+  object* fixup_data(object* obj) {
+    if (tenured->contains_p(obj)) {
+      return obj;
+    }
+
+    // Is there another forwarding pointer?
+    while (obj->forwarding_pointer_p()) {
+      object* dest = obj->forwarding_pointer();
+      obj = dest;
+    }
+
+    if (tenured->contains_p(obj)) {
+      return obj;
+    }
+
+    cell size = obj->size();
+    object* newpointer = tenured->allot(size);
+    if (!newpointer)
+      throw must_start_gc_again();
+
+    memcpy(newpointer, obj, size);
+    obj->forward_to(newpointer);
 
-struct to_tenured_collector : copying_collector<tenured_space,to_tenured_policy> {
-       to_tenured_collector(factor_vm *myvm_);
-       void go();
+    mark_stack->push_back((cell)newpointer);
+    return newpointer;
+  }
 };
 
 }