deebb52c2b
The AST-to-IR conversion stage now handles null-shorting property accesses (both for reads and writes). This required adding the following instruction types: `eq`, `block`, and `brIf`. In order to make `eq` easier to test, support was also added for AST-to-IR conversion of testing binary expressions using `==`. The way null shorting is encoded in the IR is by issuing a `block` instruction when null shorting starts, and an `end` instruction when it terminates. Anywhere a null check appears within the null shorting expression, the null check uses a `brIf(0)` instruction to branch to the `end` in the case a `null` is found. To make it easier to keep track of when `block` and `end` instructions need to be generated, `RawIRWriter` keeps track of a count of the current nesting of control flow contsructs. In order for the interpreter to find to the appropriate `end` instruction when a branch is taken, a new scope analyzer is added. Later CLs will expand on it and use it for static analysis as well. Change-Id: I09ca34eaa900d47f7a4014cbc8db2a48a1d69e1e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336800 Reviewed-by: Phil Quitslund <pquitslund@google.com> Commit-Queue: Paul Berry <paulberry@google.com>