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

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

Issue 2481873005: clang-format runtime/vm (Closed)
Patch Set: Merge Created 4 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
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/libdart_dependency_helper.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 <map> 5 #include <map>
6 #include <set> 6 #include <set>
7 #include <string> 7 #include <string>
8 8
9 #include "vm/kernel_to_il.h" 9 #include "vm/kernel_to_il.h"
10 10
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 } 56 }
57 } 57 }
58 58
59 59
60 void ScopeBuilder::EnterScope(TreeNode* node) { 60 void ScopeBuilder::EnterScope(TreeNode* node) {
61 scope_ = new (Z) LocalScope(scope_, depth_.function_, depth_.loop_); 61 scope_ = new (Z) LocalScope(scope_, depth_.function_, depth_.loop_);
62 result_->scopes.Insert(node, scope_); 62 result_->scopes.Insert(node, scope_);
63 } 63 }
64 64
65 65
66 void ScopeBuilder::ExitScope() { scope_ = scope_->parent(); } 66 void ScopeBuilder::ExitScope() {
67 scope_ = scope_->parent();
68 }
67 69
68 70
69 LocalVariable* ScopeBuilder::MakeVariable(const dart::String& name, 71 LocalVariable* ScopeBuilder::MakeVariable(const dart::String& name,
70 const AbstractType& type) { 72 const AbstractType& type) {
71 return new (Z) LocalVariable(TokenPosition::kNoSource, 73 return new (Z) LocalVariable(TokenPosition::kNoSource,
72 TokenPosition::kNoSource, 74 TokenPosition::kNoSource, name, type);
73 name,
74 type);
75 } 75 }
76 76
77 77
78 void ScopeBuilder::AddParameters(FunctionNode* function, intptr_t pos) { 78 void ScopeBuilder::AddParameters(FunctionNode* function, intptr_t pos) {
79 List<VariableDeclaration>& positional = function->positional_parameters(); 79 List<VariableDeclaration>& positional = function->positional_parameters();
80 for (intptr_t i = 0; i < positional.length(); ++i) { 80 for (intptr_t i = 0; i < positional.length(); ++i) {
81 AddParameter(positional[i], pos++); 81 AddParameter(positional[i], pos++);
82 } 82 }
83 List<VariableDeclaration>& named = function->named_parameters(); 83 List<VariableDeclaration>& named = function->named_parameters();
84 for (intptr_t i = 0; i < named.length(); ++i) { 84 for (intptr_t i = 0; i < named.length(); ++i) {
85 AddParameter(named[i], pos++); 85 AddParameter(named[i], pos++);
86 } 86 }
87 } 87 }
88 88
89 89
90 void ScopeBuilder::AddParameter(VariableDeclaration* declaration, 90 void ScopeBuilder::AddParameter(VariableDeclaration* declaration,
91 intptr_t pos) { 91 intptr_t pos) {
92 LocalVariable* variable = 92 LocalVariable* variable = MakeVariable(H.DartSymbol(declaration->name()),
93 MakeVariable(H.DartSymbol(declaration->name()), 93 T.TranslateVariableType(declaration));
94 T.TranslateVariableType(declaration));
95 if (declaration->IsFinal()) { 94 if (declaration->IsFinal()) {
96 variable->set_is_final(); 95 variable->set_is_final();
97 } 96 }
98 scope_->InsertParameterAt(pos, variable); 97 scope_->InsertParameterAt(pos, variable);
99 result_->locals.Insert(declaration, variable); 98 result_->locals.Insert(declaration, variable);
100 99
101 // The default value may contain 'let' bindings for which the constant 100 // The default value may contain 'let' bindings for which the constant
102 // evaluator needs scope bindings. 101 // evaluator needs scope bindings.
103 Expression* defaultValue = declaration->initializer(); 102 Expression* defaultValue = declaration->initializer();
104 if (defaultValue != NULL) { 103 if (defaultValue != NULL) {
105 defaultValue->AcceptExpressionVisitor(this); 104 defaultValue->AcceptExpressionVisitor(this);
106 } 105 }
107 } 106 }
108 107
109 108
110 void ScopeBuilder::AddExceptionVariable( 109 void ScopeBuilder::AddExceptionVariable(
111 GrowableArray<LocalVariable*>* variables, const char* prefix, 110 GrowableArray<LocalVariable*>* variables,
111 const char* prefix,
112 intptr_t nesting_depth) { 112 intptr_t nesting_depth) {
113 LocalVariable* v = NULL; 113 LocalVariable* v = NULL;
114 114
115 // If we are inside a function with yield points then Kernel transformer 115 // If we are inside a function with yield points then Kernel transformer
116 // could have lifted some of the auxiliary exception variables into the 116 // could have lifted some of the auxiliary exception variables into the
117 // context to preserve them across yield points because they might 117 // context to preserve them across yield points because they might
118 // be needed for rethrow. 118 // be needed for rethrow.
119 // Check if it did and capture such variables instead of introducing 119 // Check if it did and capture such variables instead of introducing
120 // new local ones. 120 // new local ones.
121 // Note: function that wrap kSyncYielding function does not contain 121 // Note: function that wrap kSyncYielding function does not contain
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 ParsedFunction* parsed_function = parsed_function_; 261 ParsedFunction* parsed_function = parsed_function_;
262 const dart::Function& function = parsed_function->function(); 262 const dart::Function& function = parsed_function->function();
263 263
264 // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used 264 // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
265 // e.g. for type translation. 265 // e.g. for type translation.
266 const dart::Class& klass = 266 const dart::Class& klass =
267 dart::Class::Handle(zone_, parsed_function_->function().Owner()); 267 dart::Class::Handle(zone_, parsed_function_->function().Owner());
268 Function& outermost_function = Function::Handle(Z); 268 Function& outermost_function = Function::Handle(Z);
269 TreeNode* outermost_node = NULL; 269 TreeNode* outermost_node = NULL;
270 Class* kernel_klass = NULL; 270 Class* kernel_klass = NULL;
271 DiscoverEnclosingElements( 271 DiscoverEnclosingElements(Z, function, &outermost_function, &outermost_node,
272 Z, function, &outermost_function, &outermost_node, &kernel_klass); 272 &kernel_klass);
273 // Use [klass]/[kernel_klass] as active class. Type parameters will get 273 // Use [klass]/[kernel_klass] as active class. Type parameters will get
274 // resolved via [kernel_klass] unless we are nested inside a static factory 274 // resolved via [kernel_klass] unless we are nested inside a static factory
275 // in which case we will use [member]. 275 // in which case we will use [member].
276 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass); 276 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass);
277 Member* member = ((outermost_node != NULL) && outermost_node->IsMember()) 277 Member* member = ((outermost_node != NULL) && outermost_node->IsMember())
278 ? Member::Cast(outermost_node) 278 ? Member::Cast(outermost_node)
279 : NULL; 279 : NULL;
280 ActiveMemberScope active_member(&active_class_, member); 280 ActiveMemberScope active_member(&active_class_, member);
281 281
282 282
(...skipping 23 matching lines...) Expand all
306 node = Procedure::Cast(node_)->function(); 306 node = Procedure::Cast(node_)->function();
307 } else if (node_->IsConstructor()) { 307 } else if (node_->IsConstructor()) {
308 node = Constructor::Cast(node_)->function(); 308 node = Constructor::Cast(node_)->function();
309 } else { 309 } else {
310 node = FunctionNode::Cast(node_); 310 node = FunctionNode::Cast(node_);
311 } 311 }
312 current_function_node_ = node; 312 current_function_node_ = node;
313 313
314 intptr_t pos = 0; 314 intptr_t pos = 0;
315 if (function.IsClosureFunction()) { 315 if (function.IsClosureFunction()) {
316 LocalVariable* variable = 316 LocalVariable* variable = MakeVariable(Symbols::ClosureParameter(),
317 MakeVariable(Symbols::ClosureParameter(), 317 AbstractType::dynamic_type());
318 AbstractType::dynamic_type());
319 variable->set_is_forced_stack(); 318 variable->set_is_forced_stack();
320 scope_->InsertParameterAt(pos++, variable); 319 scope_->InsertParameterAt(pos++, variable);
321 } else if (!function.is_static()) { 320 } else if (!function.is_static()) {
322 // We use [is_static] instead of [IsStaticFunction] because the latter 321 // We use [is_static] instead of [IsStaticFunction] because the latter
323 // returns `false` for constructors. 322 // returns `false` for constructors.
324 dart::Class& klass = dart::Class::Handle(Z, function.Owner()); 323 dart::Class& klass = dart::Class::Handle(Z, function.Owner());
325 Type& klass_type = H.GetCanonicalType(klass); 324 Type& klass_type = H.GetCanonicalType(klass);
326 LocalVariable* variable = MakeVariable(Symbols::This(), klass_type); 325 LocalVariable* variable = MakeVariable(Symbols::This(), klass_type);
327 scope_->InsertParameterAt(pos++, variable); 326 scope_->InsertParameterAt(pos++, variable);
328 result_->this_variable = variable; 327 result_->this_variable = variable;
329 328
330 // We visit instance field initializers because they might contain 329 // We visit instance field initializers because they might contain
331 // [Let] expressions and we need to have a mapping. 330 // [Let] expressions and we need to have a mapping.
332 if (node_->IsConstructor()) { 331 if (node_->IsConstructor()) {
333 Class* klass = Class::Cast(Constructor::Cast(node_)->parent()); 332 Class* klass = Class::Cast(Constructor::Cast(node_)->parent());
334 333
335 for (intptr_t i = 0; i < klass->fields().length(); i++) { 334 for (intptr_t i = 0; i < klass->fields().length(); i++) {
336 Field* field = klass->fields()[i]; 335 Field* field = klass->fields()[i];
337 if (!field->IsStatic() && (field->initializer() != NULL)) { 336 if (!field->IsStatic() && (field->initializer() != NULL)) {
338 EnterScope(field); 337 EnterScope(field);
339 field->initializer()->AcceptExpressionVisitor(this); 338 field->initializer()->AcceptExpressionVisitor(this);
340 ExitScope(); 339 ExitScope();
341 } 340 }
342 } 341 }
343 } 342 }
344 } else if (function.IsFactory()) { 343 } else if (function.IsFactory()) {
345 LocalVariable* variable = MakeVariable( 344 LocalVariable* variable = MakeVariable(
346 Symbols::TypeArgumentsParameter(), 345 Symbols::TypeArgumentsParameter(), AbstractType::dynamic_type());
347 AbstractType::dynamic_type());
348 scope_->InsertParameterAt(pos++, variable); 346 scope_->InsertParameterAt(pos++, variable);
349 result_->type_arguments_variable = variable; 347 result_->type_arguments_variable = variable;
350 } 348 }
351 AddParameters(node, pos); 349 AddParameters(node, pos);
352 350
353 // We generate a syntethic body for implicit closure functions - which 351 // We generate a syntethic body for implicit closure functions - which
354 // will forward the call to the real function. 352 // will forward the call to the real function.
355 // -> see BuildGraphOfImplicitClosureFunction 353 // -> see BuildGraphOfImplicitClosureFunction
356 if (!function.IsImplicitClosureFunction()) { 354 if (!function.IsImplicitClosureFunction()) {
357 node_->AcceptVisitor(this); 355 node_->AcceptVisitor(this);
(...skipping 12 matching lines...) Expand all
370 bool is_method = !function.IsStaticFunction(); 368 bool is_method = !function.IsStaticFunction();
371 intptr_t pos = 0; 369 intptr_t pos = 0;
372 if (is_method) { 370 if (is_method) {
373 dart::Class& klass = dart::Class::Handle(Z, function.Owner()); 371 dart::Class& klass = dart::Class::Handle(Z, function.Owner());
374 Type& klass_type = H.GetCanonicalType(klass); 372 Type& klass_type = H.GetCanonicalType(klass);
375 LocalVariable* variable = MakeVariable(Symbols::This(), klass_type); 373 LocalVariable* variable = MakeVariable(Symbols::This(), klass_type);
376 scope_->InsertParameterAt(pos++, variable); 374 scope_->InsertParameterAt(pos++, variable);
377 result_->this_variable = variable; 375 result_->this_variable = variable;
378 } 376 }
379 if (is_setter) { 377 if (is_setter) {
380 result_->setter_value = MakeVariable( 378 result_->setter_value =
381 Symbols::Value(), AbstractType::dynamic_type()); 379 MakeVariable(Symbols::Value(), AbstractType::dynamic_type());
382 scope_->InsertParameterAt(pos++, result_->setter_value); 380 scope_->InsertParameterAt(pos++, result_->setter_value);
383 } 381 }
384 break; 382 break;
385 } 383 }
386 case RawFunction::kMethodExtractor: { 384 case RawFunction::kMethodExtractor: {
387 // Add a receiver parameter. Though it is captured, we emit code to 385 // Add a receiver parameter. Though it is captured, we emit code to
388 // explicitly copy it to a fixed offset in a freshly-allocated context 386 // explicitly copy it to a fixed offset in a freshly-allocated context
389 // instead of using the generic code for regular functions. 387 // instead of using the generic code for regular functions.
390 // Therefore, it isn't necessary to mark it as captured here. 388 // Therefore, it isn't necessary to mark it as captured here.
391 dart::Class& klass = dart::Class::Handle(Z, function.Owner()); 389 dart::Class& klass = dart::Class::Handle(Z, function.Owner());
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 VisitVariableDeclaration(node->variable()); 566 VisitVariableDeclaration(node->variable());
569 node->body()->AcceptStatementVisitor(this); 567 node->body()->AcceptStatementVisitor(this);
570 ExitScope(); 568 ExitScope();
571 --depth_.loop_; 569 --depth_.loop_;
572 --depth_.for_in_; 570 --depth_.for_in_;
573 } 571 }
574 572
575 573
576 void ScopeBuilder::AddSwitchVariable() { 574 void ScopeBuilder::AddSwitchVariable() {
577 if ((depth_.function_ == 0) && (result_->switch_variable == NULL)) { 575 if ((depth_.function_ == 0) && (result_->switch_variable == NULL)) {
578 LocalVariable* variable = MakeVariable( 576 LocalVariable* variable =
579 Symbols::SwitchExpr(), 577 MakeVariable(Symbols::SwitchExpr(), AbstractType::dynamic_type());
580 AbstractType::dynamic_type());
581 variable->set_is_forced_stack(); 578 variable->set_is_forced_stack();
582 current_function_scope_->AddVariable(variable); 579 current_function_scope_->AddVariable(variable);
583 result_->switch_variable = variable; 580 result_->switch_variable = variable;
584 } 581 }
585 } 582 }
586 583
587 584
588 void ScopeBuilder::VisitSwitchStatement(SwitchStatement* node) { 585 void ScopeBuilder::VisitSwitchStatement(SwitchStatement* node) {
589 AddSwitchVariable(); 586 AddSwitchVariable();
590 node->VisitChildren(this); 587 node->VisitChildren(this);
591 } 588 }
592 589
593 590
594 void ScopeBuilder::VisitReturnStatement(ReturnStatement* node) { 591 void ScopeBuilder::VisitReturnStatement(ReturnStatement* node) {
595 if ((depth_.function_ == 0) && (depth_.finally_ > 0) && 592 if ((depth_.function_ == 0) && (depth_.finally_ > 0) &&
596 (result_->finally_return_variable == NULL)) { 593 (result_->finally_return_variable == NULL)) {
597 const dart::String& name = H.DartSymbol(":try_finally_return_value"); 594 const dart::String& name = H.DartSymbol(":try_finally_return_value");
598 LocalVariable* variable = MakeVariable( 595 LocalVariable* variable = MakeVariable(name, AbstractType::dynamic_type());
599 name,
600 AbstractType::dynamic_type());
601 current_function_scope_->AddVariable(variable); 596 current_function_scope_->AddVariable(variable);
602 result_->finally_return_variable = variable; 597 result_->finally_return_variable = variable;
603 } 598 }
604 node->VisitChildren(this); 599 node->VisitChildren(this);
605 } 600 }
606 601
607 602
608 void ScopeBuilder::VisitTryCatch(TryCatch* node) { 603 void ScopeBuilder::VisitTryCatch(TryCatch* node) {
609 ++depth_.try_; 604 ++depth_.try_;
610 AddTryVariables(); 605 AddTryVariables();
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
880 875
881 private: 876 private:
882 FlowGraphBuilder* builder_; 877 FlowGraphBuilder* builder_;
883 TryCatchBlock* outer_; 878 TryCatchBlock* outer_;
884 intptr_t try_index_; 879 intptr_t try_index_;
885 }; 880 };
886 881
887 882
888 class CatchBlock { 883 class CatchBlock {
889 public: 884 public:
890 CatchBlock(FlowGraphBuilder* builder, LocalVariable* exception_var, 885 CatchBlock(FlowGraphBuilder* builder,
891 LocalVariable* stack_trace_var, intptr_t catch_try_index) 886 LocalVariable* exception_var,
887 LocalVariable* stack_trace_var,
888 intptr_t catch_try_index)
892 : builder_(builder), 889 : builder_(builder),
893 outer_(builder->catch_block_), 890 outer_(builder->catch_block_),
894 exception_var_(exception_var), 891 exception_var_(exception_var),
895 stack_trace_var_(stack_trace_var), 892 stack_trace_var_(stack_trace_var),
896 catch_try_index_(catch_try_index) { 893 catch_try_index_(catch_try_index) {
897 builder_->catch_block_ = this; 894 builder_->catch_block_ = this;
898 } 895 }
899 ~CatchBlock() { builder_->catch_block_ = outer_; } 896 ~CatchBlock() { builder_->catch_block_ = outer_; }
900 897
901 LocalVariable* exception_var() { return exception_var_; } 898 LocalVariable* exception_var() { return exception_var_; }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 // The VM uses `get:fieldname` and `set:fieldname`. 1022 // The VM uses `get:fieldname` and `set:fieldname`.
1026 // 1023 //
1027 // => In order to be consistent, we remove the `=` always and adopt the VM 1024 // => In order to be consistent, we remove the `=` always and adopt the VM
1028 // conventions. 1025 // conventions.
1029 String* content = kernel_name->string(); 1026 String* content = kernel_name->string();
1030 ASSERT(content->size() > 0); 1027 ASSERT(content->size() > 0);
1031 intptr_t skip = 0; 1028 intptr_t skip = 0;
1032 if (content->buffer()[content->size() - 1] == '=') { 1029 if (content->buffer()[content->size() - 1] == '=') {
1033 skip = 1; 1030 skip = 1;
1034 } 1031 }
1035 dart::String& name = dart::String::ZoneHandle(Z, dart::String::FromUTF8( 1032 dart::String& name = dart::String::ZoneHandle(
1036 content->buffer(), content->size() - skip, allocation_space_)); 1033 Z, dart::String::FromUTF8(content->buffer(), content->size() - skip,
1034 allocation_space_));
1037 ManglePrivateName(kernel_name->library(), &name, false); 1035 ManglePrivateName(kernel_name->library(), &name, false);
1038 name = dart::Field::SetterSymbol(name); 1036 name = dart::Field::SetterSymbol(name);
1039 return name; 1037 return name;
1040 } 1038 }
1041 1039
1042 1040
1043 const dart::String& TranslationHelper::DartGetterName(Name* kernel_name) { 1041 const dart::String& TranslationHelper::DartGetterName(Name* kernel_name) {
1044 dart::String& name = DartString(kernel_name->string()); 1042 dart::String& name = DartString(kernel_name->string());
1045 ManglePrivateName(kernel_name->library(), &name, false); 1043 ManglePrivateName(kernel_name->library(), &name, false);
1046 name = dart::Field::GetterSymbol(name); 1044 name = dart::Field::GetterSymbol(name);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1165 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( 1163 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor(
1166 Constructor* constructor) { 1164 Constructor* constructor) {
1167 Class* kernel_klass = Class::Cast(constructor->parent()); 1165 Class* kernel_klass = Class::Cast(constructor->parent());
1168 dart::Class& klass = 1166 dart::Class& klass =
1169 dart::Class::Handle(Z, LookupClassByKernelClass(kernel_klass)); 1167 dart::Class::Handle(Z, LookupClassByKernelClass(kernel_klass));
1170 return LookupConstructorByKernelConstructor(klass, constructor); 1168 return LookupConstructorByKernelConstructor(klass, constructor);
1171 } 1169 }
1172 1170
1173 1171
1174 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( 1172 dart::RawFunction* TranslationHelper::LookupConstructorByKernelConstructor(
1175 const dart::Class& owner, Constructor* constructor) { 1173 const dart::Class& owner,
1174 Constructor* constructor) {
1176 dart::RawFunction* function = 1175 dart::RawFunction* function =
1177 owner.LookupConstructorAllowPrivate(DartConstructorName(constructor)); 1176 owner.LookupConstructorAllowPrivate(DartConstructorName(constructor));
1178 ASSERT(function != Object::null()); 1177 ASSERT(function != Object::null());
1179 return function; 1178 return function;
1180 } 1179 }
1181 1180
1182 1181
1183 dart::Type& TranslationHelper::GetCanonicalType(const dart::Class& klass) { 1182 dart::Type& TranslationHelper::GetCanonicalType(const dart::Class& klass) {
1184 ASSERT(!klass.IsNull()); 1183 ASSERT(!klass.IsNull());
1185 // Note that if cls is _Closure, the returned type will be _Closure, 1184 // Note that if cls is _Closure, the returned type will be _Closure,
(...skipping 19 matching lines...) Expand all
1205 1204
1206 va_list args; 1205 va_list args;
1207 va_start(args, format); 1206 va_start(args, format);
1208 Report::MessageV(Report::kError, null_script, TokenPosition::kNoSource, 1207 Report::MessageV(Report::kError, null_script, TokenPosition::kNoSource,
1209 Report::AtLocation, format, args); 1208 Report::AtLocation, format, args);
1210 va_end(args); 1209 va_end(args);
1211 UNREACHABLE(); 1210 UNREACHABLE();
1212 } 1211 }
1213 1212
1214 1213
1215 void TranslationHelper::ReportError(const Error& prev_error, const char* format, 1214 void TranslationHelper::ReportError(const Error& prev_error,
1215 const char* format,
1216 ...) { 1216 ...) {
1217 const Script& null_script = Script::Handle(Z); 1217 const Script& null_script = Script::Handle(Z);
1218 1218
1219 va_list args; 1219 va_list args;
1220 va_start(args, format); 1220 va_start(args, format);
1221 Report::LongJumpV(prev_error, null_script, TokenPosition::kNoSource, format, 1221 Report::LongJumpV(prev_error, null_script, TokenPosition::kNoSource, format,
1222 args); 1222 args);
1223 va_end(args); 1223 va_end(args);
1224 UNREACHABLE(); 1224 UNREACHABLE();
1225 } 1225 }
1226 1226
1227 1227
1228 dart::String& TranslationHelper::ManglePrivateName(Library* kernel_library, 1228 dart::String& TranslationHelper::ManglePrivateName(Library* kernel_library,
1229 dart::String* name_to_modify, 1229 dart::String* name_to_modify,
1230 bool symbolize) { 1230 bool symbolize) {
1231 if (name_to_modify->Length() >= 1 && name_to_modify->CharAt(0) == '_') { 1231 if (name_to_modify->Length() >= 1 && name_to_modify->CharAt(0) == '_') {
1232 const dart::Library& library = 1232 const dart::Library& library =
1233 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); 1233 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library));
1234 *name_to_modify = library.PrivateName(*name_to_modify); 1234 *name_to_modify = library.PrivateName(*name_to_modify);
1235 } else if (symbolize) { 1235 } else if (symbolize) {
1236 *name_to_modify = Symbols::New(thread_, *name_to_modify); 1236 *name_to_modify = Symbols::New(thread_, *name_to_modify);
1237 } 1237 }
1238 return *name_to_modify; 1238 return *name_to_modify;
1239 } 1239 }
1240 1240
1241 1241
1242 const Array& TranslationHelper::ArgumentNames(List<NamedExpression>* named) { 1242 const Array& TranslationHelper::ArgumentNames(List<NamedExpression>* named) {
1243 if (named->length() == 0) return Array::ZoneHandle(Z); 1243 if (named->length() == 0) return Array::ZoneHandle(Z);
1244 1244
1245 const Array& names = Array::ZoneHandle(Z, 1245 const Array& names =
1246 Array::New(named->length(), allocation_space_)); 1246 Array::ZoneHandle(Z, Array::New(named->length(), allocation_space_));
1247 for (intptr_t i = 0; i < named->length(); ++i) { 1247 for (intptr_t i = 0; i < named->length(); ++i) {
1248 names.SetAt(i, DartSymbol((*named)[i]->name())); 1248 names.SetAt(i, DartSymbol((*named)[i]->name()));
1249 } 1249 }
1250 return names; 1250 return names;
1251 } 1251 }
1252 1252
1253 1253
1254 ConstantEvaluator::ConstantEvaluator(FlowGraphBuilder* builder, 1254 ConstantEvaluator::ConstantEvaluator(FlowGraphBuilder* builder,
1255 Zone* zone, 1255 Zone* zone,
1256 TranslationHelper* h, 1256 TranslationHelper* h,
1257 DartTypeTranslator* type_translator) 1257 DartTypeTranslator* type_translator)
1258 : builder_(builder), 1258 : builder_(builder),
1259 isolate_(Isolate::Current()), 1259 isolate_(Isolate::Current()),
1260 zone_(zone), 1260 zone_(zone),
1261 translation_helper_(*h), 1261 translation_helper_(*h),
1262 type_translator_(*type_translator), 1262 type_translator_(*type_translator),
1263 script_(dart::Script::Handle( 1263 script_(dart::Script::Handle(
1264 zone, builder_->parsed_function_->function().script())), 1264 zone,
1265 builder_->parsed_function_->function().script())),
1265 result_(dart::Instance::Handle(zone)) {} 1266 result_(dart::Instance::Handle(zone)) {}
1266 1267
1267 1268
1268 Instance& ConstantEvaluator::EvaluateExpression(Expression* expression) { 1269 Instance& ConstantEvaluator::EvaluateExpression(Expression* expression) {
1269 if (!GetCachedConstant(expression, &result_)) { 1270 if (!GetCachedConstant(expression, &result_)) {
1270 expression->AcceptExpressionVisitor(this); 1271 expression->AcceptExpressionVisitor(this);
1271 CacheConstantValue(expression, result_); 1272 CacheConstantValue(expression, result_);
1272 } 1273 }
1273 // We return a new `ZoneHandle` here on purpose: The intermediate language 1274 // We return a new `ZoneHandle` here on purpose: The intermediate language
1274 // instructions do not make a copy of the handle, so we do it. 1275 // instructions do not make a copy of the handle, so we do it.
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1361 void ConstantEvaluator::VisitTypeLiteral(TypeLiteral* node) { 1362 void ConstantEvaluator::VisitTypeLiteral(TypeLiteral* node) {
1362 const AbstractType& type = T.TranslateType(node->type()); 1363 const AbstractType& type = T.TranslateType(node->type());
1363 if (type.IsMalformed()) { 1364 if (type.IsMalformed()) {
1364 H.ReportError("Malformed type literal in constant expression."); 1365 H.ReportError("Malformed type literal in constant expression.");
1365 } 1366 }
1366 result_ = type.raw(); 1367 result_ = type.raw();
1367 } 1368 }
1368 1369
1369 1370
1370 RawObject* ConstantEvaluator::EvaluateConstConstructorCall( 1371 RawObject* ConstantEvaluator::EvaluateConstConstructorCall(
1371 const dart::Class& type_class, const TypeArguments& type_arguments, 1372 const dart::Class& type_class,
1372 const Function& constructor, const Object& argument) { 1373 const TypeArguments& type_arguments,
1374 const Function& constructor,
1375 const Object& argument) {
1373 // Factories have one extra argument: the type arguments. 1376 // Factories have one extra argument: the type arguments.
1374 // Constructors have 1 extra arguments: receiver. 1377 // Constructors have 1 extra arguments: receiver.
1375 const int kNumArgs = 1; 1378 const int kNumArgs = 1;
1376 const int kNumExtraArgs = 1; 1379 const int kNumExtraArgs = 1;
1377 const int num_arguments = kNumArgs + kNumExtraArgs; 1380 const int num_arguments = kNumArgs + kNumExtraArgs;
1378 const Array& arg_values = 1381 const Array& arg_values =
1379 Array::Handle(Z, Array::New(num_arguments, Heap::kOld)); 1382 Array::Handle(Z, Array::New(num_arguments, Heap::kOld));
1380 Instance& instance = Instance::Handle(Z); 1383 Instance& instance = Instance::Handle(Z);
1381 if (!constructor.IsFactory()) { 1384 if (!constructor.IsFactory()) {
1382 instance = Instance::New(type_class, Heap::kOld); 1385 instance = Instance::New(type_class, Heap::kOld);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1437 1440
1438 const Function& function = builder_->parsed_function_->function(); 1441 const Function& function = builder_->parsed_function_->function();
1439 if (function.kind() == RawFunction::kImplicitStaticFinalGetter) { 1442 if (function.kind() == RawFunction::kImplicitStaticFinalGetter) {
1440 // Don't cache constants in initializer expressions. They get 1443 // Don't cache constants in initializer expressions. They get
1441 // evaluated only once. 1444 // evaluated only once.
1442 return; 1445 return;
1443 } 1446 }
1444 const intptr_t kInitialConstMapSize = 16; 1447 const intptr_t kInitialConstMapSize = 16;
1445 ASSERT(!script_.InVMHeap()); 1448 ASSERT(!script_.InVMHeap());
1446 if (script_.compile_time_constants() == Array::null()) { 1449 if (script_.compile_time_constants() == Array::null()) {
1447 const Array& array = 1450 const Array& array = Array::Handle(
1448 Array::Handle(HashTables::New<KernelConstantsMap>(kInitialConstMapSize, 1451 HashTables::New<KernelConstantsMap>(kInitialConstMapSize, Heap::kNew));
1449 Heap::kNew));
1450 script_.set_compile_time_constants(array); 1452 script_.set_compile_time_constants(array);
1451 } 1453 }
1452 KernelConstantsMap constants(script_.compile_time_constants()); 1454 KernelConstantsMap constants(script_.compile_time_constants());
1453 constants.InsertNewOrGetValue(node, value); 1455 constants.InsertNewOrGetValue(node, value);
1454 script_.set_compile_time_constants(constants.Release()); 1456 script_.set_compile_time_constants(constants.Release());
1455 } 1457 }
1456 1458
1457 1459
1458 void ConstantEvaluator::VisitSymbolLiteral(SymbolLiteral* node) { 1460 void ConstantEvaluator::VisitSymbolLiteral(SymbolLiteral* node) {
1459 const dart::String& symbol_value = H.DartSymbol(node->value()); 1461 const dart::String& symbol_value = H.DartSymbol(node->value());
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
1725 1727
1726 void ConstantEvaluator::VisitNot(Not* node) { 1728 void ConstantEvaluator::VisitNot(Not* node) {
1727 EvaluateExpression(node->expression()); 1729 EvaluateExpression(node->expression());
1728 ASSERT(result_.IsBool()); 1730 ASSERT(result_.IsBool());
1729 result_ = 1731 result_ =
1730 Bool::Cast(result_).value() ? Bool::False().raw() : Bool::True().raw(); 1732 Bool::Cast(result_).value() ? Bool::False().raw() : Bool::True().raw();
1731 } 1733 }
1732 1734
1733 1735
1734 const TypeArguments* ConstantEvaluator::TranslateTypeArguments( 1736 const TypeArguments* ConstantEvaluator::TranslateTypeArguments(
1735 const Function& target, dart::Class* target_klass, 1737 const Function& target,
1738 dart::Class* target_klass,
1736 Arguments* kernel_arguments) { 1739 Arguments* kernel_arguments) {
1737 List<DartType>& kernel_type_arguments = kernel_arguments->types(); 1740 List<DartType>& kernel_type_arguments = kernel_arguments->types();
1738 1741
1739 const TypeArguments* type_arguments = NULL; 1742 const TypeArguments* type_arguments = NULL;
1740 if (kernel_type_arguments.length() > 0) { 1743 if (kernel_type_arguments.length() > 0) {
1741 type_arguments = &T.TranslateInstantiatedTypeArguments( 1744 type_arguments = &T.TranslateInstantiatedTypeArguments(
1742 *target_klass, kernel_type_arguments.raw_array(), 1745 *target_klass, kernel_type_arguments.raw_array(),
1743 kernel_type_arguments.length()); 1746 kernel_type_arguments.length());
1744 1747
1745 if (!(type_arguments->IsNull() || type_arguments->IsInstantiated())) { 1748 if (!(type_arguments->IsNull() || type_arguments->IsInstantiated())) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1797 const Object& result = Object::Handle( 1800 const Object& result = Object::Handle(
1798 Z, DartEntry::InvokeFunction(function, arguments, args_descriptor)); 1801 Z, DartEntry::InvokeFunction(function, arguments, args_descriptor));
1799 if (result.IsError()) { 1802 if (result.IsError()) {
1800 H.ReportError(Error::Cast(result), "error evaluating constant constructor"); 1803 H.ReportError(Error::Cast(result), "error evaluating constant constructor");
1801 } 1804 }
1802 return result; 1805 return result;
1803 } 1806 }
1804 1807
1805 1808
1806 FlowGraphBuilder::FlowGraphBuilder( 1809 FlowGraphBuilder::FlowGraphBuilder(
1807 TreeNode* node, ParsedFunction* parsed_function, 1810 TreeNode* node,
1811 ParsedFunction* parsed_function,
1808 const ZoneGrowableArray<const ICData*>& ic_data_array, 1812 const ZoneGrowableArray<const ICData*>& ic_data_array,
1809 InlineExitCollector* exit_collector, intptr_t osr_id, 1813 InlineExitCollector* exit_collector,
1814 intptr_t osr_id,
1810 intptr_t first_block_id) 1815 intptr_t first_block_id)
1811 : zone_(Thread::Current()->zone()), 1816 : zone_(Thread::Current()->zone()),
1812 translation_helper_(Thread::Current(), zone_, 1817 translation_helper_(Thread::Current(),
1818 zone_,
1813 Thread::Current()->isolate()), 1819 Thread::Current()->isolate()),
1814 node_(node), 1820 node_(node),
1815 parsed_function_(parsed_function), 1821 parsed_function_(parsed_function),
1816 osr_id_(osr_id), 1822 osr_id_(osr_id),
1817 ic_data_array_(ic_data_array), 1823 ic_data_array_(ic_data_array),
1818 exit_collector_(exit_collector), 1824 exit_collector_(exit_collector),
1819 next_block_id_(first_block_id), 1825 next_block_id_(first_block_id),
1820 next_function_id_(0), 1826 next_function_id_(0),
1821 context_depth_(0), 1827 context_depth_(0),
1822 loop_depth_(0), 1828 loop_depth_(0),
1823 try_depth_(0), 1829 try_depth_(0),
1824 catch_depth_(0), 1830 catch_depth_(0),
1825 for_in_depth_(0), 1831 for_in_depth_(0),
1826 stack_(NULL), 1832 stack_(NULL),
1827 pending_argument_count_(0), 1833 pending_argument_count_(0),
1828 graph_entry_(NULL), 1834 graph_entry_(NULL),
1829 scopes_(NULL), 1835 scopes_(NULL),
1830 breakable_block_(NULL), 1836 breakable_block_(NULL),
1831 switch_block_(NULL), 1837 switch_block_(NULL),
1832 try_finally_block_(NULL), 1838 try_finally_block_(NULL),
1833 try_catch_block_(NULL), 1839 try_catch_block_(NULL),
1834 next_used_try_index_(0), 1840 next_used_try_index_(0),
1835 catch_block_(NULL), 1841 catch_block_(NULL),
1836 type_translator_(&translation_helper_, &active_class_), 1842 type_translator_(&translation_helper_, &active_class_),
1837 constant_evaluator_(this, zone_, &translation_helper_, 1843 constant_evaluator_(this,
1844 zone_,
1845 &translation_helper_,
1838 &type_translator_) {} 1846 &type_translator_) {}
1839 1847
1840 1848
1841 FlowGraphBuilder::~FlowGraphBuilder() {} 1849 FlowGraphBuilder::~FlowGraphBuilder() {}
1842 1850
1843 1851
1844 Fragment FlowGraphBuilder::TranslateFinallyFinalizers( 1852 Fragment FlowGraphBuilder::TranslateFinallyFinalizers(
1845 TryFinallyBlock* outer_finally, intptr_t target_context_depth) { 1853 TryFinallyBlock* outer_finally,
1854 intptr_t target_context_depth) {
1846 TryFinallyBlock* const saved_block = try_finally_block_; 1855 TryFinallyBlock* const saved_block = try_finally_block_;
1847 const intptr_t saved_depth = context_depth_; 1856 const intptr_t saved_depth = context_depth_;
1848 const intptr_t saved_try_depth = try_depth_; 1857 const intptr_t saved_try_depth = try_depth_;
1849 1858
1850 Fragment instructions; 1859 Fragment instructions;
1851 1860
1852 // While translating the body of a finalizer we need to set the try-finally 1861 // While translating the body of a finalizer we need to set the try-finally
1853 // block which is active when translating the body. 1862 // block which is active when translating the body.
1854 while (try_finally_block_ != outer_finally) { 1863 while (try_finally_block_ != outer_finally) {
1855 // Set correct try depth (in case there are nested try statements). 1864 // Set correct try depth (in case there are nested try statements).
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
2099 TokenPosition::kNoSource, negate ? Token::kNE_STRICT : Token::kEQ_STRICT, 2108 TokenPosition::kNoSource, negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
2100 left_value, right_value, false); 2109 left_value, right_value, false);
2101 BranchInstr* branch = new (Z) BranchInstr(compare); 2110 BranchInstr* branch = new (Z) BranchInstr(compare);
2102 *then_entry = *branch->true_successor_address() = BuildTargetEntry(); 2111 *then_entry = *branch->true_successor_address() = BuildTargetEntry();
2103 *otherwise_entry = *branch->false_successor_address() = BuildTargetEntry(); 2112 *otherwise_entry = *branch->false_successor_address() = BuildTargetEntry();
2104 return Fragment(branch).closed(); 2113 return Fragment(branch).closed();
2105 } 2114 }
2106 2115
2107 2116
2108 Fragment FlowGraphBuilder::BranchIfStrictEqual( 2117 Fragment FlowGraphBuilder::BranchIfStrictEqual(
2109 TargetEntryInstr** then_entry, TargetEntryInstr** otherwise_entry) { 2118 TargetEntryInstr** then_entry,
2119 TargetEntryInstr** otherwise_entry) {
2110 Value* rhs = Pop(); 2120 Value* rhs = Pop();
2111 Value* lhs = Pop(); 2121 Value* lhs = Pop();
2112 StrictCompareInstr* compare = new (Z) StrictCompareInstr( 2122 StrictCompareInstr* compare = new (Z) StrictCompareInstr(
2113 TokenPosition::kNoSource, Token::kEQ_STRICT, lhs, rhs, false); 2123 TokenPosition::kNoSource, Token::kEQ_STRICT, lhs, rhs, false);
2114 BranchInstr* branch = new (Z) BranchInstr(compare); 2124 BranchInstr* branch = new (Z) BranchInstr(compare);
2115 *then_entry = *branch->true_successor_address() = BuildTargetEntry(); 2125 *then_entry = *branch->true_successor_address() = BuildTargetEntry();
2116 *otherwise_entry = *branch->false_successor_address() = BuildTargetEntry(); 2126 *otherwise_entry = *branch->false_successor_address() = BuildTargetEntry();
2117 return Fragment(branch).closed(); 2127 return Fragment(branch).closed();
2118 } 2128 }
2119 2129
2120 2130
2121 Fragment FlowGraphBuilder::CatchBlockEntry(const Array& handler_types, 2131 Fragment FlowGraphBuilder::CatchBlockEntry(const Array& handler_types,
2122 intptr_t handler_index) { 2132 intptr_t handler_index) {
2123 ASSERT(CurrentException()->is_captured() == 2133 ASSERT(CurrentException()->is_captured() ==
2124 CurrentStackTrace()->is_captured()); 2134 CurrentStackTrace()->is_captured());
2125 const bool should_restore_closure_context = 2135 const bool should_restore_closure_context =
2126 CurrentException()->is_captured() || 2136 CurrentException()->is_captured() || CurrentCatchContext()->is_captured();
2127 CurrentCatchContext()->is_captured();
2128 CatchBlockEntryInstr* entry = new (Z) CatchBlockEntryInstr( 2137 CatchBlockEntryInstr* entry = new (Z) CatchBlockEntryInstr(
2129 AllocateBlockId(), CurrentTryIndex(), graph_entry_, handler_types, 2138 AllocateBlockId(), CurrentTryIndex(), graph_entry_, handler_types,
2130 handler_index, *CurrentException(), *CurrentStackTrace(), 2139 handler_index, *CurrentException(), *CurrentStackTrace(),
2131 /* needs_stacktrace = */ true, Thread::Current()->GetNextDeoptId(), 2140 /* needs_stacktrace = */ true, Thread::Current()->GetNextDeoptId(),
2132 should_restore_closure_context); 2141 should_restore_closure_context);
2133 graph_entry_->AddCatchEntry(entry); 2142 graph_entry_->AddCatchEntry(entry);
2134 Fragment instructions(entry); 2143 Fragment instructions(entry);
2135 2144
2136 // :saved_try_context_var can be captured in the context of 2145 // :saved_try_context_var can be captured in the context of
2137 // of the closure, in this case CatchBlockEntryInstr restores 2146 // of the closure, in this case CatchBlockEntryInstr restores
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 Fragment FlowGraphBuilder::LoadField(intptr_t offset, intptr_t class_id) { 2324 Fragment FlowGraphBuilder::LoadField(intptr_t offset, intptr_t class_id) {
2316 LoadFieldInstr* load = new (Z) LoadFieldInstr( 2325 LoadFieldInstr* load = new (Z) LoadFieldInstr(
2317 Pop(), offset, AbstractType::ZoneHandle(Z), TokenPosition::kNoSource); 2326 Pop(), offset, AbstractType::ZoneHandle(Z), TokenPosition::kNoSource);
2318 load->set_result_cid(class_id); 2327 load->set_result_cid(class_id);
2319 Push(load); 2328 Push(load);
2320 return Fragment(load); 2329 return Fragment(load);
2321 } 2330 }
2322 2331
2323 2332
2324 Fragment FlowGraphBuilder::LoadNativeField(MethodRecognizer::Kind kind, 2333 Fragment FlowGraphBuilder::LoadNativeField(MethodRecognizer::Kind kind,
2325 intptr_t offset, const Type& type, 2334 intptr_t offset,
2335 const Type& type,
2326 intptr_t class_id, 2336 intptr_t class_id,
2327 bool is_immutable) { 2337 bool is_immutable) {
2328 LoadFieldInstr* load = 2338 LoadFieldInstr* load =
2329 new (Z) LoadFieldInstr(Pop(), offset, type, TokenPosition::kNoSource); 2339 new (Z) LoadFieldInstr(Pop(), offset, type, TokenPosition::kNoSource);
2330 load->set_recognized_kind(kind); 2340 load->set_recognized_kind(kind);
2331 load->set_result_cid(class_id); 2341 load->set_result_cid(class_id);
2332 load->set_is_immutable(is_immutable); 2342 load->set_is_immutable(is_immutable);
2333 Push(load); 2343 Push(load);
2334 return Fragment(load); 2344 return Fragment(load);
2335 } 2345 }
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
2445 } 2455 }
2446 Push(call); 2456 Push(call);
2447 return Fragment(call); 2457 return Fragment(call);
2448 } 2458 }
2449 2459
2450 2460
2451 Fragment FlowGraphBuilder::StoreIndexed(intptr_t class_id) { 2461 Fragment FlowGraphBuilder::StoreIndexed(intptr_t class_id) {
2452 Value* value = Pop(); 2462 Value* value = Pop();
2453 Value* index = Pop(); 2463 Value* index = Pop();
2454 const StoreBarrierType emit_store_barrier = 2464 const StoreBarrierType emit_store_barrier =
2455 value->BindsToConstant() 2465 value->BindsToConstant() ? kNoStoreBarrier : kEmitStoreBarrier;
2456 ? kNoStoreBarrier
2457 : kEmitStoreBarrier;
2458 StoreIndexedInstr* store = new (Z) StoreIndexedInstr( 2466 StoreIndexedInstr* store = new (Z) StoreIndexedInstr(
2459 Pop(), // Array. 2467 Pop(), // Array.
2460 index, value, emit_store_barrier, Instance::ElementSizeFor(class_id), 2468 index, value, emit_store_barrier, Instance::ElementSizeFor(class_id),
2461 class_id, kAlignedAccess, Thread::kNoDeoptId, TokenPosition::kNoSource); 2469 class_id, kAlignedAccess, Thread::kNoDeoptId, TokenPosition::kNoSource);
2462 Push(store); 2470 Push(store);
2463 return Fragment(store); 2471 return Fragment(store);
2464 } 2472 }
2465 2473
2466 2474
2467 Fragment FlowGraphBuilder::StoreInstanceField( 2475 Fragment FlowGraphBuilder::StoreInstanceField(
2468 const dart::Field& field, StoreBarrierType emit_store_barrier) { 2476 const dart::Field& field,
2477 StoreBarrierType emit_store_barrier) {
2469 Value* value = Pop(); 2478 Value* value = Pop();
2470 if (value->BindsToConstant()) { 2479 if (value->BindsToConstant()) {
2471 emit_store_barrier = kNoStoreBarrier; 2480 emit_store_barrier = kNoStoreBarrier;
2472 } 2481 }
2473 StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr( 2482 StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr(
2474 field, Pop(), value, emit_store_barrier, TokenPosition::kNoSource); 2483 field, Pop(), value, emit_store_barrier, TokenPosition::kNoSource);
2475 return Fragment(store); 2484 return Fragment(store);
2476 } 2485 }
2477 2486
2478 2487
2479 Fragment FlowGraphBuilder::StoreInstanceFieldGuarded(const dart::Field& field) { 2488 Fragment FlowGraphBuilder::StoreInstanceFieldGuarded(const dart::Field& field) {
2480 Fragment instructions; 2489 Fragment instructions;
2481 if (FLAG_use_field_guards) { 2490 if (FLAG_use_field_guards) {
2482 LocalVariable* store_expression = MakeTemporary(); 2491 LocalVariable* store_expression = MakeTemporary();
2483 instructions += LoadLocal(store_expression); 2492 instructions += LoadLocal(store_expression);
2484 instructions += GuardFieldClass(field, Thread::Current()->GetNextDeoptId()); 2493 instructions += GuardFieldClass(field, Thread::Current()->GetNextDeoptId());
2485 instructions += LoadLocal(store_expression); 2494 instructions += LoadLocal(store_expression);
2486 instructions += 2495 instructions +=
2487 GuardFieldLength(field, Thread::Current()->GetNextDeoptId()); 2496 GuardFieldLength(field, Thread::Current()->GetNextDeoptId());
2488 } 2497 }
2489 instructions += StoreInstanceField(field); 2498 instructions += StoreInstanceField(field);
2490 return instructions; 2499 return instructions;
2491 } 2500 }
2492 2501
2493 2502
2494 Fragment FlowGraphBuilder::StoreInstanceField( 2503 Fragment FlowGraphBuilder::StoreInstanceField(
2495 intptr_t offset, StoreBarrierType emit_store_barrier) { 2504 intptr_t offset,
2505 StoreBarrierType emit_store_barrier) {
2496 Value* value = Pop(); 2506 Value* value = Pop();
2497 if (value->BindsToConstant()) { 2507 if (value->BindsToConstant()) {
2498 emit_store_barrier = kNoStoreBarrier; 2508 emit_store_barrier = kNoStoreBarrier;
2499 } 2509 }
2500 StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr( 2510 StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr(
2501 offset, Pop(), value, emit_store_barrier, TokenPosition::kNoSource); 2511 offset, Pop(), value, emit_store_barrier, TokenPosition::kNoSource);
2502 return Fragment(store); 2512 return Fragment(store);
2503 } 2513 }
2504 2514
2505 2515
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2613 2623
2614 instructions += StaticCall(throw_function, 6); 2624 instructions += StaticCall(throw_function, 6);
2615 // Leave "result" on the stack since callers expect it to be there (even 2625 // Leave "result" on the stack since callers expect it to be there (even
2616 // though the function will result in an exception). 2626 // though the function will result in an exception).
2617 2627
2618 return instructions; 2628 return instructions;
2619 } 2629 }
2620 2630
2621 2631
2622 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember( 2632 dart::RawFunction* FlowGraphBuilder::LookupMethodByMember(
2623 Member* target, const dart::String& method_name) { 2633 Member* target,
2634 const dart::String& method_name) {
2624 Class* kernel_klass = Class::Cast(target->parent()); 2635 Class* kernel_klass = Class::Cast(target->parent());
2625 dart::Class& klass = 2636 dart::Class& klass =
2626 dart::Class::Handle(Z, H.LookupClassByKernelClass(kernel_klass)); 2637 dart::Class::Handle(Z, H.LookupClassByKernelClass(kernel_klass));
2627 2638
2628 dart::RawFunction* function = klass.LookupFunctionAllowPrivate(method_name); 2639 dart::RawFunction* function = klass.LookupFunctionAllowPrivate(method_name);
2629 ASSERT(function != Object::null()); 2640 ASSERT(function != Object::null());
2630 return function; 2641 return function;
2631 } 2642 }
2632 2643
2633 2644
2634 LocalVariable* FlowGraphBuilder::MakeTemporary() { 2645 LocalVariable* FlowGraphBuilder::MakeTemporary() {
2635 char name[64]; 2646 char name[64];
2636 intptr_t index = stack_->definition()->temp_index(); 2647 intptr_t index = stack_->definition()->temp_index();
2637 OS::SNPrint(name, 64, ":temp%" Pd, index); 2648 OS::SNPrint(name, 64, ":temp%" Pd, index);
2638 LocalVariable* variable = new (Z) LocalVariable( 2649 LocalVariable* variable =
2639 TokenPosition::kNoSource, 2650 new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
2640 TokenPosition::kNoSource, 2651 H.DartSymbol(name), Object::dynamic_type());
2641 H.DartSymbol(name),
2642 Object::dynamic_type());
2643 // Set the index relative to the base of the expression stack including 2652 // Set the index relative to the base of the expression stack including
2644 // outgoing arguments. 2653 // outgoing arguments.
2645 variable->set_index(parsed_function_->first_stack_local_index() - 2654 variable->set_index(parsed_function_->first_stack_local_index() -
2646 parsed_function_->num_stack_locals() - 2655 parsed_function_->num_stack_locals() -
2647 pending_argument_count_ - index); 2656 pending_argument_count_ - index);
2648 2657
2649 // The value has uses as if it were a local variable. Mark the definition 2658 // The value has uses as if it were a local variable. Mark the definition
2650 // as used so that its temp index will not be cleared (causing it to never 2659 // as used so that its temp index will not be cleared (causing it to never
2651 // be materialized in the expression stack). 2660 // be materialized in the expression stack).
2652 stack_->definition()->set_ssa_temp_index(0); 2661 stack_->definition()->set_ssa_temp_index(0);
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
2778 const dart::Function& function = parsed_function_->function(); 2787 const dart::Function& function = parsed_function_->function();
2779 2788
2780 if (function.IsConstructorClosureFunction()) return NULL; 2789 if (function.IsConstructorClosureFunction()) return NULL;
2781 2790
2782 dart::Class& klass = 2791 dart::Class& klass =
2783 dart::Class::Handle(zone_, parsed_function_->function().Owner()); 2792 dart::Class::Handle(zone_, parsed_function_->function().Owner());
2784 2793
2785 Function& outermost_function = Function::Handle(Z); 2794 Function& outermost_function = Function::Handle(Z);
2786 TreeNode* outermost_node = NULL; 2795 TreeNode* outermost_node = NULL;
2787 Class* kernel_klass = NULL; 2796 Class* kernel_klass = NULL;
2788 DiscoverEnclosingElements( 2797 DiscoverEnclosingElements(Z, function, &outermost_function, &outermost_node,
2789 Z, function, &outermost_function, &outermost_node, &kernel_klass); 2798 &kernel_klass);
2790 2799
2791 // Mark that we are using [klass]/[kernell_klass] as active class. Resolving 2800 // Mark that we are using [klass]/[kernell_klass] as active class. Resolving
2792 // of type parameters will get resolved via [kernell_klass] unless we are 2801 // of type parameters will get resolved via [kernell_klass] unless we are
2793 // nested inside a static factory in which case we will use [member]. 2802 // nested inside a static factory in which case we will use [member].
2794 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass); 2803 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass);
2795 Member* member = ((outermost_node != NULL) && outermost_node->IsMember()) 2804 Member* member = ((outermost_node != NULL) && outermost_node->IsMember())
2796 ? Member::Cast(outermost_node) 2805 ? Member::Cast(outermost_node)
2797 : NULL; 2806 : NULL;
2798 ActiveMemberScope active_member(&active_class_, member); 2807 ActiveMemberScope active_member(&active_class_, member);
2799 2808
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2853 } 2862 }
2854 UNREACHABLE(); 2863 UNREACHABLE();
2855 return NULL; 2864 return NULL;
2856 } 2865 }
2857 2866
2858 2867
2859 FlowGraph* FlowGraphBuilder::BuildGraphOfFunction(FunctionNode* function, 2868 FlowGraph* FlowGraphBuilder::BuildGraphOfFunction(FunctionNode* function,
2860 Constructor* constructor) { 2869 Constructor* constructor) {
2861 const Function& dart_function = parsed_function_->function(); 2870 const Function& dart_function = parsed_function_->function();
2862 TargetEntryInstr* normal_entry = BuildTargetEntry(); 2871 TargetEntryInstr* normal_entry = BuildTargetEntry();
2863 graph_entry_ = new (Z) 2872 graph_entry_ =
2864 GraphEntryInstr(*parsed_function_, normal_entry, osr_id_); 2873 new (Z) GraphEntryInstr(*parsed_function_, normal_entry, osr_id_);
2865 2874
2866 SetupDefaultParameterValues(function); 2875 SetupDefaultParameterValues(function);
2867 2876
2868 Fragment body; 2877 Fragment body;
2869 if (!dart_function.is_native()) body += CheckStackOverflowInPrologue(); 2878 if (!dart_function.is_native()) body += CheckStackOverflowInPrologue();
2870 intptr_t context_size = 2879 intptr_t context_size =
2871 parsed_function_->node_sequence()->scope()->num_context_variables(); 2880 parsed_function_->node_sequence()->scope()->num_context_variables();
2872 if (context_size > 0) { 2881 if (context_size > 0) {
2873 body += PushContext(context_size); 2882 body += PushContext(context_size);
2874 LocalVariable* context = MakeTemporary(); 2883 LocalVariable* context = MakeTemporary();
2875 2884
2876 // Copy captured parameters from the stack into the context. 2885 // Copy captured parameters from the stack into the context.
2877 LocalScope* scope = parsed_function_->node_sequence()->scope(); 2886 LocalScope* scope = parsed_function_->node_sequence()->scope();
2878 intptr_t parameter_count = dart_function.NumParameters(); 2887 intptr_t parameter_count = dart_function.NumParameters();
2879 intptr_t parameter_index = parsed_function_->first_parameter_index(); 2888 intptr_t parameter_index = parsed_function_->first_parameter_index();
2880 for (intptr_t i = 0; i < parameter_count; ++i, --parameter_index) { 2889 for (intptr_t i = 0; i < parameter_count; ++i, --parameter_index) {
2881 LocalVariable* variable = scope->VariableAt(i); 2890 LocalVariable* variable = scope->VariableAt(i);
2882 if (variable->is_captured()) { 2891 if (variable->is_captured()) {
2883 // There is no LocalVariable describing the on-stack parameter so 2892 // There is no LocalVariable describing the on-stack parameter so
2884 // create one directly and use the same type. 2893 // create one directly and use the same type.
2885 LocalVariable* parameter = 2894 LocalVariable* parameter = new (Z)
2886 new (Z) LocalVariable(TokenPosition::kNoSource, 2895 LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
2887 TokenPosition::kNoSource, 2896 Symbols::TempParam(), variable->type());
2888 Symbols::TempParam(),
2889 variable->type());
2890 parameter->set_index(parameter_index); 2897 parameter->set_index(parameter_index);
2891 // Mark the stack variable so it will be ignored by the code for 2898 // Mark the stack variable so it will be ignored by the code for
2892 // try/catch. 2899 // try/catch.
2893 parameter->set_is_captured_parameter(true); 2900 parameter->set_is_captured_parameter(true);
2894 2901
2895 // Copy the parameter from the stack to the context. Overwrite it 2902 // Copy the parameter from the stack to the context. Overwrite it
2896 // with a null constant on the stack so the original value is 2903 // with a null constant on the stack so the original value is
2897 // eligible for garbage collection. 2904 // eligible for garbage collection.
2898 body += LoadLocal(context); 2905 body += LoadLocal(context);
2899 body += LoadLocal(parameter); 2906 body += LoadLocal(parameter);
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
3025 body = dispatch; 3032 body = dispatch;
3026 3033
3027 context_depth_ = current_context_depth; 3034 context_depth_ = current_context_depth;
3028 } 3035 }
3029 normal_entry->LinkTo(body.entry); 3036 normal_entry->LinkTo(body.entry);
3030 3037
3031 // When compiling for OSR, use a depth first search to prune instructions 3038 // When compiling for OSR, use a depth first search to prune instructions
3032 // unreachable from the OSR entry. Catch entries are always considered 3039 // unreachable from the OSR entry. Catch entries are always considered
3033 // reachable, even if they become unreachable after OSR. 3040 // reachable, even if they become unreachable after OSR.
3034 if (osr_id_ != Compiler::kNoOSRDeoptId) { 3041 if (osr_id_ != Compiler::kNoOSRDeoptId) {
3035 BitVector* block_marks = new(Z) BitVector(Z, next_block_id_); 3042 BitVector* block_marks = new (Z) BitVector(Z, next_block_id_);
3036 bool found = graph_entry_->PruneUnreachable(graph_entry_, NULL, osr_id_, 3043 bool found = graph_entry_->PruneUnreachable(graph_entry_, NULL, osr_id_,
3037 block_marks); 3044 block_marks);
3038 ASSERT(found); 3045 ASSERT(found);
3039 } 3046 }
3040 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); 3047 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
3041 } 3048 }
3042 3049
3043 3050
3044 Fragment FlowGraphBuilder::NativeFunctionBody(FunctionNode* kernel_function, 3051 Fragment FlowGraphBuilder::NativeFunctionBody(FunctionNode* kernel_function,
3045 const Function& function) { 3052 const Function& function) {
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
3191 dart::String& name = dart::String::ZoneHandle(Z, function.native_name()); 3198 dart::String& name = dart::String::ZoneHandle(Z, function.native_name());
3192 body += NativeCall(&name, &function); 3199 body += NativeCall(&name, &function);
3193 break; 3200 break;
3194 } 3201 }
3195 } 3202 }
3196 return body + Return(); 3203 return body + Return();
3197 } 3204 }
3198 3205
3199 3206
3200 FlowGraph* FlowGraphBuilder::BuildGraphOfFieldAccessor( 3207 FlowGraph* FlowGraphBuilder::BuildGraphOfFieldAccessor(
3201 Field* kernel_field, LocalVariable* setter_value) { 3208 Field* kernel_field,
3209 LocalVariable* setter_value) {
3202 const dart::Function& function = parsed_function_->function(); 3210 const dart::Function& function = parsed_function_->function();
3203 3211
3204 bool is_setter = function.IsImplicitSetterFunction(); 3212 bool is_setter = function.IsImplicitSetterFunction();
3205 bool is_method = !function.IsStaticFunction(); 3213 bool is_method = !function.IsStaticFunction();
3206 dart::Field& field = 3214 dart::Field& field =
3207 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(kernel_field)); 3215 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(kernel_field));
3208 3216
3209 TargetEntryInstr* normal_entry = BuildTargetEntry(); 3217 TargetEntryInstr* normal_entry = BuildTargetEntry();
3210 graph_entry_ = new (Z) 3218 graph_entry_ = new (Z)
3211 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId); 3219 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
3327 Fragment body(normal_entry); 3335 Fragment body(normal_entry);
3328 body += CheckStackOverflowInPrologue(); 3336 body += CheckStackOverflowInPrologue();
3329 body += BuildImplicitClosureCreation(function); 3337 body += BuildImplicitClosureCreation(function);
3330 body += Return(); 3338 body += Return();
3331 3339
3332 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); 3340 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1);
3333 } 3341 }
3334 3342
3335 3343
3336 FlowGraph* FlowGraphBuilder::BuildGraphOfImplicitClosureFunction( 3344 FlowGraph* FlowGraphBuilder::BuildGraphOfImplicitClosureFunction(
3337 FunctionNode* kernel_function, const Function& function) { 3345 FunctionNode* kernel_function,
3346 const Function& function) {
3338 const Function& target = Function::ZoneHandle(Z, function.parent_function()); 3347 const Function& target = Function::ZoneHandle(Z, function.parent_function());
3339 3348
3340 TargetEntryInstr* normal_entry = BuildTargetEntry(); 3349 TargetEntryInstr* normal_entry = BuildTargetEntry();
3341 graph_entry_ = new (Z) 3350 graph_entry_ = new (Z)
3342 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId); 3351 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId);
3343 SetupDefaultParameterValues(kernel_function); 3352 SetupDefaultParameterValues(kernel_function);
3344 3353
3345 Fragment body(normal_entry); 3354 Fragment body(normal_entry);
3346 body += CheckStackOverflowInPrologue(); 3355 body += CheckStackOverflowInPrologue();
3347 3356
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
3615 return new (Z) TargetEntryInstr(AllocateBlockId(), CurrentTryIndex()); 3624 return new (Z) TargetEntryInstr(AllocateBlockId(), CurrentTryIndex());
3616 } 3625 }
3617 3626
3618 3627
3619 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry() { 3628 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry() {
3620 return new (Z) JoinEntryInstr(AllocateBlockId(), CurrentTryIndex()); 3629 return new (Z) JoinEntryInstr(AllocateBlockId(), CurrentTryIndex());
3621 } 3630 }
3622 3631
3623 3632
3624 Fragment FlowGraphBuilder::TranslateInitializers( 3633 Fragment FlowGraphBuilder::TranslateInitializers(
3625 Class* kernel_klass, List<Initializer>* initializers) { 3634 Class* kernel_klass,
3635 List<Initializer>* initializers) {
3626 Fragment instructions; 3636 Fragment instructions;
3627 3637
3628 // These come from: 3638 // These come from:
3629 // class A { 3639 // class A {
3630 // var x = (expr); 3640 // var x = (expr);
3631 // } 3641 // }
3632 for (intptr_t i = 0; i < kernel_klass->fields().length(); i++) { 3642 for (intptr_t i = 0; i < kernel_klass->fields().length(); i++) {
3633 Field* kernel_field = kernel_klass->fields()[i]; 3643 Field* kernel_field = kernel_klass->fields()[i];
3634 Expression* init = kernel_field->initializer(); 3644 Expression* init = kernel_field->initializer();
3635 if (!kernel_field->IsStatic() && init != NULL) { 3645 if (!kernel_field->IsStatic() && init != NULL) {
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
4006 result_ = Object::dynamic_type().raw(); 4016 result_ = Object::dynamic_type().raw();
4007 } 4017 }
4008 4018
4009 4019
4010 void DartTypeTranslator::VisitVoidType(VoidType* node) { 4020 void DartTypeTranslator::VisitVoidType(VoidType* node) {
4011 result_ = Object::void_type().raw(); 4021 result_ = Object::void_type().raw();
4012 } 4022 }
4013 4023
4014 4024
4015 const TypeArguments& DartTypeTranslator::TranslateTypeArguments( 4025 const TypeArguments& DartTypeTranslator::TranslateTypeArguments(
4016 DartType** dart_types, intptr_t length) { 4026 DartType** dart_types,
4027 intptr_t length) {
4017 bool only_dynamic = true; 4028 bool only_dynamic = true;
4018 for (intptr_t i = 0; i < length; i++) { 4029 for (intptr_t i = 0; i < length; i++) {
4019 if (!dart_types[i]->IsDynamicType()) { 4030 if (!dart_types[i]->IsDynamicType()) {
4020 only_dynamic = false; 4031 only_dynamic = false;
4021 break; 4032 break;
4022 } 4033 }
4023 } 4034 }
4024 TypeArguments& type_arguments = TypeArguments::ZoneHandle(Z); 4035 TypeArguments& type_arguments = TypeArguments::ZoneHandle(Z);
4025 if (!only_dynamic) { 4036 if (!only_dynamic) {
4026 type_arguments = TypeArguments::New(length); 4037 type_arguments = TypeArguments::New(length);
4027 for (intptr_t i = 0; i < length; i++) { 4038 for (intptr_t i = 0; i < length; i++) {
4028 dart_types[i]->AcceptDartTypeVisitor(this); 4039 dart_types[i]->AcceptDartTypeVisitor(this);
4029 if (result_.IsMalformed()) { 4040 if (result_.IsMalformed()) {
4030 type_arguments = TypeArguments::null(); 4041 type_arguments = TypeArguments::null();
4031 return type_arguments; 4042 return type_arguments;
4032 } 4043 }
4033 type_arguments.SetTypeAt(i, result_); 4044 type_arguments.SetTypeAt(i, result_);
4034 } 4045 }
4035 if (finalize_) { 4046 if (finalize_) {
4036 type_arguments = type_arguments.Canonicalize(); 4047 type_arguments = type_arguments.Canonicalize();
4037 } 4048 }
4038 } 4049 }
4039 return type_arguments; 4050 return type_arguments;
4040 } 4051 }
4041 4052
4042 4053
4043 const TypeArguments& DartTypeTranslator::TranslateInstantiatedTypeArguments( 4054 const TypeArguments& DartTypeTranslator::TranslateInstantiatedTypeArguments(
4044 const dart::Class& receiver_class, DartType** receiver_type_arguments, 4055 const dart::Class& receiver_class,
4056 DartType** receiver_type_arguments,
4045 intptr_t length) { 4057 intptr_t length) {
4046 const TypeArguments& type_arguments = 4058 const TypeArguments& type_arguments =
4047 TranslateTypeArguments(receiver_type_arguments, length); 4059 TranslateTypeArguments(receiver_type_arguments, length);
4048 if (type_arguments.IsNull()) return type_arguments; 4060 if (type_arguments.IsNull()) return type_arguments;
4049 4061
4050 // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to 4062 // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to
4051 // finalize the argument types. 4063 // finalize the argument types.
4052 // (This can for example make the [type_arguments] vector larger) 4064 // (This can for example make the [type_arguments] vector larger)
4053 Type& type = Type::Handle( 4065 Type& type = Type::Handle(
4054 Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource)); 4066 Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource));
(...skipping 1651 matching lines...) Expand 10 before | Expand all | Expand 10 after
5706 instructions += LoadLocal(closure); 5718 instructions += LoadLocal(closure);
5707 instructions += LoadLocal(parsed_function_->current_context_var()); 5719 instructions += LoadLocal(parsed_function_->current_context_var());
5708 instructions += StoreInstanceField(Closure::context_offset()); 5720 instructions += StoreInstanceField(Closure::context_offset());
5709 5721
5710 return instructions; 5722 return instructions;
5711 } 5723 }
5712 5724
5713 5725
5714 } // namespace kernel 5726 } // namespace kernel
5715 } // namespace dart 5727 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/libdart_dependency_helper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698