| 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 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "src/asmjs/asm-js.h" | 10 #include "src/asmjs/asm-js.h" |
| (...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 860 Deoptimizer::VisitAllOptimizedFunctions(isolate, activations_finder); | 860 Deoptimizer::VisitAllOptimizedFunctions(isolate, activations_finder); |
| 861 } | 861 } |
| 862 return activations_finder->has_activations(); | 862 return activations_finder->has_activations(); |
| 863 } | 863 } |
| 864 | 864 |
| 865 MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { | 865 MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { |
| 866 Isolate* isolate = function->GetIsolate(); | 866 Isolate* isolate = function->GetIsolate(); |
| 867 VMState<COMPILER> state(isolate); | 867 VMState<COMPILER> state(isolate); |
| 868 PostponeInterruptsScope postpone(isolate); | 868 PostponeInterruptsScope postpone(isolate); |
| 869 Zone zone(isolate->allocator()); | 869 Zone zone(isolate->allocator()); |
| 870 ParseInfo parse_info(&zone, function); | 870 ParseInfo parse_info(&zone, handle(function->shared())); |
| 871 CompilationInfo info(&parse_info, function); | 871 CompilationInfo info(&parse_info, function); |
| 872 | 872 |
| 873 // Reset profiler ticks, function is no longer considered hot. | 873 // Reset profiler ticks, function is no longer considered hot. |
| 874 if (function->shared()->HasBytecodeArray()) { | 874 if (function->shared()->HasBytecodeArray()) { |
| 875 function->shared()->set_profiler_ticks(0); | 875 function->shared()->set_profiler_ticks(0); |
| 876 } | 876 } |
| 877 | 877 |
| 878 // Nothing left to do if the function already has baseline code. | 878 // Nothing left to do if the function already has baseline code. |
| 879 if (function->shared()->code()->kind() == Code::FUNCTION) { | 879 if (function->shared()->code()->kind() == Code::FUNCTION) { |
| 880 return Handle<Code>(function->shared()->code()); | 880 return Handle<Code>(function->shared()->code()); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 981 return Handle<Code>(function->shared()->code()); | 981 return Handle<Code>(function->shared()->code()); |
| 982 } | 982 } |
| 983 | 983 |
| 984 if (function->shared()->HasBytecodeArray()) { | 984 if (function->shared()->HasBytecodeArray()) { |
| 985 Handle<Code> entry = isolate->builtins()->InterpreterEntryTrampoline(); | 985 Handle<Code> entry = isolate->builtins()->InterpreterEntryTrampoline(); |
| 986 function->shared()->ReplaceCode(*entry); | 986 function->shared()->ReplaceCode(*entry); |
| 987 return entry; | 987 return entry; |
| 988 } | 988 } |
| 989 | 989 |
| 990 Zone zone(isolate->allocator()); | 990 Zone zone(isolate->allocator()); |
| 991 ParseInfo parse_info(&zone, function); | 991 ParseInfo parse_info(&zone, handle(function->shared())); |
| 992 CompilationInfo info(&parse_info, function); | 992 CompilationInfo info(&parse_info, function); |
| 993 Handle<Code> result; | 993 Handle<Code> result; |
| 994 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, GetUnoptimizedCode(&info), Code); | 994 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, GetUnoptimizedCode(&info), Code); |
| 995 | 995 |
| 996 if (FLAG_always_opt) { | 996 if (FLAG_always_opt) { |
| 997 Handle<Code> opt_code; | 997 Handle<Code> opt_code; |
| 998 if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT) | 998 if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT) |
| 999 .ToHandle(&opt_code)) { | 999 .ToHandle(&opt_code)) { |
| 1000 result = opt_code; | 1000 result = opt_code; |
| 1001 } | 1001 } |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1167 if (!GetOptimizedCode(function, mode).ToHandle(&code)) { | 1167 if (!GetOptimizedCode(function, mode).ToHandle(&code)) { |
| 1168 // Optimization failed, get unoptimized code. | 1168 // Optimization failed, get unoptimized code. |
| 1169 DCHECK(!isolate->has_pending_exception()); | 1169 DCHECK(!isolate->has_pending_exception()); |
| 1170 if (function->shared()->is_compiled()) { | 1170 if (function->shared()->is_compiled()) { |
| 1171 code = handle(function->shared()->code(), isolate); | 1171 code = handle(function->shared()->code(), isolate); |
| 1172 } else if (function->shared()->HasBytecodeArray()) { | 1172 } else if (function->shared()->HasBytecodeArray()) { |
| 1173 code = isolate->builtins()->InterpreterEntryTrampoline(); | 1173 code = isolate->builtins()->InterpreterEntryTrampoline(); |
| 1174 function->shared()->ReplaceCode(*code); | 1174 function->shared()->ReplaceCode(*code); |
| 1175 } else { | 1175 } else { |
| 1176 Zone zone(isolate->allocator()); | 1176 Zone zone(isolate->allocator()); |
| 1177 ParseInfo parse_info(&zone, function); | 1177 ParseInfo parse_info(&zone, handle(function->shared())); |
| 1178 CompilationInfo info(&parse_info, function); | 1178 CompilationInfo info(&parse_info, function); |
| 1179 if (!GetUnoptimizedCode(&info).ToHandle(&code)) { | 1179 if (!GetUnoptimizedCode(&info).ToHandle(&code)) { |
| 1180 return false; | 1180 return false; |
| 1181 } | 1181 } |
| 1182 } | 1182 } |
| 1183 } | 1183 } |
| 1184 | 1184 |
| 1185 // Install code on closure. | 1185 // Install code on closure. |
| 1186 function->ReplaceCode(*code); | 1186 function->ReplaceCode(*code); |
| 1187 JSFunction::EnsureLiterals(function); | 1187 JSFunction::EnsureLiterals(function); |
| 1188 | 1188 |
| 1189 // Check postconditions on success. | 1189 // Check postconditions on success. |
| 1190 DCHECK(!isolate->has_pending_exception()); | 1190 DCHECK(!isolate->has_pending_exception()); |
| 1191 DCHECK(function->shared()->is_compiled()); | 1191 DCHECK(function->shared()->is_compiled()); |
| 1192 DCHECK(function->is_compiled()); | 1192 DCHECK(function->is_compiled()); |
| 1193 return true; | 1193 return true; |
| 1194 } | 1194 } |
| 1195 | 1195 |
| 1196 bool Compiler::CompileDebugCode(Handle<JSFunction> function) { | 1196 bool Compiler::CompileDebugCode(Handle<JSFunction> function) { |
| 1197 Isolate* isolate = function->GetIsolate(); | 1197 Isolate* isolate = function->GetIsolate(); |
| 1198 DCHECK(AllowCompilation::IsAllowed(isolate)); | 1198 DCHECK(AllowCompilation::IsAllowed(isolate)); |
| 1199 | 1199 |
| 1200 // Start a compilation. | 1200 // Start a compilation. |
| 1201 Zone zone(isolate->allocator()); | 1201 Zone zone(isolate->allocator()); |
| 1202 ParseInfo parse_info(&zone, function); | 1202 ParseInfo parse_info(&zone, handle(function->shared())); |
| 1203 CompilationInfo info(&parse_info, Handle<JSFunction>::null()); | 1203 CompilationInfo info(&parse_info, Handle<JSFunction>::null()); |
| 1204 info.MarkAsDebug(); | 1204 info.MarkAsDebug(); |
| 1205 if (GetUnoptimizedCode(&info).is_null()) { | 1205 if (GetUnoptimizedCode(&info).is_null()) { |
| 1206 isolate->clear_pending_exception(); | 1206 isolate->clear_pending_exception(); |
| 1207 return false; | 1207 return false; |
| 1208 } | 1208 } |
| 1209 | 1209 |
| 1210 // Check postconditions on success. | 1210 // Check postconditions on success. |
| 1211 DCHECK(!isolate->has_pending_exception()); | 1211 DCHECK(!isolate->has_pending_exception()); |
| 1212 DCHECK(function->shared()->is_compiled()); | 1212 DCHECK(function->shared()->is_compiled()); |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1812 DCHECK(shared->is_compiled()); | 1812 DCHECK(shared->is_compiled()); |
| 1813 function->set_literals(cached.literals); | 1813 function->set_literals(cached.literals); |
| 1814 } else if (shared->is_compiled()) { | 1814 } else if (shared->is_compiled()) { |
| 1815 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. | 1815 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. |
| 1816 JSFunction::EnsureLiterals(function); | 1816 JSFunction::EnsureLiterals(function); |
| 1817 } | 1817 } |
| 1818 } | 1818 } |
| 1819 | 1819 |
| 1820 } // namespace internal | 1820 } // namespace internal |
| 1821 } // namespace v8 | 1821 } // namespace v8 |
| OLD | NEW |