4775fa3857
In certain error recovery situations, it's possible for code to refer to a variable whose declaration has been lost by error recovery mechanisms. To prevent flow analysis from crashing when this happened, it assumed that any reference to a variable whose declaration had not yet been seen was valid, and implicitly added that variable to the flow analysis state. This created a subtle problem: if a function contained a closure that declared (and assigned to) a local variable, at the time the closure was entered, flow analysis would get confused and temporarily put the variable in the "write captured" state (because it hadn't yet seen the declaration of the variable, so it didn't realize it was local to the closure). Then, a boolean variable might capture that incorrect state. Later, upon seeing the declaration of the variable, it would fix the incorrect state, however it was possible that a later reference to the boolean variable would re-vivify the old incorrect state. This is precisely what happened in issue #47991. This CL fixes the problem by giving flow analysis the ability to detect, at the time the FlowAnalysis object is constructed, all variables that are referred to but not explicitly declared, and add them to the flow analysis state. This allows it to safely assume that any variables that are not yet in the flow analysis state haven't been declared yet (and hence can be ignored), so no variable is every erroneously placed into the "write captured" state. Fixes #47991. Bug: https://github.com/dart-lang/sdk/issues/47991 Change-Id: I8d84fab96fad063f1d3ade3b8b9a6e9af88c3737 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/227361 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Paul Berry <paulberry@google.com> |
||
---|---|---|
.dart_tool | ||
.github | ||
benchmarks | ||
build | ||
docs | ||
pkg | ||
runtime | ||
samples | ||
samples-dev/swarm | ||
samples_2 | ||
sdk | ||
tests | ||
third_party | ||
tools | ||
utils | ||
.clang-format | ||
.gitattributes | ||
.gitconfig | ||
.gitignore | ||
.gn | ||
.mailmap | ||
.packages | ||
.style.yapf | ||
.vpython | ||
AUTHORS | ||
BUILD.gn | ||
CHANGELOG.md | ||
codereview.settings | ||
CONTRIBUTING.md | ||
DEPS | ||
LICENSE | ||
PATENT_GRANT | ||
PRESUBMIT.py | ||
README.dart-sdk | ||
README.md | ||
sdk_args.gni | ||
SECURITY.md | ||
WATCHLISTS |
Dart
A client-optimized language for fast apps on any platform
Dart is:
-
Optimized for UI: Develop with a programming language specialized around the needs of user interface creation.
-
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app.
-
Fast on all platforms: Compile to ARM & x64 machine code for mobile, desktop, and backend. Or compile to JavaScript for the web.
Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:
-
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
-
Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).
License & patents
Dart is free and open source.
See LICENSE and PATENT_GRANT.
Using Dart
Visit dart.dev to learn more about the language, tools, and to find codelabs.
Browse pub.dev for more packages and libraries contributed by the community and the Dart team.
Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).
Building Dart
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents on our wiki.
Contributing to Dart
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.