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
This commit is contained in:
balazs.kilvady@imgtec.com 2014-10-28 15:44:52 +00:00
parent e7239331fa
commit 369910849a
2 changed files with 136 additions and 0 deletions

View File

@ -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) {

View File

@ -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) {