Index: src/mips/stub-cache-mips.cc |
diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc |
index 10813eb02dc2911529032c93d42c7cc8b6e9b137..60ab0b8704e047c85a92e04b63d336f5a5e2b13d 100644 |
--- a/src/mips/stub-cache-mips.cc |
+++ b/src/mips/stub-cache-mips.cc |
@@ -1270,6 +1270,7 @@ Handle<Code> StoreStubCompiler::CompileStoreCallback( |
void StoreStubCompiler::GenerateStoreViaSetter( |
MacroAssembler* masm, |
+ Handle<HeapType> type, |
Handle<JSFunction> setter) { |
// ----------- S t a t e ------------- |
// -- a0 : value |
@@ -1279,13 +1280,21 @@ void StoreStubCompiler::GenerateStoreViaSetter( |
// ----------------------------------- |
{ |
FrameScope scope(masm, StackFrame::INTERNAL); |
+ Register receiver = a1; |
+ Register value = a0; |
// Save value register, so we can restore it later. |
- __ push(a0); |
+ __ push(value); |
if (!setter.is_null()) { |
// Call the JavaScript setter with receiver and value on the stack. |
- __ Push(a1, a0); |
+ if (IC::TypeToMap(*type, masm->isolate())->IsJSGlobalObjectMap()) { |
+ // Swap in the global receiver. |
+ __ lw(receiver, |
+ FieldMemOperand( |
+ receiver, JSGlobalObject::kGlobalReceiverOffset)); |
+ } |
+ __ Push(receiver, value); |
ParameterCount actual(1); |
ParameterCount expected(setter); |
__ InvokeFunction(setter, expected, actual, |
@@ -1391,6 +1400,7 @@ Register* KeyedStoreStubCompiler::registers() { |
void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm, |
+ Handle<HeapType> type, |
Register receiver, |
Handle<JSFunction> getter) { |
// ----------- S t a t e ------------- |
@@ -1403,6 +1413,12 @@ void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm, |
if (!getter.is_null()) { |
// Call the JavaScript getter with the receiver on the stack. |
+ if (IC::TypeToMap(*type, masm->isolate())->IsJSGlobalObjectMap()) { |
+ // Swap in the global receiver. |
+ __ lw(receiver, |
+ FieldMemOperand( |
+ receiver, JSGlobalObject::kGlobalReceiverOffset)); |
+ } |
__ push(receiver); |
ParameterCount actual(0); |
ParameterCount expected(getter); |