| 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 db2a4e15f4e5a904733e701b14d873b5b777a99a..893a2ebb044f27f7f7de91f19bafdfc1be420b97 100644
|
| --- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
|
| +++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
|
| @@ -4,21 +4,18 @@
|
|
|
| // Patch file for the dart:async library.
|
|
|
| -import 'dart:_js_helper' show
|
| - patch,
|
| - ExceptionAndStackTrace,
|
| - Primitives,
|
| - convertDartClosureToJS,
|
| - getTraceFromException,
|
| - requiresPreamble,
|
| - wrapException,
|
| - unwrapException;
|
| -import 'dart:_isolate_helper' show
|
| - IsolateNatives,
|
| - TimerImpl,
|
| - leaveJsAsync,
|
| - enterJsAsync,
|
| - isWorker;
|
| +import 'dart:_js_helper'
|
| + show
|
| + patch,
|
| + ExceptionAndStackTrace,
|
| + Primitives,
|
| + convertDartClosureToJS,
|
| + getTraceFromException,
|
| + requiresPreamble,
|
| + wrapException,
|
| + unwrapException;
|
| +import 'dart:_isolate_helper'
|
| + show IsolateNatives, TimerImpl, leaveJsAsync, enterJsAsync, isWorker;
|
|
|
| import 'dart:_foreign_helper' show JS;
|
|
|
| @@ -52,12 +49,13 @@ class _AsyncRun {
|
| var f = storedCallback;
|
| storedCallback = null;
|
| f();
|
| - };
|
| + }
|
| +
|
| + ;
|
|
|
| var observer = JS('', 'new self.MutationObserver(#)',
|
| convertDartClosureToJS(internalCallback, 1));
|
| - JS('', '#.observe(#, { childList: true })',
|
| - observer, div);
|
| + JS('', '#.observe(#, { childList: true })', observer, div);
|
|
|
| return (void callback()) {
|
| assert(storedCallback == null);
|
| @@ -66,8 +64,8 @@ class _AsyncRun {
|
| // Because of a broken shadow-dom polyfill we have to change the
|
| // children instead a cheap property.
|
| // See https://github.com/Polymer/ShadowDOM/issues/468
|
| - JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)',
|
| - div, div, span, div, span);
|
| + JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)', div, div,
|
| + span, div, span);
|
| };
|
| } else if (JS('', 'self.setImmediate') != null) {
|
| return _scheduleImmediateWithSetImmediate;
|
| @@ -80,20 +78,24 @@ class _AsyncRun {
|
| internalCallback() {
|
| leaveJsAsync();
|
| callback();
|
| - };
|
| + }
|
| +
|
| + ;
|
| enterJsAsync();
|
| JS('void', 'self.scheduleImmediate(#)',
|
| - convertDartClosureToJS(internalCallback, 0));
|
| + convertDartClosureToJS(internalCallback, 0));
|
| }
|
|
|
| static void _scheduleImmediateWithSetImmediate(void callback()) {
|
| internalCallback() {
|
| leaveJsAsync();
|
| callback();
|
| - };
|
| + }
|
| +
|
| + ;
|
| enterJsAsync();
|
| JS('void', 'self.setImmediate(#)',
|
| - convertDartClosureToJS(internalCallback, 0));
|
| + convertDartClosureToJS(internalCallback, 0));
|
| }
|
|
|
| static void _scheduleImmediateWithTimer(void callback()) {
|
| @@ -106,7 +108,7 @@ class DeferredLibrary {
|
| @patch
|
| Future<Null> load() {
|
| throw 'DeferredLibrary not supported. '
|
| - 'please use the `import "lib.dart" deferred as lib` syntax.';
|
| + 'please use the `import "lib.dart" deferred as lib` syntax.';
|
| }
|
| }
|
|
|
| @@ -120,8 +122,8 @@ class Timer {
|
| }
|
|
|
| @patch
|
| - static Timer _createPeriodicTimer(Duration duration,
|
| - void callback(Timer timer)) {
|
| + static Timer _createPeriodicTimer(
|
| + Duration duration, void callback(Timer timer)) {
|
| int milliseconds = duration.inMilliseconds;
|
| if (milliseconds < 0) milliseconds = 0;
|
| return new TimerImpl.periodic(milliseconds, callback);
|
| @@ -144,7 +146,8 @@ class Timer {
|
| /// on the success of the future.
|
| ///
|
| /// Returns the future of the completer for convenience of the first call.
|
| -dynamic _asyncHelper(dynamic object,
|
| +dynamic _asyncHelper(
|
| + dynamic object,
|
| dynamic /* int | _WrappedAsyncBody */ bodyFunctionOrErrorCode,
|
| Completer completer) {
|
| if (identical(bodyFunctionOrErrorCode, async_error_codes.SUCCESS)) {
|
| @@ -152,8 +155,8 @@ dynamic _asyncHelper(dynamic object,
|
| return;
|
| } else if (identical(bodyFunctionOrErrorCode, async_error_codes.ERROR)) {
|
| // The error is a js-error.
|
| - completer.completeError(unwrapException(object),
|
| - getTraceFromException(object));
|
| + completer.completeError(
|
| + unwrapException(object), getTraceFromException(object));
|
| return;
|
| }
|
|
|
| @@ -216,7 +219,8 @@ _WrappedAsyncBody _wrapJsFunctionForAsync(dynamic /* js function */ function) {
|
| }
|
| }
|
| })(#, #)""",
|
| - function, async_error_codes.ERROR);
|
| + function,
|
| + async_error_codes.ERROR);
|
|
|
| return Zone.current.registerBinaryCallback((int errorCode, dynamic result) {
|
| JS('', '#(#, #)', protected, errorCode, result);
|
| @@ -259,7 +263,8 @@ _WrappedAsyncBody _wrapJsFunctionForAsync(dynamic /* js function */ function) {
|
| ///
|
| /// If [object] is not a [Future], it is wrapped in a `Future.value`.
|
| /// The [asyncBody] is called on completion of the future (see [asyncHelper].
|
| -void _asyncStarHelper(dynamic object,
|
| +void _asyncStarHelper(
|
| + dynamic object,
|
| dynamic /* int | _WrappedAsyncBody */ bodyFunctionOrErrorCode,
|
| _AsyncStarStreamController controller) {
|
| if (identical(bodyFunctionOrErrorCode, async_error_codes.SUCCESS)) {
|
| @@ -274,11 +279,10 @@ void _asyncStarHelper(dynamic object,
|
| // The error is a js-error.
|
| if (controller.isCanceled) {
|
| controller.cancelationCompleter.completeError(
|
| - unwrapException(object),
|
| - getTraceFromException(object));
|
| + unwrapException(object), getTraceFromException(object));
|
| } else {
|
| - controller.addError(unwrapException(object),
|
| - getTraceFromException(object));
|
| + controller.addError(
|
| + unwrapException(object), getTraceFromException(object));
|
| controller.close();
|
| }
|
| return;
|
| @@ -369,38 +373,36 @@ class _AsyncStarStreamController {
|
| close() => controller.close();
|
|
|
| _AsyncStarStreamController(_WrappedAsyncBody body) {
|
| -
|
| _resumeBody() {
|
| scheduleMicrotask(() {
|
| body(async_error_codes.SUCCESS, null);
|
| });
|
| }
|
|
|
| - controller = new StreamController(
|
| - onListen: () {
|
| + controller = new StreamController(onListen: () {
|
| + _resumeBody();
|
| + }, onResume: () {
|
| + // Only schedule again if the async* function actually is suspended.
|
| + // Resume directly instead of scheduling, so that the sequence
|
| + // `pause-resume-pause` will result in one extra event produced.
|
| + if (isSuspended) {
|
| + isSuspended = false;
|
| _resumeBody();
|
| - }, onResume: () {
|
| - // Only schedule again if the async* function actually is suspended.
|
| - // Resume directly instead of scheduling, so that the sequence
|
| - // `pause-resume-pause` will result in one extra event produced.
|
| + }
|
| + }, onCancel: () {
|
| + // If the async* is finished we ignore cancel events.
|
| + if (!controller.isClosed) {
|
| + cancelationCompleter = new Completer();
|
| if (isSuspended) {
|
| + // Resume the suspended async* function to run finalizers.
|
| isSuspended = false;
|
| - _resumeBody();
|
| - }
|
| - }, onCancel: () {
|
| - // If the async* is finished we ignore cancel events.
|
| - if (!controller.isClosed) {
|
| - cancelationCompleter = new Completer();
|
| - if (isSuspended) {
|
| - // Resume the suspended async* function to run finalizers.
|
| - isSuspended = false;
|
| - scheduleMicrotask(() {
|
| - body(async_error_codes.STREAM_WAS_CANCELED, null);
|
| - });
|
| - }
|
| - return cancelationCompleter.future;
|
| + scheduleMicrotask(() {
|
| + body(async_error_codes.STREAM_WAS_CANCELED, null);
|
| + });
|
| }
|
| - });
|
| + return cancelationCompleter.future;
|
| + }
|
| + });
|
| }
|
| }
|
|
|
| @@ -468,7 +470,8 @@ class _SyncStarIterator implements Iterator {
|
|
|
| _runBody() {
|
| // TODO(sra): Find a way to hard-wire SUCCESS and ERROR codes.
|
| - return JS('',
|
| + return JS(
|
| + '',
|
| '''
|
| // Invokes [body] with [errorCode] and [result].
|
| //
|
| @@ -485,7 +488,9 @@ class _SyncStarIterator implements Iterator {
|
| }
|
| }
|
| })(#, #, #)''',
|
| - _body, async_error_codes.SUCCESS, async_error_codes.ERROR);
|
| + _body,
|
| + async_error_codes.SUCCESS,
|
| + async_error_codes.ERROR);
|
| }
|
|
|
| bool moveNext() {
|
| @@ -537,7 +542,7 @@ class _SyncStarIterator implements Iterator {
|
| return true;
|
| }
|
| }
|
| - return false; // TODO(sra): Fix type inference so that this is not needed.
|
| + return false; // TODO(sra): Fix type inference so that this is not needed.
|
| }
|
| }
|
|
|
|
|