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

Unified Diff: runtime/vm/parser.cc

Issue 14942010: Eliminate temporary locals for some expressions (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: cleaned up Created 7 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
Index: runtime/vm/parser.cc
===================================================================
--- runtime/vm/parser.cc (revision 23243)
+++ runtime/vm/parser.cc (working copy)
@@ -116,13 +116,6 @@
}
-LocalVariable* ParsedFunction::CreateArrayLiteralVar(intptr_t token_pos) {
- return new LocalVariable(token_pos,
- Symbols::ArrayLiteralVar(),
- Type::ZoneHandle(Type::ArrayType()));
-}
-
-
void ParsedFunction::SetNodeSequence(SequenceNode* node_sequence) {
ASSERT(node_sequence_ == NULL);
ASSERT(node_sequence != NULL);
@@ -788,10 +781,6 @@
UNREACHABLE();
}
- parsed_function->set_array_literal_var(
- ParsedFunction::CreateArrayLiteralVar(func.token_pos()));
- node_sequence->scope()->AddVariable(parsed_function->array_literal_var());
-
if (!HasReturnNode(node_sequence)) {
// Add implicit return node.
node_sequence->Add(new ReturnNode(func.end_token_pos()));
@@ -1409,18 +1398,6 @@
}
-LocalVariable* Parser::BuildArrayTempLocal(intptr_t token_pos) {
- char name[64];
- OS::SNPrint(name, 64, ":arrlit%"Pd, token_pos);
- LocalVariable* temp =
- new LocalVariable(token_pos,
- String::ZoneHandle(Symbols::New(name)),
- Type::ZoneHandle(Type::ArrayType()));
- current_block_->scope->AddVariable(temp);
- return temp;
-}
-
-
StaticCallNode* Parser::BuildInvocationMirrorAllocation(
intptr_t call_pos,
const String& function_name,
@@ -1438,9 +1415,8 @@
arguments->Add(new LiteralNode(args_pos, args_descriptor));
// The third argument is an array containing the original function arguments,
// including the receiver.
- ArrayNode* args_array = new ArrayNode(
- args_pos, Type::ZoneHandle(Type::ArrayType()),
- *BuildArrayTempLocal(call_pos));
+ ArrayNode* args_array =
+ new ArrayNode(args_pos, Type::ZoneHandle(Type::ArrayType()));
for (intptr_t i = 0; i < function_args.length(); i++) {
args_array->AddElement(function_args.NodeAt(i));
}
@@ -7759,7 +7735,7 @@
AstNode* Parser::ParsePostfixExpr() {
TRACE_PARSER("ParsePostfixExpr");
- const intptr_t postfix_expr_pos = TokenPos();
+ const intptr_t token_pos = TokenPos();
hausner 2013/05/28 17:00:47 Why are you renaming this? The old name expresses
Florian Schneider 2013/05/30 09:29:31 I found it too long so that it caused some ugly li
AstNode* postfix_expr = ParsePrimary();
postfix_expr = ParseSelectors(postfix_expr, false);
if (IsIncrementOperator(CurrentToken())) {
@@ -7770,24 +7746,79 @@
}
ConsumeToken();
// Not prefix.
+ if (postfix_expr->IsInstanceGetterNode()) {
hausner 2013/05/28 17:00:47 I think this special case needs to be handled in P
Florian Schneider 2013/05/30 09:29:31 Yes, I'll handle this and the other cases in Prepa
+ InstanceGetterNode* getter = postfix_expr->AsInstanceGetterNode();
+ Token::Kind binary_op =
+ (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
+ if (!IsSimpleLocalOrLiteralNode(getter->receiver())) {
+ LetNode* result = new LetNode(token_pos, 2);
+ result->SetTempExpression(0, getter->receiver());
+ result->SetTempExpression(
+ 1,
+ new InstanceGetterNode(
+ token_pos,
+ new LoadLocalNode(token_pos, result->temp(0)),
+ getter->field_name()));
+ BinaryOpNode* add = new BinaryOpNode(
+ token_pos,
+ binary_op,
+ new LoadLocalNode(token_pos, result->temp(1)),
+ new LiteralNode(token_pos, Smi::ZoneHandle(Smi::New(1))));
+ InstanceSetterNode* store = new InstanceSetterNode(
+ token_pos,
+ new LoadLocalNode(token_pos, result->temp(0)),
+ getter->field_name(),
+ add);
+ CommaNode* body = new CommaNode(
+ token_pos,
+ store,
+ new LoadLocalNode(token_pos, result->temp(1))); // Result value.
+ result->set_body(body);
+ return result;
+ } else {
+ LetNode* result = new LetNode(token_pos, 1);
+ result->SetTempExpression(
+ 0,
+ new InstanceGetterNode(
+ token_pos,
+ getter->receiver(),
+ getter->field_name()));
+ BinaryOpNode* add = new BinaryOpNode(
+ token_pos,
+ binary_op,
+ new LoadLocalNode(token_pos, result->temp(0)),
+ new LiteralNode(token_pos, Smi::ZoneHandle(Smi::New(1))));
+ InstanceSetterNode* store = new InstanceSetterNode(
+ token_pos,
+ getter->receiver(),
+ getter->field_name(),
+ add);
+ CommaNode* body = new CommaNode(
+ token_pos,
+ store,
+ new LoadLocalNode(token_pos, result->temp(0))); // Result value.
+ result->set_body(body);
+ return result;
+ }
+ }
AstNode* left_expr = PrepareCompoundAssignmentNodes(&postfix_expr);
const LocalVariable* temp = GetIncrementTempLocal();
hausner 2013/05/28 17:00:47 Can this temporary local variable be handled with
Florian Schneider 2013/05/30 09:29:31 Yes, definitely. The plan is to replace it here as
AstNode* save =
- new StoreLocalNode(postfix_expr_pos, temp, postfix_expr);
+ new StoreLocalNode(token_pos, temp, postfix_expr);
Token::Kind binary_op =
(incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
BinaryOpNode* add = new BinaryOpNode(
- postfix_expr_pos,
+ token_pos,
binary_op,
save,
- new LiteralNode(postfix_expr_pos, Smi::ZoneHandle(Smi::New(1))));
+ new LiteralNode(token_pos, Smi::ZoneHandle(Smi::New(1))));
AstNode* store = CreateAssignmentNode(left_expr, add);
// The result is a pair of the (side effects of the) store followed by
// the (value of the) initial value temp variable load.
return new CommaNode(
- postfix_expr_pos,
+ token_pos,
store,
- new LoadLocalNode(postfix_expr_pos, temp));
+ new LoadLocalNode(token_pos, temp));
}
return postfix_expr;
}
@@ -8862,9 +8893,7 @@
new LiteralNode(TokenPos(), empty_array);
factory_param->Add(empty_array_literal);
} else {
- const LocalVariable& temp_local = *BuildArrayTempLocal(type_pos);
- ArrayNode* list =
- new ArrayNode(TokenPos(), type, temp_local, element_list);
+ ArrayNode* list = new ArrayNode(TokenPos(), type, element_list);
factory_param->Add(list);
}
return CreateConstructorCallNode(literal_pos,
@@ -8883,13 +8912,10 @@
if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
EnsureExpressionTemp();
}
- LocalVariable* allocated =
- CreateTempConstVariable(token_pos, "alloc");
return new ConstructorCallNode(token_pos,
type_arguments,
constructor,
- arguments,
- allocated);
+ arguments);
}
@@ -9087,7 +9113,6 @@
ArrayNode* kv_pairs = new ArrayNode(
TokenPos(),
Type::ZoneHandle(Type::ArrayType()),
- *BuildArrayTempLocal(type_pos),
kv_pairs_list);
factory_param->Add(kv_pairs);
return CreateConstructorCallNode(literal_pos,
@@ -9474,7 +9499,6 @@
ArrayNode* values = new ArrayNode(
TokenPos(),
Type::ZoneHandle(Type::ArrayType()),
- *BuildArrayTempLocal(TokenPos()),
values_list);
interpolate_arg->Add(values);
primary = MakeStaticCall(Symbols::StringBase(),

Powered by Google App Engine
This is Rietveld 408576698