Index: Source/core/inspector/PromiseTracker.cpp |
diff --git a/Source/core/inspector/PromiseTracker.cpp b/Source/core/inspector/PromiseTracker.cpp |
index 309710b1ac5ec60bbc48722b41b84361adfb51a8..b7d9a1f7feffcdd7a703a5ac282b90665f7a4160 100644 |
--- a/Source/core/inspector/PromiseTracker.cpp |
+++ b/Source/core/inspector/PromiseTracker.cpp |
@@ -27,18 +27,16 @@ public: |
int promiseHash() const { return m_promiseHash; } |
ScopedPersistent<v8::Object>& promise() { return m_promise; } |
- void trace(Visitor* visitor) |
+#if !ENABLE(OILPAN) |
+ WeakPtr<PromiseData> createWeakPtr() |
{ |
- visitor->trace(m_callStack); |
+ return m_weakPtrFactory.createWeakPtr(); |
} |
+#endif |
- WeakPtrWillBeRawPtr<PromiseData> createWeakPtr() |
+ void trace(Visitor* visitor) |
{ |
-#if ENABLE(OILPAN) |
- return this; |
-#else |
- return m_weakPtrFactory.createWeakPtr(); |
-#endif |
+ visitor->trace(m_callStack); |
} |
private: |
@@ -81,57 +79,68 @@ namespace { |
class PromiseDataWrapper FINAL : public NoBaseWillBeGarbageCollected<PromiseDataWrapper> { |
public: |
- static PassOwnPtrWillBeRawPtr<PromiseDataWrapper> create(PromiseTracker::PromiseData* data, PromiseTracker::PromiseDataMap* map) |
+ static PassOwnPtrWillBeRawPtr<PromiseDataWrapper> create(PromiseTracker::PromiseData* data, PromiseTracker* tracker) |
{ |
- return adoptPtrWillBeNoop(new PromiseDataWrapper(data->createWeakPtr(), map)); |
+#if ENABLE(OILPAN) |
+ return new PromiseDataWrapper(data, tracker); |
+#else |
+ return adoptPtr(new PromiseDataWrapper(data->createWeakPtr(), tracker)); |
+#endif |
} |
+#if ENABLE(OILPAN) |
+ static void didRemovePromise(const v8::WeakCallbackData<v8::Object, Persistent<PromiseDataWrapper> >& data) |
+#else |
static void didRemovePromise(const v8::WeakCallbackData<v8::Object, PromiseDataWrapper>& data) |
+#endif |
{ |
- OwnPtrWillBeRawPtr<PromiseDataWrapper> wrapper = adoptPtrWillBeNoop(data.GetParameter()); |
+#if ENABLE(OILPAN) |
+ OwnPtr<Persistent<PromiseDataWrapper> > persistentWrapper = adoptPtr(data.GetParameter()); |
+ RawPtr<PromiseDataWrapper> wrapper = *persistentWrapper; |
+#else |
+ OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(data.GetParameter()); |
+#endif |
WeakPtrWillBeRawPtr<PromiseTracker::PromiseData> promiseData = wrapper->m_data; |
- if (!promiseData) |
+ if (!promiseData || !wrapper->m_tracker) |
return; |
- PromiseTracker::PromiseDataMap* map = wrapper->m_promiseDataMap; |
+ PromiseTracker::PromiseDataMap& map = wrapper->m_tracker->promiseDataMap(); |
int promiseHash = promiseData->promiseHash(); |
- PromiseTracker::PromiseDataVector* vector = &map->find(promiseHash)->value; |
+ PromiseTracker::PromiseDataVector* vector = &map.find(promiseHash)->value; |
int index = indexOf(vector, promiseData->promise()); |
ASSERT(index >= 0); |
vector->remove(index); |
- if (vector->size() == 0) |
- map->remove(promiseHash); |
+ if (vector->isEmpty()) |
+ map.remove(promiseHash); |
} |
void trace(Visitor* visitor) |
{ |
#if ENABLE(OILPAN) |
visitor->trace(m_data); |
- visitor->trace(m_promiseDataMap); |
+ visitor->trace(m_tracker); |
#endif |
} |
private: |
- PromiseDataWrapper(WeakPtrWillBeRawPtr<PromiseTracker::PromiseData> data, PromiseTracker::PromiseDataMap* map) |
+ PromiseDataWrapper(WeakPtrWillBeRawPtr<PromiseTracker::PromiseData> data, PromiseTracker* tracker) |
: m_data(data) |
- , m_promiseDataMap(map) |
+ , m_tracker(tracker) |
{ |
} |
- WeakPtrWillBeMember<PromiseTracker::PromiseData> m_data; |
- RawPtrWillBeMember<PromiseTracker::PromiseDataMap> m_promiseDataMap; |
+ WeakPtrWillBeWeakMember<PromiseTracker::PromiseData> m_data; |
+ RawPtrWillBeWeakMember<PromiseTracker> m_tracker; |
}; |
} |
PromiseTracker::PromiseTracker() |
- : m_isEnabled(false) |
- , m_circularSequentialId(0) |
+ : m_circularSequentialId(0) |
+ , m_isEnabled(false) |
{ |
} |
-PromiseTracker::~PromiseTracker() |
-{ |
-} |
+DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(PromiseTracker); |
void PromiseTracker::trace(Visitor* visitor) |
{ |
@@ -170,16 +179,22 @@ PassRefPtrWillBeRawPtr<PromiseTracker::PromiseData> PromiseTracker::createPromis |
else |
vector = &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedValue->value; |
- RefPtrWillBeRawPtr<PromiseData> data = nullptr; |
int index = indexOf(vector, ScopedPersistent<v8::Object>(isolate, promise)); |
- if (index == -1) { |
- data = PromiseData::create(isolate, promiseHash, circularSequentialId(), promise); |
- OwnPtrWillBeRawPtr<PromiseDataWrapper> wrapper = PromiseDataWrapper::create(data.get(), &m_promiseDataMap); |
- data->m_promise.setWeak(wrapper.leakPtr(), &PromiseDataWrapper::didRemovePromise); |
- vector->append(data); |
- } else { |
- data = vector->at(index); |
- } |
+ if (index != -1) |
+ return vector->at(index); |
+ |
+ // FIXME: Consider using the ScriptState's DOMWrapperWorld instead |
+ // to handle the lifetime of PromiseDataWrapper, avoiding all this |
+ // manual labor to achieve the same, with and without Oilpan. |
+ RefPtrWillBeRawPtr<PromiseData> data = PromiseData::create(isolate, promiseHash, circularSequentialId(), promise); |
+ OwnPtrWillBeRawPtr<PromiseDataWrapper> dataWrapper = PromiseDataWrapper::create(data.get(), this); |
+#if ENABLE(OILPAN) |
+ OwnPtr<Persistent<PromiseDataWrapper> > wrapper = adoptPtr(new Persistent<PromiseDataWrapper>(dataWrapper)); |
+#else |
+ OwnPtr<PromiseDataWrapper> wrapper = dataWrapper.release(); |
+#endif |
+ data->m_promise.setWeak(wrapper.leakPtr(), &PromiseDataWrapper::didRemovePromise); |
+ vector->append(data); |
return data.release(); |
} |