| Index: Source/platform/heap/Visitor.h | 
| diff --git a/Source/platform/heap/Visitor.h b/Source/platform/heap/Visitor.h | 
| index dcd07cfff5143b87feaebf66c63daaf9f6d5e3aa..0df33b31f5ee31b9744f960c6dd20ac52c1abca8 100644 | 
| --- a/Source/platform/heap/Visitor.h | 
| +++ b/Source/platform/heap/Visitor.h | 
| @@ -191,58 +191,51 @@ public: | 
|  | 
| template<typename T> class TraceTrait<const T> : public TraceTrait<T> { }; | 
|  | 
| -// If ENABLE_EAGER_TRACING_BY_DEFAULT is set to 1, GCed objects will | 
| -// be eagerly traced by default. A class type can opt out by declaring | 
| -// a TraceEagerlyTrait<> specialization, mapping the value to 'false' | 
| -// (see the WILL_NOT_BE_EAGERLY_TRACED() macro below.) | 
| -#define ENABLE_EAGER_TRACING_BY_DEFAULT 0 | 
| - | 
| -// DISABLE_ALL_EAGER_TRACING provides the "kill switch" for eager | 
| -// tracing; setting it to 1 will disable the use of eager tracing | 
| -// entirely. That is, eager tracing is disabled even if traits have | 
| -// been declared. | 
| -#define DISABLE_ALL_EAGER_TRACING 0 | 
| - | 
| -// If TraceEagerlyTrait<T>::value is true, then the marker thread should | 
| -// invoke trace() on not-yet-marked objects deriving from class T right | 
| -// away, and not queue their trace callbacks on its marker stack. | 
| +// If MARKER_EAGER_TRACING is set to 1, a marker thread is allowed | 
| +// to directly invoke the trace() method of not-as-yet marked objects upon | 
| +// marking. If it is set to 0, the |trace()| callback for an object will | 
| +// be pushed onto an explicit mark stack, which the marker proceeds to | 
| +// iteratively pop and invoke. The eager scheme enables inlining of a trace() | 
| +// method inside another, the latter keeps system call stack usage bounded | 
| +// and under explicit control. | 
| // | 
| -// Specific template specializations of TraceEagerlyTrait<T> can be used | 
| -// to declare that eager tracing should always be used when tracing over | 
| -// GCed objects with class type T. If the trait's boolean 'value' is | 
| -// mapped to 'true' that is; declare it as 'false' to disable eager tracing. | 
| +// If eager tracing leads to excessively deep |trace()| call chains (and | 
| +// the system stack usage that this brings), the marker implementation will | 
| +// switch to using an explicit mark stack. Recursive and deep object graphs | 
| +// are uncommon for Blink objects. | 
| +// | 
| +// A class type can opt out of eager tracing by declaring a TraceEagerlyTrait<> | 
| +// specialization, mapping the trait's |value| to |false| (see the | 
| +// WILL_NOT_BE_EAGERLY_TRACED() macros below.) For Blink, this is done for | 
| +// the small set of GCed classes that are directly recursive. | 
| +#define MARKER_EAGER_TRACING 1 | 
| + | 
| +// The TraceEagerlyTrait<T> trait controls whether or not a class | 
| +// (and its subclasses) should be eagerly traced or not. | 
| +// | 
| +// If |TraceEagerlyTrait<T>::value| is |true|, then the marker thread | 
| +// should invoke |trace()| on not-yet-marked objects deriving from class T | 
| +// right away, and not queue their trace callbacks on its marker stack, | 
| +// which it will do if |value| is |false|. | 
| // | 
| // The trait can be declared to enable/disable eager tracing for a class T | 
| -// and any of its subclasses, or just to the class T (but none of its subclasses.) | 
| +// and any of its subclasses, or just to the class T, but none of its | 
| +// subclasses. | 
| // | 
| template<typename T, typename Enabled = void> | 
| class TraceEagerlyTrait { | 
| public: | 
| -    static const bool value = ENABLE_EAGER_TRACING_BY_DEFAULT; | 
| +    static const bool value = MARKER_EAGER_TRACING; | 
| }; | 
|  | 
| -#define WILL_BE_EAGERLY_TRACED(TYPE)                                                        \ | 
| -template<typename U>                                                                        \ | 
| -class TraceEagerlyTrait<U, typename WTF::EnableIf<WTF::IsSubclass<U, TYPE>::value>::Type> { \ | 
| -public:                                                                                     \ | 
| -    static const bool value = true;                                                         \ | 
| -} | 
| - | 
| #define WILL_NOT_BE_EAGERLY_TRACED(TYPE)                                                    \ | 
| -template<typename U>                                                                        \ | 
| -class TraceEagerlyTrait<U, typename WTF::EnableIf<WTF::IsSubclass<U, TYPE>::value>::Type> { \ | 
| +template<typename T>                                                                        \ | 
| +class TraceEagerlyTrait<T, typename WTF::EnableIf<WTF::IsSubclass<T, TYPE>::value>::Type> { \ | 
| public:                                                                                     \ | 
| static const bool value = false;                                                        \ | 
| } | 
|  | 
| -// Limit eager tracing to only apply to TYPE (but not any of its subclasses.) | 
| -#define WILL_BE_EAGERLY_TRACED_CLASS(TYPE)       \ | 
| -template<>                                       \ | 
| -class TraceEagerlyTrait<TYPE> {                  \ | 
| -public:                                          \ | 
| -    static const bool value = true;              \ | 
| -} | 
| - | 
| +// Disable eager tracing for TYPE, but not any of its subclasses. | 
| #define WILL_NOT_BE_EAGERLY_TRACED_CLASS(TYPE)   \ | 
| template<>                                       \ | 
| class TraceEagerlyTrait<TYPE> {                  \ | 
| @@ -250,16 +243,6 @@ public:                                          \ | 
| static const bool value = false;             \ | 
| } | 
|  | 
| -// Set to 1 if you want collections to be eagerly traced regardless | 
| -// of whether the elements are eagerly traceable or not. | 
| -#define ENABLE_EAGER_HEAP_COLLECTION_TRACING ENABLE_EAGER_TRACING_BY_DEFAULT | 
| - | 
| -#if ENABLE_EAGER_HEAP_COLLECTION_TRACING | 
| -#define IS_EAGERLY_TRACED_HEAP_COLLECTION(Type) true | 
| -#else | 
| -#define IS_EAGERLY_TRACED_HEAP_COLLECTION(Type) TraceEagerlyTrait<Type>::value | 
| -#endif | 
| - | 
| template<typename Collection> | 
| struct OffHeapCollectionTraceTrait; | 
|  | 
| @@ -586,7 +569,7 @@ public: | 
| // | 
| // If the trait allows it, invoke the trace callback right here on the | 
| // not-yet-marked object. | 
| -        if (!DISABLE_ALL_EAGER_TRACING && TraceEagerlyTrait<T>::value) { | 
| +        if (TraceEagerlyTrait<T>::value) { | 
| // Protect against too deep trace call chains, and the | 
| // unbounded system stack usage they can bring about. | 
| // | 
| @@ -697,7 +680,7 @@ public: \ | 
| { \ | 
| typedef WTF::IsSubclassOfTemplate<typename WTF::RemoveConst<TYPE>::Type, blink::GarbageCollected> IsSubclassOfGarbageCollected; \ | 
| COMPILE_ASSERT(IsSubclassOfGarbageCollected::value, OnlyGarbageCollectedObjectsCanHaveGarbageCollectedMixins);                  \ | 
| -        if (!DISABLE_ALL_EAGER_TRACING && TraceEagerlyTrait<TYPE>::value) {             \ | 
| +        if (TraceEagerlyTrait<TYPE>::value) {                                           \ | 
| if (visitor->ensureMarked(static_cast<const TYPE*>(this)))                  \ | 
| TraceTrait<TYPE>::trace(visitor, const_cast<TYPE*>(this));              \ | 
| return;                                                                     \ | 
|  |