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(), |