| Index: sdk/lib/_internal/js_runtime/lib/async_patch.dart
|
| diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
|
| index 893a2ebb044f27f7f7de91f19bafdfc1be420b97..f4ad69480378f8a7a67500db3a7d2d0d57138043 100644
|
| --- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
|
| +++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
|
| @@ -130,38 +130,53 @@ class Timer {
|
| }
|
| }
|
|
|
| -/// Runtime support for async-await transformation.
|
| +/// Initiates the computation of an `async` function.
|
| ///
|
| -/// This function is called by a transformed function on each await and return
|
| -/// in the untransformed function, and before starting.
|
| +/// Used as part of the runtime support for the async/await transformation.
|
| ///
|
| -/// If [object] is not a future it will be wrapped in a `new Future.value`.
|
| +/// This function sets up the first call into the transformed [bodyFunction].
|
| +/// Independently, it takes the [completer] and returns the future of the
|
| +/// completer for convenience of the transformed code.
|
| +dynamic _asyncStart(_WrappedAsyncBody bodyFunction, Completer completer) {
|
| + // Expansion and specialization of `await null`.
|
| + Function thenCallback =
|
| + (result) => bodyFunction(async_error_codes.SUCCESS, result);
|
| + // We can skip the zone registration, since the bodyFunction is already
|
| + // registered (see [_wrapJsFunctionForAsync]).
|
| + Future._nullFuture._thenNoZoneRegistration(thenCallback, null);
|
| + return completer.future;
|
| +}
|
| +
|
| +/// Performs the `await` operation of an `async` function.
|
| ///
|
| -/// If [asyncBody] is [async_error_codes.SUCCESS]/[async_error_codes.ERROR] it
|
| -/// indicates a return or throw from the async function, and
|
| -/// complete/completeError is called on [completer] with [object].
|
| +/// Used as part of the runtime support for the async/await transformation.
|
| ///
|
| -/// Otherwise [asyncBody] is set up to be called when the future is completed
|
| -/// with a code [async_error_codes.SUCCESS]/[async_error_codes.ERROR] depending
|
| -/// on the success of the future.
|
| +/// Arranges for [bodyFunction] to be called when the future or value [object]
|
| +/// is completed with a code [async_error_codes.SUCCESS] or
|
| +/// [async_error_codes.ERROR] depending on the success of the future.
|
| +dynamic _asyncAwait(dynamic object, _WrappedAsyncBody bodyFunction) {
|
| + _awaitOnObject(object, bodyFunction);
|
| +}
|
| +
|
| +/// Completes the future of an `async` function.
|
| ///
|
| -/// Returns the future of the completer for convenience of the first call.
|
| -dynamic _asyncHelper(
|
| - dynamic object,
|
| - dynamic /* int | _WrappedAsyncBody */ bodyFunctionOrErrorCode,
|
| - Completer completer) {
|
| - if (identical(bodyFunctionOrErrorCode, async_error_codes.SUCCESS)) {
|
| - completer.complete(object);
|
| - return;
|
| - } else if (identical(bodyFunctionOrErrorCode, async_error_codes.ERROR)) {
|
| - // The error is a js-error.
|
| - completer.completeError(
|
| - unwrapException(object), getTraceFromException(object));
|
| - return;
|
| - }
|
| +/// Used as part of the runtime support for the async/await transformation.
|
| +///
|
| +/// This function is used when the `async` function returns (explicitly or
|
| +/// implicitly).
|
| +dynamic _asyncReturn(dynamic object, Completer completer) {
|
| + completer.complete(object);
|
| +}
|
|
|
| - _awaitOnObject(object, bodyFunctionOrErrorCode);
|
| - return completer.future;
|
| +/// Completes the future of an `async` function with an error.
|
| +///
|
| +/// Used as part of the runtime support for the async/await transformation.
|
| +///
|
| +/// This function is used when the `async` function re-throws an exception.
|
| +dynamic _asyncRethrow(dynamic object, Completer completer) {
|
| + // The error is a js-error.
|
| + completer.completeError(
|
| + unwrapException(object), getTraceFromException(object));
|
| }
|
|
|
| /// Awaits on the given [object].
|
|
|