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

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: 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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
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() {
hausner 2014/10/29 16:44:34 Now that every function has a local variable to st
Florian Schneider 2014/10/29 17:50:45 Done. Yes, I can now remove this function.
131 if (!has_current_context_var()) {
132 LocalVariable* temp = new(I) LocalVariable(
133 function().token_pos(),
134 Symbols::CurrentContextVar(),
135 Type::ZoneHandle(I, Type::DynamicType()));
136 ASSERT(temp != NULL);
137 set_current_context_var(temp);
138 }
139 return 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
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 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 UNREACHABLE(); 871 UNREACHABLE();
858 } 872 }
859 873
860 if (!HasReturnNode(node_sequence)) { 874 if (!HasReturnNode(node_sequence)) {
861 // Add implicit return node. 875 // Add implicit return node.
862 node_sequence->Add(new ReturnNode(func.end_token_pos())); 876 node_sequence->Add(new ReturnNode(func.end_token_pos()));
863 } 877 }
864 if (parsed_function->has_expression_temp_var()) { 878 if (parsed_function->has_expression_temp_var()) {
865 node_sequence->scope()->AddVariable(parsed_function->expression_temp_var()); 879 node_sequence->scope()->AddVariable(parsed_function->expression_temp_var());
866 } 880 }
867 if (parsed_function->has_saved_current_context_var()) { 881 if (parsed_function->has_current_context_var()) {
hausner 2014/10/29 16:44:34 This is always true now, correct?
Florian Schneider 2014/10/29 17:50:45 Done.
868 node_sequence->scope()->AddVariable( 882 node_sequence->scope()->AddVariable(
869 parsed_function->saved_current_context_var()); 883 parsed_function->current_context_var());
870 } 884 }
871 if (parsed_function->has_finally_return_temp_var()) { 885 if (parsed_function->has_finally_return_temp_var()) {
872 node_sequence->scope()->AddVariable( 886 node_sequence->scope()->AddVariable(
873 parsed_function->finally_return_temp_var()); 887 parsed_function->finally_return_temp_var());
874 } 888 }
875 parsed_function->SetNodeSequence(node_sequence); 889 parsed_function->SetNodeSequence(node_sequence);
876 890
877 // The instantiator may be required at run time for generic type checks or 891 // The instantiator may be required at run time for generic type checks or
878 // allocation of generic types. 892 // allocation of generic types.
879 if (parser.IsInstantiatorRequired()) { 893 if (parser.IsInstantiatorRequired()) {
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 ParsedFunction* parsed_function = new ParsedFunction(isolate, initializer); 1075 ParsedFunction* parsed_function = new ParsedFunction(isolate, initializer);
1062 Parser parser(script, parsed_function, field.token_pos()); 1076 Parser parser(script, parsed_function, field.token_pos());
1063 1077
1064 SequenceNode* body = parser.ParseStaticInitializer(); 1078 SequenceNode* body = parser.ParseStaticInitializer();
1065 parsed_function->SetNodeSequence(body); 1079 parsed_function->SetNodeSequence(body);
1066 parsed_function->set_default_parameter_values(Object::null_array()); 1080 parsed_function->set_default_parameter_values(Object::null_array());
1067 1081
1068 if (parsed_function->has_expression_temp_var()) { 1082 if (parsed_function->has_expression_temp_var()) {
1069 body->scope()->AddVariable(parsed_function->expression_temp_var()); 1083 body->scope()->AddVariable(parsed_function->expression_temp_var());
1070 } 1084 }
1071 if (parsed_function->has_saved_current_context_var()) { 1085 if (parsed_function->has_current_context_var()) {
hausner 2014/10/29 16:44:34 ditto
Florian Schneider 2014/10/29 17:50:45 Done.
1072 body->scope()->AddVariable(parsed_function->saved_current_context_var()); 1086 body->scope()->AddVariable(parsed_function->current_context_var());
1073 } 1087 }
1074 if (parsed_function->has_finally_return_temp_var()) { 1088 if (parsed_function->has_finally_return_temp_var()) {
1075 body->scope()->AddVariable(parsed_function->finally_return_temp_var()); 1089 body->scope()->AddVariable(parsed_function->finally_return_temp_var());
1076 } 1090 }
1077 // The instantiator is not required in a static expression. 1091 // The instantiator is not required in a static expression.
1078 ASSERT(!parser.IsInstantiatorRequired()); 1092 ASSERT(!parser.IsInstantiatorRequired());
1079 1093
1080 return parsed_function; 1094 return parsed_function;
1081 } 1095 }
1082 1096
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 7288 matching lines...) Expand 10 before | Expand all | Expand 10 after
8689 } 8702 }
8690 8703
8691 8704
8692 void Parser::EnsureExpressionTemp() { 8705 void Parser::EnsureExpressionTemp() {
8693 // Temporary used later by the flow_graph_builder. 8706 // Temporary used later by the flow_graph_builder.
8694 parsed_function()->EnsureExpressionTemp(); 8707 parsed_function()->EnsureExpressionTemp();
8695 } 8708 }
8696 8709
8697 8710
8698 void Parser::EnsureSavedCurrentContext() { 8711 void Parser::EnsureSavedCurrentContext() {
8699 // Used later by the flow_graph_builder to save current context. 8712 parsed_function()->EnsureSavedCurrentContext();
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 } 8713 }
8709 8714
8710 8715
8711 LocalVariable* Parser::CreateTempConstVariable(intptr_t token_pos, 8716 LocalVariable* Parser::CreateTempConstVariable(intptr_t token_pos,
8712 const char* s) { 8717 const char* s) {
8713 char name[64]; 8718 char name[64];
8714 OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos); 8719 OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos);
8715 LocalVariable* temp = new(I) LocalVariable( 8720 LocalVariable* temp = new(I) LocalVariable(
8716 token_pos, 8721 token_pos,
8717 String::ZoneHandle(I, Symbols::New(name)), 8722 String::ZoneHandle(I, Symbols::New(name)),
(...skipping 3228 matching lines...) Expand 10 before | Expand all | Expand 10 after
11946 void Parser::SkipQualIdent() { 11951 void Parser::SkipQualIdent() {
11947 ASSERT(IsIdentifier()); 11952 ASSERT(IsIdentifier());
11948 ConsumeToken(); 11953 ConsumeToken();
11949 if (CurrentToken() == Token::kPERIOD) { 11954 if (CurrentToken() == Token::kPERIOD) {
11950 ConsumeToken(); // Consume the kPERIOD token. 11955 ConsumeToken(); // Consume the kPERIOD token.
11951 ExpectIdentifier("identifier expected after '.'"); 11956 ExpectIdentifier("identifier expected after '.'");
11952 } 11957 }
11953 } 11958 }
11954 11959
11955 } // namespace dart 11960 } // namespace dart
OLDNEW
« runtime/vm/debugger.cc ('K') | « runtime/vm/parser.h ('k') | runtime/vm/parser_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698