| Index: third_party/WebKit/Source/wtf/StdLibExtras.h | 
| diff --git a/third_party/WebKit/Source/wtf/StdLibExtras.h b/third_party/WebKit/Source/wtf/StdLibExtras.h | 
| index 623fd15af0436effed7eef24c8d001d64a5e7de6..824c579a358dad705caacc8e528fe0d1ba322fe0 100644 | 
| --- a/third_party/WebKit/Source/wtf/StdLibExtras.h | 
| +++ b/third_party/WebKit/Source/wtf/StdLibExtras.h | 
| @@ -59,6 +59,14 @@ private: | 
| }; | 
| #endif | 
|  | 
| +// A direct static local to a Blink garbage collected objects isn't allowed; | 
| +// must be wrapped up with a persistent reference. | 
| +#define STATIC_ASSERT_FOR_LOCAL_WITH_GARBAGE_COLLECTED_TYPE(Name, Type) \ | 
| +    using Name##NoConstType = std::remove_const<Type>::type; \ | 
| +    using Name##NoPointerType = std::remove_pointer<Name##NoConstType>::type; \ | 
| +    using Name##NoReferenceType = std::remove_reference<Name##NoPointerType>::type; \ | 
| +    static_assert(!WTF::IsGarbageCollectedType<Name##NoReferenceType>::value || WTF::IsPersistentReferenceType<Name##NoReferenceType>::value, "Garbage collected static local needs to be wrapped up with a persistent reference") | 
| + | 
| // Use DEFINE_STATIC_LOCAL() to declare and define a static local variable (static T;) | 
| // so that it is leaked and its destructors are not called at exit. | 
| // | 
| @@ -68,13 +76,15 @@ private: | 
| // LEAK_SANITIZER_REGISTER_STATIC_LOCAL() takes care of the details. | 
| // | 
| #if ENABLE(ASSERT) | 
| -#define DEFINE_STATIC_LOCAL(type, name, arguments)        \ | 
| -    static StaticLocalVerifier name##StaticLocalVerifier; \ | 
| -    ASSERT(name##StaticLocalVerifier.isNotRacy());        \ | 
| -    static type& name = *LEAK_SANITIZER_REGISTER_STATIC_LOCAL(type, new type arguments) | 
| +#define DEFINE_STATIC_LOCAL(Type, Name, Arguments)        \ | 
| +    STATIC_ASSERT_FOR_LOCAL_WITH_GARBAGE_COLLECTED_TYPE(Name, Type); \ | 
| +    static StaticLocalVerifier Name##StaticLocalVerifier; \ | 
| +    ASSERT(Name##StaticLocalVerifier.isNotRacy());        \ | 
| +    static Type& Name = *LEAK_SANITIZER_REGISTER_STATIC_LOCAL(Type, new Type Arguments) | 
| #else | 
| -#define DEFINE_STATIC_LOCAL(type, name, arguments) \ | 
| -    static type& name = *LEAK_SANITIZER_REGISTER_STATIC_LOCAL(type, new type arguments) | 
| +#define DEFINE_STATIC_LOCAL(Type, Name, Arguments) \ | 
| +    STATIC_ASSERT_FOR_LOCAL_WITH_GARBAGE_COLLECTED_TYPE(Name, Type); \ | 
| +    static Type& Name = *LEAK_SANITIZER_REGISTER_STATIC_LOCAL(Type, new Type Arguments) | 
| #endif | 
|  | 
| // Use this to declare and define a static local pointer to a ref-counted object so that | 
|  |