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

Unified Diff: Source/core/inspector/PromiseTracker.cpp

Issue 561753002: Oilpan: fix PromiseTracker's handling of its persistent promise wrappers. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add FIXME on using DOMWrapperWorld to hold PromiseTrackerWrapper instances Created 6 years, 3 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/core/inspector/PromiseTracker.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
}
« no previous file with comments | « Source/core/inspector/PromiseTracker.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698