OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler.h" | 5 #include "src/compiler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "src/ast/ast-numbering.h" | 9 #include "src/ast/ast-numbering.h" |
10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 time_taken_to_optimize_, | 412 time_taken_to_optimize_, |
413 time_taken_to_codegen_); | 413 time_taken_to_codegen_); |
414 } | 414 } |
415 } | 415 } |
416 | 416 |
417 // ---------------------------------------------------------------------------- | 417 // ---------------------------------------------------------------------------- |
418 // Local helper methods that make up the compilation pipeline. | 418 // Local helper methods that make up the compilation pipeline. |
419 | 419 |
420 namespace { | 420 namespace { |
421 | 421 |
| 422 bool IsEvalToplevel(Handle<SharedFunctionInfo> shared) { |
| 423 return shared->is_toplevel() && shared->script()->IsScript() && |
| 424 Script::cast(shared->script())->compilation_type() == |
| 425 Script::COMPILATION_TYPE_EVAL; |
| 426 } |
| 427 |
422 void RecordFunctionCompilation(Logger::LogEventsAndTags tag, | 428 void RecordFunctionCompilation(Logger::LogEventsAndTags tag, |
423 CompilationInfo* info) { | 429 CompilationInfo* info) { |
424 // Log the code generation. If source information is available include | 430 // Log the code generation. If source information is available include |
425 // script name and line number. Check explicitly whether logging is | 431 // script name and line number. Check explicitly whether logging is |
426 // enabled as finding the line number is not free. | 432 // enabled as finding the line number is not free. |
427 if (info->isolate()->logger()->is_logging_code_events() || | 433 if (info->isolate()->logger()->is_logging_code_events() || |
428 info->isolate()->cpu_profiler()->is_profiling()) { | 434 info->isolate()->cpu_profiler()->is_profiling()) { |
429 Handle<SharedFunctionInfo> shared = info->shared_info(); | 435 Handle<SharedFunctionInfo> shared = info->shared_info(); |
430 Handle<Script> script = info->parse_info()->script(); | 436 Handle<Script> script = info->parse_info()->script(); |
431 Handle<AbstractCode> abstract_code = | 437 Handle<AbstractCode> abstract_code = |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 PrintF("]\n"); | 765 PrintF("]\n"); |
760 } | 766 } |
761 return cached_code; | 767 return cached_code; |
762 } | 768 } |
763 | 769 |
764 // Reset profiler ticks, function is no longer considered hot. | 770 // Reset profiler ticks, function is no longer considered hot. |
765 if (shared->is_compiled()) { | 771 if (shared->is_compiled()) { |
766 shared->code()->set_profiler_ticks(0); | 772 shared->code()->set_profiler_ticks(0); |
767 } | 773 } |
768 | 774 |
769 // TODO(mstarzinger): We cannot properly deserialize a scope chain containing | |
770 // an eval scope and hence would fail at parsing the eval source again. | |
771 if (shared->disable_optimization_reason() == kEval) { | |
772 return MaybeHandle<Code>(); | |
773 } | |
774 | |
775 VMState<COMPILER> state(isolate); | 775 VMState<COMPILER> state(isolate); |
776 DCHECK(!isolate->has_pending_exception()); | 776 DCHECK(!isolate->has_pending_exception()); |
777 PostponeInterruptsScope postpone(isolate); | 777 PostponeInterruptsScope postpone(isolate); |
778 bool use_turbofan = UseTurboFan(shared, osr_ast_id); | 778 bool use_turbofan = UseTurboFan(shared, osr_ast_id); |
779 base::SmartPointer<CompilationJob> job( | 779 base::SmartPointer<CompilationJob> job( |
780 use_turbofan ? compiler::Pipeline::NewCompilationJob(function) | 780 use_turbofan ? compiler::Pipeline::NewCompilationJob(function) |
781 : new HCompilationJob(function)); | 781 : new HCompilationJob(function)); |
782 CompilationInfo* info = job->info(); | 782 CompilationInfo* info = job->info(); |
| 783 ParseInfo* parse_info = info->parse_info(); |
783 | 784 |
784 info->SetOptimizingForOsr(osr_ast_id); | 785 info->SetOptimizingForOsr(osr_ast_id); |
785 | 786 |
786 // Do not use Crankshaft/TurboFan if we need to be able to set break points. | 787 // Do not use Crankshaft/TurboFan if we need to be able to set break points. |
787 if (info->shared_info()->HasDebugInfo()) { | 788 if (info->shared_info()->HasDebugInfo()) { |
788 info->AbortOptimization(kFunctionBeingDebugged); | 789 info->AbortOptimization(kFunctionBeingDebugged); |
789 return MaybeHandle<Code>(); | 790 return MaybeHandle<Code>(); |
790 } | 791 } |
791 | 792 |
792 // Do not use Crankshaft/TurboFan on a generator function. | 793 // Do not use Crankshaft/TurboFan on a generator function. |
(...skipping 14 matching lines...) Expand all Loading... |
807 CanonicalHandleScope canonical(isolate); | 808 CanonicalHandleScope canonical(isolate); |
808 TimerEventScope<TimerEventOptimizeCode> optimize_code_timer(isolate); | 809 TimerEventScope<TimerEventOptimizeCode> optimize_code_timer(isolate); |
809 TRACE_EVENT0("v8", "V8.OptimizeCode"); | 810 TRACE_EVENT0("v8", "V8.OptimizeCode"); |
810 | 811 |
811 // TurboFan can optimize directly from existing bytecode. | 812 // TurboFan can optimize directly from existing bytecode. |
812 if (FLAG_turbo_from_bytecode && use_turbofan && | 813 if (FLAG_turbo_from_bytecode && use_turbofan && |
813 info->shared_info()->HasBytecodeArray()) { | 814 info->shared_info()->HasBytecodeArray()) { |
814 info->MarkAsOptimizeFromBytecode(); | 815 info->MarkAsOptimizeFromBytecode(); |
815 } | 816 } |
816 | 817 |
| 818 if (IsEvalToplevel(shared)) { |
| 819 parse_info->set_eval(); |
| 820 if (function->context()->IsNativeContext()) parse_info->set_global(); |
| 821 parse_info->set_toplevel(); |
| 822 parse_info->set_allow_lazy_parsing(false); |
| 823 parse_info->set_lazy(false); |
| 824 } |
| 825 |
817 if (mode == Compiler::CONCURRENT) { | 826 if (mode == Compiler::CONCURRENT) { |
818 if (GetOptimizedCodeLater(job.get())) { | 827 if (GetOptimizedCodeLater(job.get())) { |
819 job.Detach(); // The background recompile job owns this now. | 828 job.Detach(); // The background recompile job owns this now. |
820 return isolate->builtins()->InOptimizationQueue(); | 829 return isolate->builtins()->InOptimizationQueue(); |
821 } | 830 } |
822 } else { | 831 } else { |
823 info->set_osr_frame(osr_frame); | 832 info->set_osr_frame(osr_frame); |
824 if (GetOptimizedCodeNow(job.get())) return info->code(); | 833 if (GetOptimizedCodeNow(job.get())) return info->code(); |
825 } | 834 } |
826 | 835 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
995 if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT) | 1004 if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT) |
996 .ToHandle(&opt_code)) { | 1005 .ToHandle(&opt_code)) { |
997 result = opt_code; | 1006 result = opt_code; |
998 } | 1007 } |
999 } | 1008 } |
1000 | 1009 |
1001 return result; | 1010 return result; |
1002 } | 1011 } |
1003 | 1012 |
1004 | 1013 |
1005 inline bool IsEvalToplevel(Handle<SharedFunctionInfo> shared) { | |
1006 return shared->is_toplevel() && shared->script()->IsScript() && | |
1007 Script::cast(shared->script())->compilation_type() == | |
1008 Script::COMPILATION_TYPE_EVAL; | |
1009 } | |
1010 | |
1011 Handle<SharedFunctionInfo> NewSharedFunctionInfoForLiteral( | 1014 Handle<SharedFunctionInfo> NewSharedFunctionInfoForLiteral( |
1012 Isolate* isolate, FunctionLiteral* literal, Handle<Script> script) { | 1015 Isolate* isolate, FunctionLiteral* literal, Handle<Script> script) { |
1013 Handle<Code> code = isolate->builtins()->CompileLazy(); | 1016 Handle<Code> code = isolate->builtins()->CompileLazy(); |
1014 Handle<ScopeInfo> scope_info = handle(ScopeInfo::Empty(isolate)); | 1017 Handle<ScopeInfo> scope_info = handle(ScopeInfo::Empty(isolate)); |
1015 Handle<SharedFunctionInfo> result = isolate->factory()->NewSharedFunctionInfo( | 1018 Handle<SharedFunctionInfo> result = isolate->factory()->NewSharedFunctionInfo( |
1016 literal->name(), literal->materialized_literal_count(), literal->kind(), | 1019 literal->name(), literal->materialized_literal_count(), literal->kind(), |
1017 code, scope_info); | 1020 code, scope_info); |
1018 SharedFunctionInfo::InitFromFunctionLiteral(result, literal); | 1021 SharedFunctionInfo::InitFromFunctionLiteral(result, literal); |
1019 SharedFunctionInfo::SetScript(result, script); | 1022 SharedFunctionInfo::SetScript(result, script); |
1020 return result; | 1023 return result; |
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1806 MaybeHandle<Code> code; | 1809 MaybeHandle<Code> code; |
1807 if (cached.code != nullptr) code = handle(cached.code); | 1810 if (cached.code != nullptr) code = handle(cached.code); |
1808 Handle<Context> native_context(function->context()->native_context()); | 1811 Handle<Context> native_context(function->context()->native_context()); |
1809 SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code, | 1812 SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code, |
1810 literals, BailoutId::None()); | 1813 literals, BailoutId::None()); |
1811 } | 1814 } |
1812 } | 1815 } |
1813 | 1816 |
1814 } // namespace internal | 1817 } // namespace internal |
1815 } // namespace v8 | 1818 } // namespace v8 |
OLD | NEW |