| 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,
|
|
|