Chromium Code Reviews| Index: src/arm/full-codegen-arm.cc |
| diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc |
| index a4a17efeec1194ac9acfc4e1fead128612b7962e..2ca8bd0af950e245b914beb5f6116c83b80cdea5 100644 |
| --- a/src/arm/full-codegen-arm.cc |
| +++ b/src/arm/full-codegen-arm.cc |
| @@ -262,6 +262,10 @@ void FullCodeGenerator::Generate() { |
| // function, receiver address, parameter count. |
| // The stub will rewrite receiever and parameter count if the previous |
| // stack frame was an arguments adapter frame. |
| + ArgumentsAccessStub::HasNewTarget has_new_target = |
| + IsSubclassConstructor(info->function()->kind()) |
|
arv (Not doing code reviews)
2015/02/10 20:15:18
Do we do the right thing in the following case?
c
Dmitry Lomov (no reviews)
2015/02/11 00:58:29
Yes, we do not support new.target in general yet,
|
| + ? ArgumentsAccessStub::HAS_NEW_TARGET |
| + : ArgumentsAccessStub::NO_NEW_TARGET; |
| ArgumentsAccessStub::Type type; |
| if (is_strict(language_mode())) { |
| type = ArgumentsAccessStub::NEW_STRICT; |
| @@ -270,7 +274,7 @@ void FullCodeGenerator::Generate() { |
| } else { |
| type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
| } |
| - ArgumentsAccessStub stub(isolate(), type); |
| + ArgumentsAccessStub stub(isolate(), type, has_new_target); |
| __ CallStub(&stub); |
| SetVar(arguments, r0, r1, r2); |
| @@ -450,7 +454,12 @@ void FullCodeGenerator::EmitReturnSequence() { |
| // Make sure that the constant pool is not emitted inside of the return |
| // sequence. |
| { Assembler::BlockConstPoolScope block_const_pool(masm_); |
| - int32_t sp_delta = (info_->scope()->num_parameters() + 1) * kPointerSize; |
| + int32_t arg_count = info_->scope()->num_parameters() + 1; |
| + if (FLAG_experimental_classes && |
| + IsSubclassConstructor(info_->function()->kind())) { |
| + arg_count++; |
| + } |
| + int32_t sp_delta = arg_count * kPointerSize; |
| CodeGenerator::RecordPositions(masm_, function()->end_position() - 1); |
| // TODO(svenpanne) The code below is sometimes 4 words, sometimes 5! |
| PredictableCodeSizeScope predictable(masm_, -1); |
| @@ -3257,6 +3266,11 @@ void FullCodeGenerator::VisitCallNew(CallNew* expr) { |
| void FullCodeGenerator::EmitSuperConstructorCall(Call* expr) { |
| + Comment cmnt(masm_, "[ SuperConstructorCall"); |
| + Variable* new_target_var = scope()->DeclarationScope()->new_target_var(); |
| + GetVar(result_register(), new_target_var); |
| + __ Push(result_register()); |
| + |
| SuperReference* super_ref = expr->expression()->AsSuperReference(); |
| EmitLoadSuperConstructor(super_ref); |
| __ push(result_register()); |
| @@ -3300,10 +3314,11 @@ void FullCodeGenerator::EmitSuperConstructorCall(Call* expr) { |
| __ Move(r2, FeedbackVector()); |
| __ mov(r3, Operand(SmiFromSlot(expr->CallFeedbackSlot()))); |
| - // TODO(dslomov): use a different stub and propagate new.target. |
| - CallConstructStub stub(isolate(), RECORD_CONSTRUCTOR_TARGET); |
| + CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); |
| __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); |
| + __ Drop(1); |
| + |
| RecordJSReturnSite(expr); |
| EmitVariableAssignment(this_var, Token::INIT_CONST); |