MIPS: ES6: Add support for super in object literals.
Port 84741e76a3
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
This commit is contained in:
parent
fdab306aa2
commit
669bf31c1f
@ -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:
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user