Index: src/ia32/full-codegen-ia32.cc |
diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc |
index acf59b4d86c14286814ebc88dc60b0367097a857..9c9f17fbb77efc5fe0ff9a01eaf271b9724f6ed8 100644 |
--- a/src/ia32/full-codegen-ia32.cc |
+++ b/src/ia32/full-codegen-ia32.cc |
@@ -1306,6 +1306,19 @@ void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { |
} |
+void FullCodeGenerator::EmitSetHomeObject(Expression* expr, int offset) { |
+ if (expr != NULL && expr->IsFunctionLiteral() && |
+ expr->AsFunctionLiteral()->needs_super_binding()) { |
+ __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); |
+ __ mov(StoreDescriptor::NameRegister(), |
+ Immediate(isolate()->factory()->home_object_symbol())); |
+ __ mov(StoreDescriptor::ValueRegister(), |
+ Operand(esp, offset * kPointerSize)); |
+ CallStoreIC(); |
+ } |
+} |
+ |
+ |
void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, |
TypeofState typeof_state, |
Label* slow) { |
@@ -1670,6 +1683,15 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); |
CallStoreIC(key->LiteralFeedbackId()); |
PrepareForBailoutForId(key->id(), NO_REGISTERS); |
+ |
+ if (value->IsFunctionLiteral() && |
+ value->AsFunctionLiteral()->needs_super_binding()) { |
+ __ mov(StoreDescriptor::ReceiverRegister(), eax); |
+ __ mov(StoreDescriptor::NameRegister(), |
+ Immediate(isolate()->factory()->home_object_symbol())); |
+ __ mov(StoreDescriptor::ValueRegister(), Operand(esp, 0)); |
+ CallStoreIC(); |
+ } |
} else { |
VisitForEffect(value); |
} |
@@ -1679,6 +1701,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
VisitForStackValue(key); |
VisitForStackValue(value); |
if (property->emit_store()) { |
+ EmitSetHomeObject(value, 2); |
__ push(Immediate(Smi::FromInt(SLOPPY))); // Strict mode |
__ CallRuntime(Runtime::kSetProperty, 4); |
} else { |
@@ -1711,7 +1734,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
__ push(Operand(esp, 0)); // Duplicate receiver. |
VisitForStackValue(it->first); |
EmitAccessor(it->second->getter); |
+ EmitSetHomeObject(it->second->getter, 2); |
EmitAccessor(it->second->setter); |
+ EmitSetHomeObject(it->second->setter, 3); |
__ push(Immediate(Smi::FromInt(NONE))); |
__ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
} |