Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 5712) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -4866,6 +4866,11 @@ |
} |
frame_->Push(&clone); |
+ // Mark all computed expressions that are bound to a key that |
+ // is shadowed by a later occurrence of the same key. For the |
+ // marked expressions, no store code is emitted. |
+ node->CalculateEmitStore(); |
+ |
for (int i = 0; i < node->properties()->length(); i++) { |
ObjectLiteral::Property* property = node->properties()->at(i); |
switch (property->kind()) { |
@@ -4880,13 +4885,17 @@ |
// Duplicate the object as the IC receiver. |
frame_->Dup(); |
Load(property->value()); |
- Result ignored = |
- frame_->CallStoreIC(Handle<String>::cast(key), false); |
- // A test rax instruction following the store IC call would |
- // indicate the presence of an inlined version of the |
- // store. Add a nop to indicate that there is no such |
- // inlined version. |
- __ nop(); |
+ if (property->emit_store()) { |
+ Result ignored = |
+ frame_->CallStoreIC(Handle<String>::cast(key), false); |
+ // A test rax instruction following the store IC call would |
+ // indicate the presence of an inlined version of the |
+ // store. Add a nop to indicate that there is no such |
+ // inlined version. |
+ __ nop(); |
+ } else { |
+ frame_->Drop(2); |
+ } |
break; |
} |
// Fall through |
@@ -4896,8 +4905,12 @@ |
frame_->Dup(); |
Load(property->key()); |
Load(property->value()); |
- Result ignored = frame_->CallRuntime(Runtime::kSetProperty, 3); |
- // Ignore the result. |
+ if (property->emit_store()) { |
+ // Ignore the result. |
+ Result ignored = frame_->CallRuntime(Runtime::kSetProperty, 3); |
+ } else { |
+ frame_->Drop(3); |
+ } |
break; |
} |
case ObjectLiteral::Property::SETTER: { |