mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 04:37:12 +00:00
9b7caf3b93
In async/async* methods synthetic :try_finally_return_value variable (which is used to hold return value across finally) could be captured, so flow graph builder needs to have correct context_depth_ in order to access it using LoadLocal(finally_return_variable) when building flow graph for return statement. Previously, flow graph builder left context in an unspecified state and depth after TranslateFinallyFinalizers(NULL, -1), which caused incorrect code being generated for LoadLocal(finally_return_variable). This change fixes this problem by * passing correct target_context_depth to TranslateFinallyFinalizers so context is adjusted to a known depth regardless of context depth which is used by finally; * setting context_depth_ for LoadLocal(finally_return_variable) and then restoring it (to be able to continue building flow graph for the enclosing AST nodes). TEST=tests/language/async_star/regression_47610_test.dart Fixes https://github.com/dart-lang/sdk/issues/47610 Change-Id: Id15ea719ddda892eaff0b06f6450b1a8de36e8da Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/219283 Reviewed-by: Martin Kustermann <kustermann@google.com> Reviewed-by: Slava Egorov <vegorov@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
33 lines
792 B
Dart
33 lines
792 B
Dart
// Copyright (c) 2021, 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.
|
|
|
|
// Regression test for https://github.com/dart-lang/sdk/issues/47610.
|
|
// Tests returning value from a deep context depth along with
|
|
// breaking from 'await for'.
|
|
|
|
import "dart:async";
|
|
import "package:expect/expect.dart";
|
|
import "package:async_helper/async_helper.dart";
|
|
|
|
Stream<int> foo() async* {
|
|
for (int i = 0; i < 2; ++i) {
|
|
for (int j = 0; j < 2; ++j) {
|
|
for (int k = 0; k < 2; ++k) {
|
|
yield i + j + k;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void test() async {
|
|
await for (var x in foo()) {
|
|
Expect.equals(0, x);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
asyncTest(test);
|
|
}
|