Index: src/mips/full-codegen-mips.cc |
diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc |
index f1a2ced58c815410efe89444df256609b44292a3..04760e667293f0ced9ff5eb2f0b4dccca3274c13 100644 |
--- a/src/mips/full-codegen-mips.cc |
+++ b/src/mips/full-codegen-mips.cc |
@@ -1992,7 +1992,8 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
EmitNamedPropertyAssignment(expr); |
break; |
case NAMED_SUPER_PROPERTY: |
- EmitNamedSuperPropertyAssignment(expr); |
+ EmitNamedSuperPropertyStore(property); |
+ context()->Plug(v0); |
break; |
case KEYED_PROPERTY: |
EmitKeyedPropertyAssignment(expr); |
@@ -2613,11 +2614,10 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { |
} |
-void FullCodeGenerator::EmitNamedSuperPropertyAssignment(Assignment* expr) { |
+void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
// 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); |
@@ -2627,7 +2627,6 @@ void FullCodeGenerator::EmitNamedSuperPropertyAssignment(Assignment* expr) { |
__ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict |
: Runtime::kStoreToSuper_Sloppy), |
4); |
- context()->Plug(v0); |
} |
@@ -4385,19 +4384,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. |
@@ -4416,6 +4417,14 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
VisitForStackValue(prop->obj()); |
__ lw(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |
EmitNamedPropertyLoad(prop); |
+ } else if (assign_type == NAMED_SUPER_PROPERTY) { |
+ VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
+ EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
+ __ Push(result_register()); |
+ const Register scratch = a1; |
+ __ lw(scratch, MemOperand(sp, kPointerSize)); |
+ __ Push(scratch, result_register()); |
+ EmitNamedSuperPropertyLoad(prop); |
} else { |
VisitForStackValue(prop->obj()); |
VisitForStackValue(prop->key()); |
@@ -4457,6 +4466,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
case NAMED_PROPERTY: |
__ sw(v0, MemOperand(sp, kPointerSize)); |
break; |
+ case NAMED_SUPER_PROPERTY: |
+ __ sw(v0, MemOperand(sp, 2 * kPointerSize)); |
+ break; |
case KEYED_PROPERTY: |
__ sw(v0, MemOperand(sp, 2 * kPointerSize)); |
break; |
@@ -4490,6 +4502,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
case NAMED_PROPERTY: |
__ sw(v0, MemOperand(sp, kPointerSize)); |
break; |
+ case NAMED_SUPER_PROPERTY: |
+ __ sw(v0, MemOperand(sp, 2 * kPointerSize)); |
+ break; |
case KEYED_PROPERTY: |
__ sw(v0, MemOperand(sp, 2 * kPointerSize)); |
break; |
@@ -4548,6 +4563,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(v0); |
+ } |
+ break; |
+ } |
case KEYED_PROPERTY: { |
__ mov(StoreDescriptor::ValueRegister(), result_register()); |
__ Pop(StoreDescriptor::ReceiverRegister(), |