From 5e8399cbca54fe5454d78e37e74dea8d5c290d7a Mon Sep 17 00:00:00 2001 From: "weiliang.lin@intel.com" Date: Wed, 12 Nov 2014 08:32:50 +0000 Subject: [PATCH] X87: ES6: Add support for super in object literals port 721ff07f5901a9bf9ccacf0356a2c10dc452f32d (r25271). original commit message: ES6: Add support for super in object literals This only available under --harmony-classes BUG= R=weiliang.lin@intel.com Review URL: https://codereview.chromium.org/716973004 Patch from Chunyang Dai . Cr-Commit-Position: refs/heads/master@{#25280} git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25280 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x87/full-codegen-x87.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/x87/full-codegen-x87.cc b/src/x87/full-codegen-x87.cc index edb4f4690a..9d35acd58d 100644 --- a/src/x87/full-codegen-x87.cc +++ b/src/x87/full-codegen-x87.cc @@ -1256,6 +1256,19 @@ void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { } +void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, + int offset) { + if (NeedsHomeObject(initializer)) { + __ 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) { @@ -1620,6 +1633,14 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); CallStoreIC(key->LiteralFeedbackId()); PrepareForBailoutForId(key->id(), NO_REGISTERS); + + if (NeedsHomeObject(value)) { + __ mov(StoreDescriptor::ReceiverRegister(), eax); + __ mov(StoreDescriptor::NameRegister(), + Immediate(isolate()->factory()->home_object_symbol())); + __ mov(StoreDescriptor::ValueRegister(), Operand(esp, 0)); + CallStoreIC(); + } } else { VisitForEffect(value); } @@ -1629,6 +1650,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { VisitForStackValue(key); VisitForStackValue(value); if (property->emit_store()) { + EmitSetHomeObjectIfNeeded(value, 2); __ push(Immediate(Smi::FromInt(SLOPPY))); // Strict mode __ CallRuntime(Runtime::kSetProperty, 4); } else { @@ -1661,7 +1683,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { __ push(Operand(esp, 0)); // Duplicate receiver. VisitForStackValue(it->first); EmitAccessor(it->second->getter); + EmitSetHomeObjectIfNeeded(it->second->getter, 2); EmitAccessor(it->second->setter); + EmitSetHomeObjectIfNeeded(it->second->setter, 3); __ push(Immediate(Smi::FromInt(NONE))); __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); } @@ -2396,6 +2420,7 @@ void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { } VisitForStackValue(key); VisitForStackValue(value); + EmitSetHomeObjectIfNeeded(value, 2); switch (property->kind()) { case ObjectLiteral::Property::CONSTANT: