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 |