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

Unified Diff: runtime/vm/parser.cc

Issue 10448059: Use temporary variable for StoreIndexed that returns a value. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 7 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') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
===================================================================
--- runtime/vm/parser.cc (revision 8108)
+++ runtime/vm/parser.cc (working copy)
@@ -4839,7 +4839,7 @@
AstNode* loop_var_primary = ResolveVarOrField(loop_var_pos, *loop_var_name);
ASSERT(!loop_var_primary->IsPrimaryNode());
loop_var_assignment =
- loop_var_primary->MakeAssignmentNode(iterator_next);
+ CreateAssignmentNode(loop_var_primary, iterator_next);
if (loop_var_assignment == NULL) {
ErrorMsg(loop_var_pos, "variable or field '%s' is not assignable",
loop_var_name->ToCString());
@@ -6109,6 +6109,16 @@
}
+// Ensure that the expression temp is allocated for nodes that may need it.
+AstNode* Parser::CreateAssignmentNode(AstNode* original, AstNode* rhs) {
+ AstNode* result = original->MakeAssignmentNode(rhs);
+ if ((result != NULL) && result->IsStoreIndexedNode()) {
+ EnsureExpressionTemp();
+ }
+ return result;
+}
+
+
AstNode* Parser::ParseExpr(bool require_compiletime_const) {
TRACE_PARSER("ParseExpr");
const intptr_t expr_pos = token_index_;
@@ -6135,7 +6145,7 @@
}
right_expr =
ExpandAssignableOp(assignment_pos, assignment_op, expr, right_expr);
- AstNode* assign_expr = left_expr->MakeAssignmentNode(right_expr);
+ AstNode* assign_expr = CreateAssignmentNode(left_expr, right_expr);
if (assign_expr == NULL) {
ErrorMsg(assignment_pos,
"left hand side of '%s' is not assignable",
@@ -6202,7 +6212,7 @@
binary_op,
expr,
new LiteralNode(op_pos, Smi::ZoneHandle(Smi::New(1))));
- AstNode* store = left_expr->MakeAssignmentNode(add);
+ AstNode* store = CreateAssignmentNode(left_expr, add);
expr = store;
} else {
expr = ParsePostfixExpr();
@@ -6367,7 +6377,7 @@
left_load_access = PrepareCompoundAssignmentNodes(&load_access);
}
value = ExpandAssignableOp(call_pos, assignment_op, load_access, value);
- access = left_load_access->MakeAssignmentNode(value);
+ access = CreateAssignmentNode(left_load_access, value);
} else {
access = CallGetter(call_pos, receiver, field_name);
}
@@ -6450,7 +6460,7 @@
load_access = GenerateStaticFieldLookup(field, token_index_);
}
value = ExpandAssignableOp(call_pos, assignment_op, load_access, value);
- access = load_access->MakeAssignmentNode(value);
+ access = CreateAssignmentNode(load_access, value);
} else { // Not Token::IsAssignmentOperator(CurrentToken()).
if (field.IsNull()) {
// No field, check if we have an explicit getter function.
@@ -6693,7 +6703,7 @@
binary_op,
save,
new LiteralNode(postfix_expr_pos, Smi::ZoneHandle(Smi::New(1))));
- AstNode* store = left_expr->MakeAssignmentNode(add);
+ AstNode* store = CreateAssignmentNode(left_expr, add);
LoadLocalNode* load_res =
new LoadLocalNode(postfix_expr_pos, temp, store);
return load_res;
« no previous file with comments | « runtime/vm/parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698