Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index 86ac466ae8740dc46c85df4da8d887ee9a40e913..b6f0a59a2186c4d6ee3921360d9e75abcdfcdbd9 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -833,13 +833,28 @@ Operand LCodeGen::ToOperand(LOperand* op) const { |
if (op->IsRegister()) return Operand(ToRegister(op)); |
if (op->IsDoubleRegister()) return Operand(ToDoubleRegister(op)); |
ASSERT(op->IsStackSlot() || op->IsDoubleStackSlot()); |
- return Operand(ebp, StackSlotOffset(op->index())); |
+ if (NeedsEagerFrame()) { |
+ return Operand(ebp, StackSlotOffset(op->index())); |
+ } else { |
+ // Retrieve parameter without eager stack-frame relative to the |
+ // stack-pointer. |
+ ASSERT(op->index() < 0); |
+ return Operand(esp, StackSlotOffset(op->index()) - kFPOnStackSize); |
+ } |
} |
Operand LCodeGen::HighOperand(LOperand* op) { |
ASSERT(op->IsDoubleStackSlot()); |
- return Operand(ebp, StackSlotOffset(op->index()) + kPointerSize); |
+ if (NeedsEagerFrame()) { |
+ return Operand(ebp, StackSlotOffset(op->index()) + kPointerSize); |
+ } else { |
+ // Retrieve parameter without eager stack-frame relative to the |
+ // stack-pointer. |
+ ASSERT(op->index() < 0); |
+ return Operand(esp, StackSlotOffset(op->index()) |
+ - kFPOnStackSize + kPointerSize); |
+ } |
} |
@@ -4357,7 +4372,12 @@ void LCodeGen::DoCallFunction(LCallFunction* instr) { |
int arity = instr->arity(); |
CallFunctionStub stub(arity, NO_CALL_FUNCTION_FLAGS); |
- CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); |
+ if (instr->hydrogen()->IsTailCall()) { |
+ if (NeedsEagerFrame()) __ leave(); |
+ __ jmp(stub.GetCode(isolate()), RelocInfo::CODE_TARGET); |
+ } else { |
+ CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); |
+ } |
} |