Index: src/arm64/full-codegen-arm64.cc |
diff --git a/src/arm64/full-codegen-arm64.cc b/src/arm64/full-codegen-arm64.cc |
index 426287540e4e2b523b9ed40c9030504f5ee79cf3..230fffba49d7e19e895dfb76644b854f9358a19a 100644 |
--- a/src/arm64/full-codegen-arm64.cc |
+++ b/src/arm64/full-codegen-arm64.cc |
@@ -1372,6 +1372,18 @@ void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { |
} |
+void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, |
+ int offset) { |
+ if (NeedsHomeObject(initializer)) { |
+ __ Peek(StoreDescriptor::ReceiverRegister(), 0); |
+ __ Mov(StoreDescriptor::NameRegister(), |
+ Operand(isolate()->factory()->home_object_symbol())); |
+ __ Peek(StoreDescriptor::ValueRegister(), offset * kPointerSize); |
+ CallStoreIC(); |
+ } |
+} |
+ |
+ |
void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, |
TypeofState typeof_state, |
Label* slow) { |
@@ -1721,6 +1733,15 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
__ Peek(StoreDescriptor::ReceiverRegister(), 0); |
CallStoreIC(key->LiteralFeedbackId()); |
PrepareForBailoutForId(key->id(), NO_REGISTERS); |
+ |
+ if (value != NULL && value->IsFunctionLiteral() && |
Dmitry Lomov (no reviews)
2014/11/11 19:27:47
Use NeedsHomeObject
arv (Not doing code reviews)
2014/11/11 19:51:29
Done.
|
+ value->AsFunctionLiteral()->needs_super_binding()) { |
+ __ Mov(StoreDescriptor::ReceiverRegister(), x0); |
+ __ Mov(StoreDescriptor::NameRegister(), |
+ Operand(isolate()->factory()->home_object_symbol())); |
+ __ Peek(StoreDescriptor::ValueRegister(), 0); |
+ CallStoreIC(); |
+ } |
} else { |
VisitForEffect(value); |
} |
@@ -1732,6 +1753,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
__ Push(x0); |
VisitForStackValue(key); |
VisitForStackValue(value); |
+ EmitSetHomeObjectIfNeeded(value, 2); |
__ Mov(x0, Smi::FromInt(SLOPPY)); // Strict mode |
__ Push(x0); |
__ CallRuntime(Runtime::kSetProperty, 4); |
@@ -1769,7 +1791,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
__ Push(x10); |
VisitForStackValue(it->first); |
EmitAccessor(it->second->getter); |
+ EmitSetHomeObjectIfNeeded(it->second->getter, 2); |
EmitAccessor(it->second->setter); |
+ EmitSetHomeObjectIfNeeded(it->second->setter, 3); |
__ Mov(x10, Smi::FromInt(NONE)); |
__ Push(x10); |
__ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
@@ -2203,6 +2227,7 @@ void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { |
__ Push(scratch); |
VisitForStackValue(key); |
VisitForStackValue(value); |
+ EmitSetHomeObjectIfNeeded(value, 2); |
switch (property->kind()) { |
case ObjectLiteral::Property::CONSTANT: |