| Index: src/arm64/full-codegen-arm64.cc
|
| diff --git a/src/arm64/full-codegen-arm64.cc b/src/arm64/full-codegen-arm64.cc
|
| index 788598400f1684393ae5135f1ec6662389fde927..a318b61bd91d46cc9cf8986794d4686faa2ceecd 100644
|
| --- a/src/arm64/full-codegen-arm64.cc
|
| +++ b/src/arm64/full-codegen-arm64.cc
|
| @@ -300,7 +300,8 @@ void FullCodeGenerator::Generate() {
|
| VisitDeclarations(scope()->declarations());
|
| }
|
|
|
| - { Comment cmnt(masm_, "[ Stack check");
|
| + {
|
| + Comment cmnt(masm_, "[ Stack check");
|
| PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS);
|
| Label ok;
|
| DCHECK(jssp.Is(__ StackPointer()));
|
| @@ -312,7 +313,8 @@ void FullCodeGenerator::Generate() {
|
| __ Bind(&ok);
|
| }
|
|
|
| - { Comment cmnt(masm_, "[ Body");
|
| + {
|
| + Comment cmnt(masm_, "[ Body");
|
| DCHECK(loop_depth() == 0);
|
| VisitStatements(function()->body());
|
| DCHECK(loop_depth() == 0);
|
| @@ -2040,7 +2042,7 @@ void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
|
|
|
| void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
|
| SetSourcePosition(prop->position());
|
| - // Call keyed load IC. It has arguments key and receiver in r0 and r1.
|
| + // Call keyed load IC. It has arguments key and receiver in x0 and x1.
|
| Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
|
| if (FLAG_vector_ics) {
|
| __ Mov(VectorLoadICDescriptor::SlotRegister(),
|
| @@ -2175,6 +2177,74 @@ void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr,
|
| }
|
|
|
|
|
| +void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) {
|
| + // Constructor is in x0.
|
| + DCHECK(lit != NULL);
|
| + __ push(x0);
|
| +
|
| + // No access check is needed here since the constructor is created by the
|
| + // class literal.
|
| + Register scratch = x1;
|
| + __ Ldr(scratch,
|
| + FieldMemOperand(x0, 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()) {
|
| + __ Peek(scratch, kPointerSize); // constructor
|
| + } else {
|
| + __ Peek(scratch, 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);
|
| + __ Mov(scratch, Smi::FromInt(NONE));
|
| + __ Push(scratch);
|
| + __ CallRuntime(Runtime::kDefineDataPropertyUnchecked, 4);
|
| + break;
|
| +
|
| + case ObjectLiteral::Property::GETTER:
|
| + VisitForStackValue(value);
|
| + __ LoadRoot(scratch, Heap::kNullValueRootIndex);
|
| + __ push(scratch);
|
| + __ Mov(scratch, Smi::FromInt(NONE));
|
| + __ Push(scratch);
|
| + __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5);
|
| + break;
|
| +
|
| + case ObjectLiteral::Property::SETTER:
|
| + __ LoadRoot(scratch, Heap::kNullValueRootIndex);
|
| + __ push(scratch);
|
| + VisitForStackValue(value);
|
| + __ Mov(scratch, Smi::FromInt(NONE));
|
| + __ Push(scratch);
|
| + __ CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5);
|
| + break;
|
| +
|
| + default:
|
| + UNREACHABLE();
|
| + }
|
| + }
|
| +
|
| + // prototype
|
| + __ CallRuntime(Runtime::kToFastProperties, 1);
|
| +
|
| + // constructor
|
| + __ CallRuntime(Runtime::kToFastProperties, 1);
|
| +}
|
| +
|
| +
|
| void FullCodeGenerator::EmitAssignment(Expression* expr) {
|
| DCHECK(expr->IsValidReferenceExpression());
|
|
|
| @@ -4859,7 +4929,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
|
|
|
| // The value stays in x0, and is ultimately read by the resumed generator, as
|
| // if CallRuntime(Runtime::kSuspendJSGeneratorObject) returned it. Or it
|
| - // is read to throw the value when the resumed generator is already closed. r1
|
| + // is read to throw the value when the resumed generator is already closed. x1
|
| // will hold the generator object until the activation has been resumed.
|
| VisitForStackValue(generator);
|
| VisitForAccumulatorValue(value);
|
|
|