| 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 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 deferred_handles_(nullptr), | 171 deferred_handles_(nullptr), |
| 172 dependencies_(isolate, zone), | 172 dependencies_(isolate, zone), |
| 173 bailout_reason_(kNoReason), | 173 bailout_reason_(kNoReason), |
| 174 prologue_offset_(Code::kPrologueOffsetNotSet), | 174 prologue_offset_(Code::kPrologueOffsetNotSet), |
| 175 track_positions_(FLAG_hydrogen_track_positions || | 175 track_positions_(FLAG_hydrogen_track_positions || |
| 176 isolate->cpu_profiler()->is_profiling()), | 176 isolate->cpu_profiler()->is_profiling()), |
| 177 opt_count_(has_shared_info() ? shared_info()->opt_count() : 0), | 177 opt_count_(has_shared_info() ? shared_info()->opt_count() : 0), |
| 178 parameter_count_(0), | 178 parameter_count_(0), |
| 179 optimization_id_(-1), | 179 optimization_id_(-1), |
| 180 osr_expr_stack_height_(0), | 180 osr_expr_stack_height_(0), |
| 181 function_type_(nullptr), | |
| 182 debug_name_(debug_name) { | 181 debug_name_(debug_name) { |
| 183 // Parameter count is number of stack parameters. | 182 // Parameter count is number of stack parameters. |
| 184 if (code_stub_ != NULL) { | 183 if (code_stub_ != NULL) { |
| 185 CodeStubDescriptor descriptor(code_stub_); | 184 CodeStubDescriptor descriptor(code_stub_); |
| 186 parameter_count_ = descriptor.GetStackParameterCount(); | 185 parameter_count_ = descriptor.GetStackParameterCount(); |
| 187 if (descriptor.function_mode() == NOT_JS_FUNCTION_STUB_MODE) { | 186 if (descriptor.function_mode() == NOT_JS_FUNCTION_STUB_MODE) { |
| 188 parameter_count_--; | 187 parameter_count_--; |
| 189 } | 188 } |
| 190 set_output_code_kind(code_stub->GetCodeKind()); | 189 set_output_code_kind(code_stub->GetCodeKind()); |
| 191 } else { | 190 } else { |
| 192 set_output_code_kind(Code::FUNCTION); | 191 set_output_code_kind(Code::FUNCTION); |
| 193 } | 192 } |
| 194 } | 193 } |
| 195 | 194 |
| 196 | 195 |
| 197 CompilationInfo::~CompilationInfo() { | 196 CompilationInfo::~CompilationInfo() { |
| 198 DisableFutureOptimization(); | 197 DisableFutureOptimization(); |
| 199 delete deferred_handles_; | 198 delete deferred_handles_; |
| 200 #ifdef DEBUG | 199 #ifdef DEBUG |
| 201 // Check that no dependent maps have been added or added dependent maps have | 200 // Check that no dependent maps have been added or added dependent maps have |
| 202 // been rolled back or committed. | 201 // been rolled back or committed. |
| 203 DCHECK(dependencies()->IsEmpty()); | 202 DCHECK(dependencies()->IsEmpty()); |
| 204 #endif // DEBUG | 203 #endif // DEBUG |
| 205 } | 204 } |
| 206 | 205 |
| 207 | 206 |
| 208 void CompilationInfo::SetStub(CodeStub* code_stub) { | |
| 209 SetMode(STUB); | |
| 210 code_stub_ = code_stub; | |
| 211 debug_name_ = CodeStub::MajorName(code_stub->MajorKey()); | |
| 212 set_output_code_kind(code_stub->GetCodeKind()); | |
| 213 } | |
| 214 | |
| 215 | |
| 216 int CompilationInfo::num_parameters() const { | 207 int CompilationInfo::num_parameters() const { |
| 217 return has_scope() ? scope()->num_parameters() : parameter_count_; | 208 return has_scope() ? scope()->num_parameters() : parameter_count_; |
| 218 } | 209 } |
| 219 | 210 |
| 220 | 211 |
| 221 int CompilationInfo::num_parameters_including_this() const { | 212 int CompilationInfo::num_parameters_including_this() const { |
| 222 return num_parameters() + (is_this_defined() ? 1 : 0); | 213 return num_parameters() + (is_this_defined() ? 1 : 0); |
| 223 } | 214 } |
| 224 | 215 |
| 225 | 216 |
| (...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 991 function, result, | 982 function, result, |
| 992 Compiler::NOT_CONCURRENT).ToHandle(&opt_code)) { | 983 Compiler::NOT_CONCURRENT).ToHandle(&opt_code)) { |
| 993 result = opt_code; | 984 result = opt_code; |
| 994 } | 985 } |
| 995 } | 986 } |
| 996 | 987 |
| 997 return result; | 988 return result; |
| 998 } | 989 } |
| 999 | 990 |
| 1000 | 991 |
| 1001 MaybeHandle<Code> Compiler::GetStubCode(Handle<JSFunction> function, | |
| 1002 CodeStub* stub) { | |
| 1003 // Build a "hybrid" CompilationInfo for a JSFunction/CodeStub pair. | |
| 1004 Zone zone; | |
| 1005 ParseInfo parse_info(&zone, function); | |
| 1006 CompilationInfo info(&parse_info); | |
| 1007 info.SetFunctionType(stub->GetCallInterfaceDescriptor().GetFunctionType()); | |
| 1008 info.MarkAsFunctionContextSpecializing(); | |
| 1009 info.MarkAsDeoptimizationEnabled(); | |
| 1010 info.SetStub(stub); | |
| 1011 | |
| 1012 // Run a "mini pipeline", extracted from compiler.cc. | |
| 1013 if (!ParseAndAnalyze(&parse_info)) return MaybeHandle<Code>(); | |
| 1014 return compiler::Pipeline(&info).GenerateCode(); | |
| 1015 } | |
| 1016 | |
| 1017 | |
| 1018 bool Compiler::Compile(Handle<JSFunction> function, ClearExceptionFlag flag) { | 992 bool Compiler::Compile(Handle<JSFunction> function, ClearExceptionFlag flag) { |
| 1019 if (function->is_compiled()) return true; | 993 if (function->is_compiled()) return true; |
| 1020 MaybeHandle<Code> maybe_code = Compiler::GetLazyCode(function); | 994 MaybeHandle<Code> maybe_code = Compiler::GetLazyCode(function); |
| 1021 Handle<Code> code; | 995 Handle<Code> code; |
| 1022 if (!maybe_code.ToHandle(&code)) { | 996 if (!maybe_code.ToHandle(&code)) { |
| 1023 if (flag == CLEAR_EXCEPTION) { | 997 if (flag == CLEAR_EXCEPTION) { |
| 1024 function->GetIsolate()->clear_pending_exception(); | 998 function->GetIsolate()->clear_pending_exception(); |
| 1025 } | 999 } |
| 1026 return false; | 1000 return false; |
| 1027 } | 1001 } |
| (...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1803 } | 1777 } |
| 1804 | 1778 |
| 1805 #if DEBUG | 1779 #if DEBUG |
| 1806 void CompilationInfo::PrintAstForTesting() { | 1780 void CompilationInfo::PrintAstForTesting() { |
| 1807 PrintF("--- Source from AST ---\n%s\n", | 1781 PrintF("--- Source from AST ---\n%s\n", |
| 1808 PrettyPrinter(isolate()).PrintProgram(literal())); | 1782 PrettyPrinter(isolate()).PrintProgram(literal())); |
| 1809 } | 1783 } |
| 1810 #endif | 1784 #endif |
| 1811 } // namespace internal | 1785 } // namespace internal |
| 1812 } // namespace v8 | 1786 } // namespace v8 |
| OLD | NEW |