Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(660)

Unified Diff: third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h

Issue 1873323002: Have bindings layer assume and insist that all interface types are GCed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h
index 55ef9a0a612c2da518fdc8d8259138c2b4c86e77..a6150c7bba563e01834d4a6b2e3ea9302a807b9f 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h
@@ -35,6 +35,7 @@
#include "core/CoreExport.h"
#include "platform/heap/Handle.h"
#include "wtf/Noncopyable.h"
+#include "wtf/TypeTraits.h"
#include <v8.h>
namespace blink {
@@ -59,6 +60,10 @@ public:
template<typename T>
T* toImpl()
{
+ // All ScriptWrappables are managed by the Blink GC heap; check that
+ // |T| is a garbage collected type.
+ static_assert(sizeof(T) && WTF::IsGarbageCollectedType<T>::value, "Classes implementing ScriptWrappable must be garbage collected.");
+
// Check if T* is castable to ScriptWrappable*, which means T doesn't
// have two or more ScriptWrappable as superclasses. If T has two
// ScriptWrappable as superclasses, conversions from T* to
@@ -168,31 +173,7 @@ private:
scriptWrappable->disposeWrapper(data);
auto wrapperTypeInfo = reinterpret_cast<WrapperTypeInfo*>(data.GetInternalField(v8DOMWrapperTypeIndex));
- if (wrapperTypeInfo->isGarbageCollected()) {
- // derefObject() for garbage collected objects is very cheap, so
- // we don't delay derefObject to the second pass.
- //
- // More importantly, we've already disposed the wrapper at this
- // moment, so the ScriptWrappable may have already been collected
- // by GC by the second pass. We shouldn't use a pointer to the
- // ScriptWrappable in secondWeakCallback in case of garbage
- // collected objects. Thus calls derefObject right now.
- wrapperTypeInfo->derefObject(scriptWrappable);
- } else {
- // For reference counted objects, let's delay the destruction of
- // the object to the second pass.
- data.SetSecondPassCallback(secondWeakCallback);
- }
- }
-
- static void secondWeakCallback(const v8::WeakCallbackInfo<ScriptWrappable>& data)
- {
- // FIXME: I noticed that 50%~ of minor GC cycle times can be consumed
- // inside data.GetParameter()->deref(), which causes Node destructions. We should
- // make Node destructions incremental.
- auto scriptWrappable = reinterpret_cast<ScriptWrappable*>(data.GetInternalField(v8DOMWrapperObjectIndex));
- auto wrapperTypeInfo = reinterpret_cast<WrapperTypeInfo*>(data.GetInternalField(v8DOMWrapperTypeIndex));
- wrapperTypeInfo->derefObject(scriptWrappable);
+ wrapperTypeInfo->wrapperDestroyed();
}
v8::Persistent<v8::Object> m_wrapper;

Powered by Google App Engine
This is Rietveld 408576698