Chromium Code Reviews| Index: src/js/harmony-async-await.js |
| diff --git a/src/js/harmony-async-await.js b/src/js/harmony-async-await.js |
| index 203ca88f12201df3fe3a013bed3bc2f8bb61b006..4109b77fb54174366cdae648b0dae7fc0c5b02af 100644 |
| --- a/src/js/harmony-async-await.js |
| +++ b/src/js/harmony-async-await.js |
| @@ -14,48 +14,97 @@ |
| var AsyncFunctionNext; |
| var AsyncFunctionThrow; |
| var GlobalPromise; |
| +var IsPromise; |
| var NewPromiseCapability; |
| var PerformPromiseThen; |
| -var PromiseCastResolved; |
| +var PromiseCreate; |
| var RejectPromise; |
| +var ResolvePromise; |
| utils.Import(function(from) { |
| AsyncFunctionNext = from.AsyncFunctionNext; |
| AsyncFunctionThrow = from.AsyncFunctionThrow; |
| + IsPromise = from.IsPromise; |
| GlobalPromise = from.GlobalPromise; |
| NewPromiseCapability = from.NewPromiseCapability; |
| - PromiseCastResolved = from.PromiseCastResolved; |
| + PromiseCreate = from.PromiseCreate; |
| PerformPromiseThen = from.PerformPromiseThen; |
| RejectPromise = from.RejectPromise; |
| + ResolvePromise = from.ResolvePromise; |
| }); |
| +var promiseAwaitHandlerSymbol = utils.ImportNow("promise_await_handler_symbol"); |
| +var promiseHandledHintSymbol = |
| + utils.ImportNow("promise_handled_hint_symbol"); |
| + |
| // ------------------------------------------------------------------- |
| -function AsyncFunctionAwait(generator, value) { |
| - // Promise.resolve(value).then( |
| +function PromiseCastResolved(value) { |
| + if (IsPromise(value)) { |
| + return value; |
| + } else { |
| + var promise = PromiseCreate(); |
| + ResolvePromise(promise, value); |
| + return promise; |
| + } |
| +} |
| + |
| +// ES#abstract-ops-async-function-await |
| +// AsyncFunctionAwait ( value ) |
| +// Shared logic for the core of await. The parser desugars |
|
jgruber
2016/09/12 09:29:00
Thanks, these comments are very helpful.
|
| +// await awaited |
| +// into |
| +// yield AsyncFunctionAwait{Caught,Uncaught}(.generator, awaited) |
| +// The 'awaited' parameter is the value; the generator stands in |
| +// for the asyncContext, and mark is metadata for debugging |
| +function AsyncFunctionAwait(generator, awaited, mark) { |
| + // Promise.resolve(awaited).then( |
| // value => AsyncFunctionNext(value), |
| // error => AsyncFunctionThrow(error) |
| // ); |
| - var promise = PromiseCastResolved(value); |
| + var promise = PromiseCastResolved(awaited); |
| var onFulfilled = |
| (sentValue) => %_Call(AsyncFunctionNext, generator, sentValue); |
| var onRejected = |
| (sentError) => %_Call(AsyncFunctionThrow, generator, sentError); |
| - // false debugEvent to avoid redundant ExceptionEvents |
| + if (mark && DEBUG_IS_ACTIVE && IsPromise(awaited)) { |
| + // Mark the reject handler callback such that it does not influence |
| + // catch prediction. |
| + SET_PRIVATE(onRejected, promiseAwaitHandlerSymbol, true); |
| + } |
| + |
| + // Just forwarding the exception, so no debugEvent for throwawayCapability |
| var throwawayCapability = NewPromiseCapability(GlobalPromise, false); |
| return PerformPromiseThen(promise, onFulfilled, onRejected, |
| throwawayCapability); |
| } |
| +// Called by the parser from the desugaring of 'await' when catch |
| +// prediction indicates no locally surrounding catch block |
| +function AsyncFunctionAwaitUncaught(generator, awaited) { |
| + // TODO(littledan): Install a dependency edge from awaited to outerPromise |
| + return AsyncFunctionAwait(generator, awaited, true); |
| +} |
| + |
| +// Called by the parser from the desugaring of 'await' when catch |
| +// prediction indicates that there is a locally surrounding catch block |
| +function AsyncFunctionAwaitCaught(generator, awaited) { |
| + if (DEBUG_IS_ACTIVE && IsPromise(awaited)) { |
| + SET_PRIVATE(awaited, promiseHandledHintSymbol, true); |
| + } |
| + return AsyncFunctionAwait(generator, awaited, false); |
| +} |
| + |
| // How the parser rejects promises from async/await desugaring |
| function RejectPromiseNoDebugEvent(promise, reason) { |
| return RejectPromise(promise, reason, false); |
| } |
| %InstallToContext([ |
| - "async_function_await", AsyncFunctionAwait, |
| + "async_function_await_caught", AsyncFunctionAwaitCaught, |
| + "async_function_await_uncaught", AsyncFunctionAwaitUncaught, |
| "reject_promise_no_debug_event", RejectPromiseNoDebugEvent, |
| ]); |