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

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

Issue 2451893002: Revert "Recognize and optimize a.runtimeType == b.runtimeType pattern." (Closed)
Patch Set: 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/precompiler.h ('k') | runtime/vm/symbols.h » ('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) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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/precompiler.h" 5 #include "vm/precompiler.h"
6 6
7 #include "vm/aot_optimizer.h" 7 #include "vm/aot_optimizer.h"
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/ast_printer.h" 9 #include "vm/ast_printer.h"
10 #include "vm/branch_optimizer.h" 10 #include "vm/branch_optimizer.h"
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 145
146 private: 146 private:
147 Zone* zone_; 147 Zone* zone_;
148 CompileType result_type_; 148 CompileType result_type_;
149 FieldTypeMap* field_map_; 149 FieldTypeMap* field_map_;
150 }; 150 };
151 151
152 152
153 class PrecompileParsedFunctionHelper : public ValueObject { 153 class PrecompileParsedFunctionHelper : public ValueObject {
154 public: 154 public:
155 PrecompileParsedFunctionHelper(Precompiler* precompiler, 155 PrecompileParsedFunctionHelper(ParsedFunction* parsed_function,
156 ParsedFunction* parsed_function,
157 bool optimized) 156 bool optimized)
158 : precompiler_(precompiler), 157 : parsed_function_(parsed_function),
159 parsed_function_(parsed_function),
160 optimized_(optimized), 158 optimized_(optimized),
161 thread_(Thread::Current()) { 159 thread_(Thread::Current()) {
162 } 160 }
163 161
164 bool Compile(CompilationPipeline* pipeline); 162 bool Compile(CompilationPipeline* pipeline);
165 163
166 private: 164 private:
167 ParsedFunction* parsed_function() const { return parsed_function_; } 165 ParsedFunction* parsed_function() const { return parsed_function_; }
168 bool optimized() const { return optimized_; } 166 bool optimized() const { return optimized_; }
169 Thread* thread() const { return thread_; } 167 Thread* thread() const { return thread_; }
170 Isolate* isolate() const { return thread_->isolate(); } 168 Isolate* isolate() const { return thread_->isolate(); }
171 169
172 void FinalizeCompilation(Assembler* assembler, 170 void FinalizeCompilation(Assembler* assembler,
173 FlowGraphCompiler* graph_compiler, 171 FlowGraphCompiler* graph_compiler,
174 FlowGraph* flow_graph); 172 FlowGraph* flow_graph);
175 173
176 Precompiler* precompiler_;
177 ParsedFunction* parsed_function_; 174 ParsedFunction* parsed_function_;
178 const bool optimized_; 175 const bool optimized_;
179 Thread* const thread_; 176 Thread* const thread_;
180 177
181 DISALLOW_COPY_AND_ASSIGN(PrecompileParsedFunctionHelper); 178 DISALLOW_COPY_AND_ASSIGN(PrecompileParsedFunctionHelper);
182 }; 179 };
183 180
184 181
185 static void Jump(const Error& error) { 182 static void Jump(const Error& error) {
186 Thread::Current()->long_jump_base()->Jump(1, error); 183 Thread::Current()->long_jump_base()->Jump(1, error);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 GrowableObjectArray::Handle(GrowableObjectArray::New())), 307 GrowableObjectArray::Handle(GrowableObjectArray::New())),
311 sent_selectors_(), 308 sent_selectors_(),
312 enqueued_functions_(), 309 enqueued_functions_(),
313 fields_to_retain_(), 310 fields_to_retain_(),
314 functions_to_retain_(), 311 functions_to_retain_(),
315 classes_to_retain_(), 312 classes_to_retain_(),
316 typeargs_to_retain_(), 313 typeargs_to_retain_(),
317 types_to_retain_(), 314 types_to_retain_(),
318 consts_to_retain_(), 315 consts_to_retain_(),
319 field_type_map_(), 316 field_type_map_(),
320 error_(Error::Handle()), 317 error_(Error::Handle()) {
321 get_runtime_type_is_unique_(false) {
322 } 318 }
323 319
324 320
325 void Precompiler::DoCompileAll( 321 void Precompiler::DoCompileAll(
326 Dart_QualifiedFunctionName embedder_entry_points[]) { 322 Dart_QualifiedFunctionName embedder_entry_points[]) {
327 ASSERT(I->compilation_allowed()); 323 ASSERT(I->compilation_allowed());
328 324
329 { 325 {
330 StackZone stack_zone(T); 326 StackZone stack_zone(T);
331 zone_ = stack_zone.GetZone(); 327 zone_ = stack_zone.GetZone();
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 476
481 HANDLESCOPE(T); 477 HANDLESCOPE(T);
482 StaticInitializerVisitor visitor(Z); 478 StaticInitializerVisitor visitor(Z);
483 VisitClasses(&visitor); 479 VisitClasses(&visitor);
484 } 480 }
485 481
486 482
487 void Precompiler::PrecompileConstructors() { 483 void Precompiler::PrecompileConstructors() {
488 class ConstructorVisitor : public FunctionVisitor { 484 class ConstructorVisitor : public FunctionVisitor {
489 public: 485 public:
490 explicit ConstructorVisitor(Precompiler* precompiler, Zone* zone) 486 explicit ConstructorVisitor(Zone* zone, FieldTypeMap* map)
491 : precompiler_(precompiler), zone_(zone) { 487 : zone_(zone), field_type_map_(map) {
488 ASSERT(map != NULL);
492 } 489 }
493 void Visit(const Function& function) { 490 void Visit(const Function& function) {
494 if (!function.IsGenerativeConstructor()) return; 491 if (!function.IsGenerativeConstructor()) return;
495 if (function.HasCode()) { 492 if (function.HasCode()) {
496 // Const constructors may have been visited before. Recompile them here 493 // Const constructors may have been visited before. Recompile them here
497 // to collect type information for final fields for them as well. 494 // to collect type information for final fields for them as well.
498 function.ClearCode(); 495 function.ClearCode();
499 } 496 }
500 if (FLAG_trace_precompiler) { 497 if (FLAG_trace_precompiler) {
501 THR_Print("Precompiling constructor %s\n", function.ToCString()); 498 THR_Print("Precompiling constructor %s\n", function.ToCString());
502 } 499 }
503 CompileFunction(precompiler_, 500 CompileFunction(Thread::Current(),
504 Thread::Current(),
505 zone_, 501 zone_,
506 function); 502 function,
503 field_type_map_);
507 } 504 }
508
509 private: 505 private:
510 Precompiler* precompiler_;
511 Zone* zone_; 506 Zone* zone_;
507 FieldTypeMap* field_type_map_;
512 }; 508 };
513 509
514 HANDLESCOPE(T); 510 HANDLESCOPE(T);
515 ConstructorVisitor visitor(this, zone_); 511 ConstructorVisitor visitor(zone_, &field_type_map_);
516 VisitFunctions(&visitor); 512 VisitFunctions(&visitor);
517 513
518 FieldTypeMap::Iterator it(field_type_map_.GetIterator()); 514 FieldTypeMap::Iterator it(field_type_map_.GetIterator());
519 for (FieldTypePair* current = it.Next(); 515 for (FieldTypePair* current = it.Next();
520 current != NULL; 516 current != NULL;
521 current = it.Next()) { 517 current = it.Next()) {
522 const intptr_t cid = current->cid_; 518 const intptr_t cid = current->cid_;
523 current->field_->set_guarded_cid(cid); 519 current->field_->set_guarded_cid(cid);
524 current->field_->set_is_nullable(cid == kNullCid || cid == kDynamicCid); 520 current->field_->set_is_nullable(cid == kNullCid || cid == kDynamicCid);
525 if (FLAG_trace_precompiler) { 521 if (FLAG_trace_precompiler) {
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 THR_Print("Precompiling %" Pd " %s (%s, %s)\n", 789 THR_Print("Precompiling %" Pd " %s (%s, %s)\n",
794 function_count_, 790 function_count_,
795 function.ToLibNamePrefixedQualifiedCString(), 791 function.ToLibNamePrefixedQualifiedCString(),
796 function.token_pos().ToCString(), 792 function.token_pos().ToCString(),
797 Function::KindToCString(function.kind())); 793 Function::KindToCString(function.kind()));
798 } 794 }
799 795
800 ASSERT(!function.is_abstract()); 796 ASSERT(!function.is_abstract());
801 ASSERT(!function.IsRedirectingFactory()); 797 ASSERT(!function.IsRedirectingFactory());
802 798
803 error_ = CompileFunction(this, thread_, zone_, function); 799 error_ = CompileFunction(thread_, zone_, function);
804 if (!error_.IsNull()) { 800 if (!error_.IsNull()) {
805 Jump(error_); 801 Jump(error_);
806 } 802 }
807 // Used in the JIT to save type-feedback across compilations. 803 // Used in the JIT to save type-feedback across compilations.
808 function.ClearICDataArray(); 804 function.ClearICDataArray();
809 } else { 805 } else {
810 if (FLAG_trace_precompiler) { 806 if (FLAG_trace_precompiler) {
811 // This function was compiled from somewhere other than Precompiler, 807 // This function was compiled from somewhere other than Precompiler,
812 // such as const constructors compiled by the parser. 808 // such as const constructors compiled by the parser.
813 THR_Print("Already has code: %s (%s, %s)\n", 809 THR_Print("Already has code: %s (%s, %s)\n",
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 RawFunction* Precompiler::CompileStaticInitializer(const Field& field, 1127 RawFunction* Precompiler::CompileStaticInitializer(const Field& field,
1132 bool compute_type) { 1128 bool compute_type) {
1133 ASSERT(field.is_static()); 1129 ASSERT(field.is_static());
1134 Thread* thread = Thread::Current(); 1130 Thread* thread = Thread::Current();
1135 StackZone zone(thread); 1131 StackZone zone(thread);
1136 1132
1137 ParsedFunction* parsed_function = Parser::ParseStaticFieldInitializer(field); 1133 ParsedFunction* parsed_function = Parser::ParseStaticFieldInitializer(field);
1138 1134
1139 parsed_function->AllocateVariables(); 1135 parsed_function->AllocateVariables();
1140 DartPrecompilationPipeline pipeline(zone.GetZone()); 1136 DartPrecompilationPipeline pipeline(zone.GetZone());
1141 PrecompileParsedFunctionHelper helper(/* precompiler = */ NULL, 1137 PrecompileParsedFunctionHelper helper(parsed_function,
1142 parsed_function,
1143 /* optimized = */ true); 1138 /* optimized = */ true);
1144 bool success = helper.Compile(&pipeline); 1139 bool success = helper.Compile(&pipeline);
1145 ASSERT(success); 1140 ASSERT(success);
1146 1141
1147 if (compute_type && field.is_final()) { 1142 if (compute_type && field.is_final()) {
1148 intptr_t result_cid = pipeline.result_type().ToCid(); 1143 intptr_t result_cid = pipeline.result_type().ToCid();
1149 if (result_cid != kDynamicCid) { 1144 if (result_cid != kDynamicCid) {
1150 if (FLAG_trace_precompiler && FLAG_support_il_printer) { 1145 if (FLAG_trace_precompiler && FLAG_support_il_printer) {
1151 THR_Print("Setting guarded_cid of %s to %s\n", field.ToCString(), 1146 THR_Print("Setting guarded_cid of %s to %s\n", field.ToCString(),
1152 pipeline.result_type().ToCString()); 1147 pipeline.result_type().ToCString());
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1233 // here. 1228 // here.
1234 ParsedFunction* parsed_function = new ParsedFunction(thread, func); 1229 ParsedFunction* parsed_function = new ParsedFunction(thread, func);
1235 parsed_function->SetNodeSequence(fragment); 1230 parsed_function->SetNodeSequence(fragment);
1236 fragment->scope()->AddVariable(parsed_function->EnsureExpressionTemp()); 1231 fragment->scope()->AddVariable(parsed_function->EnsureExpressionTemp());
1237 fragment->scope()->AddVariable( 1232 fragment->scope()->AddVariable(
1238 parsed_function->current_context_var()); 1233 parsed_function->current_context_var());
1239 parsed_function->AllocateVariables(); 1234 parsed_function->AllocateVariables();
1240 1235
1241 // Non-optimized code generator. 1236 // Non-optimized code generator.
1242 DartPrecompilationPipeline pipeline(Thread::Current()->zone()); 1237 DartPrecompilationPipeline pipeline(Thread::Current()->zone());
1243 PrecompileParsedFunctionHelper helper(/* precompiler = */ NULL, 1238 PrecompileParsedFunctionHelper helper(parsed_function,
1244 parsed_function,
1245 /* optimized = */ false); 1239 /* optimized = */ false);
1246 helper.Compile(&pipeline); 1240 helper.Compile(&pipeline);
1247 Code::Handle(func.unoptimized_code()).set_var_descriptors( 1241 Code::Handle(func.unoptimized_code()).set_var_descriptors(
1248 Object::empty_var_descriptors()); 1242 Object::empty_var_descriptors());
1249 1243
1250 const Object& result = PassiveObject::Handle( 1244 const Object& result = PassiveObject::Handle(
1251 DartEntry::InvokeFunction(func, Object::empty_array())); 1245 DartEntry::InvokeFunction(func, Object::empty_array()));
1252 return result.raw(); 1246 return result.raw();
1253 } else { 1247 } else {
1254 Thread* const thread = Thread::Current(); 1248 Thread* const thread = Thread::Current();
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
1510 key ^= table.GetKey(curr_key); 1504 key ^= table.GetKey(curr_key);
1511 farray ^= table.GetOrNull(key); 1505 farray ^= table.GetOrNull(key);
1512 ASSERT(!farray.IsNull()); 1506 ASSERT(!farray.IsNull());
1513 if (farray.Length() == 1) { 1507 if (farray.Length() == 1) {
1514 function ^= farray.At(0); 1508 function ^= farray.At(0);
1515 cls = function.Owner(); 1509 cls = function.Owner();
1516 functions_set.Insert(function); 1510 functions_set.Insert(function);
1517 } 1511 }
1518 } 1512 }
1519 1513
1520 farray ^= table.GetOrNull(Symbols::GetRuntimeType());
1521
1522 get_runtime_type_is_unique_ = !farray.IsNull() && (farray.Length() == 1);
1523
1524 if (FLAG_print_unique_targets) { 1514 if (FLAG_print_unique_targets) {
1525 UniqueFunctionsSet::Iterator unique_iter(&functions_set); 1515 UniqueFunctionsSet::Iterator unique_iter(&functions_set);
1526 while (unique_iter.MoveNext()) { 1516 while (unique_iter.MoveNext()) {
1527 intptr_t curr_key = unique_iter.Current(); 1517 intptr_t curr_key = unique_iter.Current();
1528 function ^= functions_set.GetKey(curr_key); 1518 function ^= functions_set.GetKey(curr_key);
1529 THR_Print("* %s\n", function.ToQualifiedCString()); 1519 THR_Print("* %s\n", function.ToQualifiedCString());
1530 } 1520 }
1531 THR_Print("%" Pd " of %" Pd " dynamic selectors are unique\n", 1521 THR_Print("%" Pd " of %" Pd " dynamic selectors are unique\n",
1532 functions_set.NumOccupied(), table.NumOccupied()); 1522 functions_set.NumOccupied(), table.NumOccupied());
1533 } 1523 }
(...skipping 1288 matching lines...) Expand 10 before | Expand all | Expand 10 after
2822 // We do not add the token position now because we don't know the 2812 // We do not add the token position now because we don't know the
2823 // position of the inlined call until later. A side effect of this 2813 // position of the inlined call until later. A side effect of this
2824 // is that the length of |inline_id_to_function| is always larger 2814 // is that the length of |inline_id_to_function| is always larger
2825 // than the length of |inline_id_to_token_pos| by one. 2815 // than the length of |inline_id_to_token_pos| by one.
2826 // Top scope function has no caller (-1). We do this because we expect 2816 // Top scope function has no caller (-1). We do this because we expect
2827 // all token positions to be at an inlined call. 2817 // all token positions to be at an inlined call.
2828 // Top scope function has no caller (-1). 2818 // Top scope function has no caller (-1).
2829 caller_inline_id.Add(-1); 2819 caller_inline_id.Add(-1);
2830 CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer); 2820 CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer);
2831 2821
2832 AotOptimizer optimizer(precompiler_, 2822 AotOptimizer optimizer(flow_graph,
2833 flow_graph,
2834 use_speculative_inlining, 2823 use_speculative_inlining,
2835 &inlining_black_list); 2824 &inlining_black_list);
2836 optimizer.PopulateWithICData(); 2825 optimizer.PopulateWithICData();
2837 2826
2838 optimizer.ApplyClassIds(); 2827 optimizer.ApplyClassIds();
2839 DEBUG_ASSERT(flow_graph->VerifyUseLists()); 2828 DEBUG_ASSERT(flow_graph->VerifyUseLists());
2840 2829
2841 FlowGraphTypePropagator::Propagate(flow_graph); 2830 FlowGraphTypePropagator::Propagate(flow_graph);
2842 DEBUG_ASSERT(flow_graph->VerifyUseLists()); 2831 DEBUG_ASSERT(flow_graph->VerifyUseLists());
2843 2832
(...skipping 21 matching lines...) Expand all
2865 2854
2866 // Use propagated class-ids to create more inlining opportunities. 2855 // Use propagated class-ids to create more inlining opportunities.
2867 optimizer.ApplyClassIds(); 2856 optimizer.ApplyClassIds();
2868 DEBUG_ASSERT(flow_graph->VerifyUseLists()); 2857 DEBUG_ASSERT(flow_graph->VerifyUseLists());
2869 2858
2870 FlowGraphInliner inliner(flow_graph, 2859 FlowGraphInliner inliner(flow_graph,
2871 &inline_id_to_function, 2860 &inline_id_to_function,
2872 &inline_id_to_token_pos, 2861 &inline_id_to_token_pos,
2873 &caller_inline_id, 2862 &caller_inline_id,
2874 use_speculative_inlining, 2863 use_speculative_inlining,
2875 &inlining_black_list, 2864 &inlining_black_list);
2876 precompiler_);
2877 inliner.Inline(); 2865 inliner.Inline();
2878 // Use lists are maintained and validated by the inliner. 2866 // Use lists are maintained and validated by the inliner.
2879 DEBUG_ASSERT(flow_graph->VerifyUseLists()); 2867 DEBUG_ASSERT(flow_graph->VerifyUseLists());
2880 } 2868 }
2881 2869
2882 // Propagate types and eliminate more type tests. 2870 // Propagate types and eliminate more type tests.
2883 FlowGraphTypePropagator::Propagate(flow_graph); 2871 FlowGraphTypePropagator::Propagate(flow_graph);
2884 DEBUG_ASSERT(flow_graph->VerifyUseLists()); 2872 DEBUG_ASSERT(flow_graph->VerifyUseLists());
2885 2873
2886 { 2874 {
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
3245 } 3233 }
3246 is_compiled = false; 3234 is_compiled = false;
3247 } 3235 }
3248 // Reset global isolate state. 3236 // Reset global isolate state.
3249 thread()->set_deopt_id(prev_deopt_id); 3237 thread()->set_deopt_id(prev_deopt_id);
3250 } 3238 }
3251 return is_compiled; 3239 return is_compiled;
3252 } 3240 }
3253 3241
3254 3242
3255 static RawError* PrecompileFunctionHelper(Precompiler* precompiler, 3243 static RawError* PrecompileFunctionHelper(CompilationPipeline* pipeline,
3256 CompilationPipeline* pipeline,
3257 const Function& function, 3244 const Function& function,
3258 bool optimized) { 3245 bool optimized) {
3259 // Check that we optimize, except if the function is not optimizable. 3246 // Check that we optimize, except if the function is not optimizable.
3260 ASSERT(FLAG_precompiled_mode); 3247 ASSERT(FLAG_precompiled_mode);
3261 ASSERT(!function.IsOptimizable() || optimized); 3248 ASSERT(!function.IsOptimizable() || optimized);
3262 ASSERT(!function.HasCode()); 3249 ASSERT(!function.HasCode());
3263 LongJumpScope jump; 3250 LongJumpScope jump;
3264 if (setjmp(*jump.Set()) == 0) { 3251 if (setjmp(*jump.Set()) == 0) {
3265 Thread* const thread = Thread::Current(); 3252 Thread* const thread = Thread::Current();
3266 StackZone stack_zone(thread); 3253 StackZone stack_zone(thread);
(...skipping 21 matching lines...) Expand all
3288 { 3275 {
3289 HANDLESCOPE(thread); 3276 HANDLESCOPE(thread);
3290 const int64_t num_tokens_before = STAT_VALUE(thread, num_tokens_consumed); 3277 const int64_t num_tokens_before = STAT_VALUE(thread, num_tokens_consumed);
3291 pipeline->ParseFunction(parsed_function); 3278 pipeline->ParseFunction(parsed_function);
3292 const int64_t num_tokens_after = STAT_VALUE(thread, num_tokens_consumed); 3279 const int64_t num_tokens_after = STAT_VALUE(thread, num_tokens_consumed);
3293 INC_STAT(thread, 3280 INC_STAT(thread,
3294 num_func_tokens_compiled, 3281 num_func_tokens_compiled,
3295 num_tokens_after - num_tokens_before); 3282 num_tokens_after - num_tokens_before);
3296 } 3283 }
3297 3284
3298 PrecompileParsedFunctionHelper helper( 3285 PrecompileParsedFunctionHelper helper(parsed_function, optimized);
3299 precompiler, parsed_function, optimized);
3300 const bool success = helper.Compile(pipeline); 3286 const bool success = helper.Compile(pipeline);
3301 if (!success) { 3287 if (!success) {
3302 // Encountered error. 3288 // Encountered error.
3303 Error& error = Error::Handle(); 3289 Error& error = Error::Handle();
3304 // We got an error during compilation. 3290 // We got an error during compilation.
3305 error = thread->sticky_error(); 3291 error = thread->sticky_error();
3306 thread->clear_sticky_error(); 3292 thread->clear_sticky_error();
3307 ASSERT(error.IsLanguageError() && 3293 ASSERT(error.IsLanguageError() &&
3308 LanguageError::Cast(error).kind() != Report::kBailout); 3294 LanguageError::Cast(error).kind() != Report::kBailout);
3309 return error.raw(); 3295 return error.raw();
(...skipping 27 matching lines...) Expand all
3337 // Precompilation may encounter compile-time errors. 3323 // Precompilation may encounter compile-time errors.
3338 // Do not attempt to optimize functions that can cause errors. 3324 // Do not attempt to optimize functions that can cause errors.
3339 function.set_is_optimizable(false); 3325 function.set_is_optimizable(false);
3340 return error.raw(); 3326 return error.raw();
3341 } 3327 }
3342 UNREACHABLE(); 3328 UNREACHABLE();
3343 return Error::null(); 3329 return Error::null();
3344 } 3330 }
3345 3331
3346 3332
3347 RawError* Precompiler::CompileFunction(Precompiler* precompiler, 3333 RawError* Precompiler::CompileFunction(Thread* thread,
3348 Thread* thread,
3349 Zone* zone, 3334 Zone* zone,
3350 const Function& function) { 3335 const Function& function,
3336 FieldTypeMap* field_type_map) {
3351 VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId); 3337 VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
3352 TIMELINE_FUNCTION_COMPILATION_DURATION(thread, "CompileFunction", function); 3338 TIMELINE_FUNCTION_COMPILATION_DURATION(thread, "CompileFunction", function);
3353 3339
3354 ASSERT(FLAG_precompiled_mode); 3340 ASSERT(FLAG_precompiled_mode);
3355 const bool optimized = function.IsOptimizable(); // False for natives. 3341 const bool optimized = function.IsOptimizable(); // False for natives.
3356 DartPrecompilationPipeline pipeline(zone, 3342 DartPrecompilationPipeline pipeline(zone, field_type_map);
3357 (precompiler != NULL) ? precompiler->field_type_map() : NULL); 3343 return PrecompileFunctionHelper(&pipeline, function, optimized);
3358 return PrecompileFunctionHelper(precompiler, &pipeline, function, optimized);
3359 } 3344 }
3360 3345
3361 #endif // DART_PRECOMPILER 3346 #endif // DART_PRECOMPILER
3362 3347
3363 } // namespace dart 3348 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/precompiler.h ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698