| Index: src/runtime.cc | 
| diff --git a/src/runtime.cc b/src/runtime.cc | 
| index 5ec33895e44d50f568edeff1b0c944fd4eff5b53..61ac7ab2750aabce2b7b8fc143794a1e0ff6ddd2 100644 | 
| --- a/src/runtime.cc | 
| +++ b/src/runtime.cc | 
| @@ -43,6 +43,7 @@ | 
| #include "deoptimizer.h" | 
| #include "date.h" | 
| #include "execution.h" | 
| +#include "full-codegen.h" | 
| #include "global-handles.h" | 
| #include "isolate-inl.h" | 
| #include "jsregexp.h" | 
| @@ -7609,9 +7610,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_OptimizeFunctionOnNextCall) { | 
| unoptimized->kind() == Code::FUNCTION) { | 
| CONVERT_ARG_HANDLE_CHECKED(String, type, 1); | 
| if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("osr"))) { | 
| -      isolate->runtime_profiler()->AttemptOnStackReplacement(*function); | 
| -      unoptimized->set_allow_osr_at_loop_nesting_level( | 
| -          Code::kMaxLoopNestingMarker); | 
| +      for (int i = 0; i <= Code::kMaxLoopNestingMarker; i++) { | 
| +        unoptimized->set_allow_osr_at_loop_nesting_level(i); | 
| +        isolate->runtime_profiler()->AttemptOnStackReplacement(*function); | 
| +      } | 
| } else if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("parallel"))) { | 
| function->MarkForParallelRecompilation(); | 
| } | 
| @@ -7704,25 +7706,28 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) { | 
| ASSERT(frame->LookupCode() == *unoptimized); | 
| ASSERT(unoptimized->contains(frame->pc())); | 
|  | 
| -    // Use linear search of the unoptimized code's stack check table to find | 
| +    // Use linear search of the unoptimized code's back edge table to find | 
| // the AST id matching the PC. | 
| Address start = unoptimized->instruction_start(); | 
| unsigned target_pc_offset = static_cast<unsigned>(frame->pc() - start); | 
| -    Address table_cursor = start + unoptimized->stack_check_table_offset(); | 
| +    Address table_cursor = start + unoptimized->back_edge_table_offset(); | 
| uint32_t table_length = Memory::uint32_at(table_cursor); | 
| table_cursor += kIntSize; | 
| +    uint8_t loop_depth = 0; | 
| for (unsigned i = 0; i < table_length; ++i) { | 
| // Table entries are (AST id, pc offset) pairs. | 
| uint32_t pc_offset = Memory::uint32_at(table_cursor + kIntSize); | 
| if (pc_offset == target_pc_offset) { | 
| ast_id = BailoutId(static_cast<int>(Memory::uint32_at(table_cursor))); | 
| +        loop_depth = Memory::uint8_at(table_cursor + 2 * kIntSize); | 
| break; | 
| } | 
| -      table_cursor += 2 * kIntSize; | 
| +      table_cursor += FullCodeGenerator::kBackEdgeEntrySize; | 
| } | 
| ASSERT(!ast_id.IsNone()); | 
| if (FLAG_trace_osr) { | 
| -      PrintF("[replacing on-stack at AST id %d in ", ast_id.ToInt()); | 
| +      PrintF("[replacing on-stack at AST id %d, loop depth %d in ", | 
| +              ast_id.ToInt(), loop_depth); | 
| function->PrintName(); | 
| PrintF("]\n"); | 
| } | 
| @@ -7750,18 +7755,18 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) { | 
| } | 
| } | 
|  | 
| -  // Revert to the original stack checks in the original unoptimized code. | 
| +  // Revert to the original interrupt calls in the original unoptimized code. | 
| if (FLAG_trace_osr) { | 
| -    PrintF("[restoring original stack checks in "); | 
| +    PrintF("[restoring original interrupt calls in "); | 
| function->PrintName(); | 
| PrintF("]\n"); | 
| } | 
| InterruptStub interrupt_stub; | 
| -  Handle<Code> check_code = interrupt_stub.GetCode(isolate); | 
| +  Handle<Code> interrupt_code = interrupt_stub.GetCode(isolate); | 
| Handle<Code> replacement_code = isolate->builtins()->OnStackReplacement(); | 
| -  Deoptimizer::RevertStackCheckCode(*unoptimized, | 
| -                                    *check_code, | 
| -                                    *replacement_code); | 
| +  Deoptimizer::RevertInterruptCode(*unoptimized, | 
| +                                   *interrupt_code, | 
| +                                   *replacement_code); | 
|  | 
| // Allow OSR only at nesting level zero again. | 
| unoptimized->set_allow_osr_at_loop_nesting_level(0); | 
|  |