| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/parser.h" | 5 #include "vm/parser.h" |
| 6 | 6 |
| 7 #include "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
| 8 #include "platform/utils.h" | 8 #include "platform/utils.h" |
| 9 #include "vm/ast_transformer.h" | 9 #include "vm/ast_transformer.h" |
| 10 #include "vm/bootstrap.h" | 10 #include "vm/bootstrap.h" |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 Symbols::ExprTemp(), | 120 Symbols::ExprTemp(), |
| 121 Type::ZoneHandle(Type::DynamicType())); | 121 Type::ZoneHandle(Type::DynamicType())); |
| 122 ASSERT(temp != NULL); | 122 ASSERT(temp != NULL); |
| 123 set_expression_temp_var(temp); | 123 set_expression_temp_var(temp); |
| 124 } | 124 } |
| 125 ASSERT(has_expression_temp_var()); | 125 ASSERT(has_expression_temp_var()); |
| 126 return expression_temp_var(); | 126 return expression_temp_var(); |
| 127 } | 127 } |
| 128 | 128 |
| 129 | 129 |
| 130 LocalVariable* ParsedFunction::EnsureSavedCurrentContext() { |
| 131 if (!has_saved_current_context_var()) { |
| 132 LocalVariable* temp = new(I) LocalVariable( |
| 133 function().token_pos(), |
| 134 Symbols::SavedCurrentContextVar(), |
| 135 Type::ZoneHandle(I, Type::DynamicType())); |
| 136 ASSERT(temp != NULL); |
| 137 set_saved_current_context_var(temp); |
| 138 } |
| 139 return saved_current_context_var(); |
| 140 } |
| 141 |
| 142 |
| 130 void ParsedFunction::EnsureFinallyReturnTemp() { | 143 void ParsedFunction::EnsureFinallyReturnTemp() { |
| 131 if (!has_finally_return_temp_var()) { | 144 if (!has_finally_return_temp_var()) { |
| 132 LocalVariable* temp = new(I) LocalVariable( | 145 LocalVariable* temp = new(I) LocalVariable( |
| 133 function_.token_pos(), | 146 function_.token_pos(), |
| 134 String::ZoneHandle(I, Symbols::New(":finally_ret_val")), | 147 String::ZoneHandle(I, Symbols::New(":finally_ret_val")), |
| 135 Type::ZoneHandle(I, Type::DynamicType())); | 148 Type::ZoneHandle(I, Type::DynamicType())); |
| 136 ASSERT(temp != NULL); | 149 ASSERT(temp != NULL); |
| 137 temp->set_is_final(); | 150 temp->set_is_final(); |
| 138 set_finally_return_temp_var(temp); | 151 set_finally_return_temp_var(temp); |
| 139 } | 152 } |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 parsed_function->function().origin()).library())), | 351 parsed_function->function().origin()).library())), |
| 339 try_blocks_list_(NULL), | 352 try_blocks_list_(NULL), |
| 340 last_used_try_index_(0), | 353 last_used_try_index_(0), |
| 341 unregister_pending_function_(false), | 354 unregister_pending_function_(false), |
| 342 async_temp_scope_(NULL) { | 355 async_temp_scope_(NULL) { |
| 343 ASSERT(tokens_iterator_.IsValid()); | 356 ASSERT(tokens_iterator_.IsValid()); |
| 344 ASSERT(!current_function().IsNull()); | 357 ASSERT(!current_function().IsNull()); |
| 345 if (FLAG_enable_type_checks) { | 358 if (FLAG_enable_type_checks) { |
| 346 EnsureExpressionTemp(); | 359 EnsureExpressionTemp(); |
| 347 } | 360 } |
| 361 EnsureSavedCurrentContext(); |
| 348 } | 362 } |
| 349 | 363 |
| 350 | 364 |
| 351 Parser::~Parser() { | 365 Parser::~Parser() { |
| 352 if (unregister_pending_function_) { | 366 if (unregister_pending_function_) { |
| 353 const GrowableObjectArray& pending_functions = | 367 const GrowableObjectArray& pending_functions = |
| 354 GrowableObjectArray::Handle(I->object_store()->pending_functions()); | 368 GrowableObjectArray::Handle(I->object_store()->pending_functions()); |
| 355 ASSERT(pending_functions.Length() > 0); | 369 ASSERT(pending_functions.Length() > 0); |
| 356 ASSERT(pending_functions.At(pending_functions.Length()-1) == | 370 ASSERT(pending_functions.At(pending_functions.Length()-1) == |
| 357 current_function().raw()); | 371 current_function().raw()); |
| (...skipping 1022 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1380 args->Add(new(I) LoadLocalNode(token_pos, scope->VariableAt(i))); | 1394 args->Add(new(I) LoadLocalNode(token_pos, scope->VariableAt(i))); |
| 1381 intptr_t index = i - desc.PositionalCount(); | 1395 intptr_t index = i - desc.PositionalCount(); |
| 1382 names.SetAt(index, String::Handle(I, desc.NameAt(index))); | 1396 names.SetAt(index, String::Handle(I, desc.NameAt(index))); |
| 1383 } | 1397 } |
| 1384 args->set_names(names); | 1398 args->set_names(names); |
| 1385 | 1399 |
| 1386 const Class& owner = Class::Handle(I, func.Owner()); | 1400 const Class& owner = Class::Handle(I, func.Owner()); |
| 1387 ASSERT(!owner.IsNull()); | 1401 ASSERT(!owner.IsNull()); |
| 1388 AstNode* result = NULL; | 1402 AstNode* result = NULL; |
| 1389 if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) { | 1403 if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) { |
| 1390 EnsureSavedCurrentContext(); | |
| 1391 result = new ClosureCallNode(token_pos, getter_call, args); | 1404 result = new ClosureCallNode(token_pos, getter_call, args); |
| 1392 } else { | 1405 } else { |
| 1393 result = BuildClosureCall(token_pos, getter_call, args); | 1406 result = BuildClosureCall(token_pos, getter_call, args); |
| 1394 } | 1407 } |
| 1395 | 1408 |
| 1396 ReturnNode* return_node = new ReturnNode(token_pos, result); | 1409 ReturnNode* return_node = new ReturnNode(token_pos, result); |
| 1397 current_block_->statements->Add(return_node); | 1410 current_block_->statements->Add(return_node); |
| 1398 return CloseBlock(); | 1411 return CloseBlock(); |
| 1399 } | 1412 } |
| 1400 | 1413 |
| (...skipping 7141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8542 } | 8555 } |
| 8543 | 8556 |
| 8544 | 8557 |
| 8545 void Parser::EnsureExpressionTemp() { | 8558 void Parser::EnsureExpressionTemp() { |
| 8546 // Temporary used later by the flow_graph_builder. | 8559 // Temporary used later by the flow_graph_builder. |
| 8547 parsed_function()->EnsureExpressionTemp(); | 8560 parsed_function()->EnsureExpressionTemp(); |
| 8548 } | 8561 } |
| 8549 | 8562 |
| 8550 | 8563 |
| 8551 void Parser::EnsureSavedCurrentContext() { | 8564 void Parser::EnsureSavedCurrentContext() { |
| 8552 // Used later by the flow_graph_builder to save current context. | 8565 parsed_function()->EnsureSavedCurrentContext(); |
| 8553 if (!parsed_function()->has_saved_current_context_var()) { | |
| 8554 LocalVariable* temp = new(I) LocalVariable( | |
| 8555 current_function().token_pos(), | |
| 8556 Symbols::SavedCurrentContextVar(), | |
| 8557 Type::ZoneHandle(I, Type::DynamicType())); | |
| 8558 ASSERT(temp != NULL); | |
| 8559 parsed_function()->set_saved_current_context_var(temp); | |
| 8560 } | |
| 8561 } | 8566 } |
| 8562 | 8567 |
| 8563 | 8568 |
| 8564 LocalVariable* Parser::CreateTempConstVariable(intptr_t token_pos, | 8569 LocalVariable* Parser::CreateTempConstVariable(intptr_t token_pos, |
| 8565 const char* s) { | 8570 const char* s) { |
| 8566 char name[64]; | 8571 char name[64]; |
| 8567 OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos); | 8572 OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos); |
| 8568 LocalVariable* temp = new(I) LocalVariable( | 8573 LocalVariable* temp = new(I) LocalVariable( |
| 8569 token_pos, | 8574 token_pos, |
| 8570 String::ZoneHandle(I, Symbols::New(name)), | 8575 String::ZoneHandle(I, Symbols::New(name)), |
| (...skipping 3228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11799 void Parser::SkipQualIdent() { | 11804 void Parser::SkipQualIdent() { |
| 11800 ASSERT(IsIdentifier()); | 11805 ASSERT(IsIdentifier()); |
| 11801 ConsumeToken(); | 11806 ConsumeToken(); |
| 11802 if (CurrentToken() == Token::kPERIOD) { | 11807 if (CurrentToken() == Token::kPERIOD) { |
| 11803 ConsumeToken(); // Consume the kPERIOD token. | 11808 ConsumeToken(); // Consume the kPERIOD token. |
| 11804 ExpectIdentifier("identifier expected after '.'"); | 11809 ExpectIdentifier("identifier expected after '.'"); |
| 11805 } | 11810 } |
| 11806 } | 11811 } |
| 11807 | 11812 |
| 11808 } // namespace dart | 11813 } // namespace dart |
| OLD | NEW |