Chromium Code Reviews| Index: runtime/vm/parser.cc |
| diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc |
| index eb3bd3d1a1a859ad017b5207326ff41c71220a5e..d481a8f9dcd89971af5b26cf466bd895e9ebba18 100644 |
| --- a/runtime/vm/parser.cc |
| +++ b/runtime/vm/parser.cc |
| @@ -10566,6 +10566,25 @@ AstNode* Parser::OptimizeBinaryOpNode(intptr_t op_pos, |
| } |
| } |
| } |
| + if (binary_op == Token::kIFNULL) { |
| + // Handle a ?? b. |
| + const intptr_t no_pos = Scanner::kNoSourcePos; |
| + LetNode* result = new(Z) LetNode(no_pos); |
| + LocalVariable* left_temp = result->AddInitializer(lhs); |
| + LiteralNode* null_operand = |
| + new LiteralNode(no_pos, Instance::ZoneHandle(Z)); |
| + LoadLocalNode* load_left_temp = new(Z) LoadLocalNode(no_pos, left_temp); |
| + ComparisonNode* null_compare = |
| + new ComparisonNode(no_pos, |
| + Token::kNE_STRICT, |
| + load_left_temp, |
| + null_operand); |
| + result->AddNode(new(Z) ConditionalExprNode(op_pos, |
| + null_compare, |
| + load_left_temp, |
| + rhs)); |
| + return result; |
| + } |
| return new(Z) BinaryOpNode(op_pos, binary_op, lhs, rhs); |
| } |
| @@ -10737,10 +10756,22 @@ AstNode* Parser::CreateAssignmentNode(AstNode* original, |
| ifnull->right(), |
| left_ident, |
| left_pos); |
| - result = new(Z) BinaryOpNode(rhs->token_pos(), |
| - Token::kIFNULL, |
| - ifnull->left(), |
| - modified_assign); |
| + const intptr_t no_pos = Scanner::kNoSourcePos; |
| + LetNode* let_node = new(Z) LetNode(no_pos); |
|
hausner
2015/11/03 19:03:08
Should be possible to call OptimizeBinaryOpNode()
Florian Schneider
2015/11/03 19:10:59
Yes, good point.
|
| + LocalVariable* left_temp = let_node->AddInitializer(ifnull->left()); |
| + LiteralNode* null_operand = |
| + new LiteralNode(no_pos, Instance::ZoneHandle(Z)); |
| + LoadLocalNode* load_left_temp = new(Z) LoadLocalNode(no_pos, left_temp); |
| + ComparisonNode* null_compare = |
| + new ComparisonNode(no_pos, |
| + Token::kNE_STRICT, |
| + load_left_temp, |
| + null_operand); |
| + let_node->AddNode(new(Z) ConditionalExprNode(rhs->token_pos(), |
| + null_compare, |
| + load_left_temp, |
| + modified_assign)); |
| + result = let_node; |
| } |
| return result; |
| } |