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

Side by Side Diff: Source/core/inspector/PromiseTracker.cpp

Issue 558673003: Oilpan: move PromiseTracker to the heap (fix build after r181646.) (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Non-oilpan compile fixes 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 unified diff | Download patch
« no previous file with comments | « Source/core/inspector/PromiseTracker.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/inspector/PromiseTracker.h" 6 #include "core/inspector/PromiseTracker.h"
7 7
8 #include "bindings/core/v8/ScopedPersistent.h" 8 #include "bindings/core/v8/ScopedPersistent.h"
9 #include "bindings/core/v8/ScriptCallStackFactory.h" 9 #include "bindings/core/v8/ScriptCallStackFactory.h"
10 #include "bindings/core/v8/ScriptState.h" 10 #include "bindings/core/v8/ScriptState.h"
11 #include "wtf/PassOwnPtr.h" 11 #include "wtf/PassOwnPtr.h"
12 #include "wtf/WeakPtr.h" 12 #include "wtf/WeakPtr.h"
13 13
14 using blink::TypeBuilder::Array; 14 using blink::TypeBuilder::Array;
15 using blink::TypeBuilder::Console::CallFrame; 15 using blink::TypeBuilder::Console::CallFrame;
16 using blink::TypeBuilder::Debugger::PromiseDetails; 16 using blink::TypeBuilder::Debugger::PromiseDetails;
17 17
18 namespace blink { 18 namespace blink {
19 19
20 class PromiseTracker::PromiseData : public RefCounted<PromiseData> { 20 class PromiseTracker::PromiseData FINAL : public RefCountedWillBeGarbageCollecte dFinalized<PromiseData> {
21 public: 21 public:
22 static PassRefPtrWillBeRawPtr<PromiseData> create(v8::Isolate* isolate, int promiseHash, int promiseId, v8::Handle<v8::Object> promise)
23 {
24 return adoptRefWillBeNoop(new PromiseData(isolate, promiseHash, promiseI d, promise));
25 }
26
27 int promiseHash() const { return m_promiseHash; }
28 ScopedPersistent<v8::Object>& promise() { return m_promise; }
29
30 void trace(Visitor* visitor)
31 {
32 visitor->trace(m_callStack);
33 }
34
35 WeakPtrWillBeRawPtr<PromiseData> createWeakPtr()
36 {
37 #if ENABLE(OILPAN)
38 return this;
39 #else
40 return m_weakPtrFactory.createWeakPtr();
41 #endif
42 }
43
44 private:
45 friend class PromiseTracker;
46
22 PromiseData(v8::Isolate* isolate, int promiseHash, int promiseId, v8::Handle <v8::Object> promise) 47 PromiseData(v8::Isolate* isolate, int promiseHash, int promiseId, v8::Handle <v8::Object> promise)
23 : m_promiseHash(promiseHash) 48 : m_promiseHash(promiseHash)
24 , m_promiseId(promiseId) 49 , m_promiseId(promiseId)
25 , m_promise(isolate, promise) 50 , m_promise(isolate, promise)
26 , m_parentPromiseId(0) 51 , m_parentPromiseId(0)
27 , m_status(0) 52 , m_status(0)
53 #if !ENABLE(OILPAN)
28 , m_weakPtrFactory(this) 54 , m_weakPtrFactory(this)
55 #endif
29 { 56 {
30 } 57 }
31 58
32 int promiseHash() const { return m_promiseHash; }
33 ScopedPersistent<v8::Object>& promise() { return m_promise; }
34
35 private:
36 friend class PromiseTracker;
37
38 int m_promiseHash; 59 int m_promiseHash;
39 int m_promiseId; 60 int m_promiseId;
40 ScopedPersistent<v8::Object> m_promise; 61 ScopedPersistent<v8::Object> m_promise;
41 int m_parentPromiseId; 62 int m_parentPromiseId;
42 int m_status; 63 int m_status;
64 RefPtrWillBeMember<ScriptCallStack> m_callStack;
65 ScopedPersistent<v8::Object> m_parentPromise;
66 #if !ENABLE(OILPAN)
43 WeakPtrFactory<PromiseData> m_weakPtrFactory; 67 WeakPtrFactory<PromiseData> m_weakPtrFactory;
44 RefPtr<ScriptCallStack> m_callStack; 68 #endif
45 ScopedPersistent<v8::Object> m_parentPromise;
46 }; 69 };
47 70
48 static int indexOf(PromiseTracker::PromiseDataVector* vector, const ScopedPersis tent<v8::Object>& promise) 71 static int indexOf(PromiseTracker::PromiseDataVector* vector, const ScopedPersis tent<v8::Object>& promise)
49 { 72 {
50 for (size_t index = 0; index < vector->size(); ++index) { 73 for (size_t index = 0; index < vector->size(); ++index) {
51 if (vector->at(index)->promise() == promise) 74 if (vector->at(index)->promise() == promise)
52 return index; 75 return index;
53 } 76 }
54 return -1; 77 return -1;
55 } 78 }
56 79
57 namespace { 80 namespace {
58 81
59 class PromiseDataWrapper { 82 class PromiseDataWrapper FINAL : public NoBaseWillBeGarbageCollected<PromiseData Wrapper> {
60 public: 83 public:
61 PromiseDataWrapper(WeakPtr<PromiseTracker::PromiseData> data, PromiseTracker ::PromiseDataMap* map) 84 static PassOwnPtrWillBeRawPtr<PromiseDataWrapper> create(PromiseTracker::Pro miseData* data, PromiseTracker::PromiseDataMap* map)
62 : m_data(data)
63 , m_promiseDataMap(map)
64 { 85 {
86 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.
65 } 87 }
66 88
67 static void didRemovePromise(const v8::WeakCallbackData<v8::Object, PromiseD ataWrapper>& data) 89 static void didRemovePromise(const v8::WeakCallbackData<v8::Object, PromiseD ataWrapper>& data)
68 { 90 {
69 OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(data.GetParameter()); 91 OwnPtrWillBeRawPtr<PromiseDataWrapper> wrapper = adoptPtrWillBeNoop(data .GetParameter());
70 WeakPtr<PromiseTracker::PromiseData> promiseData = wrapper->m_data; 92 WeakPtrWillBeRawPtr<PromiseTracker::PromiseData> promiseData = wrapper-> m_data;
71 if (!promiseData) 93 if (!promiseData)
72 return; 94 return;
73 PromiseTracker::PromiseDataMap* map = wrapper->m_promiseDataMap; 95 PromiseTracker::PromiseDataMap* map = wrapper->m_promiseDataMap;
74 int promiseHash = promiseData->promiseHash(); 96 int promiseHash = promiseData->promiseHash();
75 PromiseTracker::PromiseDataVector* vector = &map->find(promiseHash)->val ue; 97 PromiseTracker::PromiseDataVector* vector = &map->find(promiseHash)->val ue;
76 int index = indexOf(vector, promiseData->promise()); 98 int index = indexOf(vector, promiseData->promise());
77 ASSERT(index >= 0); 99 ASSERT(index >= 0);
78 vector->remove(index); 100 vector->remove(index);
79 if (vector->size() == 0) 101 if (vector->size() == 0)
80 map->remove(promiseHash); 102 map->remove(promiseHash);
81 } 103 }
82 104
105 void trace(Visitor* visitor)
106 {
107 #if ENABLE(OILPAN)
108 visitor->trace(m_data);
109 visitor->trace(m_promiseDataMap);
110 #endif
111 }
112
83 private: 113 private:
84 WeakPtr<PromiseTracker::PromiseData> m_data; 114 PromiseDataWrapper(WeakPtrWillBeRawPtr<PromiseTracker::PromiseData> data, Pr omiseTracker::PromiseDataMap* map)
85 PromiseTracker::PromiseDataMap* m_promiseDataMap; 115 : m_data(data)
116 , m_promiseDataMap(map)
117 {
118 }
119
120 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
121 RawPtrWillBeMember<PromiseTracker::PromiseDataMap> m_promiseDataMap;
86 }; 122 };
87 123
88 } 124 }
89 125
90 PromiseTracker::PromiseTracker() 126 PromiseTracker::PromiseTracker()
91 : m_isEnabled(false) 127 : m_isEnabled(false)
92 , m_circularSequentialId(0) 128 , m_circularSequentialId(0)
93 { 129 {
94 } 130 }
95 131
96 PromiseTracker::~PromiseTracker() 132 PromiseTracker::~PromiseTracker()
97 { 133 {
98 } 134 }
99 135
136 void PromiseTracker::trace(Visitor* visitor)
137 {
138 #if ENABLE(OILPAN)
139 visitor->trace(m_promiseDataMap);
140 #endif
141 }
142
100 void PromiseTracker::setEnabled(bool enabled) 143 void PromiseTracker::setEnabled(bool enabled)
101 { 144 {
102 m_isEnabled = enabled; 145 m_isEnabled = enabled;
103 if (!enabled) 146 if (!enabled)
104 clear(); 147 clear();
105 } 148 }
106 149
107 void PromiseTracker::clear() 150 void PromiseTracker::clear()
108 { 151 {
109 m_promiseDataMap.clear(); 152 m_promiseDataMap.clear();
110 } 153 }
111 154
112 int PromiseTracker::circularSequentialId() 155 int PromiseTracker::circularSequentialId()
113 { 156 {
114 ++m_circularSequentialId; 157 ++m_circularSequentialId;
115 if (m_circularSequentialId <= 0) 158 if (m_circularSequentialId <= 0)
116 m_circularSequentialId = 1; 159 m_circularSequentialId = 1;
117 return m_circularSequentialId; 160 return m_circularSequentialId;
118 } 161 }
119 162
120 PassRefPtr<PromiseTracker::PromiseData> PromiseTracker::createPromiseDataIfNeede d(v8::Isolate* isolate, v8::Handle<v8::Object> promise) 163 PassRefPtrWillBeRawPtr<PromiseTracker::PromiseData> PromiseTracker::createPromis eDataIfNeeded(v8::Isolate* isolate, v8::Handle<v8::Object> promise)
121 { 164 {
122 int promiseHash = promise->GetIdentityHash(); 165 int promiseHash = promise->GetIdentityHash();
123 PromiseDataVector* vector; 166 RawPtr<PromiseDataVector> vector = nullptr;
haraken 2014/09/10 01:41:23 PromiseDataVector* ? It looks a bit strange that
124 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash); 167 PromiseDataMap::iterator it = m_promiseDataMap.find(promiseHash);
125 if (it != m_promiseDataMap.end()) 168 if (it != m_promiseDataMap.end())
126 vector = &it->value; 169 vector = &it->value;
127 else 170 else
128 vector = &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedV alue->value; 171 vector = &m_promiseDataMap.add(promiseHash, PromiseDataVector()).storedV alue->value;
129 172
130 RefPtr<PromiseData> data; 173 RefPtrWillBeRawPtr<PromiseData> data = nullptr;
131 int index = indexOf(vector, ScopedPersistent<v8::Object>(isolate, promise)); 174 int index = indexOf(vector, ScopedPersistent<v8::Object>(isolate, promise));
132 if (index == -1) { 175 if (index == -1) {
133 data = adoptRef(new PromiseData(isolate, promiseHash, circularSequential Id(), promise)); 176 data = PromiseData::create(isolate, promiseHash, circularSequentialId(), promise);
134 OwnPtr<PromiseDataWrapper> wrapper = adoptPtr(new PromiseDataWrapper(dat a->m_weakPtrFactory.createWeakPtr(), &m_promiseDataMap)); 177 OwnPtrWillBeRawPtr<PromiseDataWrapper> wrapper = PromiseDataWrapper::cre ate(data.get(), &m_promiseDataMap);
135 data->m_promise.setWeak(wrapper.leakPtr(), &PromiseDataWrapper::didRemov ePromise); 178 data->m_promise.setWeak(wrapper.leakPtr(), &PromiseDataWrapper::didRemov ePromise);
136 vector->append(data); 179 vector->append(data);
137 } else { 180 } else {
138 data = vector->at(index); 181 data = vector->at(index);
139 } 182 }
140 183
141 return data.release(); 184 return data.release();
142 } 185 }
143 186
144 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status) 187 void PromiseTracker::didReceiveV8PromiseEvent(ScriptState* scriptState, v8::Hand le<v8::Object> promise, v8::Handle<v8::Value> parentPromise, int status)
145 { 188 {
146 ASSERT(isEnabled()); 189 ASSERT(isEnabled());
147 190
148 v8::Isolate* isolate = scriptState->isolate(); 191 v8::Isolate* isolate = scriptState->isolate();
149 RefPtr<PromiseData> data = createPromiseDataIfNeeded(isolate, promise); 192 RefPtrWillBeRawPtr<PromiseData> data = createPromiseDataIfNeeded(isolate, pr omise);
150 if (!parentPromise.IsEmpty() && parentPromise->IsObject()) { 193 if (!parentPromise.IsEmpty() && parentPromise->IsObject()) {
151 v8::Handle<v8::Object> handle = parentPromise->ToObject(); 194 v8::Handle<v8::Object> handle = parentPromise->ToObject();
152 RefPtr<PromiseData> parentData = createPromiseDataIfNeeded(isolate, hand le); 195 RefPtrWillBeRawPtr<PromiseData> parentData = createPromiseDataIfNeeded(i solate, handle);
153 data->m_parentPromiseId = parentData->m_promiseId; 196 data->m_parentPromiseId = parentData->m_promiseId;
154 data->m_parentPromise.set(isolate, handle); 197 data->m_parentPromise.set(isolate, handle);
155 } else { 198 } else {
156 data->m_status = status; 199 data->m_status = status;
157 if (!status && !data->m_callStack) { 200 if (!status && !data->m_callStack) {
158 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTr ace(isolate, 1)); 201 v8::Handle<v8::StackTrace> stackTrace(v8::StackTrace::CurrentStackTr ace(isolate, 1));
159 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(st ackTrace, 1, isolate); 202 RefPtrWillBeRawPtr<ScriptCallStack> stack = createScriptCallStack(st ackTrace, 1, isolate);
160 if (stack->size()) 203 if (stack->size())
161 data->m_callStack = stack; 204 data->m_callStack = stack;
162 } 205 }
163 } 206 }
164 } 207 }
165 208
166 PassRefPtr<Array<PromiseDetails> > PromiseTracker::promises() 209 PassRefPtr<Array<PromiseDetails> > PromiseTracker::promises()
167 { 210 {
168 ASSERT(isEnabled()); 211 ASSERT(isEnabled());
169 212
170 RefPtr<Array<PromiseDetails> > result = Array<PromiseDetails>::create(); 213 RefPtr<Array<PromiseDetails> > result = Array<PromiseDetails>::create();
171 for (PromiseDataMap::iterator it = m_promiseDataMap.begin(); it != m_promise DataMap.end(); ++it) { 214 for (PromiseDataMap::iterator it = m_promiseDataMap.begin(); it != m_promise DataMap.end(); ++it) {
172 PromiseDataVector* vector = &it->value; 215 PromiseDataVector* vector = &it->value;
173 for (size_t index = 0; index < vector->size(); ++index) { 216 for (size_t index = 0; index < vector->size(); ++index) {
174 RefPtr<PromiseData> data = vector->at(index); 217 RefPtrWillBeRawPtr<PromiseData> data = vector->at(index);
175 PromiseDetails::Status::Enum status; 218 PromiseDetails::Status::Enum status;
176 if (!data->m_status) 219 if (!data->m_status)
177 status = PromiseDetails::Status::Pending; 220 status = PromiseDetails::Status::Pending;
178 else if (data->m_status == 1) 221 else if (data->m_status == 1)
179 status = PromiseDetails::Status::Resolved; 222 status = PromiseDetails::Status::Resolved;
180 else 223 else
181 status = PromiseDetails::Status::Rejected; 224 status = PromiseDetails::Status::Rejected;
182 RefPtr<PromiseDetails> promiseDetails = PromiseDetails::create() 225 RefPtr<PromiseDetails> promiseDetails = PromiseDetails::create()
183 .setId(data->m_promiseId) 226 .setId(data->m_promiseId)
184 .setStatus(status); 227 .setStatus(status);
185 if (data->m_parentPromiseId) 228 if (data->m_parentPromiseId)
186 promiseDetails->setParentId(data->m_parentPromiseId); 229 promiseDetails->setParentId(data->m_parentPromiseId);
187 if (data->m_callStack) 230 if (data->m_callStack)
188 promiseDetails->setCallFrame(data->m_callStack->at(0).buildInspe ctorObject()); 231 promiseDetails->setCallFrame(data->m_callStack->at(0).buildInspe ctorObject());
189 result->addItem(promiseDetails); 232 result->addItem(promiseDetails);
190 } 233 }
191 } 234 }
192 235
193 return result.release(); 236 return result.release();
194 } 237 }
195 238
196 } // namespace blink 239 } // namespace blink
OLDNEW
« 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