Index: src/ia32/stub-cache-ia32.cc |
=================================================================== |
--- src/ia32/stub-cache-ia32.cc (revision 5829) |
+++ src/ia32/stub-cache-ia32.cc (working copy) |
@@ -499,8 +499,7 @@ |
// it's not controlled by GC. |
const int kApiStackSpace = 4; |
- __ PrepareCallApiFunction(argc + kFastApiCallArguments + 1, |
- kApiArgc + kApiStackSpace); |
+ __ PrepareCallApiFunction(kApiArgc + kApiStackSpace, ebx); |
__ mov(ApiParameterOperand(1), eax); // v8::Arguments::implicit_args_. |
__ add(Operand(eax), Immediate(argc * kPointerSize)); |
@@ -518,7 +517,7 @@ |
// garbage collection but instead return the allocation failure |
// object. |
MaybeObject* result = |
- masm->TryCallApiFunctionAndReturn(&fun, kApiArgc + kApiStackSpace); |
+ masm->TryCallApiFunctionAndReturn(&fun, argc + kFastApiCallArguments + 1); |
if (result->IsFailure()) { |
*failure = Failure::cast(result); |
return false; |
@@ -1109,7 +1108,7 @@ |
const int kStackSpace = 5; |
const int kApiArgc = 2; |
- __ PrepareCallApiFunction(kStackSpace, kApiArgc); |
+ __ PrepareCallApiFunction(kApiArgc, eax); |
__ mov(ApiParameterOperand(0), ebx); // name. |
__ add(Operand(ebx), Immediate(kPointerSize)); |
__ mov(ApiParameterOperand(1), ebx); // arguments pointer. |
@@ -1118,7 +1117,7 @@ |
// already generated). Do not allow the assembler to perform a |
// garbage collection but instead return the allocation failure |
// object. |
- MaybeObject* result = masm()->TryCallApiFunctionAndReturn(&fun, kApiArgc); |
+ MaybeObject* result = masm()->TryCallApiFunctionAndReturn(&fun, kStackSpace); |
if (result->IsFailure()) { |
*failure = Failure::cast(result); |
return false; |
@@ -2169,7 +2168,10 @@ |
if (depth != kInvalidProtoDepth) { |
__ IncrementCounter(&Counters::call_const_fast_api, 1); |
- ReserveSpaceForFastApiCall(masm(), eax); |
+ |
+ // Allocate space for v8::Arguments implicit values. Must be initialized |
+ // before to call any runtime function. |
+ __ sub(Operand(esp), Immediate(kFastApiCallArguments * kPointerSize)); |
} |
// Check that the maps haven't changed. |
@@ -2249,6 +2251,12 @@ |
if (depth != kInvalidProtoDepth) { |
Failure* failure; |
+ // Move the return address on top of the stack. |
+ __ mov(eax, Operand(esp, 3 * kPointerSize)); |
+ __ mov(Operand(esp, 0 * kPointerSize), eax); |
+ |
+ // esp[2 * kPointerSize] is uninitialized, esp[3 * kPointerSize] contains |
+ // duplicate of return address and will be overwritten. |
bool success = GenerateFastApiCall(masm(), optimization, argc, &failure); |
if (!success) { |
return failure; |
@@ -2260,7 +2268,7 @@ |
// Handle call cache miss. |
__ bind(&miss); |
if (depth != kInvalidProtoDepth) { |
- FreeSpaceForFastApiCall(masm(), eax); |
+ __ add(Operand(esp), Immediate(kFastApiCallArguments * kPointerSize)); |
} |
__ bind(&miss_in_smi_check); |
Object* obj; |