MIPS: Stores and compound assignments for named super properties.
Port r24268 (428e63d) BUG=v8:3330 LOG=N R=dusan.milosavljevic@imgtec.com Review URL: https://codereview.chromium.org/616463002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24284 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
9b32bb22c1
commit
38da3edf58
@ -1874,13 +1874,19 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
||||
|
||||
// Left-hand side 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* property = expr->target()->AsProperty();
|
||||
if (property != NULL) {
|
||||
assign_type = (property->key()->IsPropertyName())
|
||||
? NAMED_PROPERTY
|
||||
: KEYED_PROPERTY;
|
||||
? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY
|
||||
: NAMED_PROPERTY)
|
||||
: KEYED_PROPERTY;
|
||||
}
|
||||
|
||||
// Evaluate LHS expression.
|
||||
@ -1897,6 +1903,16 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
||||
VisitForStackValue(property->obj());
|
||||
}
|
||||
break;
|
||||
case NAMED_SUPER_PROPERTY:
|
||||
VisitForStackValue(property->obj()->AsSuperReference()->this_var());
|
||||
EmitLoadHomeObject(property->obj()->AsSuperReference());
|
||||
__ Push(result_register());
|
||||
if (expr->is_compound()) {
|
||||
const Register scratch = a1;
|
||||
__ lw(scratch, MemOperand(sp, kPointerSize));
|
||||
__ Push(scratch, result_register());
|
||||
}
|
||||
break;
|
||||
case KEYED_PROPERTY:
|
||||
// We need the key and receiver on both the stack and in v0 and a1.
|
||||
if (expr->is_compound()) {
|
||||
@ -1925,6 +1941,10 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
||||
EmitNamedPropertyLoad(property);
|
||||
PrepareForBailoutForId(property->LoadId(), TOS_REG);
|
||||
break;
|
||||
case NAMED_SUPER_PROPERTY:
|
||||
EmitNamedSuperPropertyLoad(property);
|
||||
PrepareForBailoutForId(property->LoadId(), TOS_REG);
|
||||
break;
|
||||
case KEYED_PROPERTY:
|
||||
EmitKeyedPropertyLoad(property);
|
||||
PrepareForBailoutForId(property->LoadId(), TOS_REG);
|
||||
@ -1971,6 +1991,9 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
||||
case NAMED_PROPERTY:
|
||||
EmitNamedPropertyAssignment(expr);
|
||||
break;
|
||||
case NAMED_SUPER_PROPERTY:
|
||||
EmitNamedSuperPropertyAssignment(expr);
|
||||
break;
|
||||
case KEYED_PROPERTY:
|
||||
EmitKeyedPropertyAssignment(expr);
|
||||
break;
|
||||
@ -2299,6 +2322,7 @@ void FullCodeGenerator::EmitCreateIteratorResult(bool done) {
|
||||
void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
|
||||
SetSourcePosition(prop->position());
|
||||
Literal* key = prop->key()->AsLiteral();
|
||||
DCHECK(!prop->IsSuperAccess());
|
||||
|
||||
__ li(LoadDescriptor::NameRegister(), Operand(key->value()));
|
||||
if (FLAG_vector_ics) {
|
||||
@ -2312,15 +2336,12 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
|
||||
|
||||
|
||||
void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
|
||||
// Stack: receiver, home_object.
|
||||
SetSourcePosition(prop->position());
|
||||
Literal* key = prop->key()->AsLiteral();
|
||||
DCHECK(!key->value()->IsSmi());
|
||||
DCHECK(prop->IsSuperAccess());
|
||||
|
||||
SuperReference* super_ref = prop->obj()->AsSuperReference();
|
||||
EmitLoadHomeObject(super_ref);
|
||||
__ Push(v0);
|
||||
VisitForStackValue(super_ref->this_var());
|
||||
__ Push(key->value());
|
||||
__ CallRuntime(Runtime::kLoadFromSuper, 3);
|
||||
}
|
||||
@ -2592,6 +2613,24 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
|
||||
}
|
||||
|
||||
|
||||
void FullCodeGenerator::EmitNamedSuperPropertyAssignment(Assignment* expr) {
|
||||
// Assignment to named property of super.
|
||||
// v0 : value
|
||||
// stack : receiver ('this'), home_object
|
||||
Property* prop = expr->target()->AsProperty();
|
||||
DCHECK(prop != NULL);
|
||||
Literal* key = prop->key()->AsLiteral();
|
||||
DCHECK(key != NULL);
|
||||
|
||||
__ Push(v0);
|
||||
__ Push(key->value());
|
||||
__ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict
|
||||
: Runtime::kStoreToSuper_Sloppy),
|
||||
4);
|
||||
context()->Plug(v0);
|
||||
}
|
||||
|
||||
|
||||
void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
|
||||
// Assignment to a property, using a keyed store IC.
|
||||
|
||||
@ -2624,6 +2663,9 @@ void FullCodeGenerator::VisitProperty(Property* expr) {
|
||||
__ Move(LoadDescriptor::ReceiverRegister(), v0);
|
||||
EmitNamedPropertyLoad(expr);
|
||||
} else {
|
||||
VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
|
||||
EmitLoadHomeObject(expr->obj()->AsSuperReference());
|
||||
__ Push(result_register());
|
||||
EmitNamedSuperPropertyLoad(expr);
|
||||
}
|
||||
PrepareForBailoutForId(expr->LoadId(), TOS_REG);
|
||||
@ -2692,18 +2734,16 @@ void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) {
|
||||
const Register scratch = a1;
|
||||
SuperReference* super_ref = prop->obj()->AsSuperReference();
|
||||
EmitLoadHomeObject(super_ref);
|
||||
__ Push(v0);
|
||||
__ mov(scratch, v0);
|
||||
VisitForAccumulatorValue(super_ref->this_var());
|
||||
__ Push(v0);
|
||||
__ lw(scratch, MemOperand(sp, kPointerSize));
|
||||
__ Push(scratch, v0);
|
||||
__ Push(scratch, v0, v0, scratch);
|
||||
__ Push(key->value());
|
||||
|
||||
// Stack here:
|
||||
// - home_object
|
||||
// - this (receiver)
|
||||
// - home_object <-- LoadFromSuper will pop here and below.
|
||||
// - this (receiver)
|
||||
// - this (receiver) <-- LoadFromSuper will pop here and below.
|
||||
// - home_object
|
||||
// - key
|
||||
__ CallRuntime(Runtime::kLoadFromSuper, 3);
|
||||
|
||||
@ -4350,6 +4390,11 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
||||
if (prop != NULL) {
|
||||
assign_type =
|
||||
(prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY;
|
||||
if (prop->IsSuperAccess()) {
|
||||
// throw exception.
|
||||
VisitSuperReference(prop->obj()->AsSuperReference());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Evaluate expression and get value.
|
||||
|
@ -1871,13 +1871,19 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
||||
|
||||
// Left-hand side 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* property = expr->target()->AsProperty();
|
||||
if (property != NULL) {
|
||||
assign_type = (property->key()->IsPropertyName())
|
||||
? NAMED_PROPERTY
|
||||
: KEYED_PROPERTY;
|
||||
? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY
|
||||
: NAMED_PROPERTY)
|
||||
: KEYED_PROPERTY;
|
||||
}
|
||||
|
||||
// Evaluate LHS expression.
|
||||
@ -1894,6 +1900,16 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
||||
VisitForStackValue(property->obj());
|
||||
}
|
||||
break;
|
||||
case NAMED_SUPER_PROPERTY:
|
||||
VisitForStackValue(property->obj()->AsSuperReference()->this_var());
|
||||
EmitLoadHomeObject(property->obj()->AsSuperReference());
|
||||
__ Push(result_register());
|
||||
if (expr->is_compound()) {
|
||||
const Register scratch = a1;
|
||||
__ ld(scratch, MemOperand(sp, kPointerSize));
|
||||
__ Push(scratch, result_register());
|
||||
}
|
||||
break;
|
||||
case KEYED_PROPERTY:
|
||||
// We need the key and receiver on both the stack and in v0 and a1.
|
||||
if (expr->is_compound()) {
|
||||
@ -1922,6 +1938,10 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
||||
EmitNamedPropertyLoad(property);
|
||||
PrepareForBailoutForId(property->LoadId(), TOS_REG);
|
||||
break;
|
||||
case NAMED_SUPER_PROPERTY:
|
||||
EmitNamedSuperPropertyLoad(property);
|
||||
PrepareForBailoutForId(property->LoadId(), TOS_REG);
|
||||
break;
|
||||
case KEYED_PROPERTY:
|
||||
EmitKeyedPropertyLoad(property);
|
||||
PrepareForBailoutForId(property->LoadId(), TOS_REG);
|
||||
@ -1968,6 +1988,9 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
||||
case NAMED_PROPERTY:
|
||||
EmitNamedPropertyAssignment(expr);
|
||||
break;
|
||||
case NAMED_SUPER_PROPERTY:
|
||||
EmitNamedSuperPropertyAssignment(expr);
|
||||
break;
|
||||
case KEYED_PROPERTY:
|
||||
EmitKeyedPropertyAssignment(expr);
|
||||
break;
|
||||
@ -2310,15 +2333,12 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
|
||||
|
||||
|
||||
void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
|
||||
// Stack: receiver, home_object.
|
||||
SetSourcePosition(prop->position());
|
||||
Literal* key = prop->key()->AsLiteral();
|
||||
DCHECK(!key->value()->IsSmi());
|
||||
DCHECK(prop->IsSuperAccess());
|
||||
|
||||
SuperReference* super_ref = prop->obj()->AsSuperReference();
|
||||
EmitLoadHomeObject(super_ref);
|
||||
__ Push(v0);
|
||||
VisitForStackValue(super_ref->this_var());
|
||||
__ Push(key->value());
|
||||
__ CallRuntime(Runtime::kLoadFromSuper, 3);
|
||||
}
|
||||
@ -2593,6 +2613,24 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
|
||||
}
|
||||
|
||||
|
||||
void FullCodeGenerator::EmitNamedSuperPropertyAssignment(Assignment* expr) {
|
||||
// Assignment to named property of super.
|
||||
// v0 : value
|
||||
// stack : receiver ('this'), home_object
|
||||
Property* prop = expr->target()->AsProperty();
|
||||
DCHECK(prop != NULL);
|
||||
Literal* key = prop->key()->AsLiteral();
|
||||
DCHECK(key != NULL);
|
||||
|
||||
__ Push(v0);
|
||||
__ Push(key->value());
|
||||
__ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict
|
||||
: Runtime::kStoreToSuper_Sloppy),
|
||||
4);
|
||||
context()->Plug(v0);
|
||||
}
|
||||
|
||||
|
||||
void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
|
||||
// Assignment to a property, using a keyed store IC.
|
||||
|
||||
@ -2625,6 +2663,9 @@ void FullCodeGenerator::VisitProperty(Property* expr) {
|
||||
__ Move(LoadDescriptor::ReceiverRegister(), v0);
|
||||
EmitNamedPropertyLoad(expr);
|
||||
} else {
|
||||
VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
|
||||
EmitLoadHomeObject(expr->obj()->AsSuperReference());
|
||||
__ Push(result_register());
|
||||
EmitNamedSuperPropertyLoad(expr);
|
||||
}
|
||||
PrepareForBailoutForId(expr->LoadId(), TOS_REG);
|
||||
@ -2693,18 +2734,16 @@ void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) {
|
||||
const Register scratch = a1;
|
||||
SuperReference* super_ref = prop->obj()->AsSuperReference();
|
||||
EmitLoadHomeObject(super_ref);
|
||||
__ Push(v0);
|
||||
__ mov(scratch, v0);
|
||||
VisitForAccumulatorValue(super_ref->this_var());
|
||||
__ Push(v0);
|
||||
__ ld(scratch, MemOperand(sp, kPointerSize));
|
||||
__ Push(scratch, v0);
|
||||
__ Push(scratch, v0, v0, scratch);
|
||||
__ Push(key->value());
|
||||
|
||||
// Stack here:
|
||||
// - home_object
|
||||
// - this (receiver)
|
||||
// - home_object <-- LoadFromSuper will pop here and below.
|
||||
// - this (receiver)
|
||||
// - this (receiver) <-- LoadFromSuper will pop here and below.
|
||||
// - home_object
|
||||
// - key
|
||||
__ CallRuntime(Runtime::kLoadFromSuper, 3);
|
||||
|
||||
@ -4351,6 +4390,11 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
||||
if (prop != NULL) {
|
||||
assign_type =
|
||||
(prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY;
|
||||
if (prop->IsSuperAccess()) {
|
||||
// throw exception.
|
||||
VisitSuperReference(prop->obj()->AsSuperReference());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Evaluate expression and get value.
|
||||
|
Loading…
Reference in New Issue
Block a user