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_ARM | 5 #if V8_TARGET_ARCH_ARM |
6 | 6 |
7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.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 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode); | 410 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode); |
411 GenerateTailCallToReturnedCode(masm); | 411 GenerateTailCallToReturnedCode(masm); |
412 | 412 |
413 __ bind(&ok); | 413 __ bind(&ok); |
414 GenerateTailCallToSharedCode(masm); | 414 GenerateTailCallToSharedCode(masm); |
415 } | 415 } |
416 | 416 |
417 | 417 |
418 static void Generate_JSConstructStubHelper(MacroAssembler* masm, | 418 static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
419 bool is_api_function, | 419 bool is_api_function, |
420 bool create_implicit_receiver) { | 420 bool create_implicit_receiver, |
| 421 bool check_derived_construct) { |
421 // ----------- S t a t e ------------- | 422 // ----------- S t a t e ------------- |
422 // -- r0 : number of arguments | 423 // -- r0 : number of arguments |
423 // -- r1 : constructor function | 424 // -- r1 : constructor function |
424 // -- r2 : allocation site or undefined | 425 // -- r2 : allocation site or undefined |
425 // -- r3 : new target | 426 // -- r3 : new target |
426 // -- lr : return address | 427 // -- lr : return address |
427 // -- sp[...]: constructor arguments | 428 // -- sp[...]: constructor arguments |
428 // ----------------------------------- | 429 // ----------------------------------- |
429 | 430 |
430 Isolate* isolate = masm->isolate(); | 431 Isolate* isolate = masm->isolate(); |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 // sp[0]: receiver (newly allocated object) | 679 // sp[0]: receiver (newly allocated object) |
679 // sp[1]: number of arguments (smi-tagged) | 680 // sp[1]: number of arguments (smi-tagged) |
680 __ ldr(r1, MemOperand(sp, 1 * kPointerSize)); | 681 __ ldr(r1, MemOperand(sp, 1 * kPointerSize)); |
681 } else { | 682 } else { |
682 __ ldr(r1, MemOperand(sp)); | 683 __ ldr(r1, MemOperand(sp)); |
683 } | 684 } |
684 | 685 |
685 // Leave construct frame. | 686 // Leave construct frame. |
686 } | 687 } |
687 | 688 |
| 689 // ES6 9.2.2. Step 13+ |
| 690 // Check that the result is not a Smi, indicating that the constructor result |
| 691 // from a derived class is neither undefined nor an Object. |
| 692 if (check_derived_construct) { |
| 693 Label dont_throw; |
| 694 __ JumpIfNotSmi(r0, &dont_throw); |
| 695 { |
| 696 FrameScope scope(masm, StackFrame::INTERNAL); |
| 697 __ CallRuntime(Runtime::kThrowDerivedConstructorReturnedNonObject); |
| 698 } |
| 699 __ bind(&dont_throw); |
| 700 } |
| 701 |
688 __ add(sp, sp, Operand(r1, LSL, kPointerSizeLog2 - 1)); | 702 __ add(sp, sp, Operand(r1, LSL, kPointerSizeLog2 - 1)); |
689 __ add(sp, sp, Operand(kPointerSize)); | 703 __ add(sp, sp, Operand(kPointerSize)); |
690 if (create_implicit_receiver) { | 704 if (create_implicit_receiver) { |
691 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, r1, r2); | 705 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, r1, r2); |
692 } | 706 } |
693 __ Jump(lr); | 707 __ Jump(lr); |
694 } | 708 } |
695 | 709 |
696 | 710 |
697 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { | 711 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { |
698 Generate_JSConstructStubHelper(masm, false, true); | 712 Generate_JSConstructStubHelper(masm, false, true, false); |
699 } | 713 } |
700 | 714 |
701 | 715 |
702 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) { | 716 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) { |
703 Generate_JSConstructStubHelper(masm, true, true); | 717 Generate_JSConstructStubHelper(masm, true, true, false); |
704 } | 718 } |
705 | 719 |
706 | 720 |
707 void Builtins::Generate_JSBuiltinsConstructStub(MacroAssembler* masm) { | 721 void Builtins::Generate_JSBuiltinsConstructStub(MacroAssembler* masm) { |
708 Generate_JSConstructStubHelper(masm, false, false); | 722 Generate_JSConstructStubHelper(masm, false, false, false); |
709 } | 723 } |
710 | 724 |
711 | 725 |
| 726 void Builtins::Generate_JSBuiltinsConstructStubForDerived( |
| 727 MacroAssembler* masm) { |
| 728 Generate_JSConstructStubHelper(masm, false, false, true); |
| 729 } |
| 730 |
| 731 |
712 void Builtins::Generate_ConstructedNonConstructable(MacroAssembler* masm) { | 732 void Builtins::Generate_ConstructedNonConstructable(MacroAssembler* masm) { |
713 FrameScope scope(masm, StackFrame::INTERNAL); | 733 FrameScope scope(masm, StackFrame::INTERNAL); |
714 __ push(r1); | 734 __ push(r1); |
715 __ CallRuntime(Runtime::kThrowConstructedNonConstructable); | 735 __ CallRuntime(Runtime::kThrowConstructedNonConstructable); |
716 } | 736 } |
717 | 737 |
718 | 738 |
719 enum IsTagged { kArgcIsSmiTagged, kArgcIsUntaggedInt }; | 739 enum IsTagged { kArgcIsSmiTagged, kArgcIsUntaggedInt }; |
720 | 740 |
721 | 741 |
(...skipping 1710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2432 } | 2452 } |
2433 } | 2453 } |
2434 | 2454 |
2435 | 2455 |
2436 #undef __ | 2456 #undef __ |
2437 | 2457 |
2438 } // namespace internal | 2458 } // namespace internal |
2439 } // namespace v8 | 2459 } // namespace v8 |
2440 | 2460 |
2441 #endif // V8_TARGET_ARCH_ARM | 2461 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |