Index: src/arm/full-codegen-arm.cc |
diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc |
index bb4618ae45d68fb35c8ebceb02de8f757b4b0373..0d1d3a9ee13c69b8e6e83b2d407f3ecab4075edf 100644 |
--- a/src/arm/full-codegen-arm.cc |
+++ b/src/arm/full-codegen-arm.cc |
@@ -1680,11 +1680,13 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
expr->CalculateEmitStore(zone()); |
AccessorTable accessor_table(zone()); |
- for (int i = 0; i < expr->properties()->length(); i++) { |
- ObjectLiteral::Property* property = expr->properties()->at(i); |
+ int property_index = 0; |
+ for (; property_index < expr->properties()->length(); property_index++) { |
+ ObjectLiteral::Property* property = expr->properties()->at(property_index); |
if (property->IsCompileTimeValue()) continue; |
+ if (property->kind() == ObjectLiteral::Property::COMPUTED_NAME) break; |
- Literal* key = property->key(); |
+ Literal* key = property->key()->AsLiteral(); |
Expression* value = property->value(); |
if (!result_saved) { |
__ push(r0); // Save result on stack |
@@ -1692,9 +1694,10 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
} |
switch (property->kind()) { |
case ObjectLiteral::Property::CONSTANT: |
+ case ObjectLiteral::Property::COMPUTED_NAME: |
UNREACHABLE(); |
case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
- ASSERT(!CompileTimeValue::IsCompileTimeValue(property->value())); |
+ ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); |
// Fall through. |
case ObjectLiteral::Property::COMPUTED: |
if (key->value()->IsInternalizedString()) { |
@@ -1758,6 +1761,80 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
__ CallRuntime(Runtime::kDefineOrRedefineAccessorProperty, 5); |
} |
+ for (; property_index < expr->properties()->length(); property_index++) { |
+ ObjectLiteral::Property* property = expr->properties()->at(property_index); |
+ |
+ Expression* key = property->key(); |
+ Expression* value = property->value(); |
+ if (!result_saved) { |
+ __ push(r0); // Save result on the stack |
+ result_saved = true; |
+ } |
+ |
+ switch (property->kind()) { |
+ case ObjectLiteral::Property::CONSTANT: |
+ case ObjectLiteral::Property::COMPUTED_NAME: |
+ case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
+ case ObjectLiteral::Property::COMPUTED: |
+ // Duplicate receiver on stack. |
+ __ ldr(r0, MemOperand(sp)); |
+ __ push(r0); |
+ VisitForStackValue(key); |
+ VisitForStackValue(value); |
+ if (property->emit_store()) { |
+ __ CallRuntime(Runtime::kSetOwnProperty, 3); |
+ } else { |
+ __ Drop(3); |
+ } |
+ break; |
+ case ObjectLiteral::Property::PROTOTYPE: |
+ // Duplicate receiver on stack. |
+ __ ldr(r0, MemOperand(sp)); |
+ __ push(r0); |
+ VisitForStackValue(value); |
+ if (property->emit_store()) { |
+ __ CallRuntime(Runtime::kSetPrototype, 2); |
+ } else { |
+ __ Drop(2); |
+ } |
+ break; |
+ // TODO(wingo): Allow computed names for accessor properties. Currently |
+ // disallowed by the parser. |
+ case ObjectLiteral::Property::GETTER: { |
+ ObjectLiteral::Accessors *accessors = |
+ accessor_table.lookup(key->AsLiteral())->second; |
+ accessors->getter = value; |
+ |
+ // Duplicate receiver on stack. |
+ __ ldr(r0, MemOperand(sp)); |
+ __ push(r0); |
+ VisitForStackValue(key); |
+ EmitAccessor(accessors->getter); |
+ EmitAccessor(accessors->setter); |
+ __ mov(r0, Operand(Smi::FromInt(NONE))); |
+ __ push(r0); |
+ __ CallRuntime(Runtime::kDefineOrRedefineAccessorProperty, 5); |
+ break; |
+ } |
+ case ObjectLiteral::Property::SETTER: { |
+ ObjectLiteral::Accessors *accessors = |
+ accessor_table.lookup(key->AsLiteral())->second; |
+ accessors->setter = value; |
+ |
+ // Duplicate receiver on stack. |
+ __ ldr(r0, MemOperand(sp)); |
+ __ push(r0); |
+ VisitForStackValue(key); |
+ EmitAccessor(accessors->getter); |
+ EmitAccessor(accessors->setter); |
+ __ mov(r0, Operand(Smi::FromInt(NONE))); |
+ __ push(r0); |
+ __ CallRuntime(Runtime::kDefineOrRedefineAccessorProperty, 5); |
+ break; |
+ } |
+ } |
+ } |
+ |
if (expr->has_function()) { |
ASSERT(result_saved); |
__ ldr(r0, MemOperand(sp)); |