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

Unified Diff: Source/WebCore/bindings/dart/DartUtilities.cpp

Issue 9837116: DOM wrappers that are not retained from Dart should be collected. (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: Rebased with proper shutdown semantics. Created 8 years, 9 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: Source/WebCore/bindings/dart/DartUtilities.cpp
diff --git a/Source/WebCore/bindings/dart/DartUtilities.cpp b/Source/WebCore/bindings/dart/DartUtilities.cpp
index 12210b23928436328a770c1f314d37d4f68b1fa6..3bddac4956c55f4809ec651812a55db5c9f55e86 100644
--- a/Source/WebCore/bindings/dart/DartUtilities.cpp
+++ b/Source/WebCore/bindings/dart/DartUtilities.cpp
@@ -262,7 +262,7 @@ static DartDOMData* domDataForIsolate(Dart_Isolate isolate)
static DartDOMData* currentDOMData()
{
- return domDataForIsolate(DartIsolate::current()->isolate());
+ return domDataForIsolate(Dart_CurrentIsolate());
}
void DartUtilities::registerDOMIsolate(Dart_Isolate isolate, PassRefPtr<DartApplicationLoader> applicationLoader, ScriptExecutionContext* context)
@@ -382,6 +382,43 @@ PassRefPtr<ScriptCallStack> DartUtilities::createScriptCallStack()
return ScriptCallStack::create(wrappedCallFrames);
}
+class WeakCallbackData
+{
+public:
+ void* peer;
+ Dart_WeakPersistentHandleFinalizer weakCallback;
+ Dart_Handle object;
+};
+
+static void weakCallbackWrapper(Dart_Handle object, void* peer)
+{
+ WeakCallbackData* callbackData = static_cast<WeakCallbackData*>(peer);
+ DartUtilities::domDataForCurrentIsolate()->weakCallbacks()->remove(callbackData);
Anton Muhin 2012/03/29 19:18:45 maybe performance FIXME? linear search looks scar
podivilov 2012/03/30 10:36:28 weakCallbacks is HashSet, not vector.
+ (*callbackData->weakCallback)(object, callbackData->peer);
+ delete callbackData;
+}
+
+Dart_Handle DartUtilities::createWeakPersistentHandle(Dart_Handle object, void* peer, Dart_WeakPersistentHandleFinalizer weakCallback)
+{
+ WeakCallbackData* callbackData = new WeakCallbackData;
Anton Muhin 2012/03/29 19:18:45 why not provide a ctor in the class itself?
podivilov 2012/03/30 10:36:28 Done.
+ callbackData->peer = peer;
+ callbackData->weakCallback = weakCallback;
+ callbackData->object = Dart_NewWeakPersistentHandle(object, callbackData, &weakCallbackWrapper);
+ domDataForCurrentIsolate()->weakCallbacks()->add(callbackData);
+ return callbackData->object;
+}
+
+void DartUtilities::disposeWeakPersistentHandles()
+{
+ DartWeakCallbacks* weakCallbacks = domDataForCurrentIsolate()->weakCallbacks();
+ for (DartWeakCallbacks::iterator it = weakCallbacks->begin(); it != weakCallbacks->end(); ++it) {
+ WeakCallbackData* callbackData = *it;
+ (*callbackData->weakCallback)(callbackData->object, callbackData->peer);
+ delete callbackData;
+ }
+ weakCallbacks->clear();
+}
+
const uint8_t* DartUtilities::fullSnapshot()
{
static const uint8_t snapshotBuffer[] = {
« Source/WebCore/bindings/dart/DartDOMWrapper.h ('K') | « Source/WebCore/bindings/dart/DartUtilities.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698