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
parent 9b32bb22
...@@ -1874,13 +1874,19 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -1874,13 +1874,19 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
// Left-hand side can only be a property, a global or a (parameter or local) // Left-hand side can only be a property, a global or a (parameter or local)
// slot. // slot.
enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY }; enum LhsKind {
VARIABLE,
NAMED_PROPERTY,
KEYED_PROPERTY,
NAMED_SUPER_PROPERTY
};
LhsKind assign_type = VARIABLE; LhsKind assign_type = VARIABLE;
Property* property = expr->target()->AsProperty(); Property* property = expr->target()->AsProperty();
if (property != NULL) { if (property != NULL) {
assign_type = (property->key()->IsPropertyName()) assign_type = (property->key()->IsPropertyName())
? NAMED_PROPERTY ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY
: KEYED_PROPERTY; : NAMED_PROPERTY)
: KEYED_PROPERTY;
} }
// Evaluate LHS expression. // Evaluate LHS expression.
...@@ -1897,6 +1903,16 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -1897,6 +1903,16 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
VisitForStackValue(property->obj()); VisitForStackValue(property->obj());
} }
break; 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: case KEYED_PROPERTY:
// We need the key and receiver on both the stack and in v0 and a1. // We need the key and receiver on both the stack and in v0 and a1.
if (expr->is_compound()) { if (expr->is_compound()) {
...@@ -1925,6 +1941,10 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -1925,6 +1941,10 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
EmitNamedPropertyLoad(property); EmitNamedPropertyLoad(property);
PrepareForBailoutForId(property->LoadId(), TOS_REG); PrepareForBailoutForId(property->LoadId(), TOS_REG);
break; break;
case NAMED_SUPER_PROPERTY:
EmitNamedSuperPropertyLoad(property);
PrepareForBailoutForId(property->LoadId(), TOS_REG);
break;
case KEYED_PROPERTY: case KEYED_PROPERTY:
EmitKeyedPropertyLoad(property); EmitKeyedPropertyLoad(property);
PrepareForBailoutForId(property->LoadId(), TOS_REG); PrepareForBailoutForId(property->LoadId(), TOS_REG);
...@@ -1971,6 +1991,9 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -1971,6 +1991,9 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
case NAMED_PROPERTY: case NAMED_PROPERTY:
EmitNamedPropertyAssignment(expr); EmitNamedPropertyAssignment(expr);
break; break;
case NAMED_SUPER_PROPERTY:
EmitNamedSuperPropertyAssignment(expr);
break;
case KEYED_PROPERTY: case KEYED_PROPERTY:
EmitKeyedPropertyAssignment(expr); EmitKeyedPropertyAssignment(expr);
break; break;
...@@ -2299,6 +2322,7 @@ void FullCodeGenerator::EmitCreateIteratorResult(bool done) { ...@@ -2299,6 +2322,7 @@ void FullCodeGenerator::EmitCreateIteratorResult(bool done) {
void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
SetSourcePosition(prop->position()); SetSourcePosition(prop->position());
Literal* key = prop->key()->AsLiteral(); Literal* key = prop->key()->AsLiteral();
DCHECK(!prop->IsSuperAccess());
__ li(LoadDescriptor::NameRegister(), Operand(key->value())); __ li(LoadDescriptor::NameRegister(), Operand(key->value()));
if (FLAG_vector_ics) { if (FLAG_vector_ics) {
...@@ -2312,15 +2336,12 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { ...@@ -2312,15 +2336,12 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
// Stack: receiver, home_object.
SetSourcePosition(prop->position()); SetSourcePosition(prop->position());
Literal* key = prop->key()->AsLiteral(); Literal* key = prop->key()->AsLiteral();
DCHECK(!key->value()->IsSmi()); DCHECK(!key->value()->IsSmi());
DCHECK(prop->IsSuperAccess()); DCHECK(prop->IsSuperAccess());
SuperReference* super_ref = prop->obj()->AsSuperReference();
EmitLoadHomeObject(super_ref);
__ Push(v0);
VisitForStackValue(super_ref->this_var());
__ Push(key->value()); __ Push(key->value());
__ CallRuntime(Runtime::kLoadFromSuper, 3); __ CallRuntime(Runtime::kLoadFromSuper, 3);
} }
...@@ -2592,6 +2613,24 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -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) { void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
// Assignment to a property, using a keyed store IC. // Assignment to a property, using a keyed store IC.
...@@ -2624,6 +2663,9 @@ void FullCodeGenerator::VisitProperty(Property* expr) { ...@@ -2624,6 +2663,9 @@ void FullCodeGenerator::VisitProperty(Property* expr) {
__ Move(LoadDescriptor::ReceiverRegister(), v0); __ Move(LoadDescriptor::ReceiverRegister(), v0);
EmitNamedPropertyLoad(expr); EmitNamedPropertyLoad(expr);
} else { } else {
VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
EmitLoadHomeObject(expr->obj()->AsSuperReference());
__ Push(result_register());
EmitNamedSuperPropertyLoad(expr); EmitNamedSuperPropertyLoad(expr);
} }
PrepareForBailoutForId(expr->LoadId(), TOS_REG); PrepareForBailoutForId(expr->LoadId(), TOS_REG);
...@@ -2692,18 +2734,16 @@ void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) { ...@@ -2692,18 +2734,16 @@ void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) {
const Register scratch = a1; const Register scratch = a1;
SuperReference* super_ref = prop->obj()->AsSuperReference(); SuperReference* super_ref = prop->obj()->AsSuperReference();
EmitLoadHomeObject(super_ref); EmitLoadHomeObject(super_ref);
__ Push(v0); __ mov(scratch, v0);
VisitForAccumulatorValue(super_ref->this_var()); VisitForAccumulatorValue(super_ref->this_var());
__ Push(v0); __ Push(scratch, v0, v0, scratch);
__ lw(scratch, MemOperand(sp, kPointerSize));
__ Push(scratch, v0);
__ Push(key->value()); __ Push(key->value());
// Stack here: // Stack here:
// - home_object // - home_object
// - this (receiver) // - this (receiver)
// - home_object <-- LoadFromSuper will pop here and below. // - this (receiver) <-- LoadFromSuper will pop here and below.
// - this (receiver) // - home_object
// - key // - key
__ CallRuntime(Runtime::kLoadFromSuper, 3); __ CallRuntime(Runtime::kLoadFromSuper, 3);
...@@ -4350,6 +4390,11 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -4350,6 +4390,11 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
if (prop != NULL) { if (prop != NULL) {
assign_type = assign_type =
(prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY; (prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY;
if (prop->IsSuperAccess()) {
// throw exception.
VisitSuperReference(prop->obj()->AsSuperReference());
return;
}
} }
// Evaluate expression and get value. // Evaluate expression and get value.
......
...@@ -1871,13 +1871,19 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -1871,13 +1871,19 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
// Left-hand side can only be a property, a global or a (parameter or local) // Left-hand side can only be a property, a global or a (parameter or local)
// slot. // slot.
enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY }; enum LhsKind {
VARIABLE,
NAMED_PROPERTY,
KEYED_PROPERTY,
NAMED_SUPER_PROPERTY
};
LhsKind assign_type = VARIABLE; LhsKind assign_type = VARIABLE;
Property* property = expr->target()->AsProperty(); Property* property = expr->target()->AsProperty();
if (property != NULL) { if (property != NULL) {
assign_type = (property->key()->IsPropertyName()) assign_type = (property->key()->IsPropertyName())
? NAMED_PROPERTY ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY
: KEYED_PROPERTY; : NAMED_PROPERTY)
: KEYED_PROPERTY;
} }
// Evaluate LHS expression. // Evaluate LHS expression.
...@@ -1894,6 +1900,16 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -1894,6 +1900,16 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
VisitForStackValue(property->obj()); VisitForStackValue(property->obj());
} }
break; 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: case KEYED_PROPERTY:
// We need the key and receiver on both the stack and in v0 and a1. // We need the key and receiver on both the stack and in v0 and a1.
if (expr->is_compound()) { if (expr->is_compound()) {
...@@ -1922,6 +1938,10 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -1922,6 +1938,10 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
EmitNamedPropertyLoad(property); EmitNamedPropertyLoad(property);
PrepareForBailoutForId(property->LoadId(), TOS_REG); PrepareForBailoutForId(property->LoadId(), TOS_REG);
break; break;
case NAMED_SUPER_PROPERTY:
EmitNamedSuperPropertyLoad(property);
PrepareForBailoutForId(property->LoadId(), TOS_REG);
break;
case KEYED_PROPERTY: case KEYED_PROPERTY:
EmitKeyedPropertyLoad(property); EmitKeyedPropertyLoad(property);
PrepareForBailoutForId(property->LoadId(), TOS_REG); PrepareForBailoutForId(property->LoadId(), TOS_REG);
...@@ -1968,6 +1988,9 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { ...@@ -1968,6 +1988,9 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
case NAMED_PROPERTY: case NAMED_PROPERTY:
EmitNamedPropertyAssignment(expr); EmitNamedPropertyAssignment(expr);
break; break;
case NAMED_SUPER_PROPERTY:
EmitNamedSuperPropertyAssignment(expr);
break;
case KEYED_PROPERTY: case KEYED_PROPERTY:
EmitKeyedPropertyAssignment(expr); EmitKeyedPropertyAssignment(expr);
break; break;
...@@ -2310,15 +2333,12 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { ...@@ -2310,15 +2333,12 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
// Stack: receiver, home_object.
SetSourcePosition(prop->position()); SetSourcePosition(prop->position());
Literal* key = prop->key()->AsLiteral(); Literal* key = prop->key()->AsLiteral();
DCHECK(!key->value()->IsSmi()); DCHECK(!key->value()->IsSmi());
DCHECK(prop->IsSuperAccess()); DCHECK(prop->IsSuperAccess());
SuperReference* super_ref = prop->obj()->AsSuperReference();
EmitLoadHomeObject(super_ref);
__ Push(v0);
VisitForStackValue(super_ref->this_var());
__ Push(key->value()); __ Push(key->value());
__ CallRuntime(Runtime::kLoadFromSuper, 3); __ CallRuntime(Runtime::kLoadFromSuper, 3);
} }
...@@ -2593,6 +2613,24 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { ...@@ -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) { void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
// Assignment to a property, using a keyed store IC. // Assignment to a property, using a keyed store IC.
...@@ -2625,6 +2663,9 @@ void FullCodeGenerator::VisitProperty(Property* expr) { ...@@ -2625,6 +2663,9 @@ void FullCodeGenerator::VisitProperty(Property* expr) {
__ Move(LoadDescriptor::ReceiverRegister(), v0); __ Move(LoadDescriptor::ReceiverRegister(), v0);
EmitNamedPropertyLoad(expr); EmitNamedPropertyLoad(expr);
} else { } else {
VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
EmitLoadHomeObject(expr->obj()->AsSuperReference());
__ Push(result_register());
EmitNamedSuperPropertyLoad(expr); EmitNamedSuperPropertyLoad(expr);
} }
PrepareForBailoutForId(expr->LoadId(), TOS_REG); PrepareForBailoutForId(expr->LoadId(), TOS_REG);
...@@ -2693,18 +2734,16 @@ void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) { ...@@ -2693,18 +2734,16 @@ void FullCodeGenerator::EmitSuperCallWithLoadIC(Call* expr) {
const Register scratch = a1; const Register scratch = a1;
SuperReference* super_ref = prop->obj()->AsSuperReference(); SuperReference* super_ref = prop->obj()->AsSuperReference();
EmitLoadHomeObject(super_ref); EmitLoadHomeObject(super_ref);
__ Push(v0); __ mov(scratch, v0);
VisitForAccumulatorValue(super_ref->this_var()); VisitForAccumulatorValue(super_ref->this_var());
__ Push(v0); __ Push(scratch, v0, v0, scratch);
__ ld(scratch, MemOperand(sp, kPointerSize));
__ Push(scratch, v0);
__ Push(key->value()); __ Push(key->value());
// Stack here: // Stack here:
// - home_object // - home_object
// - this (receiver) // - this (receiver)
// - home_object <-- LoadFromSuper will pop here and below. // - this (receiver) <-- LoadFromSuper will pop here and below.
// - this (receiver) // - home_object
// - key // - key
__ CallRuntime(Runtime::kLoadFromSuper, 3); __ CallRuntime(Runtime::kLoadFromSuper, 3);
...@@ -4351,6 +4390,11 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { ...@@ -4351,6 +4390,11 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
if (prop != NULL) { if (prop != NULL) {
assign_type = assign_type =
(prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY; (prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY;
if (prop->IsSuperAccess()) {
// throw exception.
VisitSuperReference(prop->obj()->AsSuperReference());
return;
}
} }
// Evaluate expression and get value. // Evaluate expression and get value.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment