From 369910849a2500ae70d59d7e772226e86164366d Mon Sep 17 00:00:00 2001 From: "balazs.kilvady@imgtec.com" Date: Tue, 28 Oct 2014 15:44:52 +0000 Subject: [PATCH] MIPS: Classes: Add basic support for properties Port r24934 (279833c) Original commit message: This adds the properties to the prototype and the constructor. BUG=v8:3330 LOG=Y R=paul.lind@imgtec.com Review URL: https://codereview.chromium.org/687633002 Cr-Commit-Position: refs/heads/master@{#24951} git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24951 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/full-codegen-mips.cc | 68 +++++++++++++++++++++++++++++++++++++++ src/mips64/full-codegen-mips64.cc | 68 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc index dab0710..e2064da 100644 --- a/src/mips/full-codegen-mips.cc +++ b/src/mips/full-codegen-mips.cc @@ -2482,6 +2482,74 @@ void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr, } +void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { + // Constructor is in v0. + DCHECK(lit != NULL); + __ push(v0); + + // No access check is needed here since the constructor is created by the + // class literal. + Register scratch = a1; + __ lw(scratch, + FieldMemOperand(v0, JSFunction::kPrototypeOrInitialMapOffset)); + __ push(scratch); + + for (int i = 0; i < lit->properties()->length(); i++) { + ObjectLiteral::Property* property = lit->properties()->at(i); + Literal* key = property->key()->AsLiteral(); + Expression* value = property->value(); + DCHECK(key != NULL); + + if (property->is_static()) { + __ lw(scratch, MemOperand(sp, kPointerSize)); // constructor + } else { + __ lw(scratch, MemOperand(sp, 0)); // prototype + } + __ push(scratch); + VisitForStackValue(key); + + switch (property->kind()) { + case ObjectLiteral::Property::CONSTANT: + case ObjectLiteral::Property::MATERIALIZED_LITERAL: + case ObjectLiteral::Property::COMPUTED: + case ObjectLiteral::Property::PROTOTYPE: + VisitForStackValue(value); + __ li(scratch, Operand(Smi::FromInt(NONE))); + __ push(scratch); + __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); + break; + + case ObjectLiteral::Property::GETTER: + VisitForStackValue(value); + __ LoadRoot(scratch, Heap::kNullValueRootIndex); + __ push(scratch); + __ li(scratch, Operand(Smi::FromInt(NONE))); + __ push(scratch); + __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); + break; + + case ObjectLiteral::Property::SETTER: + __ LoadRoot(scratch, Heap::kNullValueRootIndex); + __ push(scratch); + VisitForStackValue(value); + __ li(scratch, Operand(Smi::FromInt(NONE))); + __ push(scratch); + __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); + break; + + default: + UNREACHABLE(); + } + } + + // prototype + __ CallRuntime(Runtime::kToFastProperties, 1); + + // constructor + __ CallRuntime(Runtime::kToFastProperties, 1); +} + + void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr, Token::Value op, OverwriteMode mode) { diff --git a/src/mips64/full-codegen-mips64.cc b/src/mips64/full-codegen-mips64.cc index 73572b1..e653326 100644 --- a/src/mips64/full-codegen-mips64.cc +++ b/src/mips64/full-codegen-mips64.cc @@ -2479,6 +2479,74 @@ void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr, } +void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { + // Constructor is in v0. + DCHECK(lit != NULL); + __ push(v0); + + // No access check is needed here since the constructor is created by the + // class literal. + Register scratch = a1; + __ ld(scratch, + FieldMemOperand(v0, JSFunction::kPrototypeOrInitialMapOffset)); + __ push(scratch); + + for (int i = 0; i < lit->properties()->length(); i++) { + ObjectLiteral::Property* property = lit->properties()->at(i); + Literal* key = property->key()->AsLiteral(); + Expression* value = property->value(); + DCHECK(key != NULL); + + if (property->is_static()) { + __ ld(scratch, MemOperand(sp, kPointerSize)); // constructor + } else { + __ ld(scratch, MemOperand(sp, 0)); // prototype + } + __ push(scratch); + VisitForStackValue(key); + + switch (property->kind()) { + case ObjectLiteral::Property::CONSTANT: + case ObjectLiteral::Property::MATERIALIZED_LITERAL: + case ObjectLiteral::Property::COMPUTED: + case ObjectLiteral::Property::PROTOTYPE: + VisitForStackValue(value); + __ li(scratch, Operand(Smi::FromInt(NONE))); + __ push(scratch); + __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4); + break; + + case ObjectLiteral::Property::GETTER: + VisitForStackValue(value); + __ LoadRoot(scratch, Heap::kNullValueRootIndex); + __ push(scratch); + __ li(scratch, Operand(Smi::FromInt(NONE))); + __ push(scratch); + __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); + break; + + case ObjectLiteral::Property::SETTER: + __ LoadRoot(scratch, Heap::kNullValueRootIndex); + __ push(scratch); + VisitForStackValue(value); + __ li(scratch, Operand(Smi::FromInt(NONE))); + __ push(scratch); + __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); + break; + + default: + UNREACHABLE(); + } + } + + // prototype + __ CallRuntime(Runtime::kToFastProperties, 1); + + // constructor + __ CallRuntime(Runtime::kToFastProperties, 1); +} + + void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr, Token::Value op, OverwriteMode mode) { -- 2.7.4