Index: src/mips/stub-cache-mips.cc |
diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc |
index b6bf924b6600877d6170ee271365bea259b22ff2..cfa43a03ca2d8e5e69f62014f9b9bacd46ed2ef6 100644 |
--- a/src/mips/stub-cache-mips.cc |
+++ b/src/mips/stub-cache-mips.cc |
@@ -410,6 +410,25 @@ void StubCompiler::GenerateLoadFunctionPrototype(MacroAssembler* masm, |
} |
+// Generate code to check that a global property cell is empty. Create |
+// the property cell at compilation time if no cell exists for the |
+// property. |
+static void GenerateCheckPropertyCell(MacroAssembler* masm, |
+ Handle<GlobalObject> global, |
+ Handle<Name> name, |
+ Register scratch, |
+ Label* miss) { |
+ Handle<JSGlobalPropertyCell> cell = |
+ GlobalObject::EnsurePropertyCell(global, name); |
+ ASSERT(cell->value()->IsTheHole()); |
+ __ li(scratch, Operand(cell)); |
+ __ lw(scratch, |
+ FieldMemOperand(scratch, JSGlobalPropertyCell::kValueOffset)); |
+ __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
+ __ Branch(miss, ne, scratch, Operand(at)); |
+} |
+ |
+ |
// Generate StoreField code, value is passed in a0 register. |
// After executing generated code, the receiver_reg and name_reg |
// may be clobbered. |
@@ -458,12 +477,18 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm, |
// If no property was found, and the holder (the last object in the |
// prototype chain) is in slow mode, we need to do a negative lookup on the |
// holder. |
- if (lookup->holder() == *object && |
- !holder->HasFastProperties() && |
- !holder->IsJSGlobalProxy() && |
- !holder->IsJSGlobalObject()) { |
- GenerateDictionaryNegativeLookup( |
- masm, miss_restore_name, holder_reg, name, scratch1, scratch2); |
+ if (lookup->holder() == *object) { |
+ if (holder->IsJSGlobalObject()) { |
+ GenerateCheckPropertyCell( |
+ masm, |
+ Handle<GlobalObject>(GlobalObject::cast(holder)), |
+ name, |
+ scratch1, |
+ miss_restore_name); |
+ } else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) { |
+ GenerateDictionaryNegativeLookup( |
+ masm, miss_restore_name, holder_reg, name, scratch1, scratch2); |
+ } |
} |
} |
@@ -926,26 +951,6 @@ class CallInterceptorCompiler BASE_EMBEDDED { |
}; |
- |
-// Generate code to check that a global property cell is empty. Create |
-// the property cell at compilation time if no cell exists for the |
-// property. |
-static void GenerateCheckPropertyCell(MacroAssembler* masm, |
- Handle<GlobalObject> global, |
- Handle<Name> name, |
- Register scratch, |
- Label* miss) { |
- Handle<JSGlobalPropertyCell> cell = |
- GlobalObject::EnsurePropertyCell(global, name); |
- ASSERT(cell->value()->IsTheHole()); |
- __ li(scratch, Operand(cell)); |
- __ lw(scratch, |
- FieldMemOperand(scratch, JSGlobalPropertyCell::kValueOffset)); |
- __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
- __ Branch(miss, ne, scratch, Operand(at)); |
-} |
- |
- |
// Calls GenerateCheckPropertyCell for each global object in the prototype chain |
// from object to (but not including) holder. |
static void GenerateCheckPropertyCells(MacroAssembler* masm, |