]> 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 64740789da2a913177403bfbe38679107d6d71f0..dc61e189cd99528e7fd0b42d45fdb66ed55f1604 100644 (file)
@@ -1,23 +1,23 @@
 #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;
@@ -32,7 +32,7 @@ struct slot_checker {
   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) {
+  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);
@@ -62,32 +62,24 @@ struct slot_checker {
       return;
 
     generation target = generation_of(parent, untag<object>(*slot_ptr));
-    if (gen == aging_generation && target == nursery_generation) {
+    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) {
+    } else if (gen == TENURED_GENERATION) {
+      if (target == NURSERY_GENERATION) {
         check_write_barrier(slot_ptr, target, card_points_to_nursery);
-      } else if (target == aging_generation) {
+      } else if (target == AGING_GENERATION) {
         check_write_barrier(slot_ptr, target, card_points_to_aging);
       }
     }
   }
 };
 
-struct object_checker {
-  factor_vm* parent;
-
-  object_checker(factor_vm* parent) : parent(parent) {}
-
-  void operator()(object* obj) {
-    generation obj_gen = generation_of(parent, obj);
-    slot_checker checker(parent, obj, obj_gen);
-    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);
 }