Index: runtime/lib/async_patch.dart |
diff --git a/runtime/lib/async_patch.dart b/runtime/lib/async_patch.dart |
index 3e22fb044545fef55933c31361b6ea48c946e976..3db2220ae47f38a6fe7a3ef144d285e230763223 100644 |
--- a/runtime/lib/async_patch.dart |
+++ b/runtime/lib/async_patch.dart |
@@ -42,7 +42,10 @@ Function _asyncErrorWrapperHelper(continuation) { |
/// |
/// Returns the result of registering with `.then`. |
Future _awaitHelper( |
- var object, Function thenCallback, Function errorCallback) { |
+ var object, |
+ Function thenCallback, |
+ Function errorCallback, |
+ var awaiter) { |
if (object is! Future) { |
object = new _Future().._setValue(object); |
} else if (object is! _Future) { |
@@ -56,9 +59,33 @@ Future _awaitHelper( |
// |
// We can only do this for our internal futures (the default implementation of |
// all futures that are constructed by the `dart:async` library). |
+ object._awaiter = awaiter; |
return object._thenNoZoneRegistration(thenCallback, errorCallback); |
} |
+// Called as part of the 'await for (...)' construct. |
+void _asyncStarListenHelper(var object, |
+ var awaiter) { |
+ if (object is! _StreamImpl) { |
+ return; |
+ } |
+ // `object` is a `_StreamImpl`. |
+ object._awaiter = awaiter; |
+} |
+ |
+// Called after the |
+void _asyncStarMoveNextHelper(var object) { |
+ if (object is! _StreamImpl) { |
+ return; |
+ } |
+ // `object` is a `_StreamImpl`. |
+ if (object._generator == null) { |
+ // No generator registered, this isn't an async* Stream. |
+ return; |
+ } |
+ _moveNextDebuggerStepCheck(object._generator); |
+} |
+ |
// _AsyncStarStreamController is used by the compiler to implement |
// async* generator functions. |
class _AsyncStarStreamController { |
@@ -70,7 +97,11 @@ class _AsyncStarStreamController { |
bool isSuspendedAtYield = false; |
Completer cancellationCompleter = null; |
- Stream get stream => controller.stream; |
+ Stream get stream { |
+ Stream local = controller.stream; |
+ local._generator = asyncStarBody; |
+ return local; |
+ } |
void runBody() { |
isScheduled = false; |
@@ -190,3 +221,30 @@ class _AsyncStarStreamController { |
} |
@patch void _rethrow(Object error, StackTrace stackTrace) native "Async_rethrow"; |
+ |
+@patch class _Future<T> { |
+ Object _awaiter; |
+} |
+ |
+@patch class _StreamImpl<T> { |
+ Object _awaiter; |
+ Object _generator; |
+} |
+ |
+void _completeOnAsyncReturn(Object completer, [value]) { |
+ completer.complete(value); |
+} |
+ |
+/// Returns a [StackTrace] object containing the synchronous prefix for this |
+/// asynchronous method. |
+Object _asyncStackTraceHelper(Object closure) |
+ native "StackTrace_forAsyncMethod"; |
+ |
+void _clearAsyncThreadStackTrace() |
+ native "StackTrace_clearAsyncThreadStackTrace"; |
+ |
+void _setAsyncThreadStackTrace(StackTrace stackTrace) native |
+ "StackTrace_setAsyncThreadStackTrace"; |
+ |
+void _moveNextDebuggerStepCheck(async_op) |
+ native "AsyncStarMoveNext_debuggerStepCheck"; |