[dart2wasm] Fix async* transformation of nested async* functions
With nested `async*` functions, the state of whether we're in an `async*` function should be restored as the previous state after leaving the nested function, instead of as `false`. Fixes #55397. Change-Id: I5f2a964847ae34e98584f3adad6df7857b81e474 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/361600 Commit-Queue: Ömer Ağacan <omersa@google.com> Reviewed-by: Slava Egorov <vegorov@google.com>
This commit is contained in:
committed by
Commit Queue
parent
2e1a56f264
commit
b449e99118
@@ -679,13 +679,14 @@ class _WasmTransformer extends Transformer {
|
||||
|
||||
@override
|
||||
TreeNode visitFunctionNode(FunctionNode functionNode) {
|
||||
final previousEnclosing = _enclosingIsAsyncStar;
|
||||
if (functionNode.dartAsyncMarker == AsyncMarker.AsyncStar) {
|
||||
_enclosingIsAsyncStar = true;
|
||||
functionNode = _lowerAsyncStar(functionNode) as FunctionNode;
|
||||
_enclosingIsAsyncStar = false;
|
||||
_enclosingIsAsyncStar = previousEnclosing;
|
||||
return super.visitFunctionNode(functionNode);
|
||||
} else {
|
||||
bool previousEnclosing = _enclosingIsAsyncStar;
|
||||
_enclosingIsAsyncStar = false;
|
||||
TreeNode result = super.visitFunctionNode(functionNode);
|
||||
_enclosingIsAsyncStar = previousEnclosing;
|
||||
return result;
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import "package:async_helper/async_helper.dart";
|
||||
import "package:expect/expect.dart";
|
||||
|
||||
Stream<String> stream() async* {
|
||||
yield 'a';
|
||||
yield 'b';
|
||||
}
|
||||
|
||||
Stream<String> expandedStream() async* {
|
||||
final expanded = stream().asyncExpand((s) async* {
|
||||
yield 'before';
|
||||
yield s;
|
||||
yield 'after';
|
||||
});
|
||||
|
||||
yield* expanded;
|
||||
}
|
||||
|
||||
test() async {
|
||||
Expect.listEquals(['before', 'a', 'after', 'before', 'b', 'after'],
|
||||
await expandedStream().toList());
|
||||
}
|
||||
|
||||
void main() {
|
||||
asyncStart();
|
||||
test().then((_) => asyncEnd());
|
||||
}
|
||||
Reference in New Issue
Block a user