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

Side by Side Diff: src/runtime/runtime-promise.cc

Issue 2578923002: [inspector] async stacks for Promise.then calls... (Closed)
Patch Set: async-stacks Created 3 years, 11 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
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project 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 #include "src/runtime/runtime-utils.h" 4 #include "src/runtime/runtime-utils.h"
5 5
6 #include "src/debug/debug.h" 6 #include "src/debug/debug.h"
7 #include "src/elements.h" 7 #include "src/elements.h"
8 #include "src/promise-utils.h" 8 #include "src/promise-utils.h"
9 9
10 namespace v8 { 10 namespace v8 {
(...skipping 25 matching lines...) Expand all
36 HandleScope scope(isolate); 36 HandleScope scope(isolate);
37 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); 37 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
38 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); 38 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
39 39
40 Handle<Object> rejected_promise = promise; 40 Handle<Object> rejected_promise = promise;
41 if (isolate->debug()->is_active()) { 41 if (isolate->debug()->is_active()) {
42 // If the Promise.reject call is caught, then this will return 42 // If the Promise.reject call is caught, then this will return
43 // undefined, which will be interpreted by PromiseRejectEvent 43 // undefined, which will be interpreted by PromiseRejectEvent
44 // as being a caught exception event. 44 // as being a caught exception event.
45 rejected_promise = isolate->GetPromiseOnStackOnThrow(); 45 rejected_promise = isolate->GetPromiseOnStackOnThrow();
46 isolate->debug()->OnAsyncTaskEvent(
47 debug::kDebugEnqueueRecurring,
48 isolate->debug()->NextAsyncTaskId(promise), kDebugPromiseReject);
46 } 49 }
47 PromiseRejectEvent(isolate, promise, rejected_promise, value, true); 50 PromiseRejectEvent(isolate, promise, rejected_promise, value, true);
48 return isolate->heap()->undefined_value(); 51 return isolate->heap()->undefined_value();
49 } 52 }
50 53
51 RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) { 54 RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) {
52 DCHECK_EQ(1, args.length()); 55 DCHECK_EQ(1, args.length());
53 HandleScope scope(isolate); 56 HandleScope scope(isolate);
54 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); 57 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
55 // At this point, no revocation has been issued before 58 // At this point, no revocation has been issued before
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 103
101 // id can be Undefined or Smi. 104 // id can be Undefined or Smi.
102 if (!id->IsSmi()) { 105 if (!id->IsSmi()) {
103 return false; 106 return false;
104 } 107 }
105 108
106 *debug_id = Handle<Smi>::cast(id)->value(); 109 *debug_id = Handle<Smi>::cast(id)->value();
107 return true; 110 return true;
108 } 111 }
109 112
110 void SetDebugInfo(Isolate* isolate, Handle<PromiseReactionJobInfo> info, 113 void SetDebugInfo(Isolate* isolate, Handle<PromiseReactionJobInfo> info,
gsathya 2017/01/09 19:24:35 info->promise() == promise right? can we just reus
kozy 2017/01/10 00:11:38 Done.
111 int status) { 114 Handle<JSPromise> promise, int status) {
112 int id; 115 int id;
113 PromiseDebugActionName name; 116 PromiseDebugActionName name;
114 117
115 if (GetDebugIdForAsyncFunction(isolate, info, &id)) { 118 if (GetDebugIdForAsyncFunction(isolate, info, &id)) {
116 name = kDebugAsyncFunction; 119 name = kDebugAsyncFunction;
117 } else { 120 } else {
118 id = isolate->GetNextDebugMicrotaskId(); 121 id = isolate->debug()->NextAsyncTaskId(promise);
119
120 DCHECK(status != v8::Promise::kPending); 122 DCHECK(status != v8::Promise::kPending);
121 name = status == v8::Promise::kFulfilled ? kDebugPromiseResolve 123 name = status == v8::Promise::kFulfilled ? kDebugPromiseResolve
122 : kDebugPromiseReject; 124 : kDebugPromiseReject;
123
124 isolate->debug()->OnAsyncTaskEvent(kDebugEnqueue, id, name);
125 } 125 }
126 126
127 info->set_debug_id(id); 127 info->set_debug_id(id);
128 info->set_debug_name(name); 128 info->set_debug_name(name);
129 } 129 }
130 130
131 void EnqueuePromiseReactionJob(Isolate* isolate, 131 void EnqueuePromiseReactionJob(Isolate* isolate,
132 Handle<PromiseReactionJobInfo> info, 132 Handle<PromiseReactionJobInfo> info,
133 int status) { 133 Handle<JSPromise> promise, int status) {
134 if (isolate->debug()->is_active()) { 134 if (isolate->debug()->is_active()) {
135 SetDebugInfo(isolate, info, status); 135 SetDebugInfo(isolate, info, promise, status);
136 } 136 }
137 137
138 isolate->EnqueueMicrotask(info); 138 isolate->EnqueueMicrotask(info);
139 } 139 }
140 140
141 void PromiseSet(Isolate* isolate, Handle<JSPromise> promise, int status, 141 void PromiseSet(Isolate* isolate, Handle<JSPromise> promise, int status,
142 Handle<Object> result) { 142 Handle<Object> result) {
143 promise->set_status(status); 143 promise->set_status(status);
144 promise->set_result(*result); 144 promise->set_result(*result);
145 promise->set_deferred_promise(isolate->heap()->undefined_value()); 145 promise->set_deferred_promise(isolate->heap()->undefined_value());
146 promise->set_deferred_on_resolve(isolate->heap()->undefined_value()); 146 promise->set_deferred_on_resolve(isolate->heap()->undefined_value());
147 promise->set_deferred_on_reject(isolate->heap()->undefined_value()); 147 promise->set_deferred_on_reject(isolate->heap()->undefined_value());
148 promise->set_fulfill_reactions(isolate->heap()->undefined_value()); 148 promise->set_fulfill_reactions(isolate->heap()->undefined_value());
149 promise->set_reject_reactions(isolate->heap()->undefined_value()); 149 promise->set_reject_reactions(isolate->heap()->undefined_value());
150 } 150 }
151 151
152 void PromiseFulfill(Isolate* isolate, Handle<JSPromise> promise, int status, 152 void PromiseFulfill(Isolate* isolate, Handle<JSPromise> promise, int status,
153 Handle<Object> value) { 153 Handle<Object> value) {
154 if (isolate->debug()->is_active()) {
155 isolate->debug()->OnAsyncTaskEvent(
156 debug::kDebugEnqueueRecurring,
157 isolate->debug()->NextAsyncTaskId(promise),
158 status == v8::Promise::kFulfilled ? kDebugPromiseResolve
159 : kDebugPromiseReject);
160 }
154 // Check if there are any callbacks. 161 // Check if there are any callbacks.
155 if (!promise->deferred_promise()->IsUndefined(isolate)) { 162 if (!promise->deferred_promise()->IsUndefined(isolate)) {
156 Handle<Object> tasks((status == v8::Promise::kFulfilled) 163 Handle<Object> tasks((status == v8::Promise::kFulfilled)
157 ? promise->fulfill_reactions() 164 ? promise->fulfill_reactions()
158 : promise->reject_reactions(), 165 : promise->reject_reactions(),
159 isolate); 166 isolate);
160 Handle<PromiseReactionJobInfo> info = 167 Handle<PromiseReactionJobInfo> info =
161 isolate->factory()->NewPromiseReactionJobInfo( 168 isolate->factory()->NewPromiseReactionJobInfo(
162 promise, value, tasks, handle(promise->deferred_promise(), isolate), 169 promise, value, tasks, handle(promise->deferred_promise(), isolate),
163 handle(promise->deferred_on_resolve(), isolate), 170 handle(promise->deferred_on_resolve(), isolate),
164 handle(promise->deferred_on_reject(), isolate), 171 handle(promise->deferred_on_reject(), isolate),
165 isolate->native_context()); 172 isolate->native_context());
166 EnqueuePromiseReactionJob(isolate, info, status); 173 EnqueuePromiseReactionJob(isolate, info, promise, status);
167 } 174 }
168 175
169 PromiseSet(isolate, promise, status, value); 176 PromiseSet(isolate, promise, status, value);
170 } 177 }
171 178
172 } // namespace 179 } // namespace
173 180
174 RUNTIME_FUNCTION(Runtime_PromiseReject) { 181 RUNTIME_FUNCTION(Runtime_PromiseReject) {
175 DCHECK_EQ(3, args.length()); 182 DCHECK_EQ(3, args.length());
176 HandleScope scope(isolate); 183 HandleScope scope(isolate);
177 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); 184 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
178 CONVERT_ARG_HANDLE_CHECKED(Object, reason, 1); 185 CONVERT_ARG_HANDLE_CHECKED(Object, reason, 1);
179 CONVERT_BOOLEAN_ARG_CHECKED(debug_event, 2); 186 CONVERT_BOOLEAN_ARG_CHECKED(debug_event, 2);
180 187
181 PromiseRejectEvent(isolate, promise, promise, reason, debug_event); 188 PromiseRejectEvent(isolate, promise, promise, reason, debug_event);
182 PromiseFulfill(isolate, promise, v8::Promise::kRejected, reason); 189 PromiseFulfill(isolate, promise, v8::Promise::kRejected, reason);
183 190
184 return isolate->heap()->undefined_value(); 191 return isolate->heap()->undefined_value();
185 } 192 }
186 193
187 RUNTIME_FUNCTION(Runtime_EnqueuePromiseReactionJob) { 194 RUNTIME_FUNCTION(Runtime_EnqueuePromiseReactionJob) {
188 HandleScope scope(isolate); 195 HandleScope scope(isolate);
189 DCHECK_EQ(2, args.length()); 196 DCHECK_EQ(3, args.length());
190 CONVERT_ARG_HANDLE_CHECKED(PromiseReactionJobInfo, info, 0); 197 CONVERT_ARG_HANDLE_CHECKED(PromiseReactionJobInfo, info, 0);
191 CONVERT_SMI_ARG_CHECKED(status, 1); 198 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 1);
192 EnqueuePromiseReactionJob(isolate, info, status); 199 CONVERT_SMI_ARG_CHECKED(status, 2);
200 EnqueuePromiseReactionJob(isolate, info, promise, status);
193 return isolate->heap()->undefined_value(); 201 return isolate->heap()->undefined_value();
194 } 202 }
195 203
196 RUNTIME_FUNCTION(Runtime_EnqueuePromiseResolveThenableJob) { 204 RUNTIME_FUNCTION(Runtime_EnqueuePromiseResolveThenableJob) {
197 HandleScope scope(isolate); 205 HandleScope scope(isolate);
198 DCHECK(args.length() == 1); 206 DCHECK(args.length() == 1);
199 CONVERT_ARG_HANDLE_CHECKED(PromiseResolveThenableJobInfo, info, 0); 207 CONVERT_ARG_HANDLE_CHECKED(PromiseResolveThenableJobInfo, info, 0);
200 isolate->EnqueueMicrotask(info); 208 isolate->EnqueueMicrotask(info);
201 return isolate->heap()->undefined_value(); 209 return isolate->heap()->undefined_value();
202 } 210 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 HandleScope scope(isolate); 288 HandleScope scope(isolate);
281 DCHECK_EQ(1, args.length()); 289 DCHECK_EQ(1, args.length());
282 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); 290 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
283 isolate->RunPromiseHook(PromiseHookType::kAfter, promise, 291 isolate->RunPromiseHook(PromiseHookType::kAfter, promise,
284 isolate->factory()->undefined_value()); 292 isolate->factory()->undefined_value());
285 return isolate->heap()->undefined_value(); 293 return isolate->heap()->undefined_value();
286 } 294 }
287 295
288 } // namespace internal 296 } // namespace internal
289 } // namespace v8 297 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698