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,
|
||||
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:
|
||||
|
Loading…
Reference in New Issue
Block a user