]> 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 4198480659a97f0469bc01cb22b255c352f4803f..a46d982c3046772e19eb75fed48cf4ea1830561e 100644 (file)
@@ -1,26 +1,39 @@
 namespace factor {
 
-struct to_tenured_policy {
-  factor_vm* parent;
+struct from_tenured_refs_copier : no_fixup {
   tenured_space* tenured;
+  std::vector<cell> *mark_stack;
 
-  explicit to_tenured_policy(factor_vm* parent)
-      : parent(parent), tenured(parent->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;
+    }
 
-  void promoted_object(object* obj) {
-    parent->mark_stack.push_back((cell)obj);
-  }
+    // Is there another forwarding pointer?
+    while (obj->forwarding_pointer_p()) {
+      object* dest = obj->forwarding_pointer();
+      obj = dest;
+    }
 
-  void visited_object(object* obj) {}
-};
+    if (tenured->contains_p(obj)) {
+      return obj;
+    }
 
-struct to_tenured_collector : collector<tenured_space, to_tenured_policy> {
-  explicit to_tenured_collector(factor_vm* parent);
-  void tenure_reachable_objects();
+    cell size = obj->size();
+    object* newpointer = tenured->allot(size);
+    if (!newpointer)
+      throw must_start_gc_again();
+
+    memcpy(newpointer, obj, size);
+    obj->forward_to(newpointer);
+
+    mark_stack->push_back((cell)newpointer);
+    return newpointer;
+  }
 };
 
 }