| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if V8_TARGET_ARCH_X64 | 5 #if V8_TARGET_ARCH_X64 |
| 6 | 6 |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/codegen.h" | 8 #include "src/codegen.h" |
| 9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
| 10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode); | 110 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode); |
| 111 GenerateTailCallToReturnedCode(masm); | 111 GenerateTailCallToReturnedCode(masm); |
| 112 | 112 |
| 113 __ bind(&ok); | 113 __ bind(&ok); |
| 114 GenerateTailCallToSharedCode(masm); | 114 GenerateTailCallToSharedCode(masm); |
| 115 } | 115 } |
| 116 | 116 |
| 117 | 117 |
| 118 static void Generate_JSConstructStubHelper(MacroAssembler* masm, | 118 static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
| 119 bool is_api_function, | 119 bool is_api_function, |
| 120 bool create_implicit_receiver) { | 120 bool create_implicit_receiver, |
| 121 bool check_derived_construct) { |
| 121 // ----------- S t a t e ------------- | 122 // ----------- S t a t e ------------- |
| 122 // -- rax: number of arguments | 123 // -- rax: number of arguments |
| 123 // -- rdi: constructor function | 124 // -- rdi: constructor function |
| 124 // -- rbx: allocation site or undefined | 125 // -- rbx: allocation site or undefined |
| 125 // -- rdx: new target | 126 // -- rdx: new target |
| 126 // ----------------------------------- | 127 // ----------------------------------- |
| 127 | 128 |
| 128 // Enter a construct frame. | 129 // Enter a construct frame. |
| 129 { | 130 { |
| 130 FrameScope scope(masm, StackFrame::CONSTRUCT); | 131 FrameScope scope(masm, StackFrame::CONSTRUCT); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 // arguments count is stored below the receiver. | 351 // arguments count is stored below the receiver. |
| 351 __ bind(&exit); | 352 __ bind(&exit); |
| 352 __ movp(rbx, Operand(rsp, 1 * kPointerSize)); | 353 __ movp(rbx, Operand(rsp, 1 * kPointerSize)); |
| 353 } else { | 354 } else { |
| 354 __ movp(rbx, Operand(rsp, 0)); | 355 __ movp(rbx, Operand(rsp, 0)); |
| 355 } | 356 } |
| 356 | 357 |
| 357 // Leave construct frame. | 358 // Leave construct frame. |
| 358 } | 359 } |
| 359 | 360 |
| 361 // ES6 9.2.2. Step 13+ |
| 362 // Check that the result is not a Smi, indicating that the constructor result |
| 363 // from a derived class is neither undefined nor an Object. |
| 364 if (check_derived_construct) { |
| 365 Label dont_throw; |
| 366 __ JumpIfNotSmi(rax, &dont_throw); |
| 367 { |
| 368 FrameScope scope(masm, StackFrame::INTERNAL); |
| 369 __ CallRuntime(Runtime::kThrowDerivedConstructorReturnedNonObject); |
| 370 } |
| 371 __ bind(&dont_throw); |
| 372 } |
| 373 |
| 360 // Remove caller arguments from the stack and return. | 374 // Remove caller arguments from the stack and return. |
| 361 __ PopReturnAddressTo(rcx); | 375 __ PopReturnAddressTo(rcx); |
| 362 SmiIndex index = masm->SmiToIndex(rbx, rbx, kPointerSizeLog2); | 376 SmiIndex index = masm->SmiToIndex(rbx, rbx, kPointerSizeLog2); |
| 363 __ leap(rsp, Operand(rsp, index.reg, index.scale, 1 * kPointerSize)); | 377 __ leap(rsp, Operand(rsp, index.reg, index.scale, 1 * kPointerSize)); |
| 364 __ PushReturnAddressFrom(rcx); | 378 __ PushReturnAddressFrom(rcx); |
| 365 if (create_implicit_receiver) { | 379 if (create_implicit_receiver) { |
| 366 Counters* counters = masm->isolate()->counters(); | 380 Counters* counters = masm->isolate()->counters(); |
| 367 __ IncrementCounter(counters->constructed_objects(), 1); | 381 __ IncrementCounter(counters->constructed_objects(), 1); |
| 368 } | 382 } |
| 369 __ ret(0); | 383 __ ret(0); |
| 370 } | 384 } |
| 371 | 385 |
| 372 | 386 |
| 373 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { | 387 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { |
| 374 Generate_JSConstructStubHelper(masm, false, true); | 388 Generate_JSConstructStubHelper(masm, false, true, false); |
| 375 } | 389 } |
| 376 | 390 |
| 377 | 391 |
| 378 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) { | 392 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) { |
| 379 Generate_JSConstructStubHelper(masm, true, true); | 393 Generate_JSConstructStubHelper(masm, true, true, false); |
| 380 } | 394 } |
| 381 | 395 |
| 382 | 396 |
| 383 void Builtins::Generate_JSBuiltinsConstructStub(MacroAssembler* masm) { | 397 void Builtins::Generate_JSBuiltinsConstructStub(MacroAssembler* masm) { |
| 384 Generate_JSConstructStubHelper(masm, false, false); | 398 Generate_JSConstructStubHelper(masm, false, false, false); |
| 385 } | 399 } |
| 386 | 400 |
| 387 | 401 |
| 402 void Builtins::Generate_JSBuiltinsConstructStubForDerived( |
| 403 MacroAssembler* masm) { |
| 404 Generate_JSConstructStubHelper(masm, false, false, true); |
| 405 } |
| 406 |
| 407 |
| 388 void Builtins::Generate_ConstructedNonConstructable(MacroAssembler* masm) { | 408 void Builtins::Generate_ConstructedNonConstructable(MacroAssembler* masm) { |
| 389 FrameScope scope(masm, StackFrame::INTERNAL); | 409 FrameScope scope(masm, StackFrame::INTERNAL); |
| 390 __ Push(rdi); | 410 __ Push(rdi); |
| 391 __ CallRuntime(Runtime::kThrowConstructedNonConstructable); | 411 __ CallRuntime(Runtime::kThrowConstructedNonConstructable); |
| 392 } | 412 } |
| 393 | 413 |
| 394 | 414 |
| 395 enum IsTagged { kRaxIsSmiTagged, kRaxIsUntaggedInt }; | 415 enum IsTagged { kRaxIsSmiTagged, kRaxIsUntaggedInt }; |
| 396 | 416 |
| 397 | 417 |
| (...skipping 2186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2584 __ ret(0); | 2604 __ ret(0); |
| 2585 } | 2605 } |
| 2586 | 2606 |
| 2587 | 2607 |
| 2588 #undef __ | 2608 #undef __ |
| 2589 | 2609 |
| 2590 } // namespace internal | 2610 } // namespace internal |
| 2591 } // namespace v8 | 2611 } // namespace v8 |
| 2592 | 2612 |
| 2593 #endif // V8_TARGET_ARCH_X64 | 2613 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |