Chromium Code Reviews| 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: |