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

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: Address comments. 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
« no previous file with comments | « Source/WebCore/bindings/dart/DartUtilities.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..af5f59e01a7d04c6ffffae3707285edad09980e5 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,48 @@ PassRefPtr<ScriptCallStack> DartUtilities::createScriptCallStack()
return ScriptCallStack::create(wrappedCallFrames);
}
+class DartWeakCallback
+{
+public:
+ DartWeakCallback(void* peer, Dart_WeakPersistentHandleFinalizer weakCallback)
+ : peer(peer)
+ , weakCallback(weakCallback)
+ , object(0)
+ {
+ }
+
+ void* peer;
Anton Muhin 2012/03/30 11:36:00 nit: m_peer, m_weakCallback, etc.?
+ Dart_WeakPersistentHandleFinalizer weakCallback;
+ Dart_Handle object;
+};
+
+static void weakCallbackWrapper(Dart_Handle object, void* peer)
+{
+ DartWeakCallback* callback = static_cast<DartWeakCallback*>(peer);
+ DartUtilities::domDataForCurrentIsolate()->weakCallbacks()->remove(callback);
+ (*callback->weakCallback)(object, callback->peer);
+ delete callback;
+}
+
+Dart_Handle DartUtilities::createWeakPersistentHandle(Dart_Handle object, void* peer, Dart_WeakPersistentHandleFinalizer weakCallback)
+{
+ DartWeakCallback* callback = new DartWeakCallback(peer, weakCallback);
+ callback->object = Dart_NewWeakPersistentHandle(object, callback, &weakCallbackWrapper);
+ domDataForCurrentIsolate()->weakCallbacks()->add(callback);
+ return callback->object;
+}
+
+void DartUtilities::disposeWeakPersistentHandles()
+{
+ DartWeakCallbacks* weakCallbacks = domDataForCurrentIsolate()->weakCallbacks();
+ for (DartWeakCallbacks::iterator it = weakCallbacks->begin(); it != weakCallbacks->end(); ++it) {
+ DartWeakCallback* callback = *it;
+ (*callback->weakCallback)(callback->object, callback->peer);
+ delete callback;
+ }
+ weakCallbacks->clear();
+}
+
const uint8_t* DartUtilities::fullSnapshot()
{
static const uint8_t snapshotBuffer[] = {
« no previous file with comments | « Source/WebCore/bindings/dart/DartUtilities.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698