Index: Source/platform/heap/Heap.cpp |
diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp |
index a53b497aa0be8dc26ddb55d156f0101e9d23b8d5..3987142b2c77f7729f60f297c709c690ae5583ac 100644 |
--- a/Source/platform/heap/Heap.cpp |
+++ b/Source/platform/heap/Heap.cpp |
@@ -572,12 +572,12 @@ static bool isUninitializedMemory(void* objectPointer, size_t objectSize) |
template<> |
void LargeObject<FinalizedHeapObjectHeader>::mark(Visitor* visitor) |
{ |
- if (heapObjectHeader()->hasVTable() && !vTableInitialized(payload())) { |
- FinalizedHeapObjectHeader* header = heapObjectHeader(); |
+ FinalizedHeapObjectHeader* header = heapObjectHeader(); |
+ if (header->hasVTable() && !vTableInitialized(payload())) { |
visitor->markNoTracing(header); |
ASSERT(isUninitializedMemory(header->payload(), header->payloadSize())); |
} else { |
- visitor->mark(heapObjectHeader(), heapObjectHeader()->traceCallback()); |
+ visitor->mark(header, header->traceCallback()); |
} |
} |
@@ -1984,17 +1984,14 @@ public: |
Heap::pushTraceCallback(m_markingStack, const_cast<void*>(objectPointer), callback); |
} |
+ // We need both HeapObjectHeader and FinalizedHeapObjectHeader versions to correctly find the payload. |
virtual void mark(HeapObjectHeader* header, TraceCallback callback) override |
{ |
- // We need both the HeapObjectHeader and FinalizedHeapObjectHeader |
- // version to correctly find the payload. |
visitHeader(header, header->payload(), callback); |
} |
virtual void mark(FinalizedHeapObjectHeader* header, TraceCallback callback) override |
{ |
- // We need both the HeapObjectHeader and FinalizedHeapObjectHeader |
- // version to correctly find the payload. |
visitHeader(header, header->payload(), callback); |
} |
@@ -2033,6 +2030,52 @@ public: |
return FinalizedHeapObjectHeader::fromPayload(objectPointer)->isMarked(); |
} |
+ virtual bool ensureMarked(const void* objectPointer) override |
haraken
2014/11/28 05:20:05
Shall we flip true/false of the return value? It l
haraken
2014/11/28 05:20:05
Can we share the implementation of ensureMarked wi
sof
2014/11/28 12:05:08
I would prefer not to do that exercise; there's tr
sof
2014/11/28 12:05:08
Meaning is still not self-evident, but flipped.
haraken
2014/11/28 12:39:27
Sounds reasonable. Given that the code that ensure
|
+ { |
+ if (!objectPointer) |
+ return true; |
+#if ENABLE(ASSERT) |
+ if (isMarked(objectPointer)) |
+ return true; |
+ |
+ markNoTracing(objectPointer); |
+#else |
+ FinalizedHeapObjectHeader* header = |
+ FinalizedHeapObjectHeader::fromPayload(objectPointer); |
+ if (header->isMarked()) |
+ return true; |
+ header->mark(); |
+#endif |
+ return false; |
+ } |
+ |
+#if ENABLE(ASSERT) |
kouhei (in TOK)
2014/11/28 01:00:57
Would you describe why we need ENABLE(ASSERT) / no
sof
2014/11/28 12:05:08
A debug-specific version is provided essentially b
kouhei (in TOK)
2014/12/02 00:41:58
Thanks for the explanation. Would you add a commen
sof
2014/12/02 09:52:15
Certainly, done.
|
+#define DEFINE_ENSURE_MARKED_METHOD(Type) \ |
+ virtual bool ensureMarked(const Type* objectPointer) override \ |
+ { \ |
+ if (!objectPointer) \ |
+ return true; \ |
+ COMPILE_ASSERT(!NeedsAdjustAndMark<Type>::value, CanOnlyUseIsMarkedOnNonAdjustedTypes); \ |
+ if (isMarked(objectPointer)) \ |
+ return true; \ |
+ markNoTracing(objectPointer); \ |
+ return false; \ |
+ } |
+#else |
+#define DEFINE_ENSURE_MARKED_METHOD(Type) \ |
+ virtual bool ensureMarked(const Type* objectPointer) override \ |
+ { \ |
+ if (!objectPointer) \ |
+ return true; \ |
+ HeapObjectHeader* header = \ |
+ HeapObjectHeader::fromPayload(objectPointer); \ |
+ if (header->isMarked()) \ |
+ return true; \ |
+ header->mark(); \ |
+ return false; \ |
+ } |
+#endif |
+ |
// This macro defines the necessary visitor methods for typed heaps |
#define DEFINE_VISITOR_METHODS(Type) \ |
virtual void mark(const Type* objectPointer, TraceCallback callback) override \ |
@@ -2046,7 +2089,8 @@ public: |
virtual bool isMarked(const Type* objectPointer) override \ |
{ \ |
return HeapObjectHeader::fromPayload(objectPointer)->isMarked(); \ |
- } |
+ } \ |
+ DEFINE_ENSURE_MARKED_METHOD(Type) |
FOR_EACH_TYPED_HEAP(DEFINE_VISITOR_METHODS) |
#undef DEFINE_VISITOR_METHODS |