| 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: {
|
|
|