Index: src/x64/stub-cache-x64.cc |
diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc |
index c16da0cdb62826757c20d43ded1ebafd3159a7b1..a6c3be3c0704f3096836a39f289d3c7b30ebc2ce 100644 |
--- a/src/x64/stub-cache-x64.cc |
+++ b/src/x64/stub-cache-x64.cc |
@@ -712,6 +712,24 @@ void BaseStoreStubCompiler::GenerateRestoreName(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()); |
+ __ Move(scratch, cell); |
+ __ Cmp(FieldOperand(scratch, JSGlobalPropertyCell::kValueOffset), |
+ masm->isolate()->factory()->the_hole_value()); |
+ __ j(not_equal, miss); |
+} |
+ |
+ |
// Both name_reg and receiver_reg are preserved on jumps to miss_label, |
// but may be destroyed if store is successful. |
void StubCompiler::GenerateStoreField(MacroAssembler* masm, |
@@ -756,12 +774,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); |
+ } |
} |
} |
@@ -842,24 +866,6 @@ void StubCompiler::GenerateStoreField(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()); |
- __ Move(scratch, cell); |
- __ Cmp(FieldOperand(scratch, JSGlobalPropertyCell::kValueOffset), |
- masm->isolate()->factory()->the_hole_value()); |
- __ j(not_equal, miss); |
-} |
- |
- |
// Calls GenerateCheckPropertyCell for each global object in the prototype chain |
// from object to (but not including) holder. |
static void GenerateCheckPropertyCells(MacroAssembler* masm, |