Index: Source/platform/heap/Visitor.h |
diff --git a/Source/platform/heap/Visitor.h b/Source/platform/heap/Visitor.h |
index e0511aef6949441b6ed38e714feb8a0885cd4f4d..3139e493366c480a8cf5fa3e0f1d0ed7c2d74f91 100644 |
--- a/Source/platform/heap/Visitor.h |
+++ b/Source/platform/heap/Visitor.h |
@@ -32,6 +32,7 @@ |
#define Visitor_h |
#include "platform/PlatformExport.h" |
+#include "platform/heap/StackFrameDepth.h" |
#include "platform/heap/ThreadState.h" |
#include "wtf/Assertions.h" |
#include "wtf/Deque.h" |
@@ -614,18 +615,37 @@ public: |
} |
#endif |
- inline bool canTraceEagerly() const { return m_traceDepth < kMaxEagerTraceDepth; } |
- inline void incrementTraceDepth() { m_traceDepth++; } |
- inline void decrementTraceDepth() { ASSERT(m_traceDepth > 0); m_traceDepth--; } |
+ inline bool canTraceEagerly() const |
+ { |
+ ASSERT(m_traceDepth); |
+ return m_traceDepth->isSafeToRecurse(); |
+ } |
+ |
+ inline void incrementTraceDepth() |
+ { |
+ ASSERT(m_traceDepth); |
+ m_traceDepth->increment(); |
+ } |
+ |
+ inline void decrementTraceDepth() |
+ { |
+ ASSERT(m_traceDepth); |
+ m_traceDepth->decrement(); |
+ } |
+ |
+ inline void configureEagerTraceLimit() |
+ { |
+ if (!m_traceDepth) |
+ m_traceDepth = new StackFrameDepth; |
+ m_traceDepth->configureLimit(); |
+ } |
inline bool isGlobalMarkingVisitor() const { return m_isGlobalMarkingVisitor; } |
protected: |
explicit Visitor(VisitorType type) |
: m_isGlobalMarkingVisitor(type == GlobalMarkingVisitorType) |
- { |
- m_traceDepth = 0; |
- } |
+ { } |
virtual void registerWeakCellWithCallback(void**, WeakPointerCallback) = 0; |
#if ENABLE(GC_PROFILE_MARKING) |
@@ -639,11 +659,7 @@ protected: |
#endif |
private: |
- // The maximum depth of eager, unrolled trace() calls that is |
- // considered safe and allowed. |
- const int kMaxEagerTraceDepth = 100; |
- |
- static int m_traceDepth; |
+ static StackFrameDepth* m_traceDepth; |
bool m_isGlobalMarkingVisitor; |
}; |