Index: src/runtime/runtime-test.cc |
diff --git a/src/runtime/runtime-test.cc b/src/runtime/runtime-test.cc |
index 1778401210ccda2573a3f2aa7df5898441dd265f..89e1f2a69662fee8051345cdcc86e6047990c145 100644 |
--- a/src/runtime/runtime-test.cc |
+++ b/src/runtime/runtime-test.cc |
@@ -69,13 +69,8 @@ RUNTIME_FUNCTION(Runtime_OptimizeFunctionOnNextCall) { |
Code* unoptimized = function->shared()->code(); |
if (args.length() == 2 && unoptimized->kind() == Code::FUNCTION) { |
CONVERT_ARG_HANDLE_CHECKED(String, type, 1); |
- if (type->IsOneByteEqualTo(STATIC_CHAR_VECTOR("osr")) && FLAG_use_osr) { |
- // Start patching from the currently patched loop nesting level. |
- DCHECK(BackEdgeTable::Verify(isolate, unoptimized)); |
- isolate->runtime_profiler()->AttemptOnStackReplacement( |
- *function, Code::kMaxLoopNestingMarker); |
- } else if (type->IsOneByteEqualTo(STATIC_CHAR_VECTOR("concurrent")) && |
- isolate->concurrent_recompilation_enabled()) { |
+ if (type->IsOneByteEqualTo(STATIC_CHAR_VECTOR("concurrent")) && |
+ isolate->concurrent_recompilation_enabled()) { |
function->AttemptConcurrentOptimization(); |
} |
} |
@@ -84,6 +79,45 @@ RUNTIME_FUNCTION(Runtime_OptimizeFunctionOnNextCall) { |
} |
+RUNTIME_FUNCTION(Runtime_OptimizeOsr) { |
+ HandleScope scope(isolate); |
+ RUNTIME_ASSERT(args.length() == 0); |
+ Handle<JSFunction> function = Handle<JSFunction>::null(); |
+ |
+ { |
+ // Find the JavaScript function on the top of the stack. |
+ JavaScriptFrameIterator it(isolate); |
+ while (!it.done()) { |
+ if (it.frame()->is_java_script()) { |
+ function = Handle<JSFunction>(it.frame()->function()); |
+ break; |
+ } |
+ } |
+ if (function.is_null()) return isolate->heap()->undefined_value(); |
+ } |
+ |
+ // The following assertion was lifted from the DCHECK inside |
+ // JSFunction::MarkForOptimization(). |
+ RUNTIME_ASSERT(function->shared()->allows_lazy_compilation() || |
+ (function->code()->kind() == Code::FUNCTION && |
+ function->code()->optimizable())); |
+ |
+ if (!isolate->use_crankshaft()) return isolate->heap()->undefined_value(); |
+ |
+ // If the function is already optimized, just return. |
+ if (function->IsOptimized()) return isolate->heap()->undefined_value(); |
+ |
+ Code* unoptimized = function->shared()->code(); |
+ if (unoptimized->kind() == Code::FUNCTION) { |
+ DCHECK(BackEdgeTable::Verify(isolate, unoptimized)); |
+ isolate->runtime_profiler()->AttemptOnStackReplacement( |
+ *function, Code::kMaxLoopNestingMarker); |
+ } |
+ |
+ return isolate->heap()->undefined_value(); |
+} |
+ |
+ |
RUNTIME_FUNCTION(Runtime_NeverOptimizeFunction) { |
HandleScope scope(isolate); |
DCHECK(args.length() == 1); |