Chromium Code Reviews| Index: src/arm/full-codegen-arm.cc |
| diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc |
| index 1710b609dc68740a60cb1984cdbb9223415e99f5..e1c88463e943f503b84a4df8f91e68c43de9f277 100644 |
| --- a/src/arm/full-codegen-arm.cc |
| +++ b/src/arm/full-codegen-arm.cc |
| @@ -1383,6 +1383,19 @@ void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { |
| } |
| +void FullCodeGenerator::EmitSetHomeObject(Expression* expr, int offset) { |
| + if (expr != NULL && expr->IsFunctionLiteral() && |
|
Dmitry Lomov (no reviews)
2014/11/11 11:50:38
Style: extract this condition into bool NeedsHomeO
arv (Not doing code reviews)
2014/11/11 17:19:07
Done.
|
| + expr->AsFunctionLiteral()->needs_super_binding()) { |
| + __ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); |
| + __ mov(StoreDescriptor::NameRegister(), |
| + Operand(isolate()->factory()->home_object_symbol())); |
| + __ ldr(StoreDescriptor::ValueRegister(), |
| + MemOperand(sp, offset * kPointerSize)); |
| + CallStoreIC(); |
| + } |
| +} |
| + |
| + |
| void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, |
| TypeofState typeof_state, |
| Label* slow) { |
| @@ -1739,6 +1752,15 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
| __ ldr(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); |
| CallStoreIC(key->LiteralFeedbackId()); |
| PrepareForBailoutForId(key->id(), NO_REGISTERS); |
| + |
| + if (value != NULL && value->IsFunctionLiteral() && |
|
Dmitry Lomov (no reviews)
2014/11/11 11:50:38
Use NeedsHomeObject (as per previous comment) here
arv (Not doing code reviews)
2014/11/11 17:19:07
Done.
|
| + value->AsFunctionLiteral()->needs_super_binding()) { |
| + __ Move(StoreDescriptor::ReceiverRegister(), r0); |
| + __ mov(StoreDescriptor::NameRegister(), |
| + Operand(isolate()->factory()->home_object_symbol())); |
| + __ ldr(StoreDescriptor::ValueRegister(), MemOperand(sp)); |
| + CallStoreIC(); |
| + } |
| } else { |
| VisitForEffect(value); |
| } |
| @@ -1750,6 +1772,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
| VisitForStackValue(key); |
| VisitForStackValue(value); |
| if (property->emit_store()) { |
| + EmitSetHomeObject(value, 2); |
| __ mov(r0, Operand(Smi::FromInt(SLOPPY))); // PropertyAttributes |
| __ push(r0); |
| __ CallRuntime(Runtime::kSetProperty, 4); |
| @@ -1787,7 +1810,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
| __ push(r0); |
| VisitForStackValue(it->first); |
| EmitAccessor(it->second->getter); |
| + EmitSetHomeObject(it->second->getter, 2); |
| EmitAccessor(it->second->setter); |
| + EmitSetHomeObject(it->second->setter, 3); |
| __ mov(r0, Operand(Smi::FromInt(NONE))); |
| __ push(r0); |
| __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
| @@ -2534,6 +2559,7 @@ void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { |
| __ push(scratch); |
| VisitForStackValue(key); |
| VisitForStackValue(value); |
| + EmitSetHomeObject(value, 2); |
| switch (property->kind()) { |
| case ObjectLiteral::Property::CONSTANT: |