Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1036)

Unified Diff: runtime/vm/parser.cc

Issue 1273033007: Fix ??= AST modification (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/parser.h ('k') | tests/language/nullaware_opt_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 23c22c3f3fc03cff02cb1eb625772e0568201306..be67426c8d9ec38516765244cff7e6d3a9221567 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -8644,6 +8644,7 @@ AstNode* Parser::ParseAwaitForStatement(String* label_name) {
ASSERT(!loop_var_primary->IsPrimaryNode());
loop_var_assignment = CreateAssignmentNode(loop_var_primary,
iterator_current,
+ false,
srdjan 2015/08/11 19:26:10 Add comment /*is_compound */
loop_var_name,
loop_var_assignment_pos);
ASSERT(loop_var_assignment != NULL);
@@ -8862,6 +8863,7 @@ AstNode* Parser::ParseForInStatement(intptr_t forin_pos,
ASSERT(!loop_var_primary->IsPrimaryNode());
loop_var_assignment = CreateAssignmentNode(loop_var_primary,
iterator_current,
+ false,
srdjan 2015/08/11 19:26:10 ditto
loop_var_name,
loop_var_assignment_pos);
ASSERT(loop_var_assignment != NULL);
@@ -10569,6 +10571,7 @@ bool Parser::IsLegalAssignableSyntax(AstNode* expr, intptr_t end_pos) {
AstNode* Parser::CreateAssignmentNode(AstNode* original,
AstNode* rhs,
+ bool is_compound,
const String* left_ident,
intptr_t left_pos) {
AstNode* result = original->MakeAssignmentNode(rhs);
@@ -10608,17 +10611,19 @@ AstNode* Parser::CreateAssignmentNode(AstNode* original,
// normally: a op= b ==> a = a op b
// however: a ??= b ==> a ?? (a = b)
// Therefore, we need to transform a = (a ?? b) into a ?? (a = b)
- if (rhs->IsBinaryOpNode() &&
+ if (is_compound &&
+ rhs->IsBinaryOpNode() &&
(rhs->AsBinaryOpNode()->kind() == Token::kIFNULL)) {
BinaryOpNode* ifnull = rhs->AsBinaryOpNode();
AstNode* modified_assign =
- CreateAssignmentNode(ifnull->left(),
+ CreateAssignmentNode(original,
ifnull->right(),
+ false,
srdjan 2015/08/11 19:26:10 ditto
left_ident,
left_pos);
result = new(Z) BinaryOpNode(rhs->token_pos(),
Token::kIFNULL,
- original,
+ ifnull->left(),
modified_assign);
}
return result;
@@ -10660,7 +10665,7 @@ AstNode* Parser::ParseCascades(AstNode* expr) {
right_expr =
ExpandAssignableOp(assignment_pos, assignment_op, expr, right_expr);
AstNode* assign_expr =
- CreateAssignmentNode(expr, right_expr, expr_ident, expr_pos);
+ CreateAssignmentNode(expr, right_expr, true, expr_ident, expr_pos);
srdjan 2015/08/11 19:26:10 comment what true means (and below false). Also at
ASSERT(assign_expr != NULL);
let_expr->AddNode(assign_expr);
expr = let_expr;
@@ -10668,7 +10673,7 @@ AstNode* Parser::ParseCascades(AstNode* expr) {
right_expr =
ExpandAssignableOp(assignment_pos, assignment_op, expr, right_expr);
AstNode* assign_expr =
- CreateAssignmentNode(expr, right_expr, expr_ident, expr_pos);
+ CreateAssignmentNode(expr, right_expr, false, expr_ident, expr_pos);
ASSERT(assign_expr != NULL);
expr = assign_expr;
}
@@ -10773,14 +10778,14 @@ AstNode* Parser::ParseExpr(bool require_compiletime_const,
AstNode* assigned_value =
ExpandAssignableOp(assignment_pos, assignment_op, expr, right_expr);
AstNode* assign_expr =
- CreateAssignmentNode(expr, assigned_value, expr_ident, expr_pos);
+ CreateAssignmentNode(expr, assigned_value, true, expr_ident, expr_pos);
ASSERT(assign_expr != NULL);
let_expr->AddNode(assign_expr);
return let_expr;
} else {
AstNode* assigned_value = LiteralIfStaticConst(Z, right_expr);
AstNode* assign_expr =
- CreateAssignmentNode(expr, assigned_value, expr_ident, expr_pos);
+ CreateAssignmentNode(expr, assigned_value, false, expr_ident, expr_pos);
ASSERT(assign_expr != NULL);
return assign_expr;
}
@@ -10874,7 +10879,8 @@ AstNode* Parser::ParseUnaryExpr() {
binary_op,
expr,
new(Z) LiteralNode(op_pos, Smi::ZoneHandle(Z, Smi::New(1))));
- AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos);
+ AstNode* store =
+ CreateAssignmentNode(expr, add, true, expr_ident, expr_pos);
ASSERT(store != NULL);
let_expr->AddNode(store);
expr = let_expr;
@@ -11591,7 +11597,8 @@ AstNode* Parser::ParsePostfixExpr() {
binary_op,
new(Z) LoadLocalNode(expr_pos, temp),
new(Z) LiteralNode(expr_pos, Smi::ZoneHandle(Z, Smi::New(1))));
- AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos);
+ AstNode* store =
+ CreateAssignmentNode(expr, add, true, expr_ident, expr_pos);
ASSERT(store != NULL);
// The result is a pair of the (side effects of the) store followed by
// the (value of the) initial value temp variable load.
« no previous file with comments | « runtime/vm/parser.h ('k') | tests/language/nullaware_opt_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698