Index: src/ia32/full-codegen-ia32.cc |
=================================================================== |
--- src/ia32/full-codegen-ia32.cc (revision 5712) |
+++ src/ia32/full-codegen-ia32.cc (working copy) |
@@ -1184,7 +1184,6 @@ |
context()->Plug(eax); |
} |
Mads Ager (chromium)
2010/10/27 09:28:54
Please add back this line.
|
- |
void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
Comment cmnt(masm_, "[ ObjectLiteral"); |
__ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); |
@@ -1202,6 +1201,11 @@ |
// result_saved is false the result is in eax. |
bool result_saved = false; |
+ // 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. |
+ expr->CalculateEmitStore(); |
+ |
for (int i = 0; i < expr->properties()->length(); i++) { |
ObjectLiteral::Property* property = expr->properties()->at(i); |
if (property->IsCompileTimeValue()) continue; |
@@ -1221,8 +1225,10 @@ |
VisitForAccumulatorValue(value); |
__ mov(ecx, Immediate(key->handle())); |
__ mov(edx, Operand(esp, 0)); |
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
- EmitCallIC(ic, RelocInfo::CODE_TARGET); |
+ if (property->emit_store()) { |
+ Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
+ EmitCallIC(ic, RelocInfo::CODE_TARGET); |
+ } |
break; |
} |
// Fall through. |
@@ -1230,7 +1236,11 @@ |
__ push(Operand(esp, 0)); // Duplicate receiver. |
VisitForStackValue(key); |
VisitForStackValue(value); |
- __ CallRuntime(Runtime::kSetProperty, 3); |
+ if (property->emit_store()) { |
+ __ CallRuntime(Runtime::kSetProperty, 3); |
+ } else { |
+ __ Drop(3); |
+ } |
break; |
case ObjectLiteral::Property::SETTER: |
case ObjectLiteral::Property::GETTER: |