| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/compiler.h" | 5 #include "vm/compiler.h" |
| 6 | 6 |
| 7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 | 8 |
| 9 #include "vm/ast_printer.h" | 9 #include "vm/ast_printer.h" |
| 10 #include "vm/block_scheduler.h" | 10 #include "vm/block_scheduler.h" |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 return new (zone) DartCompilationPipeline(); | 197 return new (zone) DartCompilationPipeline(); |
| 198 } | 198 } |
| 199 } | 199 } |
| 200 | 200 |
| 201 | 201 |
| 202 // Compile a function. Should call only if the function has not been compiled. | 202 // Compile a function. Should call only if the function has not been compiled. |
| 203 // Arg0: function object. | 203 // Arg0: function object. |
| 204 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { | 204 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { |
| 205 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); | 205 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); |
| 206 ASSERT(!function.HasCode()); | 206 ASSERT(!function.HasCode()); |
| 207 const Error& error = | 207 const Object& result = |
| 208 Error::Handle(Compiler::CompileFunction(thread, function)); | 208 Object::Handle(Compiler::CompileFunction(thread, function)); |
| 209 if (!error.IsNull()) { | 209 if (result.IsError()) { |
| 210 if (error.IsLanguageError()) { | 210 if (result.IsLanguageError()) { |
| 211 Exceptions::ThrowCompileTimeError(LanguageError::Cast(error)); | 211 Exceptions::ThrowCompileTimeError(LanguageError::Cast(result)); |
| 212 UNREACHABLE(); | 212 UNREACHABLE(); |
| 213 } | 213 } |
| 214 Exceptions::PropagateError(error); | 214 Exceptions::PropagateError(Error::Cast(result)); |
| 215 } | 215 } |
| 216 } | 216 } |
| 217 | 217 |
| 218 | 218 |
| 219 bool Compiler::CanOptimizeFunction(Thread* thread, const Function& function) { | 219 bool Compiler::CanOptimizeFunction(Thread* thread, const Function& function) { |
| 220 if (FLAG_support_debugger) { | 220 if (FLAG_support_debugger) { |
| 221 Isolate* isolate = thread->isolate(); | 221 Isolate* isolate = thread->isolate(); |
| 222 if (isolate->debugger()->IsStepping() || | 222 if (isolate->debugger()->IsStepping() || |
| 223 isolate->debugger()->HasBreakpoint(function, thread->zone())) { | 223 isolate->debugger()->HasBreakpoint(function, thread->zone())) { |
| 224 // We cannot set breakpoints and single step in optimized code, | 224 // We cannot set breakpoints and single step in optimized code, |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 CompileParsedFunctionHelper(ParsedFunction* parsed_function, | 489 CompileParsedFunctionHelper(ParsedFunction* parsed_function, |
| 490 bool optimized, | 490 bool optimized, |
| 491 intptr_t osr_id) | 491 intptr_t osr_id) |
| 492 : parsed_function_(parsed_function), | 492 : parsed_function_(parsed_function), |
| 493 optimized_(optimized), | 493 optimized_(optimized), |
| 494 osr_id_(osr_id), | 494 osr_id_(osr_id), |
| 495 thread_(Thread::Current()), | 495 thread_(Thread::Current()), |
| 496 loading_invalidation_gen_at_start_( | 496 loading_invalidation_gen_at_start_( |
| 497 isolate()->loading_invalidation_gen()) {} | 497 isolate()->loading_invalidation_gen()) {} |
| 498 | 498 |
| 499 bool Compile(CompilationPipeline* pipeline); | 499 RawCode* Compile(CompilationPipeline* pipeline); |
| 500 | 500 |
| 501 private: | 501 private: |
| 502 ParsedFunction* parsed_function() const { return parsed_function_; } | 502 ParsedFunction* parsed_function() const { return parsed_function_; } |
| 503 bool optimized() const { return optimized_; } | 503 bool optimized() const { return optimized_; } |
| 504 intptr_t osr_id() const { return osr_id_; } | 504 intptr_t osr_id() const { return osr_id_; } |
| 505 Thread* thread() const { return thread_; } | 505 Thread* thread() const { return thread_; } |
| 506 Isolate* isolate() const { return thread_->isolate(); } | 506 Isolate* isolate() const { return thread_->isolate(); } |
| 507 intptr_t loading_invalidation_gen_at_start() const { | 507 intptr_t loading_invalidation_gen_at_start() const { |
| 508 return loading_invalidation_gen_at_start_; | 508 return loading_invalidation_gen_at_start_; |
| 509 } | 509 } |
| 510 void FinalizeCompilation(Assembler* assembler, | 510 RawCode* FinalizeCompilation(Assembler* assembler, |
| 511 FlowGraphCompiler* graph_compiler, | 511 FlowGraphCompiler* graph_compiler, |
| 512 FlowGraph* flow_graph); | 512 FlowGraph* flow_graph); |
| 513 void CheckIfBackgroundCompilerIsBeingStopped(); | 513 void CheckIfBackgroundCompilerIsBeingStopped(); |
| 514 | 514 |
| 515 ParsedFunction* parsed_function_; | 515 ParsedFunction* parsed_function_; |
| 516 const bool optimized_; | 516 const bool optimized_; |
| 517 const intptr_t osr_id_; | 517 const intptr_t osr_id_; |
| 518 Thread* const thread_; | 518 Thread* const thread_; |
| 519 const intptr_t loading_invalidation_gen_at_start_; | 519 const intptr_t loading_invalidation_gen_at_start_; |
| 520 | 520 |
| 521 DISALLOW_COPY_AND_ASSIGN(CompileParsedFunctionHelper); | 521 DISALLOW_COPY_AND_ASSIGN(CompileParsedFunctionHelper); |
| 522 }; | 522 }; |
| 523 | 523 |
| 524 | 524 |
| 525 void CompileParsedFunctionHelper::FinalizeCompilation( | 525 RawCode* CompileParsedFunctionHelper::FinalizeCompilation( |
| 526 Assembler* assembler, | 526 Assembler* assembler, |
| 527 FlowGraphCompiler* graph_compiler, | 527 FlowGraphCompiler* graph_compiler, |
| 528 FlowGraph* flow_graph) { | 528 FlowGraph* flow_graph) { |
| 529 ASSERT(!FLAG_precompiled_mode); | 529 ASSERT(!FLAG_precompiled_mode); |
| 530 const Function& function = parsed_function()->function(); | 530 const Function& function = parsed_function()->function(); |
| 531 Zone* const zone = thread()->zone(); | 531 Zone* const zone = thread()->zone(); |
| 532 | 532 |
| 533 CSTAT_TIMER_SCOPE(thread(), codefinalizer_timer); | 533 CSTAT_TIMER_SCOPE(thread(), codefinalizer_timer); |
| 534 // CreateDeoptInfo uses the object pool and needs to be done before | 534 // CreateDeoptInfo uses the object pool and needs to be done before |
| 535 // FinalizeCode. | 535 // FinalizeCode. |
| 536 const Array& deopt_info_array = | 536 const Array& deopt_info_array = |
| 537 Array::Handle(zone, graph_compiler->CreateDeoptInfo(assembler)); | 537 Array::Handle(zone, graph_compiler->CreateDeoptInfo(assembler)); |
| 538 INC_STAT(thread(), total_code_size, | 538 INC_STAT(thread(), total_code_size, |
| 539 deopt_info_array.Length() * sizeof(uword)); | 539 deopt_info_array.Length() * sizeof(uword)); |
| 540 // Allocates instruction object. Since this occurs only at safepoint, | 540 // Allocates instruction object. Since this occurs only at safepoint, |
| 541 // there can be no concurrent access to the instruction page. | 541 // there can be no concurrent access to the instruction page. |
| 542 const Code& code = | 542 Code& code = |
| 543 Code::Handle(Code::FinalizeCode(function, assembler, optimized())); | 543 Code::Handle(Code::FinalizeCode(function, assembler, optimized())); |
| 544 code.set_is_optimized(optimized()); | 544 code.set_is_optimized(optimized()); |
| 545 code.set_owner(function); | 545 code.set_owner(function); |
| 546 #if !defined(PRODUCT) | 546 #if !defined(PRODUCT) |
| 547 if (FLAG_support_debugger) { | 547 if (FLAG_support_debugger) { |
| 548 ZoneGrowableArray<TokenPosition>* await_token_positions = | 548 ZoneGrowableArray<TokenPosition>* await_token_positions = |
| 549 flow_graph->await_token_positions(); | 549 flow_graph->await_token_positions(); |
| 550 if (await_token_positions != NULL) { | 550 if (await_token_positions != NULL) { |
| 551 Smi& token_pos_value = Smi::Handle(zone); | 551 Smi& token_pos_value = Smi::Handle(zone); |
| 552 if (await_token_positions->length() > 0) { | 552 if (await_token_positions->length() > 0) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 581 code.set_deopt_info_array(deopt_info_array); | 581 code.set_deopt_info_array(deopt_info_array); |
| 582 | 582 |
| 583 graph_compiler->FinalizeStackMaps(code); | 583 graph_compiler->FinalizeStackMaps(code); |
| 584 graph_compiler->FinalizeVarDescriptors(code); | 584 graph_compiler->FinalizeVarDescriptors(code); |
| 585 graph_compiler->FinalizeExceptionHandlers(code); | 585 graph_compiler->FinalizeExceptionHandlers(code); |
| 586 graph_compiler->FinalizeCatchEntryStateMap(code); | 586 graph_compiler->FinalizeCatchEntryStateMap(code); |
| 587 graph_compiler->FinalizeStaticCallTargetsTable(code); | 587 graph_compiler->FinalizeStaticCallTargetsTable(code); |
| 588 graph_compiler->FinalizeCodeSourceMap(code); | 588 graph_compiler->FinalizeCodeSourceMap(code); |
| 589 | 589 |
| 590 if (optimized()) { | 590 if (optimized()) { |
| 591 bool code_was_installed = false; | |
| 592 // Installs code while at safepoint. | 591 // Installs code while at safepoint. |
| 593 if (thread()->IsMutatorThread()) { | 592 if (thread()->IsMutatorThread()) { |
| 594 const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId; | 593 const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId; |
| 595 function.InstallOptimizedCode(code, is_osr); | 594 if (!is_osr) { |
| 596 code_was_installed = true; | 595 function.InstallOptimizedCode(code); |
| 596 } |
| 597 ASSERT(code.owner() == function.raw()); |
| 597 } else { | 598 } else { |
| 598 // Background compilation. | 599 // Background compilation. |
| 599 // Before installing code check generation counts if the code may | 600 // Before installing code check generation counts if the code may |
| 600 // have become invalid. | 601 // have become invalid. |
| 601 const bool trace_compiler = | 602 const bool trace_compiler = |
| 602 FLAG_trace_compiler || FLAG_trace_optimizing_compiler; | 603 FLAG_trace_compiler || FLAG_trace_optimizing_compiler; |
| 603 bool code_is_valid = true; | 604 bool code_is_valid = true; |
| 604 if (!flow_graph->parsed_function().guarded_fields()->is_empty()) { | 605 if (!flow_graph->parsed_function().guarded_fields()->is_empty()) { |
| 605 const ZoneGrowableArray<const Field*>& guarded_fields = | 606 const ZoneGrowableArray<const Field*>& guarded_fields = |
| 606 *flow_graph->parsed_function().guarded_fields(); | 607 *flow_graph->parsed_function().guarded_fields(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 630 code_is_valid = false; | 631 code_is_valid = false; |
| 631 if (trace_compiler) { | 632 if (trace_compiler) { |
| 632 THR_Print("--> FAIL: Class hierarchy has new subclasses."); | 633 THR_Print("--> FAIL: Class hierarchy has new subclasses."); |
| 633 } | 634 } |
| 634 } | 635 } |
| 635 | 636 |
| 636 // Setting breakpoints at runtime could make a function non-optimizable. | 637 // Setting breakpoints at runtime could make a function non-optimizable. |
| 637 if (code_is_valid && Compiler::CanOptimizeFunction(thread(), function)) { | 638 if (code_is_valid && Compiler::CanOptimizeFunction(thread(), function)) { |
| 638 const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId; | 639 const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId; |
| 639 ASSERT(!is_osr); // OSR is not compiled in background. | 640 ASSERT(!is_osr); // OSR is not compiled in background. |
| 640 function.InstallOptimizedCode(code, is_osr); | 641 function.InstallOptimizedCode(code); |
| 641 code_was_installed = true; | 642 } else { |
| 643 code = Code::null(); |
| 642 } | 644 } |
| 643 if (function.usage_counter() < 0) { | 645 if (function.usage_counter() < 0) { |
| 644 // Reset to 0 so that it can be recompiled if needed. | 646 // Reset to 0 so that it can be recompiled if needed. |
| 645 if (code_is_valid) { | 647 if (code_is_valid) { |
| 646 function.set_usage_counter(0); | 648 function.set_usage_counter(0); |
| 647 } else { | 649 } else { |
| 648 // Trigger another optimization pass soon. | 650 // Trigger another optimization pass soon. |
| 649 function.set_usage_counter(FLAG_optimization_counter_threshold - 100); | 651 function.set_usage_counter(FLAG_optimization_counter_threshold - 100); |
| 650 } | 652 } |
| 651 } | 653 } |
| 652 } | 654 } |
| 653 | 655 |
| 654 if (code_was_installed) { | 656 if (!code.IsNull()) { |
| 655 // The generated code was compiled under certain assumptions about | 657 // The generated code was compiled under certain assumptions about |
| 656 // class hierarchy and field types. Register these dependencies | 658 // class hierarchy and field types. Register these dependencies |
| 657 // to ensure that the code will be deoptimized if they are violated. | 659 // to ensure that the code will be deoptimized if they are violated. |
| 658 thread()->cha()->RegisterDependencies(code); | 660 thread()->cha()->RegisterDependencies(code); |
| 659 | 661 |
| 660 const ZoneGrowableArray<const Field*>& guarded_fields = | 662 const ZoneGrowableArray<const Field*>& guarded_fields = |
| 661 *flow_graph->parsed_function().guarded_fields(); | 663 *flow_graph->parsed_function().guarded_fields(); |
| 662 Field& field = Field::Handle(); | 664 Field& field = Field::Handle(); |
| 663 for (intptr_t i = 0; i < guarded_fields.length(); i++) { | 665 for (intptr_t i = 0; i < guarded_fields.length(); i++) { |
| 664 field = guarded_fields[i]->Original(); | 666 field = guarded_fields[i]->Original(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 675 function.AttachCode(code); | 677 function.AttachCode(code); |
| 676 } | 678 } |
| 677 if (parsed_function()->HasDeferredPrefixes()) { | 679 if (parsed_function()->HasDeferredPrefixes()) { |
| 678 ASSERT(!FLAG_load_deferred_eagerly); | 680 ASSERT(!FLAG_load_deferred_eagerly); |
| 679 ZoneGrowableArray<const LibraryPrefix*>* prefixes = | 681 ZoneGrowableArray<const LibraryPrefix*>* prefixes = |
| 680 parsed_function()->deferred_prefixes(); | 682 parsed_function()->deferred_prefixes(); |
| 681 for (intptr_t i = 0; i < prefixes->length(); i++) { | 683 for (intptr_t i = 0; i < prefixes->length(); i++) { |
| 682 (*prefixes)[i]->RegisterDependentCode(code); | 684 (*prefixes)[i]->RegisterDependentCode(code); |
| 683 } | 685 } |
| 684 } | 686 } |
| 687 return code.raw(); |
| 685 } | 688 } |
| 686 | 689 |
| 687 | 690 |
| 688 void CompileParsedFunctionHelper::CheckIfBackgroundCompilerIsBeingStopped() { | 691 void CompileParsedFunctionHelper::CheckIfBackgroundCompilerIsBeingStopped() { |
| 689 ASSERT(Compiler::IsBackgroundCompilation()); | 692 ASSERT(Compiler::IsBackgroundCompilation()); |
| 690 if (!isolate()->background_compiler()->is_running()) { | 693 if (!isolate()->background_compiler()->is_running()) { |
| 691 // The background compiler is being stopped. | 694 // The background compiler is being stopped. |
| 692 Compiler::AbortBackgroundCompilation( | 695 Compiler::AbortBackgroundCompilation( |
| 693 Thread::kNoDeoptId, "Background compilation is being stopped"); | 696 Thread::kNoDeoptId, "Background compilation is being stopped"); |
| 694 } | 697 } |
| 695 } | 698 } |
| 696 | 699 |
| 697 | 700 |
| 698 // Return false if bailed out. | 701 // Return null if bailed out. |
| 699 // If optimized_result_code is not NULL then it is caller's responsibility | 702 // If optimized_result_code is not NULL then it is caller's responsibility |
| 700 // to install code. | 703 // to install code. |
| 701 bool CompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) { | 704 RawCode* CompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) { |
| 702 ASSERT(!FLAG_precompiled_mode); | 705 ASSERT(!FLAG_precompiled_mode); |
| 703 const Function& function = parsed_function()->function(); | 706 const Function& function = parsed_function()->function(); |
| 704 if (optimized() && !function.IsOptimizable()) { | 707 if (optimized() && !function.IsOptimizable()) { |
| 705 return false; | 708 return Code::null(); |
| 706 } | 709 } |
| 707 bool is_compiled = false; | |
| 708 Zone* const zone = thread()->zone(); | 710 Zone* const zone = thread()->zone(); |
| 709 NOT_IN_PRODUCT(TimelineStream* compiler_timeline = | 711 NOT_IN_PRODUCT(TimelineStream* compiler_timeline = |
| 710 Timeline::GetCompilerStream()); | 712 Timeline::GetCompilerStream()); |
| 711 CSTAT_TIMER_SCOPE(thread(), codegen_timer); | 713 CSTAT_TIMER_SCOPE(thread(), codegen_timer); |
| 712 HANDLESCOPE(thread()); | 714 HANDLESCOPE(thread()); |
| 713 | 715 |
| 714 // We may reattempt compilation if the function needs to be assembled using | 716 // We may reattempt compilation if the function needs to be assembled using |
| 715 // far branches on ARM and MIPS. In the else branch of the setjmp call, | 717 // far branches on ARM and MIPS. In the else branch of the setjmp call, |
| 716 // done is set to false, and use_far_branches is set to true if there is a | 718 // done is set to false, and use_far_branches is set to true if there is a |
| 717 // longjmp from the ARM or MIPS assemblers. In all other paths through this | 719 // longjmp from the ARM or MIPS assemblers. In all other paths through this |
| 718 // while loop, done is set to true. use_far_branches is always false on ia32 | 720 // while loop, done is set to true. use_far_branches is always false on ia32 |
| 719 // and x64. | 721 // and x64. |
| 720 volatile bool done = false; | 722 volatile bool done = false; |
| 721 // volatile because the variable may be clobbered by a longjmp. | 723 // volatile because the variable may be clobbered by a longjmp. |
| 722 volatile bool use_far_branches = false; | 724 volatile bool use_far_branches = false; |
| 723 const bool use_speculative_inlining = false; | 725 const bool use_speculative_inlining = false; |
| 724 | 726 |
| 727 Code* volatile result = &Code::ZoneHandle(zone); |
| 725 while (!done) { | 728 while (!done) { |
| 729 *result = Code::null(); |
| 726 const intptr_t prev_deopt_id = thread()->deopt_id(); | 730 const intptr_t prev_deopt_id = thread()->deopt_id(); |
| 727 thread()->set_deopt_id(0); | 731 thread()->set_deopt_id(0); |
| 728 LongJumpScope jump; | 732 LongJumpScope jump; |
| 729 const intptr_t val = setjmp(*jump.Set()); | 733 if (setjmp(*jump.Set()) == 0) { |
| 730 if (val == 0) { | |
| 731 FlowGraph* flow_graph = NULL; | 734 FlowGraph* flow_graph = NULL; |
| 732 | 735 |
| 733 // Class hierarchy analysis is registered with the thread in the | 736 // Class hierarchy analysis is registered with the thread in the |
| 734 // constructor and unregisters itself upon destruction. | 737 // constructor and unregisters itself upon destruction. |
| 735 CHA cha(thread()); | 738 CHA cha(thread()); |
| 736 | 739 |
| 737 // TimerScope needs an isolate to be properly terminated in case of a | 740 // TimerScope needs an isolate to be properly terminated in case of a |
| 738 // LongJump. | 741 // LongJump. |
| 739 { | 742 { |
| 740 CSTAT_TIMER_SCOPE(thread(), graphbuilder_timer); | 743 CSTAT_TIMER_SCOPE(thread(), graphbuilder_timer); |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1128 CSTAT_TIMER_SCOPE(thread(), graphcompiler_timer); | 1131 CSTAT_TIMER_SCOPE(thread(), graphcompiler_timer); |
| 1129 NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline, | 1132 NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline, |
| 1130 "CompileGraph")); | 1133 "CompileGraph")); |
| 1131 graph_compiler.CompileGraph(); | 1134 graph_compiler.CompileGraph(); |
| 1132 pipeline->FinalizeCompilation(flow_graph); | 1135 pipeline->FinalizeCompilation(flow_graph); |
| 1133 } | 1136 } |
| 1134 { | 1137 { |
| 1135 NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline, | 1138 NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline, |
| 1136 "FinalizeCompilation")); | 1139 "FinalizeCompilation")); |
| 1137 if (thread()->IsMutatorThread()) { | 1140 if (thread()->IsMutatorThread()) { |
| 1138 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); | 1141 *result = |
| 1142 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); |
| 1139 } else { | 1143 } else { |
| 1140 // This part of compilation must be at a safepoint. | 1144 // This part of compilation must be at a safepoint. |
| 1141 // Stop mutator thread before creating the instruction object and | 1145 // Stop mutator thread before creating the instruction object and |
| 1142 // installing code. | 1146 // installing code. |
| 1143 // Mutator thread may not run code while we are creating the | 1147 // Mutator thread may not run code while we are creating the |
| 1144 // instruction object, since the creation of instruction object | 1148 // instruction object, since the creation of instruction object |
| 1145 // changes code page access permissions (makes them temporary not | 1149 // changes code page access permissions (makes them temporary not |
| 1146 // executable). | 1150 // executable). |
| 1147 { | 1151 { |
| 1148 CheckIfBackgroundCompilerIsBeingStopped(); | 1152 CheckIfBackgroundCompilerIsBeingStopped(); |
| 1149 SafepointOperationScope safepoint_scope(thread()); | 1153 SafepointOperationScope safepoint_scope(thread()); |
| 1150 // Do not Garbage collect during this stage and instead allow the | 1154 // Do not Garbage collect during this stage and instead allow the |
| 1151 // heap to grow. | 1155 // heap to grow. |
| 1152 NoHeapGrowthControlScope no_growth_control; | 1156 NoHeapGrowthControlScope no_growth_control; |
| 1153 CheckIfBackgroundCompilerIsBeingStopped(); | 1157 CheckIfBackgroundCompilerIsBeingStopped(); |
| 1154 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); | 1158 *result = |
| 1159 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); |
| 1155 } | 1160 } |
| 1156 // TODO(srdjan): Enable this and remove the one from | 1161 // TODO(srdjan): Enable this and remove the one from |
| 1157 // 'BackgroundCompiler::CompileOptimized' once cause of time-outs | 1162 // 'BackgroundCompiler::CompileOptimized' once cause of time-outs |
| 1158 // is resolved. | 1163 // is resolved. |
| 1159 // if (isolate()->heap()->NeedsGarbageCollection()) { | 1164 // if (isolate()->heap()->NeedsGarbageCollection()) { |
| 1160 // isolate()->heap()->CollectAllGarbage(); | 1165 // isolate()->heap()->CollectAllGarbage(); |
| 1161 // } | 1166 // } |
| 1162 } | 1167 } |
| 1163 } | 1168 } |
| 1164 // Exit the loop and the function with the correct result value. | 1169 // Exit the loop and the function with the correct result value. |
| 1165 is_compiled = true; | |
| 1166 done = true; | 1170 done = true; |
| 1167 } else { | 1171 } else { |
| 1168 // We bailed out or we encountered an error. | 1172 // We bailed out or we encountered an error. |
| 1169 const Error& error = Error::Handle(thread()->sticky_error()); | 1173 const Error& error = Error::Handle(thread()->sticky_error()); |
| 1170 | 1174 |
| 1171 if (error.raw() == Object::branch_offset_error().raw()) { | 1175 if (error.raw() == Object::branch_offset_error().raw()) { |
| 1172 // Compilation failed due to an out of range branch offset in the | 1176 // Compilation failed due to an out of range branch offset in the |
| 1173 // assembler. We try again (done = false) with far branches enabled. | 1177 // assembler. We try again (done = false) with far branches enabled. |
| 1174 done = false; | 1178 done = false; |
| 1175 ASSERT(!use_far_branches); | 1179 ASSERT(!use_far_branches); |
| 1176 use_far_branches = true; | 1180 use_far_branches = true; |
| 1177 } else if (error.raw() == Object::speculative_inlining_error().raw()) { | 1181 } else if (error.raw() == Object::speculative_inlining_error().raw()) { |
| 1178 // Can only happen with precompilation. | 1182 // Can only happen with precompilation. |
| 1179 UNREACHABLE(); | 1183 UNREACHABLE(); |
| 1180 } else { | 1184 } else { |
| 1181 // If the error isn't due to an out of range branch offset, we don't | 1185 // If the error isn't due to an out of range branch offset, we don't |
| 1182 // try again (done = true), and indicate that we did not finish | 1186 // try again (done = true). |
| 1183 // compiling (is_compiled = false). | |
| 1184 if (FLAG_trace_bailout) { | 1187 if (FLAG_trace_bailout) { |
| 1185 THR_Print("%s\n", error.ToErrorCString()); | 1188 THR_Print("%s\n", error.ToErrorCString()); |
| 1186 } | 1189 } |
| 1187 done = true; | 1190 done = true; |
| 1188 } | 1191 } |
| 1189 | 1192 |
| 1190 // If is is not a background compilation, clear the error if it was not a | 1193 // If is is not a background compilation, clear the error if it was not a |
| 1191 // real error, but just a bailout. If we're it a background compilation | 1194 // real error, but just a bailout. If we're it a background compilation |
| 1192 // this will be dealt with in the caller. | 1195 // this will be dealt with in the caller. |
| 1193 if (!Compiler::IsBackgroundCompilation() && error.IsLanguageError() && | 1196 if (!Compiler::IsBackgroundCompilation() && error.IsLanguageError() && |
| 1194 (LanguageError::Cast(error).kind() == Report::kBailout)) { | 1197 (LanguageError::Cast(error).kind() == Report::kBailout)) { |
| 1195 thread()->clear_sticky_error(); | 1198 thread()->clear_sticky_error(); |
| 1196 } | 1199 } |
| 1197 is_compiled = false; | |
| 1198 } | 1200 } |
| 1199 // Reset global isolate state. | 1201 // Reset global isolate state. |
| 1200 thread()->set_deopt_id(prev_deopt_id); | 1202 thread()->set_deopt_id(prev_deopt_id); |
| 1201 } | 1203 } |
| 1202 return is_compiled; | 1204 return result->raw(); |
| 1203 } | 1205 } |
| 1204 | 1206 |
| 1205 | 1207 |
| 1206 static RawError* CompileFunctionHelper(CompilationPipeline* pipeline, | 1208 static RawObject* CompileFunctionHelper(CompilationPipeline* pipeline, |
| 1207 const Function& function, | 1209 const Function& function, |
| 1208 bool optimized, | 1210 bool optimized, |
| 1209 intptr_t osr_id) { | 1211 intptr_t osr_id) { |
| 1210 ASSERT(!FLAG_precompiled_mode); | 1212 ASSERT(!FLAG_precompiled_mode); |
| 1211 ASSERT(!optimized || function.was_compiled()); | 1213 ASSERT(!optimized || function.was_compiled()); |
| 1212 LongJumpScope jump; | 1214 LongJumpScope jump; |
| 1213 if (setjmp(*jump.Set()) == 0) { | 1215 if (setjmp(*jump.Set()) == 0) { |
| 1214 Thread* const thread = Thread::Current(); | 1216 Thread* const thread = Thread::Current(); |
| 1215 Isolate* const isolate = thread->isolate(); | 1217 Isolate* const isolate = thread->isolate(); |
| 1216 StackZone stack_zone(thread); | 1218 StackZone stack_zone(thread); |
| 1217 Zone* const zone = stack_zone.GetZone(); | 1219 Zone* const zone = stack_zone.GetZone(); |
| 1218 const bool trace_compiler = | 1220 const bool trace_compiler = |
| 1219 FLAG_trace_compiler || (FLAG_trace_optimizing_compiler && optimized); | 1221 FLAG_trace_compiler || (FLAG_trace_optimizing_compiler && optimized); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1255 (loading_invalidation_gen_at_start != | 1257 (loading_invalidation_gen_at_start != |
| 1256 isolate->loading_invalidation_gen())) { | 1258 isolate->loading_invalidation_gen())) { |
| 1257 // Loading occured while parsing. We need to abort here because state | 1259 // Loading occured while parsing. We need to abort here because state |
| 1258 // changed while compiling. | 1260 // changed while compiling. |
| 1259 Compiler::AbortBackgroundCompilation( | 1261 Compiler::AbortBackgroundCompilation( |
| 1260 Thread::kNoDeoptId, | 1262 Thread::kNoDeoptId, |
| 1261 "Invalidated state during parsing because of script loading"); | 1263 "Invalidated state during parsing because of script loading"); |
| 1262 } | 1264 } |
| 1263 } | 1265 } |
| 1264 | 1266 |
| 1265 const bool success = helper.Compile(pipeline); | 1267 const Code& result = Code::Handle(helper.Compile(pipeline)); |
| 1266 if (success) { | 1268 if (!result.IsNull()) { |
| 1267 if (!optimized) { | 1269 if (!optimized) { |
| 1268 function.set_was_compiled(true); | 1270 function.set_was_compiled(true); |
| 1269 } | 1271 } |
| 1270 } else { | 1272 } else { |
| 1271 if (optimized) { | 1273 if (optimized) { |
| 1272 if (Compiler::IsBackgroundCompilation()) { | 1274 if (Compiler::IsBackgroundCompilation()) { |
| 1273 // Try again later, background compilation may abort because of | 1275 // Try again later, background compilation may abort because of |
| 1274 // state change during compilation. | 1276 // state change during compilation. |
| 1275 if (FLAG_trace_compiler) { | 1277 if (FLAG_trace_compiler) { |
| 1276 THR_Print("Aborted background compilation: %s\n", | 1278 THR_Print("Aborted background compilation: %s\n", |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1298 if (trace_compiler) { | 1300 if (trace_compiler) { |
| 1299 THR_Print("--> disabling optimizations for '%s'\n", | 1301 THR_Print("--> disabling optimizations for '%s'\n", |
| 1300 function.ToFullyQualifiedCString()); | 1302 function.ToFullyQualifiedCString()); |
| 1301 } else if (FLAG_trace_failed_optimization_attempts) { | 1303 } else if (FLAG_trace_failed_optimization_attempts) { |
| 1302 THR_Print("Cannot optimize: %s\n", | 1304 THR_Print("Cannot optimize: %s\n", |
| 1303 function.ToFullyQualifiedCString()); | 1305 function.ToFullyQualifiedCString()); |
| 1304 } | 1306 } |
| 1305 function.SetIsOptimizable(false); | 1307 function.SetIsOptimizable(false); |
| 1306 return Error::null(); | 1308 return Error::null(); |
| 1307 } else { | 1309 } else { |
| 1310 ASSERT(!optimized); |
| 1308 // Encountered error. | 1311 // Encountered error. |
| 1309 Error& error = Error::Handle(); | 1312 Error& error = Error::Handle(); |
| 1310 // We got an error during compilation. | 1313 // We got an error during compilation. |
| 1311 error = thread->sticky_error(); | 1314 error = thread->sticky_error(); |
| 1312 thread->clear_sticky_error(); | 1315 thread->clear_sticky_error(); |
| 1313 // The non-optimizing compiler can get an unhandled exception | 1316 // The non-optimizing compiler can get an unhandled exception |
| 1314 // due to OOM or Stack overflow errors, it should not however | 1317 // due to OOM or Stack overflow errors, it should not however |
| 1315 // bail out. | 1318 // bail out. |
| 1316 ASSERT(error.IsUnhandledException() || | 1319 ASSERT(error.IsUnhandledException() || |
| 1317 (error.IsLanguageError() && | 1320 (error.IsLanguageError() && |
| 1318 LanguageError::Cast(error).kind() != Report::kBailout)); | 1321 LanguageError::Cast(error).kind() != Report::kBailout)); |
| 1319 return error.raw(); | 1322 return error.raw(); |
| 1320 } | 1323 } |
| 1324 UNREACHABLE(); |
| 1321 } | 1325 } |
| 1322 | 1326 |
| 1323 per_compile_timer.Stop(); | 1327 per_compile_timer.Stop(); |
| 1324 | 1328 |
| 1325 if (trace_compiler && success) { | 1329 if (trace_compiler) { |
| 1326 THR_Print("--> '%s' entry: %#" Px " size: %" Pd " time: %" Pd64 " us\n", | 1330 THR_Print("--> '%s' entry: %#" Px " size: %" Pd " time: %" Pd64 " us\n", |
| 1327 function.ToFullyQualifiedCString(), | 1331 function.ToFullyQualifiedCString(), |
| 1328 Code::Handle(function.CurrentCode()).PayloadStart(), | 1332 Code::Handle(function.CurrentCode()).PayloadStart(), |
| 1329 Code::Handle(function.CurrentCode()).Size(), | 1333 Code::Handle(function.CurrentCode()).Size(), |
| 1330 per_compile_timer.TotalElapsedTime()); | 1334 per_compile_timer.TotalElapsedTime()); |
| 1331 } | 1335 } |
| 1332 | 1336 |
| 1333 if (FLAG_support_debugger) { | 1337 if (FLAG_support_debugger) { |
| 1334 isolate->debugger()->NotifyCompilation(function); | 1338 isolate->debugger()->NotifyCompilation(function); |
| 1335 } | 1339 } |
| 1336 | 1340 |
| 1337 if (FLAG_disassemble && FlowGraphPrinter::ShouldPrint(function)) { | 1341 if (FLAG_disassemble && FlowGraphPrinter::ShouldPrint(function)) { |
| 1338 Disassembler::DisassembleCode(function, optimized); | 1342 Disassembler::DisassembleCode(function, optimized); |
| 1339 } else if (FLAG_disassemble_optimized && optimized && | 1343 } else if (FLAG_disassemble_optimized && optimized && |
| 1340 FlowGraphPrinter::ShouldPrint(function)) { | 1344 FlowGraphPrinter::ShouldPrint(function)) { |
| 1341 Disassembler::DisassembleCode(function, true); | 1345 Disassembler::DisassembleCode(function, true); |
| 1342 } | 1346 } |
| 1343 | 1347 |
| 1344 return Error::null(); | 1348 return result.raw(); |
| 1345 } else { | 1349 } else { |
| 1346 Thread* const thread = Thread::Current(); | 1350 Thread* const thread = Thread::Current(); |
| 1347 StackZone stack_zone(thread); | 1351 StackZone stack_zone(thread); |
| 1348 Error& error = Error::Handle(); | 1352 Error& error = Error::Handle(); |
| 1349 // We got an error during compilation or it is a bailout from background | 1353 // We got an error during compilation or it is a bailout from background |
| 1350 // compilation (e.g., during parsing with EnsureIsFinalized). | 1354 // compilation (e.g., during parsing with EnsureIsFinalized). |
| 1351 error = thread->sticky_error(); | 1355 error = thread->sticky_error(); |
| 1352 thread->clear_sticky_error(); | 1356 thread->clear_sticky_error(); |
| 1353 if (error.raw() == Object::background_compilation_error().raw()) { | 1357 if (error.raw() == Object::background_compilation_error().raw()) { |
| 1354 // Exit compilation, retry it later. | 1358 // Exit compilation, retry it later. |
| 1355 if (FLAG_trace_bailout) { | 1359 if (FLAG_trace_bailout) { |
| 1356 THR_Print("Aborted background compilation: %s\n", | 1360 THR_Print("Aborted background compilation: %s\n", |
| 1357 function.ToFullyQualifiedCString()); | 1361 function.ToFullyQualifiedCString()); |
| 1358 } | 1362 } |
| 1359 return Error::null(); | 1363 return Object::null(); |
| 1360 } | 1364 } |
| 1361 // Do not attempt to optimize functions that can cause errors. | 1365 // Do not attempt to optimize functions that can cause errors. |
| 1362 function.set_is_optimizable(false); | 1366 function.set_is_optimizable(false); |
| 1363 return error.raw(); | 1367 return error.raw(); |
| 1364 } | 1368 } |
| 1365 UNREACHABLE(); | 1369 UNREACHABLE(); |
| 1366 return Error::null(); | 1370 return Object::null(); |
| 1367 } | 1371 } |
| 1368 | 1372 |
| 1369 | 1373 |
| 1370 static RawError* ParseFunctionHelper(CompilationPipeline* pipeline, | 1374 static RawError* ParseFunctionHelper(CompilationPipeline* pipeline, |
| 1371 const Function& function, | 1375 const Function& function, |
| 1372 bool optimized, | 1376 bool optimized, |
| 1373 intptr_t osr_id) { | 1377 intptr_t osr_id) { |
| 1374 ASSERT(!FLAG_precompiled_mode); | 1378 ASSERT(!FLAG_precompiled_mode); |
| 1375 ASSERT(!optimized || function.was_compiled()); | 1379 ASSERT(!optimized || function.was_compiled()); |
| 1376 LongJumpScope jump; | 1380 LongJumpScope jump; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1417 // Unoptimized compilation or precompilation may encounter compile-time | 1421 // Unoptimized compilation or precompilation may encounter compile-time |
| 1418 // errors, but regular optimized compilation should not. | 1422 // errors, but regular optimized compilation should not. |
| 1419 ASSERT(!optimized); | 1423 ASSERT(!optimized); |
| 1420 return error.raw(); | 1424 return error.raw(); |
| 1421 } | 1425 } |
| 1422 UNREACHABLE(); | 1426 UNREACHABLE(); |
| 1423 return Error::null(); | 1427 return Error::null(); |
| 1424 } | 1428 } |
| 1425 | 1429 |
| 1426 | 1430 |
| 1427 RawError* Compiler::CompileFunction(Thread* thread, const Function& function) { | 1431 RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) { |
| 1428 #ifdef DART_PRECOMPILER | 1432 #ifdef DART_PRECOMPILER |
| 1429 if (FLAG_precompiled_mode) { | 1433 if (FLAG_precompiled_mode) { |
| 1430 return Precompiler::CompileFunction( | 1434 return Precompiler::CompileFunction( |
| 1431 /* precompiler = */ NULL, thread, thread->zone(), function); | 1435 /* precompiler = */ NULL, thread, thread->zone(), function); |
| 1432 } | 1436 } |
| 1433 #endif | 1437 #endif |
| 1434 | 1438 |
| 1435 Isolate* isolate = thread->isolate(); | 1439 Isolate* isolate = thread->isolate(); |
| 1436 | 1440 |
| 1437 #if !defined(PRODUCT) | 1441 #if !defined(PRODUCT) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1480 const Function& function) { | 1484 const Function& function) { |
| 1481 if (function.unoptimized_code() != Object::null()) { | 1485 if (function.unoptimized_code() != Object::null()) { |
| 1482 return Error::null(); | 1486 return Error::null(); |
| 1483 } | 1487 } |
| 1484 Code& original_code = Code::ZoneHandle(thread->zone()); | 1488 Code& original_code = Code::ZoneHandle(thread->zone()); |
| 1485 if (function.HasCode()) { | 1489 if (function.HasCode()) { |
| 1486 original_code = function.CurrentCode(); | 1490 original_code = function.CurrentCode(); |
| 1487 } | 1491 } |
| 1488 CompilationPipeline* pipeline = | 1492 CompilationPipeline* pipeline = |
| 1489 CompilationPipeline::New(thread->zone(), function); | 1493 CompilationPipeline::New(thread->zone(), function); |
| 1490 const Error& error = Error::Handle( | 1494 const Object& result = Object::Handle( |
| 1491 CompileFunctionHelper(pipeline, function, false, /* not optimized */ | 1495 CompileFunctionHelper(pipeline, function, false, /* not optimized */ |
| 1492 kNoOSRDeoptId)); | 1496 kNoOSRDeoptId)); |
| 1493 if (!error.IsNull()) { | 1497 if (result.IsError()) { |
| 1494 return error.raw(); | 1498 return Error::Cast(result).raw(); |
| 1495 } | 1499 } |
| 1496 // Since CompileFunctionHelper replaces the current code, re-attach the | 1500 // Since CompileFunctionHelper replaces the current code, re-attach the |
| 1497 // the original code if the function was already compiled. | 1501 // the original code if the function was already compiled. |
| 1498 if (!original_code.IsNull() && | 1502 if (!original_code.IsNull() && result.raw() == function.CurrentCode() && |
| 1499 (original_code.raw() != function.CurrentCode())) { | 1503 !original_code.IsDisabled()) { |
| 1500 function.AttachCode(original_code); | 1504 function.AttachCode(original_code); |
| 1501 } | 1505 } |
| 1502 ASSERT(function.unoptimized_code() != Object::null()); | 1506 ASSERT(function.unoptimized_code() != Object::null()); |
| 1507 ASSERT(function.unoptimized_code() == result.raw()); |
| 1503 if (FLAG_trace_compiler) { | 1508 if (FLAG_trace_compiler) { |
| 1504 THR_Print("Ensure unoptimized code for %s\n", function.ToCString()); | 1509 THR_Print("Ensure unoptimized code for %s\n", function.ToCString()); |
| 1505 } | 1510 } |
| 1506 return Error::null(); | 1511 return Error::null(); |
| 1507 } | 1512 } |
| 1508 | 1513 |
| 1509 | 1514 |
| 1510 RawError* Compiler::CompileOptimizedFunction(Thread* thread, | 1515 RawObject* Compiler::CompileOptimizedFunction(Thread* thread, |
| 1511 const Function& function, | 1516 const Function& function, |
| 1512 intptr_t osr_id) { | 1517 intptr_t osr_id) { |
| 1513 #if !defined(PRODUCT) | 1518 #if !defined(PRODUCT) |
| 1514 VMTagScope tagScope(thread, VMTag::kCompileOptimizedTagId); | 1519 VMTagScope tagScope(thread, VMTag::kCompileOptimizedTagId); |
| 1515 const char* event_name; | 1520 const char* event_name; |
| 1516 if (osr_id != kNoOSRDeoptId) { | 1521 if (osr_id != kNoOSRDeoptId) { |
| 1517 event_name = "CompileFunctionOptimizedOSR"; | 1522 event_name = "CompileFunctionOptimizedOSR"; |
| 1518 } else if (IsBackgroundCompilation()) { | 1523 } else if (IsBackgroundCompilation()) { |
| 1519 event_name = "CompileFunctionOptimizedBackground"; | 1524 event_name = "CompileFunctionOptimizedBackground"; |
| 1520 } else { | 1525 } else { |
| 1521 event_name = "CompileFunctionOptimized"; | 1526 event_name = "CompileFunctionOptimized"; |
| 1522 } | 1527 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1585 } else { | 1590 } else { |
| 1586 // Only possible with background compilation. | 1591 // Only possible with background compilation. |
| 1587 ASSERT(Compiler::IsBackgroundCompilation()); | 1592 ASSERT(Compiler::IsBackgroundCompilation()); |
| 1588 } | 1593 } |
| 1589 } | 1594 } |
| 1590 | 1595 |
| 1591 | 1596 |
| 1592 RawError* Compiler::CompileAllFunctions(const Class& cls) { | 1597 RawError* Compiler::CompileAllFunctions(const Class& cls) { |
| 1593 Thread* thread = Thread::Current(); | 1598 Thread* thread = Thread::Current(); |
| 1594 Zone* zone = thread->zone(); | 1599 Zone* zone = thread->zone(); |
| 1595 Error& error = Error::Handle(zone); | 1600 Object& result = Object::Handle(zone); |
| 1596 Array& functions = Array::Handle(zone, cls.functions()); | 1601 Array& functions = Array::Handle(zone, cls.functions()); |
| 1597 Function& func = Function::Handle(zone); | 1602 Function& func = Function::Handle(zone); |
| 1598 // Class dynamic lives in the vm isolate. Its array fields cannot be set to | 1603 // Class dynamic lives in the vm isolate. Its array fields cannot be set to |
| 1599 // an empty array. | 1604 // an empty array. |
| 1600 if (functions.IsNull()) { | 1605 if (functions.IsNull()) { |
| 1601 ASSERT(cls.IsDynamicClass()); | 1606 ASSERT(cls.IsDynamicClass()); |
| 1602 return error.raw(); | 1607 return Error::null(); |
| 1603 } | 1608 } |
| 1604 // Compile all the regular functions. | 1609 // Compile all the regular functions. |
| 1605 for (int i = 0; i < functions.Length(); i++) { | 1610 for (int i = 0; i < functions.Length(); i++) { |
| 1606 func ^= functions.At(i); | 1611 func ^= functions.At(i); |
| 1607 ASSERT(!func.IsNull()); | 1612 ASSERT(!func.IsNull()); |
| 1608 if (!func.HasCode() && !func.is_abstract() && | 1613 if (!func.HasCode() && !func.is_abstract() && |
| 1609 !func.IsRedirectingFactory()) { | 1614 !func.IsRedirectingFactory()) { |
| 1610 if ((cls.is_mixin_app_alias() || cls.IsMixinApplication()) && | 1615 if ((cls.is_mixin_app_alias() || cls.IsMixinApplication()) && |
| 1611 func.HasOptionalParameters()) { | 1616 func.HasOptionalParameters()) { |
| 1612 // Skipping optional parameters in mixin application. | 1617 // Skipping optional parameters in mixin application. |
| 1613 continue; | 1618 continue; |
| 1614 } | 1619 } |
| 1615 error = CompileFunction(thread, func); | 1620 result = CompileFunction(thread, func); |
| 1616 if (!error.IsNull()) { | 1621 if (result.IsError()) { |
| 1617 return error.raw(); | 1622 return Error::Cast(result).raw(); |
| 1618 } | 1623 } |
| 1624 ASSERT(!result.IsNull()); |
| 1619 func.ClearICDataArray(); | 1625 func.ClearICDataArray(); |
| 1620 func.ClearCode(); | 1626 func.ClearCode(); |
| 1621 } | 1627 } |
| 1622 } | 1628 } |
| 1623 return error.raw(); | 1629 return Error::null(); |
| 1624 } | 1630 } |
| 1625 | 1631 |
| 1626 | 1632 |
| 1627 RawError* Compiler::ParseAllFunctions(const Class& cls) { | 1633 RawError* Compiler::ParseAllFunctions(const Class& cls) { |
| 1628 Thread* thread = Thread::Current(); | 1634 Thread* thread = Thread::Current(); |
| 1629 Zone* zone = thread->zone(); | 1635 Zone* zone = thread->zone(); |
| 1630 Error& error = Error::Handle(zone); | 1636 Error& error = Error::Handle(zone); |
| 1631 Array& functions = Array::Handle(zone, cls.functions()); | 1637 Array& functions = Array::Handle(zone, cls.functions()); |
| 1632 Function& func = Function::Handle(zone); | 1638 Function& func = Function::Handle(zone); |
| 1633 // Class dynamic lives in the vm isolate. Its array fields cannot be set to | 1639 // Class dynamic lives in the vm isolate. Its array fields cannot be set to |
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2190 return Error::null(); | 2196 return Error::null(); |
| 2191 } | 2197 } |
| 2192 | 2198 |
| 2193 | 2199 |
| 2194 RawError* Compiler::CompileClass(const Class& cls) { | 2200 RawError* Compiler::CompileClass(const Class& cls) { |
| 2195 UNREACHABLE(); | 2201 UNREACHABLE(); |
| 2196 return Error::null(); | 2202 return Error::null(); |
| 2197 } | 2203 } |
| 2198 | 2204 |
| 2199 | 2205 |
| 2200 RawError* Compiler::CompileFunction(Thread* thread, const Function& function) { | 2206 RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) { |
| 2201 UNREACHABLE(); | 2207 UNREACHABLE(); |
| 2202 return Error::null(); | 2208 return Error::null(); |
| 2203 } | 2209 } |
| 2204 | 2210 |
| 2205 | 2211 |
| 2206 RawError* Compiler::ParseFunction(Thread* thread, const Function& function) { | 2212 RawError* Compiler::ParseFunction(Thread* thread, const Function& function) { |
| 2207 UNREACHABLE(); | 2213 UNREACHABLE(); |
| 2208 return Error::null(); | 2214 return Error::null(); |
| 2209 } | 2215 } |
| 2210 | 2216 |
| 2211 | 2217 |
| 2212 RawError* Compiler::EnsureUnoptimizedCode(Thread* thread, | 2218 RawError* Compiler::EnsureUnoptimizedCode(Thread* thread, |
| 2213 const Function& function) { | 2219 const Function& function) { |
| 2214 UNREACHABLE(); | 2220 UNREACHABLE(); |
| 2215 return Error::null(); | 2221 return Error::null(); |
| 2216 } | 2222 } |
| 2217 | 2223 |
| 2218 | 2224 |
| 2219 RawError* Compiler::CompileOptimizedFunction(Thread* thread, | 2225 RawObject* Compiler::CompileOptimizedFunction(Thread* thread, |
| 2220 const Function& function, | 2226 const Function& function, |
| 2221 intptr_t osr_id) { | 2227 intptr_t osr_id) { |
| 2222 UNREACHABLE(); | 2228 UNREACHABLE(); |
| 2223 return Error::null(); | 2229 return Error::null(); |
| 2224 } | 2230 } |
| 2225 | 2231 |
| 2226 | 2232 |
| 2227 RawError* Compiler::CompileParsedFunction(ParsedFunction* parsed_function) { | 2233 RawError* Compiler::CompileParsedFunction(ParsedFunction* parsed_function) { |
| 2228 UNREACHABLE(); | 2234 UNREACHABLE(); |
| 2229 return Error::null(); | 2235 return Error::null(); |
| 2230 } | 2236 } |
| 2231 | 2237 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2297 | 2303 |
| 2298 | 2304 |
| 2299 bool BackgroundCompiler::IsDisabled() { | 2305 bool BackgroundCompiler::IsDisabled() { |
| 2300 UNREACHABLE(); | 2306 UNREACHABLE(); |
| 2301 return true; | 2307 return true; |
| 2302 } | 2308 } |
| 2303 | 2309 |
| 2304 #endif // DART_PRECOMPILED_RUNTIME | 2310 #endif // DART_PRECOMPILED_RUNTIME |
| 2305 | 2311 |
| 2306 } // namespace dart | 2312 } // namespace dart |
| OLD | NEW |