From 669bf31c1f38fcf186058173c93096a698cab987 Mon Sep 17 00:00:00 2001 From: "balazs.kilvady@imgtec.com" Date: Wed, 12 Nov 2014 15:03:23 +0000 Subject: [PATCH] MIPS: ES6: Add support for super in object literals. Port 84741e76a346e34b018af129b0c15bd5d7b1af15 Port r25271 Original commit message: This only available under --harmony-classes BUG=v8:3571 LOG=Y R=paul.lind@imgtec.com Review URL: https://codereview.chromium.org/714423004 Cr-Commit-Position: refs/heads/master@{#25301} git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25301 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/full-codegen-mips.cc | 25 +++++++++++++++++++++++++ src/mips64/full-codegen-mips64.cc | 25 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc index 228988a..643ff12 100644 --- a/src/mips/full-codegen-mips.cc +++ b/src/mips/full-codegen-mips.cc @@ -1330,6 +1330,19 @@ void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { } +void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, + int offset) { + if (NeedsHomeObject(initializer)) { + __ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); + __ li(StoreDescriptor::NameRegister(), + Operand(isolate()->factory()->home_object_symbol())); + __ lw(StoreDescriptor::ValueRegister(), + MemOperand(sp, offset * kPointerSize)); + CallStoreIC(); + } +} + + void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, TypeofState typeof_state, Label* slow) { @@ -1686,6 +1699,14 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { __ lw(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); CallStoreIC(key->LiteralFeedbackId()); PrepareForBailoutForId(key->id(), NO_REGISTERS); + + if (NeedsHomeObject(value)) { + __ Move(StoreDescriptor::ReceiverRegister(), v0); + __ li(StoreDescriptor::NameRegister(), + Operand(isolate()->factory()->home_object_symbol())); + __ lw(StoreDescriptor::ValueRegister(), MemOperand(sp)); + CallStoreIC(); + } } else { VisitForEffect(value); } @@ -1697,6 +1718,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { VisitForStackValue(key); VisitForStackValue(value); if (property->emit_store()) { + EmitSetHomeObjectIfNeeded(value, 2); __ li(a0, Operand(Smi::FromInt(SLOPPY))); // PropertyAttributes. __ push(a0); __ CallRuntime(Runtime::kSetProperty, 4); @@ -1733,7 +1755,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { __ push(a0); VisitForStackValue(it->first); EmitAccessor(it->second->getter); + EmitSetHomeObjectIfNeeded(it->second->getter, 2); EmitAccessor(it->second->setter); + EmitSetHomeObjectIfNeeded(it->second->setter, 3); __ li(a0, Operand(Smi::FromInt(NONE))); __ push(a0); __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); @@ -2472,6 +2496,7 @@ void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { __ push(scratch); VisitForStackValue(key); VisitForStackValue(value); + EmitSetHomeObjectIfNeeded(value, 2); switch (property->kind()) { case ObjectLiteral::Property::CONSTANT: diff --git a/src/mips64/full-codegen-mips64.cc b/src/mips64/full-codegen-mips64.cc index ecce508..f95e8c6 100644 --- a/src/mips64/full-codegen-mips64.cc +++ b/src/mips64/full-codegen-mips64.cc @@ -1325,6 +1325,19 @@ void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { } +void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, + int offset) { + if (NeedsHomeObject(initializer)) { + __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); + __ li(StoreDescriptor::NameRegister(), + Operand(isolate()->factory()->home_object_symbol())); + __ ld(StoreDescriptor::ValueRegister(), + MemOperand(sp, offset * kPointerSize)); + CallStoreIC(); + } +} + + void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, TypeofState typeof_state, Label* slow) { @@ -1683,6 +1696,14 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { __ ld(StoreDescriptor::ReceiverRegister(), MemOperand(sp)); CallStoreIC(key->LiteralFeedbackId()); PrepareForBailoutForId(key->id(), NO_REGISTERS); + + if (NeedsHomeObject(value)) { + __ Move(StoreDescriptor::ReceiverRegister(), v0); + __ li(StoreDescriptor::NameRegister(), + Operand(isolate()->factory()->home_object_symbol())); + __ ld(StoreDescriptor::ValueRegister(), MemOperand(sp)); + CallStoreIC(); + } } else { VisitForEffect(value); } @@ -1694,6 +1715,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { VisitForStackValue(key); VisitForStackValue(value); if (property->emit_store()) { + EmitSetHomeObjectIfNeeded(value, 2); __ li(a0, Operand(Smi::FromInt(SLOPPY))); // PropertyAttributes. __ push(a0); __ CallRuntime(Runtime::kSetProperty, 4); @@ -1730,7 +1752,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { __ push(a0); VisitForStackValue(it->first); EmitAccessor(it->second->getter); + EmitSetHomeObjectIfNeeded(it->second->getter, 2); EmitAccessor(it->second->setter); + EmitSetHomeObjectIfNeeded(it->second->setter, 3); __ li(a0, Operand(Smi::FromInt(NONE))); __ push(a0); __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); @@ -2469,6 +2493,7 @@ void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { __ push(scratch); VisitForStackValue(key); VisitForStackValue(value); + EmitSetHomeObjectIfNeeded(value, 2); switch (property->kind()) { case ObjectLiteral::Property::CONSTANT: -- 2.7.4