Index: src/ic/x87/handler-compiler-x87.cc |
diff --git a/src/ic/x87/handler-compiler-x87.cc b/src/ic/x87/handler-compiler-x87.cc |
index 674a8c21ecaba125e4f4363d325e369e23afa21a..6096b7574306a0f39478425b32bc9e92a59af792 100644 |
--- a/src/ic/x87/handler-compiler-x87.cc |
+++ b/src/ic/x87/handler-compiler-x87.cc |
@@ -165,6 +165,13 @@ void PropertyHandlerCompiler::GenerateApiAccessorCall( |
DCHECK(!accessor_holder.is(scratch)); |
// Copy return value. |
__ pop(scratch); |
+ |
+ if (is_store) { |
+ // Discard stack arguments. |
+ __ add(esp, Immediate(StoreWithVectorDescriptor::kStackArgumentsCount * |
+ kPointerSize)); |
+ } |
+ |
// receiver |
__ push(receiver); |
// Write the arguments to stack frame. |
@@ -305,7 +312,14 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
// Restore context register. |
__ pop(esi); |
} |
- __ ret(0); |
+ if (accessor_index >= 0) { |
+ __ ret(StoreWithVectorDescriptor::kStackArgumentsCount * kPointerSize); |
+ } else { |
+ // If we generate a global code snippet for deoptimization only, don't try |
+ // to drop stack arguments for the StoreIC because they are not a part of |
+ // expression stack and deoptimizer does not reconstruct them. |
+ __ ret(0); |
+ } |
} |
@@ -508,7 +522,7 @@ void NamedLoadHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { |
Label success; |
__ jmp(&success); |
__ bind(miss); |
- if (IC::ICUseVector(kind())) { |
+ if (IC::ShouldPushPopSlotAndVector(kind())) { |
DCHECK(kind() == Code::LOAD_IC); |
PopVectorAndSlot(); |
} |
@@ -523,7 +537,7 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { |
Label success; |
__ jmp(&success); |
GenerateRestoreName(miss, name); |
- if (IC::ICUseVector(kind())) PopVectorAndSlot(); |
+ DCHECK(!IC::ShouldPushPopSlotAndVector(kind())); |
TailCallBuiltin(masm(), MissBuiltin(kind())); |
__ bind(&success); |
} |
@@ -624,6 +638,9 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback( |
Register holder_reg = Frontend(name); |
__ pop(scratch1()); // remove the return address |
+ // Discard stack arguments. |
+ __ add(esp, Immediate(StoreWithVectorDescriptor::kStackArgumentsCount * |
+ kPointerSize)); |
__ push(receiver()); |
__ push(holder_reg); |
// If the callback cannot leak, then push the callback directly, |
@@ -655,7 +672,7 @@ Register NamedStoreHandlerCompiler::value() { |
Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( |
Handle<PropertyCell> cell, Handle<Name> name, bool is_configurable) { |
Label miss; |
- if (IC::ICUseVector(kind())) { |
+ if (IC::ShouldPushPopSlotAndVector(kind())) { |
PushVectorAndSlot(); |
} |
FrontendHeader(receiver(), name, &miss, DONT_RETURN_ANYTHING); |
@@ -677,7 +694,7 @@ Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( |
Counters* counters = isolate()->counters(); |
__ IncrementCounter(counters->ic_named_load_global_stub(), 1); |
// The code above already loads the result into the return register. |
- if (IC::ICUseVector(kind())) { |
+ if (IC::ShouldPushPopSlotAndVector(kind())) { |
DiscardVectorAndSlot(); |
} |
__ ret(0); |