| Index: Source/core/inspector/PromiseTracker.cpp
|
| diff --git a/Source/core/inspector/PromiseTracker.cpp b/Source/core/inspector/PromiseTracker.cpp
|
| index b7d9a1f7feffcdd7a703a5ac282b90665f7a4160..3787eda37caf4bbee8031b1464569f33ae202134 100644
|
| --- a/Source/core/inspector/PromiseTracker.cpp
|
| +++ b/Source/core/inspector/PromiseTracker.cpp
|
| @@ -27,7 +27,13 @@ public:
|
| int promiseHash() const { return m_promiseHash; }
|
| ScopedPersistent<v8::Object>& promise() { return m_promise; }
|
|
|
| -#if !ENABLE(OILPAN)
|
| +#if ENABLE(OILPAN)
|
| + void dispose()
|
| + {
|
| + m_promise.clear();
|
| + m_parentPromise.clear();
|
| + }
|
| +#else
|
| WeakPtr<PromiseData> createWeakPtr()
|
| {
|
| return m_weakPtrFactory.createWeakPtr();
|
| @@ -103,9 +109,23 @@ public:
|
| WeakPtrWillBeRawPtr<PromiseTracker::PromiseData> promiseData = wrapper->m_data;
|
| if (!promiseData || !wrapper->m_tracker)
|
| return;
|
| +
|
| +#if ENABLE(OILPAN)
|
| + // Oilpan: let go of ScopedPersistent<>s right here (and not wait until the
|
| + // PromiseDataWrapper is GCed later.) The v8 weak callback handling expects
|
| + // to see the callback data upon return.
|
| + promiseData->dispose();
|
| +#endif
|
| PromiseTracker::PromiseDataMap& map = wrapper->m_tracker->promiseDataMap();
|
| int promiseHash = promiseData->promiseHash();
|
| - PromiseTracker::PromiseDataVector* vector = &map.find(promiseHash)->value;
|
| +
|
| + PromiseTracker::PromiseDataMap::iterator it = map.find(promiseHash);
|
| + // The PromiseTracker may have been disabled (and, possibly, re-enabled later),
|
| + // leaving the promiseHash as unmapped.
|
| + if (it == map.end())
|
| + return;
|
| +
|
| + PromiseTracker::PromiseDataVector* vector = &it->value;
|
| int index = indexOf(vector, promiseData->promise());
|
| ASSERT(index >= 0);
|
| vector->remove(index);
|
|
|