Index: src/x64/virtual-frame-x64.cc |
diff --git a/src/x64/virtual-frame-x64.cc b/src/x64/virtual-frame-x64.cc |
index 3f7b1db7e5c0d6060bdc5b9a9630d172e5d8f5f0..31f9527a6de512ddf6814b2939f3a3767e06a073 100644 |
--- a/src/x64/virtual-frame-x64.cc |
+++ b/src/x64/virtual-frame-x64.cc |
@@ -1119,23 +1119,30 @@ Result VirtualFrame::CallKeyedLoadIC(RelocInfo::Mode mode) { |
} |
-Result VirtualFrame::CallStoreIC(Handle<String> name, bool is_contextual) { |
+Result VirtualFrame::CallStoreIC(Handle<String> name, |
+ bool is_contextual, |
+ StrictModeFlag strict_mode) { |
// Value and (if not contextual) receiver are on top of the frame. |
// The IC expects name in rcx, value in rax, and receiver in rdx. |
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin(strict_mode == kStrictMode |
+ ? Builtins::StoreIC_Initialize_Strict |
+ : Builtins::StoreIC_Initialize)); |
Result value = Pop(); |
+ RelocInfo::Mode mode; |
if (is_contextual) { |
PrepareForCall(0, 0); |
value.ToRegister(rax); |
__ movq(rdx, Operand(rsi, Context::SlotOffset(Context::GLOBAL_INDEX))); |
value.Unuse(); |
+ mode = RelocInfo::CODE_TARGET_CONTEXT; |
} else { |
Result receiver = Pop(); |
PrepareForCall(0, 0); |
MoveResultsToRegisters(&value, &receiver, rax, rdx); |
+ mode = RelocInfo::CODE_TARGET; |
} |
__ Move(rcx, name); |
- return RawCallCodeObject(ic, RelocInfo::CODE_TARGET); |
+ return RawCallCodeObject(ic, mode); |
} |