Chromium Code Reviews| 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[] = { |