Index: src/runtime/runtime-test.cc |
diff --git a/src/runtime/runtime-test.cc b/src/runtime/runtime-test.cc |
index f6393a36169a3f4dec0b9766e0aa1e14af7129c3..1f1e0f4b4663b9bbc0b7318f47d095fba0030b69 100644 |
--- a/src/runtime/runtime-test.cc |
+++ b/src/runtime/runtime-test.cc |
@@ -143,37 +143,27 @@ RUNTIME_FUNCTION(Runtime_OptimizeFunctionOnNextCall) { |
RUNTIME_FUNCTION(Runtime_OptimizeOsr) { |
HandleScope scope(isolate); |
+ DCHECK(args.length() == 0 || args.length() == 1); |
- // This function is used by fuzzers, ignore calls with bogus arguments count. |
- if (args.length() != 0 && args.length() != 1) { |
- return isolate->heap()->undefined_value(); |
- } |
+ Handle<JSFunction> function; |
- Handle<JSFunction> function = Handle<JSFunction>::null(); |
- if (args.length() == 0) { |
- // Find the JavaScript function on the top of the stack. |
- JavaScriptFrameIterator it(isolate); |
- if (!it.done()) function = Handle<JSFunction>(it.frame()->function()); |
- if (function.is_null()) return isolate->heap()->undefined_value(); |
- } else { |
- // Function was passed as an argument. |
- CONVERT_ARG_HANDLE_CHECKED(JSFunction, arg, 0); |
- function = arg; |
- } |
+ // The optional parameter determines the frame being targeted. |
+ int stack_depth = args.length() == 1 ? args.smi_at(0) : 0; |
- // If function is interpreted but OSR hasn't been enabled, just return. |
- if (function->shared()->HasBytecodeArray() && !FLAG_ignition_osr) { |
- return isolate->heap()->undefined_value(); |
- } |
+ // Find the JavaScript function on the top of the stack. |
+ JavaScriptFrameIterator it(isolate); |
+ while (!it.done() && stack_depth--) it.Advance(); |
+ if (!it.done()) function = Handle<JSFunction>(it.frame()->function()); |
+ if (function.is_null()) return isolate->heap()->undefined_value(); |
// If the function is already optimized, just return. |
if (function->IsOptimized()) return isolate->heap()->undefined_value(); |
// Make the profiler arm all back edges in unoptimized code. |
- if (function->shared()->HasBytecodeArray() || |
- function->shared()->HasBaselineCode()) { |
+ if (it.frame()->type() == StackFrame::JAVA_SCRIPT || |
+ it.frame()->type() == StackFrame::INTERPRETED) { |
isolate->runtime_profiler()->AttemptOnStackReplacement( |
- *function, AbstractCode::kMaxLoopNestingMarker); |
+ it.frame(), AbstractCode::kMaxLoopNestingMarker); |
} |
return isolate->heap()->undefined_value(); |