-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[vm/compiler] Fix handling of captured try_finally_return_value variable
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 #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>
- Loading branch information
1 parent
f8df8ca
commit 9b7caf3
Showing
3 changed files
with
81 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// 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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// 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. | ||
|
||
// @dart = 2.9 | ||
|
||
// 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); | ||
} |