Index: src/arm/codegen-arm.cc |
=================================================================== |
--- src/arm/codegen-arm.cc (revision 5712) |
+++ src/arm/codegen-arm.cc (working copy) |
@@ -3596,6 +3596,12 @@ |
frame_->CallRuntime(Runtime::kCreateObjectLiteralShallow, 4); |
} |
frame_->EmitPush(r0); // save the result |
+ |
+ // 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++) { |
// At the start of each iteration, the top of stack contains |
// the newly created object literal. |
@@ -3612,11 +3618,15 @@ |
if (key->handle()->IsSymbol()) { |
Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
Load(value); |
- frame_->PopToR0(); |
- // Fetch the object literal. |
- frame_->SpillAllButCopyTOSToR1(); |
- __ mov(r2, Operand(key->handle())); |
- frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); |
+ if (property->emit_store()) { |
+ frame_->PopToR0(); |
+ // Fetch the object literal. |
+ frame_->SpillAllButCopyTOSToR1(); |
+ __ mov(r2, Operand(key->handle())); |
+ frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); |
+ } else { |
+ frame_->Drop(); |
+ } |
break; |
} |
// else fall through |
@@ -3624,7 +3634,11 @@ |
frame_->Dup(); |
Load(key); |
Load(value); |
- frame_->CallRuntime(Runtime::kSetProperty, 3); |
+ if (property->emit_store()) { |
+ frame_->CallRuntime(Runtime::kSetProperty, 3); |
+ } else { |
+ frame_->Drop(3); |
+ } |
break; |
} |
case ObjectLiteral::Property::SETTER: { |