Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index 2b66dad2093cca55c16fcb37336cc2f9e2a0997c..4ec7e341a81dbfd24a9ca9b54c1155681cbbc2ad 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -216,12 +216,7 @@ bool Heap::HasBeenSetup() { |
int Heap::GcSafeSizeOfOldObject(HeapObject* object) { |
Erik Corry
2011/01/07 12:13:21
Shouldn't we just get rid of this alltogether?
|
- ASSERT(!Heap::InNewSpace(object)); // Code only works for old objects. |
- ASSERT(!MarkCompactCollector::are_map_pointers_encoded()); |
- MapWord map_word = object->map_word(); |
- map_word.ClearMark(); |
- map_word.ClearOverflow(); |
- return object->SizeFromMap(map_word.ToMap()); |
+ return object->Size(); |
} |
@@ -4598,6 +4593,8 @@ bool Heap::Setup(bool create_heap_objects) { |
ProducerHeapProfile::Setup(); |
#endif |
+ if (!Marking::Setup()) return false; |
+ |
return true; |
} |
@@ -4672,6 +4669,8 @@ void Heap::TearDown() { |
lo_space_ = NULL; |
} |
+ Marking::TearDown(); |
+ |
MemoryAllocator::TearDown(); |
} |
@@ -4905,6 +4904,34 @@ class HeapObjectsFilter { |
}; |
+// Intrusive object marking uses least significant bit of |
+// heap object's map word to mark objects. |
+// Normally all map words have least significant bit set |
+// because they contain tagged map pointer. |
+// If the bit is not set object is marked. |
+// All objects should be unmarked before resuming |
+// JavaScript execution. |
+class IntrusiveMarking { |
+ public: |
+ static bool IsMarked(HeapObject* object) { |
+ return (object->map_word().ToRawValue() & kNotMarkedBit) == 0; |
+ } |
+ |
+ static void ClearMark(HeapObject* object) { |
+ uintptr_t map_word = object->map_word().ToRawValue(); |
+ object->set_map_word(MapWord::FromRawValue(map_word | kNotMarkedBit)); |
+ } |
+ |
+ static void SetMark(HeapObject* object) { |
+ uintptr_t map_word = object->map_word().ToRawValue(); |
+ object->set_map_word(MapWord::FromRawValue(map_word & ~kNotMarkedBit)); |
+ } |
+ |
+ private: |
+ static const uintptr_t kNotMarkedBit = 0x1; |
+ STATIC_ASSERT((kHeapObjectTag & kNotMarkedBit) != 0); |
+}; |
+ |
class FreeListNodesFilter : public HeapObjectsFilter { |
public: |
FreeListNodesFilter() { |
@@ -4912,8 +4939,8 @@ class FreeListNodesFilter : public HeapObjectsFilter { |
} |
bool SkipObject(HeapObject* object) { |
- if (object->IsMarked()) { |
- object->ClearMark(); |
+ if (IntrusiveMarking::IsMarked(object)) { |
+ IntrusiveMarking::ClearMark(object); |
return true; |
} else { |
return false; |
@@ -4935,7 +4962,9 @@ class FreeListNodesFilter : public HeapObjectsFilter { |
for (HeapObject* obj = iter.next_object(); |
obj != NULL; |
obj = iter.next_object()) { |
- if (FreeListNode::IsFreeListNode(obj)) obj->SetMark(); |
+ if (FreeListNode::IsFreeListNode(obj)) { |
+ IntrusiveMarking::SetMark(obj); |
+ } |
} |
} |
@@ -4950,8 +4979,8 @@ class UnreachableObjectsFilter : public HeapObjectsFilter { |
} |
bool SkipObject(HeapObject* object) { |
- if (object->IsMarked()) { |
- object->ClearMark(); |
+ if (IntrusiveMarking::IsMarked(object)) { |
+ IntrusiveMarking::ClearMark(object); |
return true; |
} else { |
return false; |
@@ -4967,8 +4996,8 @@ class UnreachableObjectsFilter : public HeapObjectsFilter { |
for (Object** p = start; p < end; p++) { |
if (!(*p)->IsHeapObject()) continue; |
HeapObject* obj = HeapObject::cast(*p); |
- if (obj->IsMarked()) { |
- obj->ClearMark(); |
+ if (IntrusiveMarking::IsMarked(obj)) { |
+ IntrusiveMarking::ClearMark(obj); |
list_.Add(obj); |
} |
} |
@@ -4990,7 +5019,7 @@ class UnreachableObjectsFilter : public HeapObjectsFilter { |
for (HeapObject* obj = iterator.next(); |
obj != NULL; |
obj = iterator.next()) { |
- obj->SetMark(); |
+ IntrusiveMarking::SetMark(obj); |
} |
UnmarkingVisitor visitor; |
Heap::IterateRoots(&visitor, VISIT_ONLY_STRONG); |
@@ -5284,7 +5313,6 @@ GCTracer::GCTracer() |
// These two fields reflect the state of the previous full collection. |
// Set them before they are changed by the collector. |
previous_has_compacted_ = MarkCompactCollector::HasCompacted(); |
- previous_marked_count_ = MarkCompactCollector::previous_marked_count(); |
if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return; |
start_time_ = OS::TimeCurrentMillis(); |
start_size_ = Heap::SizeOfObjects(); |