| 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/code-stubs.h" | 7 #include "src/code-stubs.h" |
| 8 | 8 |
| 9 #include "src/api-arguments.h" | 9 #include "src/api-arguments.h" |
| 10 #include "src/assembler-inl.h" | 10 #include "src/assembler-inl.h" |
| (...skipping 2682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2693 void CallApiCallbackStub::Generate(MacroAssembler* masm) { | 2693 void CallApiCallbackStub::Generate(MacroAssembler* masm) { |
| 2694 // ----------- S t a t e ------------- | 2694 // ----------- S t a t e ------------- |
| 2695 // -- r0 : callee | 2695 // -- r0 : callee |
| 2696 // -- r4 : call_data | 2696 // -- r4 : call_data |
| 2697 // -- r2 : holder | 2697 // -- r2 : holder |
| 2698 // -- r1 : api_function_address | 2698 // -- r1 : api_function_address |
| 2699 // -- cp : context | 2699 // -- cp : context |
| 2700 // -- | 2700 // -- |
| 2701 // -- sp[0] : last argument | 2701 // -- sp[0] : last argument |
| 2702 // -- ... | 2702 // -- ... |
| 2703 // -- sp[(argc - 1)* 4] : first argument | 2703 // -- sp[(argc - 1) * 4] : first argument |
| 2704 // -- sp[argc * 4] : receiver | 2704 // -- sp[argc * 4] : receiver |
| 2705 // -- sp[(argc + 1) * 4] : accessor_holder |
| 2705 // ----------------------------------- | 2706 // ----------------------------------- |
| 2706 | 2707 |
| 2707 Register callee = r0; | 2708 Register callee = r0; |
| 2708 Register call_data = r4; | 2709 Register call_data = r4; |
| 2709 Register holder = r2; | 2710 Register holder = r2; |
| 2710 Register api_function_address = r1; | 2711 Register api_function_address = r1; |
| 2711 Register context = cp; | 2712 Register context = cp; |
| 2712 | 2713 |
| 2713 typedef FunctionCallbackArguments FCA; | 2714 typedef FunctionCallbackArguments FCA; |
| 2714 | 2715 |
| 2715 STATIC_ASSERT(FCA::kContextSaveIndex == 6); | 2716 STATIC_ASSERT(FCA::kContextSaveIndex == 6); |
| 2716 STATIC_ASSERT(FCA::kCalleeIndex == 5); | 2717 STATIC_ASSERT(FCA::kCalleeIndex == 5); |
| 2717 STATIC_ASSERT(FCA::kDataIndex == 4); | 2718 STATIC_ASSERT(FCA::kDataIndex == 4); |
| 2718 STATIC_ASSERT(FCA::kReturnValueOffset == 3); | 2719 STATIC_ASSERT(FCA::kReturnValueOffset == 3); |
| 2719 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); | 2720 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); |
| 2720 STATIC_ASSERT(FCA::kIsolateIndex == 1); | 2721 STATIC_ASSERT(FCA::kIsolateIndex == 1); |
| 2721 STATIC_ASSERT(FCA::kHolderIndex == 0); | 2722 STATIC_ASSERT(FCA::kHolderIndex == 0); |
| 2722 STATIC_ASSERT(FCA::kNewTargetIndex == 7); | 2723 STATIC_ASSERT(FCA::kNewTargetIndex == 7); |
| 2723 STATIC_ASSERT(FCA::kArgsLength == 8); | 2724 STATIC_ASSERT(FCA::kArgsLength == 8); |
| 2724 | 2725 |
| 2725 // new target | 2726 // new target |
| 2726 __ PushRoot(Heap::kUndefinedValueRootIndex); | 2727 __ PushRoot(Heap::kUndefinedValueRootIndex); |
| 2727 | 2728 |
| 2728 // context save | 2729 // context save |
| 2729 __ push(context); | 2730 __ push(context); |
| 2730 if (!is_lazy()) { | |
| 2731 // load context from callee | |
| 2732 __ ldr(context, FieldMemOperand(callee, JSFunction::kContextOffset)); | |
| 2733 } | |
| 2734 | 2731 |
| 2735 // callee | 2732 // callee |
| 2736 __ push(callee); | 2733 __ push(callee); |
| 2737 | 2734 |
| 2738 // call data | 2735 // call data |
| 2739 __ push(call_data); | 2736 __ push(call_data); |
| 2740 | 2737 |
| 2741 Register scratch = call_data; | 2738 Register scratch = call_data; |
| 2742 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); | 2739 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); |
| 2743 // return value | 2740 // return value |
| 2744 __ push(scratch); | 2741 __ push(scratch); |
| 2745 // return value default | 2742 // return value default |
| 2746 __ push(scratch); | 2743 __ push(scratch); |
| 2747 // isolate | 2744 // isolate |
| 2748 __ mov(scratch, Operand(ExternalReference::isolate_address(masm->isolate()))); | 2745 __ mov(scratch, Operand(ExternalReference::isolate_address(masm->isolate()))); |
| 2749 __ push(scratch); | 2746 __ push(scratch); |
| 2750 // holder | 2747 // holder |
| 2751 __ push(holder); | 2748 __ push(holder); |
| 2752 | 2749 |
| 2750 // enter a new context |
| 2751 if (is_lazy()) { |
| 2752 // load context from accessor_holder |
| 2753 Register accessor_holder = context; |
| 2754 __ ldr(accessor_holder, |
| 2755 MemOperand(sp, (FCA::kArgsLength + 1 + argc()) * kPointerSize)); |
| 2756 __ ldr(scratch, FieldMemOperand(accessor_holder, HeapObject::kMapOffset)); |
| 2757 __ GetMapConstructor(scratch, scratch, context, callee); |
| 2758 __ ldr(context, FieldMemOperand(scratch, JSFunction::kContextOffset)); |
| 2759 } else { |
| 2760 // load context from callee |
| 2761 __ ldr(context, FieldMemOperand(callee, JSFunction::kContextOffset)); |
| 2762 } |
| 2763 |
| 2753 // Prepare arguments. | 2764 // Prepare arguments. |
| 2754 __ mov(scratch, sp); | 2765 __ mov(scratch, sp); |
| 2755 | 2766 |
| 2756 // Allocate the v8::Arguments structure in the arguments' space since | 2767 // Allocate the v8::Arguments structure in the arguments' space since |
| 2757 // it's not controlled by GC. | 2768 // it's not controlled by GC. |
| 2758 const int kApiStackSpace = 3; | 2769 const int kApiStackSpace = 3; |
| 2759 | 2770 |
| 2760 FrameScope frame_scope(masm, StackFrame::MANUAL); | 2771 FrameScope frame_scope(masm, StackFrame::MANUAL); |
| 2761 __ EnterExitFrame(false, kApiStackSpace); | 2772 __ EnterExitFrame(false, kApiStackSpace); |
| 2762 | 2773 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2780 MemOperand context_restore_operand( | 2791 MemOperand context_restore_operand( |
| 2781 fp, (2 + FCA::kContextSaveIndex) * kPointerSize); | 2792 fp, (2 + FCA::kContextSaveIndex) * kPointerSize); |
| 2782 // Stores return the first js argument | 2793 // Stores return the first js argument |
| 2783 int return_value_offset = 0; | 2794 int return_value_offset = 0; |
| 2784 if (is_store()) { | 2795 if (is_store()) { |
| 2785 return_value_offset = 2 + FCA::kArgsLength; | 2796 return_value_offset = 2 + FCA::kArgsLength; |
| 2786 } else { | 2797 } else { |
| 2787 return_value_offset = 2 + FCA::kReturnValueOffset; | 2798 return_value_offset = 2 + FCA::kReturnValueOffset; |
| 2788 } | 2799 } |
| 2789 MemOperand return_value_operand(fp, return_value_offset * kPointerSize); | 2800 MemOperand return_value_operand(fp, return_value_offset * kPointerSize); |
| 2790 int stack_space = 0; | 2801 const int stack_space = argc() + FCA::kArgsLength + 2; |
| 2791 MemOperand length_operand = MemOperand(sp, 3 * kPointerSize); | 2802 MemOperand* stack_space_operand = nullptr; |
| 2792 MemOperand* stack_space_operand = &length_operand; | |
| 2793 stack_space = argc() + FCA::kArgsLength + 1; | |
| 2794 stack_space_operand = NULL; | |
| 2795 | 2803 |
| 2796 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, stack_space, | 2804 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, stack_space, |
| 2797 stack_space_operand, return_value_operand, | 2805 stack_space_operand, return_value_operand, |
| 2798 &context_restore_operand); | 2806 &context_restore_operand); |
| 2799 } | 2807 } |
| 2800 | 2808 |
| 2801 | 2809 |
| 2802 void CallApiGetterStub::Generate(MacroAssembler* masm) { | 2810 void CallApiGetterStub::Generate(MacroAssembler* masm) { |
| 2803 // Build v8::PropertyCallbackInfo::args_ array on the stack and push property | 2811 // Build v8::PropertyCallbackInfo::args_ array on the stack and push property |
| 2804 // name below the exit frame to make GC aware of them. | 2812 // name below the exit frame to make GC aware of them. |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2859 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 2867 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
| 2860 kStackUnwindSpace, NULL, return_value_operand, NULL); | 2868 kStackUnwindSpace, NULL, return_value_operand, NULL); |
| 2861 } | 2869 } |
| 2862 | 2870 |
| 2863 #undef __ | 2871 #undef __ |
| 2864 | 2872 |
| 2865 } // namespace internal | 2873 } // namespace internal |
| 2866 } // namespace v8 | 2874 } // namespace v8 |
| 2867 | 2875 |
| 2868 #endif // V8_TARGET_ARCH_ARM | 2876 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |