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 699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 Handle<SharedFunctionInfo> shared) { | 710 Handle<SharedFunctionInfo> shared) { |
711 // SharedFunctionInfo is passed separately, because if CompilationInfo | 711 // SharedFunctionInfo is passed separately, because if CompilationInfo |
712 // was created using Script object, it will not have it. | 712 // was created using Script object, it will not have it. |
713 | 713 |
714 // Log the code generation. If source information is available include | 714 // Log the code generation. If source information is available include |
715 // script name and line number. Check explicitly whether logging is | 715 // script name and line number. Check explicitly whether logging is |
716 // enabled as finding the line number is not free. | 716 // enabled as finding the line number is not free. |
717 if (info->isolate()->logger()->is_logging_code_events() || | 717 if (info->isolate()->logger()->is_logging_code_events() || |
718 info->isolate()->cpu_profiler()->is_profiling()) { | 718 info->isolate()->cpu_profiler()->is_profiling()) { |
719 Handle<Script> script = info->parse_info()->script(); | 719 Handle<Script> script = info->parse_info()->script(); |
720 Handle<Code> code = info->code(); | 720 Handle<AbstractCode> abstract_code = info->abstract_code(); |
721 if (code.is_identical_to(info->isolate()->builtins()->CompileLazy())) { | 721 if (abstract_code.is_identical_to( |
| 722 info->isolate()->builtins()->CompileLazy())) { |
722 return; | 723 return; |
723 } | 724 } |
724 int line_num = Script::GetLineNumber(script, shared->start_position()) + 1; | 725 int line_num = Script::GetLineNumber(script, shared->start_position()) + 1; |
725 int column_num = | 726 int column_num = |
726 Script::GetColumnNumber(script, shared->start_position()) + 1; | 727 Script::GetColumnNumber(script, shared->start_position()) + 1; |
727 String* script_name = script->name()->IsString() | 728 String* script_name = script->name()->IsString() |
728 ? String::cast(script->name()) | 729 ? String::cast(script->name()) |
729 : info->isolate()->heap()->empty_string(); | 730 : info->isolate()->heap()->empty_string(); |
730 Logger::LogEventsAndTags log_tag = Logger::ToNativeByScript(tag, *script); | 731 Logger::LogEventsAndTags log_tag = Logger::ToNativeByScript(tag, *script); |
731 PROFILE(info->isolate(), | 732 PROFILE(info->isolate(), |
732 CodeCreateEvent(log_tag, *code, *shared, info, script_name, | 733 CodeCreateEvent(log_tag, *abstract_code, *shared, info, script_name, |
733 line_num, column_num)); | 734 line_num, column_num)); |
734 } | 735 } |
735 } | 736 } |
736 | 737 |
737 static bool CompileUnoptimizedCode(CompilationInfo* info) { | 738 static bool CompileUnoptimizedCode(CompilationInfo* info) { |
738 DCHECK(AllowCompilation::IsAllowed(info->isolate())); | 739 DCHECK(AllowCompilation::IsAllowed(info->isolate())); |
739 if (!Compiler::Analyze(info->parse_info()) || | 740 if (!Compiler::Analyze(info->parse_info()) || |
740 !FullCodeGenerator::MakeCode(info)) { | 741 !FullCodeGenerator::MakeCode(info)) { |
741 Isolate* isolate = info->isolate(); | 742 Isolate* isolate = info->isolate(); |
742 if (!isolate->has_pending_exception()) isolate->StackOverflow(); | 743 if (!isolate->has_pending_exception()) isolate->StackOverflow(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
817 // Parse and update CompilationInfo with the results. | 818 // Parse and update CompilationInfo with the results. |
818 if (!Parser::ParseStatic(info->parse_info())) return MaybeHandle<Code>(); | 819 if (!Parser::ParseStatic(info->parse_info())) return MaybeHandle<Code>(); |
819 Handle<SharedFunctionInfo> shared = info->shared_info(); | 820 Handle<SharedFunctionInfo> shared = info->shared_info(); |
820 FunctionLiteral* lit = info->literal(); | 821 FunctionLiteral* lit = info->literal(); |
821 DCHECK_EQ(shared->language_mode(), lit->language_mode()); | 822 DCHECK_EQ(shared->language_mode(), lit->language_mode()); |
822 SetExpectedNofPropertiesFromEstimate(shared, lit->expected_property_count()); | 823 SetExpectedNofPropertiesFromEstimate(shared, lit->expected_property_count()); |
823 MaybeDisableOptimization(shared, lit->dont_optimize_reason()); | 824 MaybeDisableOptimization(shared, lit->dont_optimize_reason()); |
824 | 825 |
825 // Compile either unoptimized code or bytecode for the interpreter. | 826 // Compile either unoptimized code or bytecode for the interpreter. |
826 if (!CompileBaselineCode(info)) return MaybeHandle<Code>(); | 827 if (!CompileBaselineCode(info)) return MaybeHandle<Code>(); |
827 if (info->code()->kind() == Code::FUNCTION) { // Only for full code. | 828 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, shared); |
828 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, shared); | |
829 } | |
830 | 829 |
831 // Update the shared function info with the scope info. Allocating the | 830 // Update the shared function info with the scope info. Allocating the |
832 // ScopeInfo object may cause a GC. | 831 // ScopeInfo object may cause a GC. |
833 Handle<ScopeInfo> scope_info = | 832 Handle<ScopeInfo> scope_info = |
834 ScopeInfo::Create(info->isolate(), info->zone(), info->scope()); | 833 ScopeInfo::Create(info->isolate(), info->zone(), info->scope()); |
835 shared->set_scope_info(*scope_info); | 834 shared->set_scope_info(*scope_info); |
836 | 835 |
837 // Update the code and feedback vector for the shared function info. | 836 // Update the code and feedback vector for the shared function info. |
838 shared->ReplaceCode(*info->code()); | 837 shared->ReplaceCode(*info->code()); |
839 shared->set_feedback_vector(*info->feedback_vector()); | 838 shared->set_feedback_vector(*info->feedback_vector()); |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1322 } | 1321 } |
1323 | 1322 |
1324 Handle<String> script_name = | 1323 Handle<String> script_name = |
1325 script->name()->IsString() | 1324 script->name()->IsString() |
1326 ? Handle<String>(String::cast(script->name())) | 1325 ? Handle<String>(String::cast(script->name())) |
1327 : isolate->factory()->empty_string(); | 1326 : isolate->factory()->empty_string(); |
1328 Logger::LogEventsAndTags log_tag = info->is_eval() | 1327 Logger::LogEventsAndTags log_tag = info->is_eval() |
1329 ? Logger::EVAL_TAG | 1328 ? Logger::EVAL_TAG |
1330 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script); | 1329 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script); |
1331 | 1330 |
1332 PROFILE(isolate, CodeCreateEvent( | 1331 PROFILE(isolate, CodeCreateEvent(log_tag, *info->abstract_code(), *result, |
1333 log_tag, *info->code(), *result, info, *script_name)); | 1332 info, *script_name)); |
1334 | 1333 |
1335 // Hint to the runtime system used when allocating space for initial | 1334 // Hint to the runtime system used when allocating space for initial |
1336 // property space by setting the expected number of properties for | 1335 // property space by setting the expected number of properties for |
1337 // the instances of the function. | 1336 // the instances of the function. |
1338 SetExpectedNofPropertiesFromEstimate(result, | 1337 SetExpectedNofPropertiesFromEstimate(result, |
1339 lit->expected_property_count()); | 1338 lit->expected_property_count()); |
1340 | 1339 |
1341 if (!script.is_null()) | 1340 if (!script.is_null()) |
1342 script->set_compilation_state(Script::COMPILATION_STATE_COMPILED); | 1341 script->set_compilation_state(Script::COMPILATION_STATE_COMPILED); |
1343 | 1342 |
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1888 } | 1887 } |
1889 | 1888 |
1890 #if DEBUG | 1889 #if DEBUG |
1891 void CompilationInfo::PrintAstForTesting() { | 1890 void CompilationInfo::PrintAstForTesting() { |
1892 PrintF("--- Source from AST ---\n%s\n", | 1891 PrintF("--- Source from AST ---\n%s\n", |
1893 PrettyPrinter(isolate()).PrintProgram(literal())); | 1892 PrettyPrinter(isolate()).PrintProgram(literal())); |
1894 } | 1893 } |
1895 #endif | 1894 #endif |
1896 } // namespace internal | 1895 } // namespace internal |
1897 } // namespace v8 | 1896 } // namespace v8 |
OLD | NEW |