| Index: Source/wtf/TypeTraits.h
 | 
| diff --git a/Source/wtf/TypeTraits.h b/Source/wtf/TypeTraits.h
 | 
| index 92f8cebb2b7b02d00e717be8d7902c8af2e656da..1a9f4265a79a19acf23daaa71f3208e3cc0a3459 100644
 | 
| --- a/Source/wtf/TypeTraits.h
 | 
| +++ b/Source/wtf/TypeTraits.h
 | 
| @@ -240,6 +240,10 @@ namespace WTF {
 | 
|          typedef T Type;
 | 
|      };
 | 
|  
 | 
| +    template <typename T> struct Identity {
 | 
| +        typedef T type; 
 | 
| +    };
 | 
| +
 | 
|      template <typename T> struct RemoveConst {
 | 
|          typedef T Type;
 | 
|      };
 | 
| @@ -303,6 +307,8 @@ namespace WTF {
 | 
|  namespace blink {
 | 
|  
 | 
|  class JSONValue;
 | 
| +class InlinedGlobalMarkingVisitor;
 | 
| +class Visitor;
 | 
|  
 | 
|  } // namespace blink
 | 
|  
 | 
| @@ -318,23 +324,42 @@ namespace WTF {
 | 
|      };
 | 
|  
 | 
|  template<typename T>
 | 
| +class HasTraceNewMethod {
 | 
| +    typedef char YesType;
 | 
| +    typedef struct NoType {
 | 
| +        char padding[8];
 | 
| +    } NoType;
 | 
| +#if COMPILER(MSVC)
 | 
| +    QUACK!
 | 
| +#else
 | 
| +    template<size_t> struct HasMethod;
 | 
| +    template<typename V> static YesType checkHasTraceNewMethod(HasMethod<sizeof(static_cast<void (V::*)(blink::InlinedGlobalMarkingVisitor)>(&V::trace))>*);
 | 
| +#endif // COMPILER(MSVC)
 | 
| +    template<typename V> static NoType checkHasTraceNewMethod(...);
 | 
| +public:
 | 
| +    static const bool value = sizeof(YesType) + sizeof(T) == sizeof(checkHasTraceNewMethod<T>(0)) + sizeof(T);
 | 
| +};
 | 
| +
 | 
| +template<typename T>
 | 
|  class NeedsTracing {
 | 
|      typedef char YesType;
 | 
|      typedef struct NoType {
 | 
|          char padding[8];
 | 
|      } NoType;
 | 
|  #if COMPILER(MSVC)
 | 
| +    QUACK!
 | 
|      template<typename V> static YesType checkHasTraceMethod(char[&V::trace != 0]);
 | 
|  #else
 | 
|      template<size_t> struct HasMethod;
 | 
| -    template<typename V> static YesType checkHasTraceMethod(HasMethod<sizeof(&V::trace)>*);
 | 
| +    template<typename V> static YesType checkHasTraceMethod(HasMethod<sizeof(static_cast<void (V::*)(blink::Visitor*)>(&V::trace))>*);
 | 
|  #endif // COMPILER(MSVC)
 | 
|      template<typename V> static NoType checkHasTraceMethod(...);
 | 
|  public:
 | 
|      // We add sizeof(T) to both sides here, because we want it to fail for
 | 
|      // incomplete types. Otherwise it just assumes that incomplete types do not
 | 
|      // have a trace method, which may not be true.
 | 
| -    static const bool value = sizeof(YesType) + sizeof(T) == sizeof(checkHasTraceMethod<T>(0)) + sizeof(T);
 | 
| +    static const bool hasTraceMethod = sizeof(YesType) + sizeof(T) == sizeof(checkHasTraceMethod<T>(0)) + sizeof(T);
 | 
| +    static const bool value = hasTraceMethod || HasTraceNewMethod<T>::value;
 | 
|  };
 | 
|  
 | 
|  // Convenience template wrapping the NeedsTracingLazily template in
 | 
| 
 |