Index: sdk/lib/_internal/compiler/js_lib/js_helper.dart |
diff --git a/sdk/lib/_internal/compiler/js_lib/js_helper.dart b/sdk/lib/_internal/compiler/js_lib/js_helper.dart |
index 163833b6ffadbac2da7a19366980a6bcf9041896..d2b6795ce42eea337c8c28328a3af380b530af83 100644 |
--- a/sdk/lib/_internal/compiler/js_lib/js_helper.dart |
+++ b/sdk/lib/_internal/compiler/js_lib/js_helper.dart |
@@ -3741,6 +3741,7 @@ void asyncStarHelper(dynamic object, |
return; |
} |
if (object.state == IterationMarker.YIELD_SINGLE) { |
+ controller.isWaitingForYield = true; |
controller.add(object.value); |
// If the controller is paused we stop producing more values. |
if (controller.isPaused) { |
@@ -3748,6 +3749,7 @@ void asyncStarHelper(dynamic object, |
} |
// TODO(sigurdm): We should not suspend here according to the spec. |
Lasse Reichstein Nielsen
2015/04/08 14:12:14
Isn't the spec allowing you to do so, but not requ
sigurdm
2015/04/09 11:24:08
Yes I think so - this is an outdated comment. Remo
|
scheduleMicrotask(() { |
+ controller.isWaitingForYield = false; |
Lasse Reichstein Nielsen
2015/04/08 14:12:15
I think this line should be moved outside of the s
sigurdm
2015/04/09 11:24:08
Done.
|
_wrapJsFunctionForAsync(bodyFunctionOrErrorCode, |
async_error_codes.SUCCESS) |
(null); |
@@ -3796,6 +3798,8 @@ class AsyncStarStreamController { |
bool get isCanceled => cancelationCompleter != null; |
bool isAdding = false; |
bool isPaused = false; |
+ bool isWaitingForYield = false; |
floitsch
2015/04/08 14:01:25
isAtYield ?
Add comment what exactly this means.
sigurdm
2015/04/08 14:07:40
Done.
Lasse Reichstein Nielsen
2015/04/08 14:12:14
Consider documenting these fields, preferably by d
sigurdm
2015/04/09 11:24:08
Good advice!
I realized I can leave out `isAdding`
|
+ |
add(event) => controller.add(event); |
addStream(Stream stream) { |
return controller.addStream(stream, cancelOnError: false); |
@@ -3807,8 +3811,8 @@ class AsyncStarStreamController { |
controller = new StreamController( |
onListen: () { |
scheduleMicrotask(() { |
- Function wrapped = _wrapJsFunctionForAsync(body, |
- async_error_codes.SUCCESS); |
+ Function wrapped = |
+ _wrapJsFunctionForAsync(body, async_error_codes.SUCCESS); |
wrapped(null); |
}); |
}, |
@@ -3816,7 +3820,7 @@ class AsyncStarStreamController { |
isPaused = true; |
}, onResume: () { |
isPaused = false; |
- if (!isAdding) { |
+ if (!isAdding && isWaitingForYield) { |
Lasse Reichstein Nielsen
2015/04/08 14:12:15
I don't think this is safe enough.
If the stream
Lasse Reichstein Nielsen
2015/04/08 14:12:15
Maybe name it "isWaitingForResume"? You have alrea
sigurdm
2015/04/09 11:24:08
It is now isSuspended
|
asyncStarHelper(null, body, this); |
} |
}, onCancel: () { |