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 <chunyang.dai@intel.com>. Cr-Commit-Position: refs/heads/master@{#25280} git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25280 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
4fd9ba9042
commit
5e8399cbca
@ -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,
|
void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
|
||||||
TypeofState typeof_state,
|
TypeofState typeof_state,
|
||||||
Label* slow) {
|
Label* slow) {
|
||||||
@ -1620,6 +1633,14 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
|||||||
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
|
__ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
|
||||||
CallStoreIC(key->LiteralFeedbackId());
|
CallStoreIC(key->LiteralFeedbackId());
|
||||||
PrepareForBailoutForId(key->id(), NO_REGISTERS);
|
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 {
|
} else {
|
||||||
VisitForEffect(value);
|
VisitForEffect(value);
|
||||||
}
|
}
|
||||||
@ -1629,6 +1650,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
|||||||
VisitForStackValue(key);
|
VisitForStackValue(key);
|
||||||
VisitForStackValue(value);
|
VisitForStackValue(value);
|
||||||
if (property->emit_store()) {
|
if (property->emit_store()) {
|
||||||
|
EmitSetHomeObjectIfNeeded(value, 2);
|
||||||
__ push(Immediate(Smi::FromInt(SLOPPY))); // Strict mode
|
__ push(Immediate(Smi::FromInt(SLOPPY))); // Strict mode
|
||||||
__ CallRuntime(Runtime::kSetProperty, 4);
|
__ CallRuntime(Runtime::kSetProperty, 4);
|
||||||
} else {
|
} else {
|
||||||
@ -1661,7 +1683,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
|||||||
__ push(Operand(esp, 0)); // Duplicate receiver.
|
__ push(Operand(esp, 0)); // Duplicate receiver.
|
||||||
VisitForStackValue(it->first);
|
VisitForStackValue(it->first);
|
||||||
EmitAccessor(it->second->getter);
|
EmitAccessor(it->second->getter);
|
||||||
|
EmitSetHomeObjectIfNeeded(it->second->getter, 2);
|
||||||
EmitAccessor(it->second->setter);
|
EmitAccessor(it->second->setter);
|
||||||
|
EmitSetHomeObjectIfNeeded(it->second->setter, 3);
|
||||||
__ push(Immediate(Smi::FromInt(NONE)));
|
__ push(Immediate(Smi::FromInt(NONE)));
|
||||||
__ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5);
|
__ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5);
|
||||||
}
|
}
|
||||||
@ -2396,6 +2420,7 @@ void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) {
|
|||||||
}
|
}
|
||||||
VisitForStackValue(key);
|
VisitForStackValue(key);
|
||||||
VisitForStackValue(value);
|
VisitForStackValue(value);
|
||||||
|
EmitSetHomeObjectIfNeeded(value, 2);
|
||||||
|
|
||||||
switch (property->kind()) {
|
switch (property->kind()) {
|
||||||
case ObjectLiteral::Property::CONSTANT:
|
case ObjectLiteral::Property::CONSTANT:
|
||||||
|
Loading…
Reference in New Issue
Block a user