| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 }) |
| OLD | NEW |