| Index: src/runtime/runtime-compiler.cc
|
| diff --git a/src/runtime/runtime-compiler.cc b/src/runtime/runtime-compiler.cc
|
| index 862fefcd5045ad3fbc7a5dcd85c2b032be34387a..258975375cf7dfcff431d4d02fb378bea023ef9f 100644
|
| --- a/src/runtime/runtime-compiler.cc
|
| +++ b/src/runtime/runtime-compiler.cc
|
| @@ -217,75 +217,38 @@
|
| return true;
|
| }
|
|
|
| -namespace {
|
| -
|
| -BailoutId DetermineEntryAndDisarmOSRForBaseline(JavaScriptFrame* frame) {
|
| - Handle<Code> caller_code(frame->function()->shared()->code());
|
| -
|
| - // Passing the PC in the JavaScript frame from the caller directly is
|
| +
|
| +RUNTIME_FUNCTION(Runtime_CompileForOnStackReplacement) {
|
| + HandleScope scope(isolate);
|
| + DCHECK(args.length() == 1);
|
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
|
| + Handle<Code> caller_code(function->shared()->code());
|
| +
|
| + // We're not prepared to handle a function with arguments object.
|
| + DCHECK(!function->shared()->uses_arguments());
|
| +
|
| + CHECK(FLAG_use_osr);
|
| +
|
| + // Passing the PC in the javascript frame from the caller directly is
|
| // not GC safe, so we walk the stack to get it.
|
| + JavaScriptFrameIterator it(isolate);
|
| + JavaScriptFrame* frame = it.frame();
|
| if (!caller_code->contains(frame->pc())) {
|
| // Code on the stack may not be the code object referenced by the shared
|
| // function info. It may have been replaced to include deoptimization data.
|
| caller_code = Handle<Code>(frame->LookupCode());
|
| }
|
|
|
| - DCHECK_EQ(frame->LookupCode(), *caller_code);
|
| - DCHECK_EQ(Code::FUNCTION, caller_code->kind());
|
| - DCHECK(caller_code->contains(frame->pc()));
|
| -
|
| - // Revert the patched back edge table, regardless of whether OSR succeeds.
|
| - BackEdgeTable::Revert(frame->isolate(), *caller_code);
|
| -
|
| uint32_t pc_offset =
|
| static_cast<uint32_t>(frame->pc() - caller_code->instruction_start());
|
|
|
| - return caller_code->TranslatePcOffsetToAstId(pc_offset);
|
| -}
|
| -
|
| -BailoutId DetermineEntryAndDisarmOSRForInterpreter(JavaScriptFrame* frame) {
|
| - InterpretedFrame* iframe = reinterpret_cast<InterpretedFrame*>(frame);
|
| -
|
| - // Note that the bytecode array active on the stack might be different from
|
| - // the one installed on the function (e.g. patched by debugger). This however
|
| - // is fine because we guarantee the layout to be in sync, hence any BailoutId
|
| - // representing the entry point will be valid for any copy of the bytecode.
|
| - Handle<BytecodeArray> bytecode(iframe->GetBytecodeArray());
|
| -
|
| - DCHECK(frame->LookupCode()->is_interpreter_trampoline_builtin());
|
| - DCHECK(frame->function()->shared()->HasBytecodeArray());
|
| - DCHECK(frame->is_interpreted());
|
| - DCHECK(FLAG_ignition_osr);
|
| -
|
| - // Reset the OSR loop nesting depth to disarm back edges.
|
| - bytecode->set_osr_loop_nesting_level(0);
|
| -
|
| - return BailoutId(iframe->GetBytecodeOffset());
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -RUNTIME_FUNCTION(Runtime_CompileForOnStackReplacement) {
|
| - HandleScope scope(isolate);
|
| - DCHECK(args.length() == 1);
|
| - CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
|
| -
|
| - // We're not prepared to handle a function with arguments object.
|
| - DCHECK(!function->shared()->uses_arguments());
|
| -
|
| - // Only reachable when OST is enabled.
|
| - CHECK(FLAG_use_osr);
|
| -
|
| - // Determine frame triggering OSR request.
|
| - JavaScriptFrameIterator it(isolate);
|
| - JavaScriptFrame* frame = it.frame();
|
| +#ifdef DEBUG
|
| DCHECK_EQ(frame->function(), *function);
|
| -
|
| - // Determine the entry point for which this OSR request has been fired and
|
| - // also disarm all back edges in the calling code to stop new requests.
|
| - BailoutId ast_id = frame->is_interpreted()
|
| - ? DetermineEntryAndDisarmOSRForInterpreter(frame)
|
| - : DetermineEntryAndDisarmOSRForBaseline(frame);
|
| + DCHECK_EQ(frame->LookupCode(), *caller_code);
|
| + DCHECK(caller_code->contains(frame->pc()));
|
| +#endif // DEBUG
|
| +
|
| + BailoutId ast_id = caller_code->TranslatePcOffsetToAstId(pc_offset);
|
| DCHECK(!ast_id.IsNone());
|
|
|
| MaybeHandle<Code> maybe_result;
|
| @@ -297,6 +260,9 @@
|
| }
|
| maybe_result = Compiler::GetOptimizedCodeForOSR(function, ast_id, frame);
|
| }
|
| +
|
| + // Revert the patched back edge table, regardless of whether OSR succeeds.
|
| + BackEdgeTable::Revert(isolate, *caller_code);
|
|
|
| // Check whether we ended up with usable optimized code.
|
| Handle<Code> result;
|
|
|