Index: src/mark-compact.cc |
=================================================================== |
--- src/mark-compact.cc (revision 1848) |
+++ src/mark-compact.cc (working copy) |
@@ -562,48 +562,58 @@ |
} |
-// Helper class to unmark marked objects in a range of pointers but |
-// not recursively. |
-class UnmarkingVisitor : public ObjectVisitor { |
+class SymbolMarkingVisitor : public ObjectVisitor { |
public: |
void VisitPointers(Object** start, Object** end) { |
+ MarkingVisitor marker; |
for (Object** p = start; p < end; p++) { |
- if ((*p)->IsHeapObject() && HeapObject::cast(*p)->IsMarked()) { |
- MarkCompactCollector::ClearMark(HeapObject::cast(*p)); |
- } |
+ if (!(*p)->IsHeapObject()) continue; |
iposva
2009/05/05 05:05:19
Can there be non-heap entries in the symbol table?
|
+ |
+ HeapObject* object = HeapObject::cast(*p); |
Kasper Lund
2009/05/05 05:22:34
The newlines here look weird. How about moving the
Kevin Millikin (Chromium)
2009/05/05 05:34:07
I could do that, but the comment goes with the con
|
+ // If the object is marked, we have marked or are in the process |
+ // of marking subparts. |
+ if (object->IsMarked()) continue; |
+ |
+ // The object is unmarked, we do not need to unmark to use its |
+ // map. |
+ Map* map = object->map(); |
+ object->IterateBody(map->instance_type(), |
Kasper Lund
2009/05/05 05:22:34
I'd compute the size before the IterateBody call,
Kevin Millikin (Chromium)
2009/05/05 05:34:07
That's not the way I roll.
|
+ object->SizeFromMap(map), |
+ &marker); |
} |
} |
}; |
-void MarkCompactCollector::ProcessRoots(RootMarkingVisitor* visitor) { |
- // Handle the symbol table specially. Mark the prefix and the |
- // symbol table itself. Do not mark the symbol table entries, but |
- // do explicitly mark all other objects reachable from them. |
- // |
+void MarkCompactCollector::MarkSymbolTable() { |
// Objects reachable from symbols are marked as live so as to ensure |
// that if the symbol itself remains alive after GC for any reason, |
// and if it is a sliced string or a cons string backed by an |
// external string (even indirectly), then the external string does |
// not receive a weak reference callback. |
SymbolTable* symbol_table = SymbolTable::cast(Heap::symbol_table()); |
- // First mark everything reachable from the symbol table, then |
- // unmark just the elements themselves. |
- symbol_table->Iterate(visitor); |
- // There may be overflowed objects in the heap. Visit them now. |
- while (marking_stack.overflowed()) { |
- RefillMarkingStack(); |
- EmptyMarkingStack(visitor->stack_visitor()); |
- } |
- UnmarkingVisitor unmarking_visitor; |
- symbol_table->IterateElements(&unmarking_visitor); |
// Mark the symbol table itself. |
SetMark(symbol_table); |
+ // Explicitly mark the prefix. |
+ MarkingVisitor marker; |
+ symbol_table->IteratePrefix(&marker); |
+ ProcessMarkingStack(&marker); |
+ // Mark subparts of the symbols but not the symbols themselves |
+ // (unless reachable from another symbol). |
+ SymbolMarkingVisitor symbol_marker; |
+ symbol_table->IterateElements(&symbol_marker); |
+ ProcessMarkingStack(&marker); |
+} |
+ |
+void MarkCompactCollector::MarkRoots(RootMarkingVisitor* visitor) { |
// Mark the heap roots including global variables, stack variables, |
// etc., and all objects reachable from them. |
Heap::IterateStrongRoots(visitor); |
+ // Handle the symbol table specially. |
+ MarkSymbolTable(); |
+ |
// There may be overflowed objects in the heap. Visit them now. |
while (marking_stack.overflowed()) { |
RefillMarkingStack(); |
@@ -744,7 +754,7 @@ |
ASSERT(!marking_stack.overflowed()); |
RootMarkingVisitor root_visitor; |
- ProcessRoots(&root_visitor); |
+ MarkRoots(&root_visitor); |
// The objects reachable from the roots are marked black, unreachable |
// objects are white. Mark objects reachable from object groups with at |