Index: Source/heap/Heap.h |
diff --git a/Source/heap/Heap.h b/Source/heap/Heap.h |
index 19ba86b1bed229144ff0f0405516dd2cb31e4e5a..13d1cee310655c8a483d7305fc0b2cf489dbdf41 100644 |
--- a/Source/heap/Heap.h |
+++ b/Source/heap/Heap.h |
@@ -225,7 +225,7 @@ public: |
inline bool hasDebugMark() const; |
// Zap magic number with a new magic number that means there was once an |
- // object allocated here, but it was freed because nobody visited it during |
+ // object allocated here, but it was freed because nobody marked it during |
// GC. |
void zapMagic(); |
@@ -348,7 +348,7 @@ public: |
Address address() { return reinterpret_cast<Address>(this); } |
const GCInfo* gcInfo() { return m_gcInfo; } |
- virtual bool checkAndVisitPointer(Visitor*, Address) = 0; |
+ virtual bool checkAndMarkPointer(Visitor*, Address) = 0; |
PageMemory* storage() const { return m_storage; } |
@@ -408,9 +408,9 @@ public: |
bool isMarked(); |
void unmark(); |
void getStats(HeapStats&); |
- void visit(Visitor*); |
+ void trace(Visitor*); |
Erik Corry
2013/12/06 10:30:33
Should this not be mark?
Mads Ager (chromium)
2013/12/06 11:00:10
Yeah, I probably went a little bit too far with th
|
void finalize(); |
- virtual bool checkAndVisitPointer(Visitor*, Address); |
+ virtual bool checkAndMarkPointer(Visitor*, Address); |
private: |
friend class Heap; |
@@ -513,7 +513,7 @@ public: |
void sweep(); |
void clearObjectStartBitMap(); |
void finalize(Header*); |
- virtual bool checkAndVisitPointer(Visitor*, Address); |
+ virtual bool checkAndMarkPointer(Visitor*, Address); |
ThreadHeap<Header>* heap() { return m_heap; } |
#if USE_ASAN |
void poisonUnmarkedObjects(); |
@@ -594,20 +594,6 @@ private: |
friend class ThreadState; |
}; |
-enum TraceRequirement { |
- // TraceChecker does not perform checks, because there are weak pointers |
- // present that cannot be distinguished from pointers that were incorrectly |
- // not visited. Later, however, we can check that the weak pointers were |
- // cleared by the weak pointer callback. |
- NoRequirement, |
- // The trace method must visit all member pointers. |
- AllPointersMustBeVisited, |
- // All member pointers must be marked live if they were not already. This |
- // also means that all weak pointers must be cleared if they are not |
- // pointing to objects that are marked live. |
- AllPointersMustBeMarked |
-}; |
- |
typedef void (*TraceTrampoline)(VisitorCallback, Visitor*, void*); |
class Heap { |
@@ -648,7 +634,7 @@ public: |
static void prepareForGC(); |
static void visitRoots(Visitor*); |
- static Address checkAndVisitPointer(Visitor*, Address); |
+ static Address checkAndMarkPointer(Visitor*, Address); |
static void getStats(HeapStats*); |
@@ -687,7 +673,7 @@ public: |
// Large objects and adding pages are handled by the ThreadHeap |
virtual BaseHeapPage* heapPageFromAddress(Address) = 0; |
virtual BaseHeapPage* largeHeapObjectFromAddress(Address) = 0; |
- virtual bool checkAndVisitLargeHeapObjects(Visitor*, Address) = 0; |
+ virtual bool checkAndMarkLargeHeapObjects(Visitor*, Address) = 0; |
virtual void sweep() = 0; |
virtual void finalizeAll(const void* except = 0) = 0; |
virtual bool inFinalizeAll() = 0; |
@@ -715,7 +701,7 @@ public: |
virtual BaseHeapPage* heapPageFromAddress(Address); |
virtual BaseHeapPage* largeHeapObjectFromAddress(Address); |
- virtual bool checkAndVisitLargeHeapObjects(Visitor*, Address); |
+ virtual bool checkAndMarkLargeHeapObjects(Visitor*, Address); |
virtual void sweep(); |
virtual void finalizeAll(const void* except = 0); |
virtual bool inFinalizeAll() { return m_inFinalizeAll; } |
@@ -1073,7 +1059,7 @@ public: |
static void init(CallbackStack** first); |
static void shutdown(CallbackStack** first); |
- bool popAndTrace(CallbackStack** first, Visitor*, TraceRequirement, TraceTrampoline); |
+ bool popAndTrace(CallbackStack** first, Visitor*, TraceTrampoline); |
Item* allocateEntry(CallbackStack** first) |
{ |
@@ -1155,130 +1141,130 @@ void FinalizerTrait<HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTrait |
} |
} |
-template<bool visitWeakPointersStrongly, typename T, typename Traits> |
+template<bool markWeakPointersStrongly, typename T, typename Traits> |
struct BaseVisitVectorBackingTrait { |
- static void visit(WebCore::Visitor* visitor, void* self) |
+ static void mark(WebCore::Visitor* visitor, void* self) |
{ |
// The alllocator can oversize the allocation a little, according to |
// the allocation granularity. The extra size is included in the |
// payloadSize call below, since there is nowhere to store the |
// originally allocated memory. This assert ensures that visiting the |
// last bit of memory can't cause trouble. |
- COMPILE_ASSERT(!Traits::needsVisiting || sizeof(T) > allocationGranularity || Traits::canInitializeWithMemset, HeapOverallocationCanCauseSpuriousVisits); |
+ COMPILE_ASSERT(!Traits::needsMarking || sizeof(T) > allocationGranularity || Traits::canInitializeWithMemset, HeapOverallocationCanCauseSpuriousVisits); |
T* array = reinterpret_cast<T*>(self); |
WebCore::FinalizedHeapObjectHeader* header = WebCore::FinalizedHeapObjectHeader::fromPayload(self); |
// Use the payload size as recorded by the heap to determine how many |
- // elements to visit. |
+ // elements to mark. |
int length = header->payloadSize() / sizeof(T); |
for (int i = 0; i < length; i++) |
- VisitCollectionBackingTrait<Traits::needsVisiting, Traits::isWeak, visitWeakPointersStrongly, T, Traits>::visit(visitor, array[i]); |
+ CollectionBackingTraceTrait<Traits::needsMarking, Traits::isWeak, markWeakPointersStrongly, T, Traits>::mark(visitor, array[i]); |
} |
}; |
-template<bool visitWeakPointersStrongly, typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits> |
+template<bool markWeakPointersStrongly, typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits> |
struct BaseVisitHashTableBackingTrait { |
- static void visit(WebCore::Visitor* visitor, void* self) |
+ static void mark(WebCore::Visitor* visitor, void* self) |
{ |
Value* array = reinterpret_cast<Value*>(self); |
WebCore::FinalizedHeapObjectHeader* header = WebCore::FinalizedHeapObjectHeader::fromPayload(self); |
int length = header->payloadSize() / sizeof(Value); |
for (int i = 0; i < length; i++) { |
if (!WTF::HashTableHelper<Value, Extractor, KeyTraits>::isEmptyOrDeletedBucket(array[i])) |
- VisitCollectionBackingTrait<Traits::needsVisiting, Traits::isWeak, visitWeakPointersStrongly, Value, Traits>::visit(visitor, array[i]); |
+ CollectionBackingTraceTrait<Traits::needsMarking, Traits::isWeak, markWeakPointersStrongly, Value, Traits>::mark(visitor, array[i]); |
} |
} |
}; |
-template<bool visitWeakPointersStrongly, typename Key, typename Value, typename Traits> |
+template<bool markWeakPointersStrongly, typename Key, typename Value, typename Traits> |
struct BaseVisitKeyValuePairTrait { |
- static void visit(WebCore::Visitor* visitor, WTF::KeyValuePair<Key, Value>& self) |
+ static void mark(WebCore::Visitor* visitor, WTF::KeyValuePair<Key, Value>& self) |
{ |
- ASSERT(Traits::needsVisiting || (Traits::isWeak && visitWeakPointersStrongly)); |
- VisitCollectionBackingTrait<Traits::KeyTraits::needsVisiting, Traits::KeyTraits::isWeak, visitWeakPointersStrongly, Key, typename Traits::KeyTraits>::visit(visitor, self.key); |
- VisitCollectionBackingTrait<Traits::ValueTraits::needsVisiting, Traits::ValueTraits::isWeak, visitWeakPointersStrongly, Value, typename Traits::ValueTraits>::visit(visitor, self.value); |
+ ASSERT(Traits::needsMarking || (Traits::isWeak && markWeakPointersStrongly)); |
+ CollectionBackingTraceTrait<Traits::KeyTraits::needsMarking, Traits::KeyTraits::isWeak, markWeakPointersStrongly, Key, typename Traits::KeyTraits>::mark(visitor, self.key); |
+ CollectionBackingTraceTrait<Traits::ValueTraits::needsMarking, Traits::ValueTraits::isWeak, markWeakPointersStrongly, Value, typename Traits::ValueTraits>::mark(visitor, self.value); |
} |
}; |
-// FFX - Things that don't need visiting and have no weak pointers. |
-template<bool visitWeakPointersStrongly, typename T, typename U> |
-struct VisitCollectionBackingTrait<false, false, visitWeakPointersStrongly, T, U> { |
- static void visit(Visitor*, const T&) { } |
- static void visit(Visitor*, const void*) { } |
+// FFX - Things that don't need marking and have no weak pointers. |
+template<bool markWeakPointersStrongly, typename T, typename U> |
+struct CollectionBackingTraceTrait<false, false, markWeakPointersStrongly, T, U> { |
+ static void mark(Visitor*, const T&) { } |
+ static void mark(Visitor*, const void*) { } |
}; |
-// FTF - Things that don't need visiting. They have weak pointers, but we are |
-// not visiting weak pointers in this object in this GC. |
+// FTF - Things that don't need marking. They have weak pointers, but we are |
+// not marking weak pointers in this object in this GC. |
template<typename T, typename U> |
-struct VisitCollectionBackingTrait<false, true, false, T, U> { |
- static void visit(Visitor*, const T&) { } |
- static void visit(Visitor*, const void*) { } |
+struct CollectionBackingTraceTrait<false, true, false, T, U> { |
+ static void mark(Visitor*, const T&) { } |
+ static void mark(Visitor*, const void*) { } |
}; |
// For each type that we understand we have the FTT case and the TXX case. The |
-// FTT case is where we would not normally need to visit it, but it has weak |
-// pointers, and we are visiting them as strong. The TXX case is the regular |
-// case for things that need visiting. |
+// FTT case is where we would not normally need to mark it, but it has weak |
+// pointers, and we are marking them as strong. The TXX case is the regular |
+// case for things that need marking. |
// FTT (vector) |
template<typename T, typename Traits> |
-struct VisitCollectionBackingTrait<false, true, true, HeapVectorBacking<T, Traits>, void> : public BaseVisitVectorBackingTrait<true, T, Traits> { |
+struct CollectionBackingTraceTrait<false, true, true, HeapVectorBacking<T, Traits>, void> : public BaseVisitVectorBackingTrait<true, T, Traits> { |
}; |
// TXX (vector) |
-template<bool isWeak, bool visitWeakPointersStrongly, typename T, typename Traits> |
-struct VisitCollectionBackingTrait<true, isWeak, visitWeakPointersStrongly, HeapVectorBacking<T, Traits>, void> : public BaseVisitVectorBackingTrait<visitWeakPointersStrongly, T, Traits> { |
+template<bool isWeak, bool markWeakPointersStrongly, typename T, typename Traits> |
+struct CollectionBackingTraceTrait<true, isWeak, markWeakPointersStrongly, HeapVectorBacking<T, Traits>, void> : public BaseVisitVectorBackingTrait<markWeakPointersStrongly, T, Traits> { |
}; |
// FTT (hash table) |
template<typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits> |
-struct VisitCollectionBackingTrait<false, true, true, HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>, void> : public BaseVisitHashTableBackingTrait<true, Key, Value, Extractor, Traits, KeyTraits> { |
+struct CollectionBackingTraceTrait<false, true, true, HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>, void> : public BaseVisitHashTableBackingTrait<true, Key, Value, Extractor, Traits, KeyTraits> { |
}; |
// TXX (hash table) |
-template<bool isWeak, bool visitWeakPointersStrongly, typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits> |
-struct VisitCollectionBackingTrait<true, isWeak, visitWeakPointersStrongly, HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>, void> : public BaseVisitHashTableBackingTrait<visitWeakPointersStrongly, Key, Value, Extractor, Traits, KeyTraits> { |
+template<bool isWeak, bool markWeakPointersStrongly, typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits> |
+struct CollectionBackingTraceTrait<true, isWeak, markWeakPointersStrongly, HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>, void> : public BaseVisitHashTableBackingTrait<markWeakPointersStrongly, Key, Value, Extractor, Traits, KeyTraits> { |
}; |
// FTT (key value pair) |
template<typename Key, typename Value, typename Traits> |
-struct VisitCollectionBackingTrait<false, true, true, WTF::KeyValuePair<Key, Value>, Traits> : public BaseVisitKeyValuePairTrait<true, Key, Value, Traits> { |
+struct CollectionBackingTraceTrait<false, true, true, WTF::KeyValuePair<Key, Value>, Traits> : public BaseVisitKeyValuePairTrait<true, Key, Value, Traits> { |
}; |
// TXX (key value pair) |
-template<bool isWeak, bool visitWeakPointersStrongly, typename Key, typename Value, typename Traits> |
-struct VisitCollectionBackingTrait<true, isWeak, visitWeakPointersStrongly, WTF::KeyValuePair<Key, Value>, Traits> : public BaseVisitKeyValuePairTrait<visitWeakPointersStrongly, Key, Value, Traits> { |
+template<bool isWeak, bool markWeakPointersStrongly, typename Key, typename Value, typename Traits> |
+struct CollectionBackingTraceTrait<true, isWeak, markWeakPointersStrongly, WTF::KeyValuePair<Key, Value>, Traits> : public BaseVisitKeyValuePairTrait<markWeakPointersStrongly, Key, Value, Traits> { |
}; |
// TFX (member) |
-template<bool visitWeakPointersStrongly, typename T, typename Traits> |
-struct VisitCollectionBackingTrait<true, false, visitWeakPointersStrongly, Member<T>, Traits> { |
- static void visit(WebCore::Visitor* visitor, Member<T> self) |
+template<bool markWeakPointersStrongly, typename T, typename Traits> |
+struct CollectionBackingTraceTrait<true, false, markWeakPointersStrongly, Member<T>, Traits> { |
+ static void mark(WebCore::Visitor* visitor, Member<T> self) |
{ |
- visitor->visit(self.raw()); |
+ visitor->mark(self.raw()); |
} |
}; |
// FTT (weak member) |
template<typename T, typename Traits> |
-struct VisitCollectionBackingTrait<false, true, true, WeakMember<T>, Traits> { |
- static void visit(WebCore::Visitor* visitor, WeakMember<T> self) |
+struct CollectionBackingTraceTrait<false, true, true, WeakMember<T>, Traits> { |
+ static void mark(WebCore::Visitor* visitor, WeakMember<T> self) |
{ |
- // This can visit weak members as if they were strong. The reason we |
+ // This can mark weak members as if they were strong. The reason we |
// need this is that we don't do weak processing unless we reach the |
// backing only through the hash table. Reaching it in any other way |
// makes it impossible to update the size and deleted slot count of the |
// table, and exposes us to weak processing during iteration issues. |
- visitor->visit(self.raw()); |
+ visitor->mark(self.raw()); |
} |
}; |
// Catch-all for things that have a way to trace. For things that contain weak |
// pointers they will generally be visited weakly even if |
-// visitWeakPointersStrongly is true. This is what you want. |
-template<bool isWeak, bool visitWeakPointersStrongly, typename T, typename Traits> |
-struct VisitCollectionBackingTrait<true, isWeak, visitWeakPointersStrongly, T, Traits> { |
- static void visit(WebCore::Visitor* visitor, T& t) |
+// markWeakPointersStrongly is true. This is what you want. |
+template<bool isWeak, bool markWeakPointersStrongly, typename T, typename Traits> |
+struct CollectionBackingTraceTrait<true, isWeak, markWeakPointersStrongly, T, Traits> { |
+ static void mark(WebCore::Visitor* visitor, T& t) |
{ |
TraceTrait<T>::trace(visitor, reinterpret_cast<void*>(&t)); |
} |
@@ -1290,12 +1276,12 @@ struct TraceTrait<HeapVectorBacking<T, Traits> > { |
static void trace(WebCore::Visitor* visitor, void* self) |
{ |
COMPILE_ASSERT(!Traits::isWeak, WeDontSupportWeaknessInHeapVectors); |
- if (Traits::needsVisiting) |
- VisitCollectionBackingTrait<Traits::needsVisiting, false, false, HeapVectorBacking<T, Traits>, void>::visit(visitor, self); |
+ if (Traits::needsMarking) |
Erik Corry
2013/12/06 10:30:33
I think this should be needsTracing
Mads Ager (chromium)
2013/12/06 11:00:10
Yes, will fix.
|
+ CollectionBackingTraceTrait<Traits::needsMarking, false, false, HeapVectorBacking<T, Traits>, void>::mark(visitor, self); |
} |
- static void visit(Visitor* v, const Backing* p) |
+ static void mark(Visitor* v, const Backing* p) |
{ |
- v->visit(p, &trace); |
+ v->mark(p, &trace); |
} |
static void checkTypeMarker(Visitor* visitor, const Backing* t) |
{ |
@@ -1314,18 +1300,18 @@ struct TraceTrait<HeapVectorBacking<T, Traits> > { |
template<typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits> |
struct TraceTrait<HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits> > { |
typedef HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits> Backing; |
- static const bool needsVisiting = (Traits::needsVisiting || Traits::isWeak); |
+ static const bool needsMarking = (Traits::needsMarking || Traits::isWeak); |
static void trace(WebCore::Visitor* visitor, void* self) |
{ |
- if (needsVisiting) |
- VisitCollectionBackingTrait<Traits::needsVisiting, Traits::isWeak, true, HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>, void>::visit(visitor, self); |
+ if (needsMarking) |
+ CollectionBackingTraceTrait<Traits::needsMarking, Traits::isWeak, true, HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>, void>::mark(visitor, self); |
} |
- static void visit(Visitor* v, const Backing* p) |
+ static void mark(Visitor* v, const Backing* p) |
{ |
- if (needsVisiting) |
- v->visit(p, &trace); |
+ if (needsMarking) |
+ v->mark(p, &trace); |
else |
- v->visit(p, nullptr); |
+ v->mark(p, nullptr); |
} |
static void checkTypeMarker(Visitor* visitor, const Backing* t) |
{ |