Index: src/arm/builtins-arm.cc |
diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc |
index eff47e2692bfc2627f4e4269da609b030d39367d..d1ed4d5ac3fd6b7fa0601d7d91a6a4d8bf156ed0 100644 |
--- a/src/arm/builtins-arm.cc |
+++ b/src/arm/builtins-arm.cc |
@@ -975,22 +975,35 @@ void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) { |
__ CallRuntime(Runtime::kCompileForOnStackReplacement, 1); |
} |
- // If the result was -1 it means that we couldn't optimize the |
- // function. Just return and continue in the unoptimized version. |
+ // If the code object is null, just return to the unoptimized code. |
Label skip; |
- __ cmp(r0, Operand(Smi::FromInt(-1))); |
+ __ cmp(r0, Operand(Smi::FromInt(0))); |
__ b(ne, &skip); |
__ Ret(); |
__ bind(&skip); |
- // Untag the AST id and push it on the stack. |
- __ SmiUntag(r0); |
- __ push(r0); |
- |
- // Generate the code for doing the frame-to-frame translation using |
- // the deoptimizer infrastructure. |
- Deoptimizer::EntryGenerator generator(masm, Deoptimizer::OSR); |
- generator.Generate(); |
+ |
+ // Load deoptimization data from the code object. |
+ // <deopt_data> = <code>[#deoptimization_data_offset] |
+ __ ldr(r1, MemOperand(r0, Code::kDeoptimizationDataOffset - kHeapObjectTag)); |
+ |
+ // Load the OSR entrypoint offset from the deoptimization data. |
+ // <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset] |
+ __ ldr(r1, MemOperand(r1, FixedArray::kHeaderSize + |
+ DeoptimizationInputData::kOsrPcOffsetIndex * kPointerSize |
+ - kHeapObjectTag)); |
+ __ SmiUntag(r1); |
+ |
+ // Compute the target address = code_obj + header_size + osr_offset |
+ // <entry_addr> = <code_obj> + #header_size + <osr_offset> |
+ __ add(r0, r0, r1); |
vincent.belliard.fr
2013/07/31 15:07:44
You can do the SmiUntag and the add in one instruc
|
+ __ add(r0, r0, Operand(Code::kHeaderSize - kHeapObjectTag)); |
vincent.belliard.fr
2013/07/31 15:07:44
the result of add can be directly stored in lr. It
|
+ |
+ // Overwrite the return address in the link register. |
+ __ mov(lr, r0); |
+ |
+ // And "return" to the OSR entry point of the function. |
+ __ Ret(); |
} |