Index: src/full-codegen/x64/full-codegen-x64.cc |
diff --git a/src/full-codegen/x64/full-codegen-x64.cc b/src/full-codegen/x64/full-codegen-x64.cc |
index 42c273bc2ff8ca7e6a33afc82be9824ec29815f2..b17722c994f390224734ea195a89615f0d9e0d86 100644 |
--- a/src/full-codegen/x64/full-codegen-x64.cc |
+++ b/src/full-codegen/x64/full-codegen-x64.cc |
@@ -1185,10 +1185,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
bool result_saved = false; |
AccessorTable accessor_table(zone()); |
- int property_index = 0; |
- for (; property_index < expr->properties()->length(); property_index++) { |
- ObjectLiteral::Property* property = expr->properties()->at(property_index); |
- if (property->is_computed_name()) break; |
+ for (int i = 0; i < expr->properties()->length(); i++) { |
+ ObjectLiteral::Property* property = expr->properties()->at(i); |
+ DCHECK(!property->is_computed_name()); |
if (property->IsCompileTimeValue()) continue; |
Literal* key = property->key()->AsLiteral(); |
@@ -1241,20 +1240,20 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
VisitForStackValue(value); |
DCHECK(property->emit_store()); |
CallRuntimeWithOperands(Runtime::kInternalSetPrototype); |
- PrepareForBailoutForId(expr->GetIdForPropertySet(property_index), |
+ PrepareForBailoutForId(expr->GetIdForPropertySet(i), |
BailoutState::NO_REGISTERS); |
break; |
case ObjectLiteral::Property::GETTER: |
if (property->emit_store()) { |
AccessorTable::Iterator it = accessor_table.lookup(key); |
- it->second->bailout_id = expr->GetIdForPropertySet(property_index); |
+ it->second->bailout_id = expr->GetIdForPropertySet(i); |
it->second->getter = property; |
} |
break; |
case ObjectLiteral::Property::SETTER: |
if (property->emit_store()) { |
AccessorTable::Iterator it = accessor_table.lookup(key); |
- it->second->bailout_id = expr->GetIdForPropertySet(property_index); |
+ it->second->bailout_id = expr->GetIdForPropertySet(i); |
it->second->setter = property; |
} |
break; |
@@ -1275,61 +1274,6 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
PrepareForBailoutForId(it->second->bailout_id, BailoutState::NO_REGISTERS); |
} |
- // Object literals have two parts. The "static" part on the left contains no |
- // computed property names, and so we can compute its map ahead of time; see |
- // runtime.cc::CreateObjectLiteralBoilerplate. The second "dynamic" part |
- // starts with the first computed property name, and continues with all |
- // properties to its right. All the code from above initializes the static |
- // component of the object literal, and arranges for the map of the result to |
- // reflect the static order in which the keys appear. For the dynamic |
- // properties, we compile them into a series of "SetOwnProperty" runtime |
- // calls. This will preserve insertion order. |
- for (; property_index < expr->properties()->length(); property_index++) { |
- ObjectLiteral::Property* property = expr->properties()->at(property_index); |
- |
- Expression* value = property->value(); |
- if (!result_saved) { |
- PushOperand(rax); // Save result on the stack |
- result_saved = true; |
- } |
- |
- PushOperand(Operand(rsp, 0)); // Duplicate receiver. |
- |
- if (property->kind() == ObjectLiteral::Property::PROTOTYPE) { |
- DCHECK(!property->is_computed_name()); |
- VisitForStackValue(value); |
- DCHECK(property->emit_store()); |
- CallRuntimeWithOperands(Runtime::kInternalSetPrototype); |
- PrepareForBailoutForId(expr->GetIdForPropertySet(property_index), |
- BailoutState::NO_REGISTERS); |
- } else { |
- EmitPropertyKey(property, expr->GetIdForPropertyName(property_index)); |
- VisitForStackValue(value); |
- if (NeedsHomeObject(value)) { |
- EmitSetHomeObject(value, 2, property->GetSlot()); |
- } |
- |
- switch (property->kind()) { |
- case ObjectLiteral::Property::CONSTANT: |
- case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
- case ObjectLiteral::Property::COMPUTED: |
- case ObjectLiteral::Property::PROTOTYPE: |
- UNREACHABLE(); |
- break; |
- |
- case ObjectLiteral::Property::GETTER: |
- PushOperand(Smi::FromInt(NONE)); |
- CallRuntimeWithOperands(Runtime::kDefineGetterPropertyUnchecked); |
- break; |
- |
- case ObjectLiteral::Property::SETTER: |
- PushOperand(Smi::FromInt(NONE)); |
- CallRuntimeWithOperands(Runtime::kDefineSetterPropertyUnchecked); |
- break; |
- } |
- } |
- } |
- |
if (result_saved) { |
context()->PlugTOS(); |
} else { |