| 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 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 String* script_name = script->name()->IsString() | 720 String* script_name = script->name()->IsString() |
| 721 ? String::cast(script->name()) | 721 ? String::cast(script->name()) |
| 722 : info->isolate()->heap()->empty_string(); | 722 : info->isolate()->heap()->empty_string(); |
| 723 Logger::LogEventsAndTags log_tag = Logger::ToNativeByScript(tag, *script); | 723 Logger::LogEventsAndTags log_tag = Logger::ToNativeByScript(tag, *script); |
| 724 PROFILE(info->isolate(), | 724 PROFILE(info->isolate(), |
| 725 CodeCreateEvent(log_tag, *code, *shared, info, script_name, | 725 CodeCreateEvent(log_tag, *code, *shared, info, script_name, |
| 726 line_num, column_num)); | 726 line_num, column_num)); |
| 727 } | 727 } |
| 728 } | 728 } |
| 729 | 729 |
| 730 | |
| 731 static bool CompileUnoptimizedCode(CompilationInfo* info) { | 730 static bool CompileUnoptimizedCode(CompilationInfo* info) { |
| 732 DCHECK(AllowCompilation::IsAllowed(info->isolate())); | 731 DCHECK(AllowCompilation::IsAllowed(info->isolate())); |
| 733 if (!Compiler::Analyze(info->parse_info()) || | 732 if (!Compiler::Analyze(info->parse_info()) || |
| 734 !FullCodeGenerator::MakeCode(info)) { | 733 !FullCodeGenerator::MakeCode(info)) { |
| 735 Isolate* isolate = info->isolate(); | 734 Isolate* isolate = info->isolate(); |
| 736 if (!isolate->has_pending_exception()) isolate->StackOverflow(); | 735 if (!isolate->has_pending_exception()) isolate->StackOverflow(); |
| 737 return false; | 736 return false; |
| 738 } | 737 } |
| 739 return true; | 738 return true; |
| 740 } | 739 } |
| 741 | 740 |
| 742 | 741 |
| 743 static bool UseIgnition(CompilationInfo* info) { | 742 static bool UseIgnition(CompilationInfo* info) { |
| 744 // Cannot use Ignition when the {function_data} is already used. | 743 // Cannot use Ignition when the {function_data} is already used. |
| 745 if (info->has_shared_info() && info->shared_info()->HasBuiltinFunctionId()) { | 744 if (info->has_shared_info() && info->shared_info()->HasBuiltinFunctionId()) { |
| 746 return false; | 745 return false; |
| 747 } | 746 } |
| 748 | 747 |
| 749 // Checks whether top level functions should be passed by the filter. | 748 // Checks whether top level functions should be passed by the filter. |
| 750 if (info->closure().is_null()) { | 749 if (info->closure().is_null()) { |
| 751 Vector<const char> filter = CStrVector(FLAG_ignition_filter); | 750 Vector<const char> filter = CStrVector(FLAG_ignition_filter); |
| 752 return (filter.length() == 0) || (filter.length() == 1 && filter[0] == '*'); | 751 return (filter.length() == 0) || (filter.length() == 1 && filter[0] == '*'); |
| 753 } | 752 } |
| 754 | 753 |
| 755 // Finally respect the filter. | 754 // Finally respect the filter. |
| 756 return info->closure()->PassesFilter(FLAG_ignition_filter); | 755 return info->closure()->PassesFilter(FLAG_ignition_filter); |
| 757 } | 756 } |
| 758 | 757 |
| 758 static int CodeAndMetadataSize(CompilationInfo* info) { |
| 759 int size = 0; |
| 760 if (info->has_bytecode_array()) { |
| 761 Handle<BytecodeArray> bytecode_array = info->bytecode_array(); |
| 762 size += bytecode_array->BytecodeArraySize(); |
| 763 size += bytecode_array->constant_pool()->Size(); |
| 764 size += bytecode_array->handler_table()->Size(); |
| 765 size += bytecode_array->source_position_table()->Size(); |
| 766 } else { |
| 767 Handle<Code> code = info->code(); |
| 768 size += code->CodeSize(); |
| 769 size += code->relocation_info()->Size(); |
| 770 size += code->deoptimization_data()->Size(); |
| 771 size += code->handler_table()->Size(); |
| 772 } |
| 773 return size; |
| 774 } |
| 775 |
| 759 | 776 |
| 760 static bool GenerateBaselineCode(CompilationInfo* info) { | 777 static bool GenerateBaselineCode(CompilationInfo* info) { |
| 778 bool success; |
| 761 if (FLAG_ignition && UseIgnition(info)) { | 779 if (FLAG_ignition && UseIgnition(info)) { |
| 762 return interpreter::Interpreter::MakeBytecode(info); | 780 success = interpreter::Interpreter::MakeBytecode(info); |
| 763 } else { | 781 } else { |
| 764 return FullCodeGenerator::MakeCode(info); | 782 success = FullCodeGenerator::MakeCode(info); |
| 765 } | 783 } |
| 784 if (success) { |
| 785 Isolate* isolate = info->isolate(); |
| 786 Counters* counters = isolate->counters(); |
| 787 counters->total_baseline_code_size()->Increment(CodeAndMetadataSize(info)); |
| 788 counters->total_baseline_compile_count()->Increment(1); |
| 789 } |
| 790 return success; |
| 766 } | 791 } |
| 767 | 792 |
| 768 | 793 |
| 769 static bool CompileBaselineCode(CompilationInfo* info) { | 794 static bool CompileBaselineCode(CompilationInfo* info) { |
| 770 DCHECK(AllowCompilation::IsAllowed(info->isolate())); | 795 DCHECK(AllowCompilation::IsAllowed(info->isolate())); |
| 771 if (!Compiler::Analyze(info->parse_info()) || !GenerateBaselineCode(info)) { | 796 if (!Compiler::Analyze(info->parse_info()) || !GenerateBaselineCode(info)) { |
| 772 Isolate* isolate = info->isolate(); | 797 Isolate* isolate = info->isolate(); |
| 773 if (!isolate->has_pending_exception()) isolate->StackOverflow(); | 798 if (!isolate->has_pending_exception()) isolate->StackOverflow(); |
| 774 return false; | 799 return false; |
| 775 } | 800 } |
| (...skipping 1061 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1837 } | 1862 } |
| 1838 | 1863 |
| 1839 #if DEBUG | 1864 #if DEBUG |
| 1840 void CompilationInfo::PrintAstForTesting() { | 1865 void CompilationInfo::PrintAstForTesting() { |
| 1841 PrintF("--- Source from AST ---\n%s\n", | 1866 PrintF("--- Source from AST ---\n%s\n", |
| 1842 PrettyPrinter(isolate()).PrintProgram(literal())); | 1867 PrettyPrinter(isolate()).PrintProgram(literal())); |
| 1843 } | 1868 } |
| 1844 #endif | 1869 #endif |
| 1845 } // namespace internal | 1870 } // namespace internal |
| 1846 } // namespace v8 | 1871 } // namespace v8 |
| OLD | NEW |