]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/nursery_collector.cpp
io.streams.256color: faster by caching styles
[factor.git] / vm / nursery_collector.cpp
index 54e5a59d438cec04e8c4601e2f54f5b94c7d7c17..3634110d1e4a7222e7595cd21eeb2bd78236fe02 100644 (file)
@@ -14,10 +14,13 @@ struct nursery_copier : no_fixup {
       return obj;
     }
 
-    if (obj->forwarding_pointer_p()) {
-      object* dest = obj->forwarding_pointer();
-      FACTOR_ASSERT(!nursery->contains_p(dest));
-      return dest;
+    // The while-loop is a needed micro-optimization.
+    while (obj->forwarding_pointer_p()) {
+      obj = obj->forwarding_pointer();
+    }
+
+    if (!nursery->contains_p(obj)) {
+      return obj;
     }
 
     cell size = obj->size();
@@ -47,14 +50,19 @@ void factor_vm::collect_nursery() {
   visitor.visit_cards(data->tenured, card_points_to_nursery,
                       card_points_to_nursery);
   visitor.visit_cards(data->aging, card_points_to_nursery, 0xff);
-  if (event)
-    event->ended_card_scan(visitor.cards_scanned, visitor.decks_scanned);
+  if (event) {
+    event->ended_phase(PHASE_CARD_SCAN);
+    event->cards_scanned += visitor.cards_scanned;
+    event->decks_scanned += visitor.decks_scanned;
+  }
 
   if (event)
     event->reset_timer();
   visitor.visit_code_heap_roots(&code->points_to_nursery);
-  if (event)
-    event->ended_code_scan(code->points_to_nursery.size());
+  if (event) {
+    event->ended_phase(PHASE_CODE_SCAN);
+    event->code_blocks_scanned += code->points_to_nursery.size();
+  }
 
   visitor.cheneys_algorithm(data->aging, scan);