From 38da3edf582141715ef2c8a2d1d6f25edb47a39c Mon Sep 17 00:00:00 2001 From: "balazs.kilvady@imgtec.com" Date: Mon, 29 Sep 2014 12:45:12 +0000 Subject: [PATCH] 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 --- src/mips/full-codegen-mips.cc | 71 +++++++++++++++++++++++++------ src/mips64/full-codegen-mips64.cc | 70 ++++++++++++++++++++++++------ 2 files changed, 115 insertions(+), 26 deletions(-) diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc index 568b8bd3c4..8b20639c44 100644 --- a/src/mips/full-codegen-mips.cc +++ b/src/mips/full-codegen-mips.cc @@ -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. diff --git a/src/mips64/full-codegen-mips64.cc b/src/mips64/full-codegen-mips64.cc index 5c26f16391..1d4e63e8d5 100644 --- a/src/mips64/full-codegen-mips64.cc +++ b/src/mips64/full-codegen-mips64.cc @@ -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.