| Index: src/builtins/ia32/builtins-ia32.cc
 | 
| diff --git a/src/builtins/ia32/builtins-ia32.cc b/src/builtins/ia32/builtins-ia32.cc
 | 
| index b549ab1336e4b3f2bb875fb446079e878e7f4a07..0d62f9f5b74e9483a4993c2d8af1a71e67a288ba 100644
 | 
| --- a/src/builtins/ia32/builtins-ia32.cc
 | 
| +++ b/src/builtins/ia32/builtins-ia32.cc
 | 
| @@ -2968,9 +2968,16 @@ void Builtins::Generate_HandleFastApiCall(MacroAssembler* masm) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) {
 | 
| +static void Generate_OnStackReplacementHelper(MacroAssembler* masm,
 | 
| +                                              bool has_handler_frame) {
 | 
|    // Lookup the function in the JavaScript frame.
 | 
| -  __ mov(eax, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
 | 
| +  if (has_handler_frame) {
 | 
| +    __ mov(eax, Operand(ebp, StandardFrameConstants::kCallerFPOffset));
 | 
| +    __ mov(eax, Operand(eax, JavaScriptFrameConstants::kFunctionOffset));
 | 
| +  } else {
 | 
| +    __ mov(eax, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
 | 
| +  }
 | 
| +
 | 
|    {
 | 
|      FrameScope scope(masm, StackFrame::INTERNAL);
 | 
|      // Pass function as argument.
 | 
| @@ -2979,13 +2986,19 @@ void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) {
 | 
|    }
 | 
|  
 | 
|    Label skip;
 | 
| -  // If the code object is null, just return to the unoptimized code.
 | 
| +  // If the code object is null, just return to the caller.
 | 
|    __ cmp(eax, Immediate(0));
 | 
|    __ j(not_equal, &skip, Label::kNear);
 | 
|    __ ret(0);
 | 
|  
 | 
|    __ bind(&skip);
 | 
|  
 | 
| +  // Drop any potential handler frame that is be sitting on top of the actual
 | 
| +  // JavaScript frame. This is the case then OSR is triggered from bytecode.
 | 
| +  if (has_handler_frame) {
 | 
| +    __ leave();
 | 
| +  }
 | 
| +
 | 
|    // Load deoptimization data from the code object.
 | 
|    __ mov(ebx, Operand(eax, Code::kDeoptimizationDataOffset - kHeapObjectTag));
 | 
|  
 | 
| @@ -3005,6 +3018,14 @@ void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) {
 | 
|    __ ret(0);
 | 
|  }
 | 
|  
 | 
| +void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) {
 | 
| +  Generate_OnStackReplacementHelper(masm, false);
 | 
| +}
 | 
| +
 | 
| +void Builtins::Generate_InterpreterOnStackReplacement(MacroAssembler* masm) {
 | 
| +  Generate_OnStackReplacementHelper(masm, true);
 | 
| +}
 | 
| +
 | 
|  #undef __
 | 
|  }  // namespace internal
 | 
|  }  // namespace v8
 | 
| 
 |