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

Side by Side Diff: runtime/vm/parser.cc

Issue 678763004: Make CTX allocatable by the register allocator. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: incorporated latest comments Created 6 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 846 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 UNREACHABLE(); 857 UNREACHABLE();
858 } 858 }
859 859
860 if (!HasReturnNode(node_sequence)) { 860 if (!HasReturnNode(node_sequence)) {
861 // Add implicit return node. 861 // Add implicit return node.
862 node_sequence->Add(new ReturnNode(func.end_token_pos())); 862 node_sequence->Add(new ReturnNode(func.end_token_pos()));
863 } 863 }
864 if (parsed_function->has_expression_temp_var()) { 864 if (parsed_function->has_expression_temp_var()) {
865 node_sequence->scope()->AddVariable(parsed_function->expression_temp_var()); 865 node_sequence->scope()->AddVariable(parsed_function->expression_temp_var());
866 } 866 }
867 if (parsed_function->has_saved_current_context_var()) { 867 node_sequence->scope()->AddVariable(
868 node_sequence->scope()->AddVariable( 868 parsed_function->current_context_var());
869 parsed_function->saved_current_context_var());
870 }
871 if (parsed_function->has_finally_return_temp_var()) { 869 if (parsed_function->has_finally_return_temp_var()) {
872 node_sequence->scope()->AddVariable( 870 node_sequence->scope()->AddVariable(
873 parsed_function->finally_return_temp_var()); 871 parsed_function->finally_return_temp_var());
874 } 872 }
875 parsed_function->SetNodeSequence(node_sequence); 873 parsed_function->SetNodeSequence(node_sequence);
876 874
877 // The instantiator may be required at run time for generic type checks or 875 // The instantiator may be required at run time for generic type checks or
878 // allocation of generic types. 876 // allocation of generic types.
879 if (parser.IsInstantiatorRequired()) { 877 if (parser.IsInstantiatorRequired()) {
880 // In the case of a local function, only set the instantiator if the 878 // In the case of a local function, only set the instantiator if the
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 ParsedFunction* parsed_function = new ParsedFunction(isolate, initializer); 1059 ParsedFunction* parsed_function = new ParsedFunction(isolate, initializer);
1062 Parser parser(script, parsed_function, field.token_pos()); 1060 Parser parser(script, parsed_function, field.token_pos());
1063 1061
1064 SequenceNode* body = parser.ParseStaticInitializer(); 1062 SequenceNode* body = parser.ParseStaticInitializer();
1065 parsed_function->SetNodeSequence(body); 1063 parsed_function->SetNodeSequence(body);
1066 parsed_function->set_default_parameter_values(Object::null_array()); 1064 parsed_function->set_default_parameter_values(Object::null_array());
1067 1065
1068 if (parsed_function->has_expression_temp_var()) { 1066 if (parsed_function->has_expression_temp_var()) {
1069 body->scope()->AddVariable(parsed_function->expression_temp_var()); 1067 body->scope()->AddVariable(parsed_function->expression_temp_var());
1070 } 1068 }
1071 if (parsed_function->has_saved_current_context_var()) { 1069 body->scope()->AddVariable(parsed_function->current_context_var());
1072 body->scope()->AddVariable(parsed_function->saved_current_context_var());
1073 }
1074 if (parsed_function->has_finally_return_temp_var()) { 1070 if (parsed_function->has_finally_return_temp_var()) {
1075 body->scope()->AddVariable(parsed_function->finally_return_temp_var()); 1071 body->scope()->AddVariable(parsed_function->finally_return_temp_var());
1076 } 1072 }
1077 // The instantiator is not required in a static expression. 1073 // The instantiator is not required in a static expression.
1078 ASSERT(!parser.IsInstantiatorRequired()); 1074 ASSERT(!parser.IsInstantiatorRequired());
1079 1075
1080 return parsed_function; 1076 return parsed_function;
1081 } 1077 }
1082 1078
1083 1079
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 args->Add(new(I) LoadLocalNode(token_pos, scope->VariableAt(i))); 1376 args->Add(new(I) LoadLocalNode(token_pos, scope->VariableAt(i)));
1381 intptr_t index = i - desc.PositionalCount(); 1377 intptr_t index = i - desc.PositionalCount();
1382 names.SetAt(index, String::Handle(I, desc.NameAt(index))); 1378 names.SetAt(index, String::Handle(I, desc.NameAt(index)));
1383 } 1379 }
1384 args->set_names(names); 1380 args->set_names(names);
1385 1381
1386 const Class& owner = Class::Handle(I, func.Owner()); 1382 const Class& owner = Class::Handle(I, func.Owner());
1387 ASSERT(!owner.IsNull()); 1383 ASSERT(!owner.IsNull());
1388 AstNode* result = NULL; 1384 AstNode* result = NULL;
1389 if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) { 1385 if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) {
1390 EnsureSavedCurrentContext();
1391 result = new ClosureCallNode(token_pos, getter_call, args); 1386 result = new ClosureCallNode(token_pos, getter_call, args);
1392 } else { 1387 } else {
1393 result = BuildClosureCall(token_pos, getter_call, args); 1388 result = BuildClosureCall(token_pos, getter_call, args);
1394 } 1389 }
1395 1390
1396 ReturnNode* return_node = new ReturnNode(token_pos, result); 1391 ReturnNode* return_node = new ReturnNode(token_pos, result);
1397 current_block_->statements->Add(return_node); 1392 current_block_->statements->Add(return_node);
1398 return CloseBlock(); 1393 return CloseBlock();
1399 } 1394 }
1400 1395
(...skipping 7287 matching lines...) Expand 10 before | Expand all | Expand 10 after
8688 return expressions; 8683 return expressions;
8689 } 8684 }
8690 8685
8691 8686
8692 void Parser::EnsureExpressionTemp() { 8687 void Parser::EnsureExpressionTemp() {
8693 // Temporary used later by the flow_graph_builder. 8688 // Temporary used later by the flow_graph_builder.
8694 parsed_function()->EnsureExpressionTemp(); 8689 parsed_function()->EnsureExpressionTemp();
8695 } 8690 }
8696 8691
8697 8692
8698 void Parser::EnsureSavedCurrentContext() {
8699 // Used later by the flow_graph_builder to save current context.
8700 if (!parsed_function()->has_saved_current_context_var()) {
8701 LocalVariable* temp = new(I) LocalVariable(
8702 current_function().token_pos(),
8703 Symbols::SavedCurrentContextVar(),
8704 Type::ZoneHandle(I, Type::DynamicType()));
8705 ASSERT(temp != NULL);
8706 parsed_function()->set_saved_current_context_var(temp);
8707 }
8708 }
8709
8710
8711 LocalVariable* Parser::CreateTempConstVariable(intptr_t token_pos, 8693 LocalVariable* Parser::CreateTempConstVariable(intptr_t token_pos,
8712 const char* s) { 8694 const char* s) {
8713 char name[64]; 8695 char name[64];
8714 OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos); 8696 OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos);
8715 LocalVariable* temp = new(I) LocalVariable( 8697 LocalVariable* temp = new(I) LocalVariable(
8716 token_pos, 8698 token_pos,
8717 String::ZoneHandle(I, Symbols::New(name)), 8699 String::ZoneHandle(I, Symbols::New(name)),
8718 Type::ZoneHandle(I, Type::DynamicType())); 8700 Type::ZoneHandle(I, Type::DynamicType()));
8719 temp->set_is_final(); 8701 temp->set_is_final();
8720 current_block_->scope->AddVariable(temp); 8702 current_block_->scope->AddVariable(temp);
(...skipping 3225 matching lines...) Expand 10 before | Expand all | Expand 10 after
11946 void Parser::SkipQualIdent() { 11928 void Parser::SkipQualIdent() {
11947 ASSERT(IsIdentifier()); 11929 ASSERT(IsIdentifier());
11948 ConsumeToken(); 11930 ConsumeToken();
11949 if (CurrentToken() == Token::kPERIOD) { 11931 if (CurrentToken() == Token::kPERIOD) {
11950 ConsumeToken(); // Consume the kPERIOD token. 11932 ConsumeToken(); // Consume the kPERIOD token.
11951 ExpectIdentifier("identifier expected after '.'"); 11933 ExpectIdentifier("identifier expected after '.'");
11952 } 11934 }
11953 } 11935 }
11954 11936
11955 } // namespace dart 11937 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698