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; |
} |