| Index: Source/WebCore/bindings/dart/DartGCController.cpp
|
| diff --git a/Source/WebCore/bindings/dart/DartGCController.cpp b/Source/WebCore/bindings/dart/DartGCController.cpp
|
| index 5219e3222e3e12eedeee6aeb73005973e8124078..b017f3ac67c38b2692db8235005b3e18ea44ae16 100644
|
| --- a/Source/WebCore/bindings/dart/DartGCController.cpp
|
| +++ b/Source/WebCore/bindings/dart/DartGCController.cpp
|
| @@ -48,31 +48,21 @@ struct WeakReferenceSet {
|
| Vector<Dart_Handle> values;
|
| };
|
|
|
| -typedef HashMap<Node*, WeakReferenceSet*> weakReferenceSetForRootMap;
|
| +typedef Vector<WeakReferenceSet*> WeakReferenceSets;
|
|
|
| -static weakReferenceSetForRootMap* weakReferenceSetForRoot()
|
| +static WeakReferenceSets* weakReferenceSets()
|
| {
|
| - DEFINE_STATIC_LOCAL(weakReferenceSetForRootMap, map, ());
|
| - return ↦
|
| + DEFINE_STATIC_LOCAL(WeakReferenceSets, sets, ());
|
| + return &sets;
|
| }
|
|
|
| static Node* calculateRootNode(Node*);
|
| static void addEventListenersToReferenceSet(EventTarget*, WeakReferenceSet*);
|
|
|
| -void DartGCController::prologueCallback()
|
| +static void createWeakReferenceSetsForNodes(DartDOMData* domData, WeakReferenceSet* documentWeakReferenceSet, WeakReferenceSets* weakReferenceSets)
|
| {
|
| - ASSERT(DartIsolate::isDOMIsolate(Dart_CurrentIsolate()));
|
| -
|
| - // FIXME: pass the state to epilogue callback instead of using statics.
|
| - ASSERT(weakReferenceSetForRoot()->isEmpty());
|
| -
|
| - DartDOMData* domData = DartIsolate::currentDOMData();
|
| -
|
| - ASSERT(domData->scriptExecutionContext()->isDocument());
|
| - Document* document = static_cast<Document*>(domData->scriptExecutionContext());
|
| -
|
| - WeakReferenceSet* documentWeakReferenceSet = new WeakReferenceSet;
|
| - weakReferenceSetForRoot()->set(document, documentWeakReferenceSet);
|
| + typedef HashMap<Node*, WeakReferenceSet*> WeakReferenceSetForRootMap;
|
| + WeakReferenceSetForRootMap weakReferenceSetForRootMap;
|
|
|
| DartDOMNodeMap* nodeMap = domData->nodeMap();
|
| for (DartDOMNodeMap::iterator it = nodeMap->begin(); it != nodeMap->end(); ++it) {
|
| @@ -86,12 +76,13 @@ void DartGCController::prologueCallback()
|
| Node* root = calculateRootNode(node);
|
| if (!root)
|
| continue;
|
| - weakReferenceSetForRootMap::iterator weakReferenceSetIterator = weakReferenceSetForRoot()->find(root);
|
| - if (weakReferenceSetIterator != weakReferenceSetForRoot()->end())
|
| + WeakReferenceSetForRootMap::iterator weakReferenceSetIterator = weakReferenceSetForRootMap.find(root);
|
| + if (weakReferenceSetIterator != weakReferenceSetForRootMap.end())
|
| weakReferenceSet = weakReferenceSetIterator->second;
|
| else {
|
| weakReferenceSet = new WeakReferenceSet;
|
| - weakReferenceSetForRoot()->set(root, weakReferenceSet);
|
| + weakReferenceSets->append(weakReferenceSet);
|
| + weakReferenceSetForRootMap.set(root, weakReferenceSet);
|
| }
|
| }
|
| ASSERT(weakReferenceSet);
|
| @@ -101,13 +92,16 @@ void DartGCController::prologueCallback()
|
| weakReferenceSet->values.append(wrapper);
|
| addEventListenersToReferenceSet(node, weakReferenceSet);
|
| }
|
| +}
|
|
|
| +static void collectRetainedActiveDOMObjectWrappers(DartDOMData* domData, Vector<Dart_Handle>& wrappers)
|
| +{
|
| DartActiveDOMObjectMap* activeObjectMap = domData->activeObjectMap();
|
| for (DartActiveDOMObjectMap::iterator it = activeObjectMap->begin(); it != activeObjectMap->end(); ++it) {
|
| ActiveDOMObject* activeDOMObject = it->first;
|
| if (activeDOMObject->hasPendingActivity()) {
|
| Dart_Handle wrapper = it->second;
|
| - documentWeakReferenceSet->values.append(wrapper);
|
| + wrappers.append(wrapper);
|
| }
|
| }
|
|
|
| @@ -116,22 +110,20 @@ void DartGCController::prologueCallback()
|
| MessagePort* messagePort = it->first;
|
| if (messagePort->isEntangled() || messagePort->hasPendingActivity()) {
|
| Dart_Handle wrapper = it->second;
|
| - documentWeakReferenceSet->values.append(wrapper);
|
| + wrappers.append(wrapper);
|
| }
|
| }
|
| -
|
| - addEventListenersToReferenceSet(document->domWindow(), documentWeakReferenceSet);
|
| -
|
| - for (weakReferenceSetForRootMap::iterator it = weakReferenceSetForRoot()->begin(); it != weakReferenceSetForRoot()->end(); ++it) {
|
| - WeakReferenceSet* set = it->second;
|
| - Dart_NewWeakReferenceSet(set->keys.data(), set->keys.size(), set->values.data(), set->values.size());
|
| - }
|
| }
|
|
|
| -void DartGCController::epilogueCallback()
|
| +static void createWeakReferenceSetsForEventTargets(DartDOMData* domData, WeakReferenceSets* weakReferenceSets)
|
| {
|
| - WTF::deleteAllValues(*weakReferenceSetForRoot());
|
| - weakReferenceSetForRoot()->clear();
|
| + DartEventTargetMap* eventTargetMap = domData->eventTargetMap();
|
| + for (DartEventTargetMap::iterator it = eventTargetMap->begin(); it != eventTargetMap->end(); ++it) {
|
| + WeakReferenceSet* weakReferenceSet = new WeakReferenceSet;
|
| + weakReferenceSets->append(weakReferenceSet);
|
| + weakReferenceSet->keys.append(it->second);
|
| + addEventListenersToReferenceSet(it->first, weakReferenceSet);
|
| + }
|
| }
|
|
|
| static Node* calculateRootNode(Node* node)
|
| @@ -166,4 +158,31 @@ static void addEventListenersToReferenceSet(EventTarget* eventTarget, WeakRefere
|
| }
|
| }
|
|
|
| +void DartGCController::prologueCallback()
|
| +{
|
| + ASSERT(DartIsolate::isDOMIsolate(Dart_CurrentIsolate()));
|
| + // FIXME: pass the state to epilogue callback instead of using statics.
|
| + ASSERT(weakReferenceSets()->isEmpty());
|
| +
|
| + DartDOMData* domData = DartIsolate::currentDOMData();
|
| +
|
| + WeakReferenceSet* documentWeakReferenceSet = new WeakReferenceSet;
|
| + weakReferenceSets()->append(documentWeakReferenceSet);
|
| +
|
| + createWeakReferenceSetsForNodes(domData, documentWeakReferenceSet, weakReferenceSets());
|
| + createWeakReferenceSetsForEventTargets(domData, weakReferenceSets());
|
| + collectRetainedActiveDOMObjectWrappers(domData, documentWeakReferenceSet->values);
|
| +
|
| + for (size_t i = 0; i < weakReferenceSets()->size(); ++i) {
|
| + WeakReferenceSet* set = (*weakReferenceSets())[i];
|
| + Dart_NewWeakReferenceSet(set->keys.data(), set->keys.size(), set->values.data(), set->values.size());
|
| + }
|
| +}
|
| +
|
| +void DartGCController::epilogueCallback()
|
| +{
|
| + WTF::deleteAllValues(*weakReferenceSets());
|
| + weakReferenceSets()->clear();
|
| +}
|
| +
|
| }
|
|
|