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

Side by Side Diff: src/js/promise.js

Issue 2415023002: [promises] Move async debug event creation to c++ (Closed)
Patch Set: rebase Created 4 years, 2 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 | « src/js/async-await.js ('k') | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 4
5 (function(global, utils, extrasUtils) { 5 (function(global, utils, extrasUtils) {
6 6
7 "use strict"; 7 "use strict";
8 8
9 %CheckIsBootstrapping(); 9 %CheckIsBootstrapping();
10 10
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 } else { 178 } else {
179 %_Call(deferred.reject, UNDEFINED, exception); 179 %_Call(deferred.reject, UNDEFINED, exception);
180 } 180 }
181 } catch (e) { } 181 } catch (e) { }
182 } finally { 182 } finally {
183 if (debug_is_active) %DebugPopPromise(); 183 if (debug_is_active) %DebugPopPromise();
184 } 184 }
185 } 185 }
186 186
187 function PromiseEnqueue(value, tasks, deferreds, status) { 187 function PromiseEnqueue(value, tasks, deferreds, status) {
188 var id, name, beforeDebug, afterDebug, instrumenting = DEBUG_IS_ACTIVE; 188 var id, name, instrumenting = DEBUG_IS_ACTIVE;
189 189
190 if (instrumenting) { 190 if (instrumenting) {
191 // In an async function, reuse the existing stack related to the outer 191 // In an async function, reuse the existing stack related to the outer
192 // Promise. Otherwise, e.g. in a direct call to then, save a new stack. 192 // Promise. Otherwise, e.g. in a direct call to then, save a new stack.
193 // Promises with multiple reactions with one or more of them being async 193 // Promises with multiple reactions with one or more of them being async
194 // functions will not get a good stack trace, as async functions require 194 // functions will not get a good stack trace, as async functions require
195 // different stacks from direct Promise use, but we save and restore a 195 // different stacks from direct Promise use, but we save and restore a
196 // stack once for all reactions. TODO(littledan): Improve this case. 196 // stack once for all reactions. TODO(littledan): Improve this case.
197 if (!IS_UNDEFINED(deferreds) && 197 if (!IS_UNDEFINED(deferreds) &&
198 HAS_PRIVATE(deferreds.promise, promiseHandledBySymbol) && 198 HAS_PRIVATE(deferreds.promise, promiseHandledBySymbol) &&
199 HAS_PRIVATE(GET_PRIVATE(deferreds.promise, promiseHandledBySymbol), 199 HAS_PRIVATE(GET_PRIVATE(deferreds.promise, promiseHandledBySymbol),
200 promiseAsyncStackIDSymbol)) { 200 promiseAsyncStackIDSymbol)) {
201 id = GET_PRIVATE(GET_PRIVATE(deferreds.promise, promiseHandledBySymbol), 201 id = GET_PRIVATE(GET_PRIVATE(deferreds.promise, promiseHandledBySymbol),
202 promiseAsyncStackIDSymbol); 202 promiseAsyncStackIDSymbol);
203 name = "async function"; 203 name = "async function";
204 } else { 204 } else {
205 id = PromiseNextMicrotaskID(); 205 id = PromiseNextMicrotaskID();
206 name = status === kFulfilled ? "Promise.resolve" : "Promise.reject"; 206 name = status === kFulfilled ? "Promise.resolve" : "Promise.reject";
207 %DebugAsyncTaskEvent({ type: "enqueue", id: id, name: name }); 207 %DebugAsyncTaskEvent("enqueue", id, name);
208 } 208 }
209
210 beforeDebug = { type: "willHandle", id: id, name: name };
211 afterDebug = { type: "didHandle", id: id, name: name };
212 } 209 }
213 210 %EnqueuePromiseReactionJob(value, tasks, deferreds, id, name);
214 %EnqueuePromiseReactionJob(value, tasks, deferreds, beforeDebug, afterDebug);
215 } 211 }
216 212
217 function PromiseAttachCallbacks(promise, deferred, onResolve, onReject) { 213 function PromiseAttachCallbacks(promise, deferred, onResolve, onReject) {
218 var maybeResolveCallbacks = 214 var maybeResolveCallbacks =
219 GET_PRIVATE(promise, promiseFulfillReactionsSymbol); 215 GET_PRIVATE(promise, promiseFulfillReactionsSymbol);
220 if (IS_UNDEFINED(maybeResolveCallbacks)) { 216 if (IS_UNDEFINED(maybeResolveCallbacks)) {
221 SET_PRIVATE(promise, promiseFulfillReactionsSymbol, onResolve); 217 SET_PRIVATE(promise, promiseFulfillReactionsSymbol, onResolve);
222 SET_PRIVATE(promise, promiseRejectReactionsSymbol, onReject); 218 SET_PRIVATE(promise, promiseRejectReactionsSymbol, onReject);
223 SET_PRIVATE(promise, promiseDeferredReactionSymbol, deferred); 219 SET_PRIVATE(promise, promiseDeferredReactionSymbol, deferred);
224 } else if (!IS_ARRAY(maybeResolveCallbacks)) { 220 } else if (!IS_ARRAY(maybeResolveCallbacks)) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 } 294 }
299 // Don't cause a debug event as this case is forwarding a rejection 295 // Don't cause a debug event as this case is forwarding a rejection
300 RejectPromise(promise, thenableValue, false); 296 RejectPromise(promise, thenableValue, false);
301 SET_PRIVATE(resolution, promiseHasHandlerSymbol, true); 297 SET_PRIVATE(resolution, promiseHasHandlerSymbol, true);
302 return; 298 return;
303 } 299 }
304 } 300 }
305 301
306 if (IS_CALLABLE(then)) { 302 if (IS_CALLABLE(then)) {
307 var callbacks = CreateResolvingFunctions(promise, false); 303 var callbacks = CreateResolvingFunctions(promise, false);
308 var id, before_debug_event, after_debug_event; 304 var id, name, instrumenting = DEBUG_IS_ACTIVE;
309 var instrumenting = DEBUG_IS_ACTIVE;
310 if (instrumenting) { 305 if (instrumenting) {
311 if (IsPromise(resolution)) { 306 if (IsPromise(resolution)) {
312 // Mark the dependency of the new promise on the resolution 307 // Mark the dependency of the new promise on the resolution
313 SET_PRIVATE(resolution, promiseHandledBySymbol, promise); 308 SET_PRIVATE(resolution, promiseHandledBySymbol, promise);
314 } 309 }
315 id = PromiseNextMicrotaskID(); 310 id = PromiseNextMicrotaskID();
316 before_debug_event = { 311 name = "PromiseResolveThenableJob";
317 type: "willHandle", 312 %DebugAsyncTaskEvent("enqueue", id, name);
318 id: id,
319 name: "PromiseResolveThenableJob"
320 };
321 after_debug_event = {
322 type: "didHandle",
323 id: id,
324 name: "PromiseResolveThenableJob"
325 };
326 %DebugAsyncTaskEvent({
327 type: "enqueue",
328 id: id,
329 name: "PromiseResolveThenableJob"
330 });
331 } 313 }
332 %EnqueuePromiseResolveThenableJob( 314 %EnqueuePromiseResolveThenableJob(
333 resolution, then, callbacks.resolve, callbacks.reject, 315 resolution, then, callbacks.resolve, callbacks.reject, id, name);
334 before_debug_event, after_debug_event);
335 return; 316 return;
336 } 317 }
337 } 318 }
338 FulfillPromise(promise, kFulfilled, resolution, 319 FulfillPromise(promise, kFulfilled, resolution,
339 promiseFulfillReactionsSymbol); 320 promiseFulfillReactionsSymbol);
340 } 321 }
341 322
342 // ES#sec-rejectpromise 323 // ES#sec-rejectpromise
343 // RejectPromise ( promise, reason ) 324 // RejectPromise ( promise, reason )
344 function RejectPromise(promise, reason, debugEvent) { 325 function RejectPromise(promise, reason, debugEvent) {
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 to.PromiseNextMicrotaskID = PromiseNextMicrotaskID; 690 to.PromiseNextMicrotaskID = PromiseNextMicrotaskID;
710 691
711 to.GlobalPromise = GlobalPromise; 692 to.GlobalPromise = GlobalPromise;
712 to.NewPromiseCapability = NewPromiseCapability; 693 to.NewPromiseCapability = NewPromiseCapability;
713 to.PerformPromiseThen = PerformPromiseThen; 694 to.PerformPromiseThen = PerformPromiseThen;
714 to.ResolvePromise = ResolvePromise; 695 to.ResolvePromise = ResolvePromise;
715 to.RejectPromise = RejectPromise; 696 to.RejectPromise = RejectPromise;
716 }); 697 });
717 698
718 }) 699 })
OLDNEW
« no previous file with comments | « src/js/async-await.js ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698