X87: Support count operations on super named properties.
port r24290. original commit message: Support count operations on super named properties. BUG= R=weiliang.lin@intel.com Review URL: https://codereview.chromium.org/612873003 Patch from Chunyang Dai <chunyang.dai@intel.com>. git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24304 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
8c41380688
commit
7ead464238
@ -1919,7 +1919,8 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
||||
EmitNamedPropertyAssignment(expr);
|
||||
break;
|
||||
case NAMED_SUPER_PROPERTY:
|
||||
EmitNamedSuperPropertyAssignment(expr);
|
||||
EmitNamedSuperPropertyStore(property);
|
||||
context()->Plug(eax);
|
||||
break;
|
||||
case KEYED_PROPERTY:
|
||||
EmitKeyedPropertyAssignment(expr);
|
||||
@ -2538,11 +2539,10 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
|
||||
}
|
||||
|
||||
|
||||
void FullCodeGenerator::EmitNamedSuperPropertyAssignment(Assignment* expr) {
|
||||
void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) {
|
||||
// Assignment to named property of super.
|
||||
// eax : value
|
||||
// stack : receiver ('this'), home_object
|
||||
Property* prop = expr->target()->AsProperty();
|
||||
DCHECK(prop != NULL);
|
||||
Literal* key = prop->key()->AsLiteral();
|
||||
DCHECK(key != NULL);
|
||||
@ -2552,7 +2552,6 @@ void FullCodeGenerator::EmitNamedSuperPropertyAssignment(Assignment* expr) {
|
||||
__ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict
|
||||
: Runtime::kStoreToSuper_Sloppy),
|
||||
4);
|
||||
context()->Plug(eax);
|
||||
}
|
||||
|
||||
|
||||
@ -4321,19 +4320,21 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
||||
|
||||
// Expression can only be a property, a global or a (parameter or local)
|
||||
// slot.
|
||||
enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY };
|
||||
enum LhsKind {
|
||||
VARIABLE,
|
||||
NAMED_PROPERTY,
|
||||
KEYED_PROPERTY,
|
||||
NAMED_SUPER_PROPERTY
|
||||
};
|
||||
LhsKind assign_type = VARIABLE;
|
||||
Property* prop = expr->expression()->AsProperty();
|
||||
// In case of a property we use the uninitialized expression context
|
||||
// of the key to detect a named property.
|
||||
if (prop != NULL) {
|
||||
assign_type =
|
||||
(prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY;
|
||||
if (prop->IsSuperAccess()) {
|
||||
// throw exception.
|
||||
VisitSuperReference(prop->obj()->AsSuperReference());
|
||||
return;
|
||||
}
|
||||
(prop->key()->IsPropertyName())
|
||||
? (prop->IsSuperAccess() ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY)
|
||||
: KEYED_PROPERTY;
|
||||
}
|
||||
|
||||
// Evaluate expression and get value.
|
||||
@ -4351,6 +4352,13 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
||||
VisitForStackValue(prop->obj());
|
||||
__ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0));
|
||||
EmitNamedPropertyLoad(prop);
|
||||
} else if (assign_type == NAMED_SUPER_PROPERTY) {
|
||||
VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
|
||||
EmitLoadHomeObject(prop->obj()->AsSuperReference());
|
||||
__ push(result_register());
|
||||
__ push(MemOperand(esp, kPointerSize));
|
||||
__ push(result_register());
|
||||
EmitNamedSuperPropertyLoad(prop);
|
||||
} else {
|
||||
VisitForStackValue(prop->obj());
|
||||
VisitForStackValue(prop->key());
|
||||
@ -4389,6 +4397,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
||||
case NAMED_PROPERTY:
|
||||
__ mov(Operand(esp, kPointerSize), eax);
|
||||
break;
|
||||
case NAMED_SUPER_PROPERTY:
|
||||
__ mov(Operand(esp, 2 * kPointerSize), eax);
|
||||
break;
|
||||
case KEYED_PROPERTY:
|
||||
__ mov(Operand(esp, 2 * kPointerSize), eax);
|
||||
break;
|
||||
@ -4427,6 +4438,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
||||
case NAMED_PROPERTY:
|
||||
__ mov(Operand(esp, kPointerSize), eax);
|
||||
break;
|
||||
case NAMED_SUPER_PROPERTY:
|
||||
__ mov(Operand(esp, 2 * kPointerSize), eax);
|
||||
break;
|
||||
case KEYED_PROPERTY:
|
||||
__ mov(Operand(esp, 2 * kPointerSize), eax);
|
||||
break;
|
||||
@ -4486,6 +4500,17 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NAMED_SUPER_PROPERTY: {
|
||||
EmitNamedSuperPropertyStore(prop);
|
||||
if (expr->is_postfix()) {
|
||||
if (!context()->IsEffect()) {
|
||||
context()->PlugTOS();
|
||||
}
|
||||
} else {
|
||||
context()->Plug(eax);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case KEYED_PROPERTY: {
|
||||
__ pop(StoreDescriptor::NameRegister());
|
||||
__ pop(StoreDescriptor::ReceiverRegister());
|
||||
|
Loading…
Reference in New Issue
Block a user