Chromium Code Reviews| Index: Source/core/inspector/PromiseTracker.cpp |
| diff --git a/Source/core/inspector/PromiseTracker.cpp b/Source/core/inspector/PromiseTracker.cpp |
| index d549b95260e38c2e754f893a5076c1c7729f5646..309710b1ac5ec60bbc48722b41b84361adfb51a8 100644 |
| --- a/Source/core/inspector/PromiseTracker.cpp |
| +++ b/Source/core/inspector/PromiseTracker.cpp |
| @@ -17,32 +17,55 @@ using blink::TypeBuilder::Debugger::PromiseDetails; |
| namespace blink { |
| -class PromiseTracker::PromiseData : public RefCounted<PromiseData> { |
| +class PromiseTracker::PromiseData FINAL : public RefCountedWillBeGarbageCollectedFinalized<PromiseData> { |
| public: |
| + static PassRefPtrWillBeRawPtr<PromiseData> create(v8::Isolate* isolate, int promiseHash, int promiseId, v8::Handle<v8::Object> promise) |
| + { |
| + return adoptRefWillBeNoop(new PromiseData(isolate, promiseHash, promiseId, promise)); |
| + } |
| + |
| + int promiseHash() const { return m_promiseHash; } |
| + ScopedPersistent<v8::Object>& promise() { return m_promise; } |
| + |
| + void trace(Visitor* visitor) |
| + { |
| + visitor->trace(m_callStack); |
| + } |
| + |
| + WeakPtrWillBeRawPtr<PromiseData> createWeakPtr() |
| + { |
| +#if ENABLE(OILPAN) |
| + return this; |
| +#else |
| + return m_weakPtrFactory.createWeakPtr(); |
| +#endif |
| + } |
| + |
| +private: |
| + friend class PromiseTracker; |
| + |
| PromiseData(v8::Isolate* isolate, int promiseHash, int promiseId, v8::Handle<v8::Object> promise) |
| : m_promiseHash(promiseHash) |
| , m_promiseId(promiseId) |
| , m_promise(isolate, promise) |
| , m_parentPromiseId(0) |
| , m_status(0) |
| +#if !ENABLE(OILPAN) |
| , m_weakPtrFactory(this) |
| +#endif |
| { |
| } |
| - int promiseHash() const { return m_promiseHash; } |
| - ScopedPersistent<v8::Object>& promise() { return m_promise; } |
| - |
| -private: |
| - friend class PromiseTracker; |
| - |
| int m_promiseHash; |
| int m_promiseId; |
| ScopedPersistent<v8::Object> m_promise; |
| int m_parentPromiseId; |
| int m_status; |
| - WeakPtrFactory<PromiseData> m_weakPtrFactory; |
| - RefPtr<ScriptCallStack> m_callStack; |
| + RefPtrWillBeMember<ScriptCallStack> m_callStack; |
| ScopedPersistent<v8::Object> m_parentPromise; |
| +#if !ENABLE(OILPAN) |
| + WeakPtrFactory<PromiseData> m_weakPtrFactory; |
| +#endif |
| }; |
| static int indexOf(PromiseTracker::PromiseDataVector* vector, const ScopedPersistent<v8::Object>& promise) |
| @@ -56,18 +79,17 @@ static int indexOf(PromiseTracker::PromiseDataVector* vector, const ScopedPersis |
| namespace { |
| -class PromiseDataWrapper { |
| +class PromiseDataWrapper FINAL : public NoBaseWillBeGarbageCollected<PromiseDataWrapper> { |
| public: |
| - PromiseDataWrapper(WeakPtr<PromiseTracker::PromiseData> data, PromiseTracker::PromiseDataMap* map) |
| - : m_data(data) |
| - , m_promiseDataMap(map) |
| + static PassOwnPtrWillBeRawPtr<PromiseDataWrapper> create(PromiseTracker::PromiseData* data, PromiseTracker::PromiseDataMap* map) |
| { |
| + return adoptPtrWillBeNoop(new PromiseDataWrapper(data->createWeakPtr(), map)); |
|
haraken
2014/09/10 01:41:23
I'd write:
#if ENABLE(OILPAN)
return adoptPtrWill
sof
2014/09/10 13:40:34
Let's do that.
|
| } |
| static void didRemovePromise(const v8::WeakCallbackData<v8::Object, PromiseDataWrapper>& data) |
| { |
| - OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(data.GetParameter()); |
| - WeakPtr<PromiseTracker::PromiseData> promiseData = wrapper->m_data; |
| + OwnPtrWillBeRawPtr<PromiseDataWrapper> wrapper = adoptPtrWillBeNoop(data.GetParameter()); |
| + WeakPtrWillBeRawPtr<PromiseTracker::PromiseData> promiseData = wrapper->m_data; |
| if (!promiseData) |
| return; |
| PromiseTracker::PromiseDataMap* map = wrapper->m_promiseDataMap; |
| @@ -80,9 +102,23 @@ public: |
| map->remove(promiseHash); |
| } |
| + void trace(Visitor* visitor) |
| + { |
| +#if ENABLE(OILPAN) |
| + visitor->trace(m_data); |
| + visitor->trace(m_promiseDataMap); |
| +#endif |
| + } |
| + |
| private: |
| - WeakPtr<PromiseTracker::PromiseData> m_data; |
| - PromiseTracker::PromiseDataMap* m_promiseDataMap; |
| + PromiseDataWrapper(WeakPtrWillBeRawPtr<PromiseTracker::PromiseData> data, PromiseTracker::PromiseDataMap* map) |
| + : m_data(data) |
| + , m_promiseDataMap(map) |
| + { |
| + } |
| + |
| + WeakPtrWillBeMember<PromiseTracker::PromiseData> m_data; |
|
haraken
2014/09/10 01:41:23
Just to confirm: Is this WeakPtr just used to brea
sof
2014/09/10 13:40:34
As far as I understand the use, the unfulfilled pr
|
| + RawPtrWillBeMember<PromiseTracker::PromiseDataMap> m_promiseDataMap; |
| }; |
| } |
| @@ -97,6 +133,13 @@ PromiseTracker::~PromiseTracker() |
| { |
| } |
| +void PromiseTracker::trace(Visitor* visitor) |
| +{ |
| +#if ENABLE(OILPAN) |
| + visitor->trace(m_promiseDataMap); |
| +#endif |
| +} |
| + |
| void PromiseTracker::setEnabled(bool enabled) |
| { |
| m_isEnabled = enabled; |
| @@ -117,21 +160,21 @@ int PromiseTracker::circularSequentialId() |
| return m_circularSequentialId; |
| } |
| -PassRefPtr<PromiseTracker::PromiseData> PromiseTracker::createPromiseDataIfNeeded(v8::Isolate* isolate, v8::Handle<v8::Object> promise) |
| +PassRefPtrWillBeRawPtr<PromiseTracker::PromiseData> PromiseTracker::createPromiseDataIfNeeded(v8::Isolate* isolate, v8::Handle<v8::Object> promise) |
| { |
| int promiseHash = promise->GetIdentityHash(); |
| - PromiseDataVector* vector; |
| + RawPtr<PromiseDataVector> vector = nullptr; |
|
haraken
2014/09/10 01:41:23
PromiseDataVector* ?
It looks a bit strange that
|
| PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash); |
| if (it != m_promiseDataMap.end()) |
| vector = &it->value; |
| else |
| vector = &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedValue->value; |
| - RefPtr<PromiseData> data; |
| + RefPtrWillBeRawPtr<PromiseData> data = nullptr; |
| int index = indexOf(vector, ScopedPersistent<v8::Object>(isolate, promise)); |
| if (index == -1) { |
| - data = adoptRef(new PromiseData(isolate, promiseHash, circularSequentialId(), promise)); |
| - OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(new PromiseDataWrapper(data->m_weakPtrFactory.createWeakPtr(), &m_promiseDataMap)); |
| + 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 { |
| @@ -146,10 +189,10 @@ void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand |
| ASSERT(isEnabled()); |
| v8::Isolate* isolate = scriptState->isolate(); |
| - RefPtr<PromiseData> data = createPromiseDataIfNeeded(isolate, promise); |
| + RefPtrWillBeRawPtr<PromiseData> data = createPromiseDataIfNeeded(isolate, promise); |
| if (!parentPromise.IsEmpty() && parentPromise->IsObject()) { |
| v8::Handle<v8::Object> handle = parentPromise->ToObject(); |
| - RefPtr<PromiseData> parentData = createPromiseDataIfNeeded(isolate, handle); |
| + RefPtrWillBeRawPtr<PromiseData> parentData = createPromiseDataIfNeeded(isolate, handle); |
| data->m_parentPromiseId = parentData->m_promiseId; |
| data->m_parentPromise.set(isolate, handle); |
| } else { |
| @@ -171,7 +214,7 @@ PassRefPtr<Array<PromiseDetails> > PromiseTracker::promises() |
| for (PromiseDataMap::iterator it = m_promiseDataMap.begin(); it != m_promiseDataMap.end(); ++it) { |
| PromiseDataVector* vector = &it->value; |
| for (size_t index = 0; index < vector->size(); ++index) { |
| - RefPtr<PromiseData> data = vector->at(index); |
| + RefPtrWillBeRawPtr<PromiseData> data = vector->at(index); |
| PromiseDetails::Status::Enum status; |
| if (!data->m_status) |
| status = PromiseDetails::Status::Pending; |