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:
parent
e7239331fa
commit
369910849a
@ -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) {
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user