| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
| 10 #include "src/deoptimizer.h" | 10 #include "src/deoptimizer.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 DCHECK(args.length() == 1); | 30 DCHECK(args.length() == 1); |
| 31 | 31 |
| 32 // This function is used by fuzzers to get coverage in compiler. | 32 // This function is used by fuzzers to get coverage in compiler. |
| 33 // Ignore calls on non-function objects to avoid runtime errors. | 33 // Ignore calls on non-function objects to avoid runtime errors. |
| 34 CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); | 34 CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); |
| 35 if (!function_object->IsJSFunction()) { | 35 if (!function_object->IsJSFunction()) { |
| 36 return isolate->heap()->undefined_value(); | 36 return isolate->heap()->undefined_value(); |
| 37 } | 37 } |
| 38 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 38 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); |
| 39 | 39 |
| 40 // If the function is not optimized, just return. |
| 40 if (!function->IsOptimized()) return isolate->heap()->undefined_value(); | 41 if (!function->IsOptimized()) return isolate->heap()->undefined_value(); |
| 41 | 42 |
| 42 // TODO(turbofan): Deoptimization is not supported yet. | 43 // TODO(turbofan): Deoptimization is not supported yet. |
| 43 if (function->code()->is_turbofanned() && | 44 if (function->code()->is_turbofanned() && |
| 44 function->shared()->asm_function() && !FLAG_turbo_asm_deoptimization) { | 45 function->shared()->asm_function() && !FLAG_turbo_asm_deoptimization) { |
| 45 return isolate->heap()->undefined_value(); | 46 return isolate->heap()->undefined_value(); |
| 46 } | 47 } |
| 47 | 48 |
| 48 Deoptimizer::DeoptimizeFunction(*function); | 49 Deoptimizer::DeoptimizeFunction(*function); |
| 49 | 50 |
| 50 return isolate->heap()->undefined_value(); | 51 return isolate->heap()->undefined_value(); |
| 51 } | 52 } |
| 52 | 53 |
| 53 | 54 |
| 54 RUNTIME_FUNCTION(Runtime_DeoptimizeNow) { | 55 RUNTIME_FUNCTION(Runtime_DeoptimizeNow) { |
| 55 HandleScope scope(isolate); | 56 HandleScope scope(isolate); |
| 56 DCHECK(args.length() == 0); | 57 DCHECK(args.length() == 0); |
| 57 | 58 |
| 58 Handle<JSFunction> function; | 59 Handle<JSFunction> function; |
| 59 | 60 |
| 60 // If the argument is 'undefined', deoptimize the topmost | 61 // Find the JavaScript function on the top of the stack. |
| 61 // function. | |
| 62 JavaScriptFrameIterator it(isolate); | 62 JavaScriptFrameIterator it(isolate); |
| 63 while (!it.done()) { | 63 if (!it.done()) function = Handle<JSFunction>(it.frame()->function()); |
| 64 if (it.frame()->is_java_script()) { | |
| 65 function = Handle<JSFunction>(it.frame()->function()); | |
| 66 break; | |
| 67 } | |
| 68 } | |
| 69 if (function.is_null()) return isolate->heap()->undefined_value(); | 64 if (function.is_null()) return isolate->heap()->undefined_value(); |
| 70 | 65 |
| 66 // If the function is not optimized, just return. |
| 71 if (!function->IsOptimized()) return isolate->heap()->undefined_value(); | 67 if (!function->IsOptimized()) return isolate->heap()->undefined_value(); |
| 72 | 68 |
| 73 // TODO(turbofan): Deoptimization is not supported yet. | 69 // TODO(turbofan): Deoptimization is not supported yet. |
| 74 if (function->code()->is_turbofanned() && | 70 if (function->code()->is_turbofanned() && |
| 75 function->shared()->asm_function() && !FLAG_turbo_asm_deoptimization) { | 71 function->shared()->asm_function() && !FLAG_turbo_asm_deoptimization) { |
| 76 return isolate->heap()->undefined_value(); | 72 return isolate->heap()->undefined_value(); |
| 77 } | 73 } |
| 78 | 74 |
| 79 Deoptimizer::DeoptimizeFunction(*function); | 75 Deoptimizer::DeoptimizeFunction(*function); |
| 80 | 76 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 | 144 |
| 149 // This function is used by fuzzers, ignore calls with bogus arguments count. | 145 // This function is used by fuzzers, ignore calls with bogus arguments count. |
| 150 if (args.length() != 0 && args.length() != 1) { | 146 if (args.length() != 0 && args.length() != 1) { |
| 151 return isolate->heap()->undefined_value(); | 147 return isolate->heap()->undefined_value(); |
| 152 } | 148 } |
| 153 | 149 |
| 154 Handle<JSFunction> function = Handle<JSFunction>::null(); | 150 Handle<JSFunction> function = Handle<JSFunction>::null(); |
| 155 if (args.length() == 0) { | 151 if (args.length() == 0) { |
| 156 // Find the JavaScript function on the top of the stack. | 152 // Find the JavaScript function on the top of the stack. |
| 157 JavaScriptFrameIterator it(isolate); | 153 JavaScriptFrameIterator it(isolate); |
| 158 while (!it.done()) { | 154 if (!it.done()) function = Handle<JSFunction>(it.frame()->function()); |
| 159 if (it.frame()->is_java_script()) { | |
| 160 function = Handle<JSFunction>(it.frame()->function()); | |
| 161 break; | |
| 162 } | |
| 163 } | |
| 164 if (function.is_null()) return isolate->heap()->undefined_value(); | 155 if (function.is_null()) return isolate->heap()->undefined_value(); |
| 165 } else { | 156 } else { |
| 166 // Function was passed as an argument. | 157 // Function was passed as an argument. |
| 167 CONVERT_ARG_HANDLE_CHECKED(JSFunction, arg, 0); | 158 CONVERT_ARG_HANDLE_CHECKED(JSFunction, arg, 0); |
| 168 function = arg; | 159 function = arg; |
| 169 } | 160 } |
| 170 | 161 |
| 171 // The following condition was lifted from the DCHECK inside | |
| 172 // JSFunction::MarkForOptimization(). | |
| 173 if (!(function->shared()->allows_lazy_compilation() || | |
| 174 !function->shared()->optimization_disabled())) { | |
| 175 return isolate->heap()->undefined_value(); | |
| 176 } | |
| 177 | |
| 178 // If function is interpreted but OSR hasn't been enabled, just return. | 162 // If function is interpreted but OSR hasn't been enabled, just return. |
| 179 if (function->shared()->HasBytecodeArray() && !FLAG_ignition_osr) { | 163 if (function->shared()->HasBytecodeArray() && !FLAG_ignition_osr) { |
| 180 return isolate->heap()->undefined_value(); | 164 return isolate->heap()->undefined_value(); |
| 181 } | 165 } |
| 182 | 166 |
| 183 // If the function is already optimized, just return. | 167 // If the function is already optimized, just return. |
| 184 if (function->IsOptimized()) return isolate->heap()->undefined_value(); | 168 if (function->IsOptimized()) return isolate->heap()->undefined_value(); |
| 185 | 169 |
| 186 // Make the profiler arm all back edges in unoptimized code. | 170 // Make the profiler arm all back edges in unoptimized code. |
| 187 if (function->shared()->HasBytecodeArray() || | 171 if (function->shared()->HasBytecodeArray() || |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 | 574 |
| 591 RUNTIME_FUNCTION(Runtime_SpeciesProtector) { | 575 RUNTIME_FUNCTION(Runtime_SpeciesProtector) { |
| 592 SealHandleScope shs(isolate); | 576 SealHandleScope shs(isolate); |
| 593 DCHECK_EQ(0, args.length()); | 577 DCHECK_EQ(0, args.length()); |
| 594 return isolate->heap()->ToBoolean(isolate->IsArraySpeciesLookupChainIntact()); | 578 return isolate->heap()->ToBoolean(isolate->IsArraySpeciesLookupChainIntact()); |
| 595 } | 579 } |
| 596 | 580 |
| 597 | 581 |
| 598 } // namespace internal | 582 } // namespace internal |
| 599 } // namespace v8 | 583 } // namespace v8 |
| OLD | NEW |