From 7ead4642386c1c622c3e0afc6b26c77fe111f297 Mon Sep 17 00:00:00 2001 From: "weiliang.lin@intel.com" Date: Tue, 30 Sep 2014 07:22:29 +0000 Subject: [PATCH] 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 . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24304 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x87/full-codegen-x87.cc | 47 ++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/x87/full-codegen-x87.cc b/src/x87/full-codegen-x87.cc index a59ac17dd0..723afaf99c 100644 --- a/src/x87/full-codegen-x87.cc +++ b/src/x87/full-codegen-x87.cc @@ -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());