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

Unified Diff: runtime/vm/parser.cc

Issue 135913003: Optimize getField by caching a closure generated from a specialized function kind. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 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
« no previous file with comments | « runtime/vm/parser.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 2958e4798f00198a7041db0f02d686c0963e5ca0..4a89597fb515c3a2e7a86d31348f8670d5ed5464 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -782,6 +782,12 @@ void Parser::ParseFunction(ParsedFunction* parsed_function) {
}
node_sequence = parser.ParseFunc(func, default_parameter_values);
break;
+ case RawFunction::kGetFieldClosure:
+ node_sequence = parser.ParseGetFieldClosure(func);
+ break;
+ case RawFunction::kSetFieldClosure:
+ node_sequence = parser.ParseSetFieldClosure(func);
+ break;
case RawFunction::kImplicitGetter:
ASSERT(!func.is_static());
node_sequence = parser.ParseInstanceGetter(func);
@@ -1230,6 +1236,72 @@ SequenceNode* Parser::ParseInstanceSetter(const Function& func) {
}
+SequenceNode* Parser::ParseGetFieldClosure(const Function& func) {
+ TRACE_PARSER("ParseGetFieldClosure");
+ ParamList params;
+
+ const intptr_t ident_pos = func.token_pos();
+ ASSERT(func.token_pos() == 0);
+ ASSERT(current_class().raw() == func.Owner());
+ params.AddReceiver(ReceiverType(current_class()), ident_pos);
+ params.AddFinalParameter(0, // token pos
+ &Symbols::PhaseParameter(),
+ &Type::ZoneHandle(Type::DynamicType()));
+ ASSERT(func.num_fixed_parameters() == 2);
+ ASSERT(!func.HasOptionalParameters());
+
+ OpenFunctionBlock(func);
+ AddFormalParamsToScope(&params, current_block_->scope);
+
+ LoadLocalNode* victim =
+ new LoadLocalNode(ident_pos, current_block_->scope->VariableAt(1));
+
+ const String& selector = String::ZoneHandle(func.name());
+ AstNode* get_field = CallGetter(ident_pos, victim, selector);
+
+ ReturnNode* return_node = new ReturnNode(ident_pos, get_field);
+ current_block_->statements->Add(return_node);
+ return CloseBlock();
+}
+
+
+SequenceNode* Parser::ParseSetFieldClosure(const Function& func) {
+ TRACE_PARSER("ParseSetFieldClosure");
+ ParamList params;
+
+ const intptr_t ident_pos = func.token_pos();
+ ASSERT(func.token_pos() == 0);
+ ASSERT(current_class().raw() == func.Owner());
+ params.AddReceiver(ReceiverType(current_class()), ident_pos);
+ params.AddFinalParameter(0, // token pos
+ &Symbols::PhaseParameter(),
+ &Type::ZoneHandle(Type::DynamicType()));
+ params.AddFinalParameter(0, // token pos
+ &Symbols::Value(),
+ &Type::ZoneHandle(Type::DynamicType()));
+ ASSERT(func.num_fixed_parameters() == 3);
+ ASSERT(!func.HasOptionalParameters());
+
+ OpenFunctionBlock(func);
+ AddFormalParamsToScope(&params, current_block_->scope);
+
+ LoadLocalNode* victim =
+ new LoadLocalNode(ident_pos, current_block_->scope->VariableAt(1));
+ LoadLocalNode* value =
+ new LoadLocalNode(ident_pos, current_block_->scope->VariableAt(2));
+
+ const String& selector = String::ZoneHandle(func.name());
+ AstNode* get_field = CallGetter(ident_pos, victim, selector);
+ AstNode* set_field =
+ Parser::CreateAssignmentNode(get_field, value, &selector, ident_pos);
+ ASSERT(set_field->IsInstanceSetterNode());
+
+ ReturnNode* return_node = new ReturnNode(ident_pos, set_field);
+ current_block_->statements->Add(return_node);
+ return CloseBlock();
+}
+
+
SequenceNode* Parser::ParseMethodExtractor(const Function& func) {
TRACE_PARSER("ParseMethodExtractor");
ParamList params;
« no previous file with comments | « runtime/vm/parser.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698