]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/data_heap_checker.cpp
audio.engine.test: cleanup using
[factor.git] / vm / data_heap_checker.cpp
index a659ac5f2de86939165e5534d0172cfc032c8a15..dc61e189cd99528e7fd0b42d45fdb66ed55f1604 100644 (file)
@@ -1,26 +1,26 @@
 #include "master.hpp"
 
-/* A tool to debug write barriers. Call check_data_heap() to ensure that all
-cards that should be marked are actually marked. */
+// A tool to debug write barriers. Call check_data_heap() to ensure that all
+// cards that should be marked are actually marked.
 
 namespace factor {
 
 enum generation {
-  nursery_generation,
-  aging_generation,
-  tenured_generation
+  NURSERY_GENERATION,
+  AGING_GENERATION,
+  TENURED_GENERATION
 };
 
 inline generation generation_of(factor_vm* parent, object* obj) {
   if (parent->data->nursery->contains_p(obj))
-    return nursery_generation;
+    return NURSERY_GENERATION;
   else if (parent->data->aging->contains_p(obj))
-    return aging_generation;
+    return AGING_GENERATION;
   else if (parent->data->tenured->contains_p(obj))
-    return tenured_generation;
+    return TENURED_GENERATION;
   else {
-    critical_error("Bad object", (cell) obj);
-    return (generation) - 1;
+    critical_error("Bad object", (cell)obj);
+    return (generation)-1;
   }
 }
 
@@ -29,13 +29,13 @@ struct slot_checker {
   object* obj;
   generation gen;
 
-  explicit slot_checker(factor_vm* parent_, object* obj_, generation gen_)
-      : parent(parent_), obj(obj_), gen(gen_) {}
+  slot_checker(factor_vm* parent, object* obj, generation gen)
+      : parent(parent), obj(obj), gen(gen) {}
 
-  void check_write_barrier(cell* slot_ptr, generation target, char mask) {
-    cell object_card_pointer = parent->cards_offset + ((cell) obj >> card_bits);
+  void check_write_barrier(cell* slot_ptr, generation target, cell mask) {
+    cell object_card_pointer = parent->cards_offset + ((cell)obj >> card_bits);
     cell slot_card_pointer =
-        parent->cards_offset + ((cell) slot_ptr >> card_bits);
+        parent->cards_offset + ((cell)slot_ptr >> card_bits);
     char slot_card_value = *(char*)slot_card_pointer;
     if ((slot_card_value & mask) != mask) {
       std::cout << "card not marked" << std::endl;
@@ -58,39 +58,28 @@ struct slot_checker {
   }
 
   void operator()(cell* slot_ptr) {
-    if (!immediate_p(*slot_ptr)) {
-      generation target = generation_of(parent, untag<object>(*slot_ptr));
-      switch (gen) {
-        case nursery_generation:
-          break;
-        case aging_generation:
-          if (target == nursery_generation)
-            check_write_barrier(slot_ptr, target, card_points_to_nursery);
-          break;
-        case tenured_generation:
-          if (target == nursery_generation)
-            check_write_barrier(slot_ptr, target, card_points_to_nursery);
-          else if (target == aging_generation)
-            check_write_barrier(slot_ptr, target, card_points_to_aging);
-          break;
+    if (immediate_p(*slot_ptr))
+      return;
+
+    generation target = generation_of(parent, untag<object>(*slot_ptr));
+    if (gen == AGING_GENERATION && target == NURSERY_GENERATION) {
+      check_write_barrier(slot_ptr, target, card_points_to_nursery);
+    } else if (gen == TENURED_GENERATION) {
+      if (target == NURSERY_GENERATION) {
+        check_write_barrier(slot_ptr, target, card_points_to_nursery);
+      } else if (target == AGING_GENERATION) {
+        check_write_barrier(slot_ptr, target, card_points_to_aging);
       }
     }
   }
 };
 
-struct object_checker {
-  factor_vm* parent;
-
-  explicit object_checker(factor_vm* parent_) : parent(parent_) {}
-
-  void operator()(object* obj) {
-    slot_checker checker(parent, obj, generation_of(parent, obj));
-    obj->each_slot(checker);
-  }
-};
-
 void factor_vm::check_data_heap() {
-  object_checker checker(this);
+  auto checker = [&](object* obj){
+    generation obj_gen = generation_of(this, obj);
+    slot_checker s_checker(this, obj, obj_gen);
+    obj->each_slot(s_checker);
+  };
   each_object(checker);
 }