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 2744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2755 void CallApiCallbackStub::Generate(MacroAssembler* masm) { | 2755 void CallApiCallbackStub::Generate(MacroAssembler* masm) { |
2756 // ----------- S t a t e ------------- | 2756 // ----------- S t a t e ------------- |
2757 // -- r0 : callee | 2757 // -- r0 : callee |
2758 // -- r4 : call_data | 2758 // -- r4 : call_data |
2759 // -- r2 : holder | 2759 // -- r2 : holder |
2760 // -- r1 : api_function_address | 2760 // -- r1 : api_function_address |
2761 // -- cp : context | 2761 // -- cp : context |
2762 // -- | 2762 // -- |
2763 // -- sp[0] : last argument | 2763 // -- sp[0] : last argument |
2764 // -- ... | 2764 // -- ... |
2765 // -- sp[(argc - 1)* 4] : first argument | 2765 // -- sp[(argc - 1) * 4] : first argument |
2766 // -- sp[argc * 4] : receiver | 2766 // -- sp[argc * 4] : receiver |
| 2767 // -- sp[(argc + 1) * 4] : accessor_holder |
2767 // ----------------------------------- | 2768 // ----------------------------------- |
2768 | 2769 |
2769 Register callee = r0; | 2770 Register callee = r0; |
2770 Register call_data = r4; | 2771 Register call_data = r4; |
2771 Register holder = r2; | 2772 Register holder = r2; |
2772 Register api_function_address = r1; | 2773 Register api_function_address = r1; |
2773 Register context = cp; | 2774 Register context = cp; |
2774 | 2775 |
2775 typedef FunctionCallbackArguments FCA; | 2776 typedef FunctionCallbackArguments FCA; |
2776 | 2777 |
2777 STATIC_ASSERT(FCA::kContextSaveIndex == 6); | 2778 STATIC_ASSERT(FCA::kContextSaveIndex == 6); |
2778 STATIC_ASSERT(FCA::kCalleeIndex == 5); | 2779 STATIC_ASSERT(FCA::kCalleeIndex == 5); |
2779 STATIC_ASSERT(FCA::kDataIndex == 4); | 2780 STATIC_ASSERT(FCA::kDataIndex == 4); |
2780 STATIC_ASSERT(FCA::kReturnValueOffset == 3); | 2781 STATIC_ASSERT(FCA::kReturnValueOffset == 3); |
2781 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); | 2782 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); |
2782 STATIC_ASSERT(FCA::kIsolateIndex == 1); | 2783 STATIC_ASSERT(FCA::kIsolateIndex == 1); |
2783 STATIC_ASSERT(FCA::kHolderIndex == 0); | 2784 STATIC_ASSERT(FCA::kHolderIndex == 0); |
2784 STATIC_ASSERT(FCA::kNewTargetIndex == 7); | 2785 STATIC_ASSERT(FCA::kNewTargetIndex == 7); |
2785 STATIC_ASSERT(FCA::kArgsLength == 8); | 2786 STATIC_ASSERT(FCA::kArgsLength == 8); |
2786 | 2787 |
2787 // new target | 2788 // new target |
2788 __ PushRoot(Heap::kUndefinedValueRootIndex); | 2789 __ PushRoot(Heap::kUndefinedValueRootIndex); |
2789 | 2790 |
2790 // context save | 2791 // context save |
2791 __ push(context); | 2792 __ push(context); |
2792 if (!is_lazy()) { | |
2793 // load context from callee | |
2794 __ ldr(context, FieldMemOperand(callee, JSFunction::kContextOffset)); | |
2795 } | |
2796 | 2793 |
2797 // callee | 2794 // callee |
2798 __ push(callee); | 2795 __ push(callee); |
2799 | 2796 |
2800 // call data | 2797 // call data |
2801 __ push(call_data); | 2798 __ push(call_data); |
2802 | 2799 |
2803 Register scratch = call_data; | 2800 Register scratch = call_data; |
2804 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); | 2801 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); |
2805 // return value | 2802 // return value |
2806 __ push(scratch); | 2803 __ push(scratch); |
2807 // return value default | 2804 // return value default |
2808 __ push(scratch); | 2805 __ push(scratch); |
2809 // isolate | 2806 // isolate |
2810 __ mov(scratch, Operand(ExternalReference::isolate_address(masm->isolate()))); | 2807 __ mov(scratch, Operand(ExternalReference::isolate_address(masm->isolate()))); |
2811 __ push(scratch); | 2808 __ push(scratch); |
2812 // holder | 2809 // holder |
2813 __ push(holder); | 2810 __ push(holder); |
2814 | 2811 |
| 2812 // enter a new context |
| 2813 if (is_lazy()) { |
| 2814 // load context from accessor_holder |
| 2815 Register accessor_holder = context; |
| 2816 __ ldr(accessor_holder, |
| 2817 MemOperand(sp, (FCA::kArgsLength + 1 argc()) * kPointerSize)); |
| 2818 __ ldr(scratch, FieldMemOperand(accessor_holder, HeapObject::kMapOffset)); |
| 2819 __ GetMapConstructor(scratch, scratch, context, callee); |
| 2820 __ ldr(context, FieldMemOperand(scratch, JSFunction::kContextOffset)); |
| 2821 } else { |
| 2822 // load context from callee |
| 2823 __ ldr(context, FieldMemOperand(callee, JSFunction::kContextOffset)); |
| 2824 } |
| 2825 |
2815 // Prepare arguments. | 2826 // Prepare arguments. |
2816 __ mov(scratch, sp); | 2827 __ mov(scratch, sp); |
2817 | 2828 |
2818 // Allocate the v8::Arguments structure in the arguments' space since | 2829 // Allocate the v8::Arguments structure in the arguments' space since |
2819 // it's not controlled by GC. | 2830 // it's not controlled by GC. |
2820 const int kApiStackSpace = 3; | 2831 const int kApiStackSpace = 3; |
2821 | 2832 |
2822 FrameScope frame_scope(masm, StackFrame::MANUAL); | 2833 FrameScope frame_scope(masm, StackFrame::MANUAL); |
2823 __ EnterExitFrame(false, kApiStackSpace); | 2834 __ EnterExitFrame(false, kApiStackSpace); |
2824 | 2835 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2921 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 2932 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
2922 kStackUnwindSpace, NULL, return_value_operand, NULL); | 2933 kStackUnwindSpace, NULL, return_value_operand, NULL); |
2923 } | 2934 } |
2924 | 2935 |
2925 #undef __ | 2936 #undef __ |
2926 | 2937 |
2927 } // namespace internal | 2938 } // namespace internal |
2928 } // namespace v8 | 2939 } // namespace v8 |
2929 | 2940 |
2930 #endif // V8_TARGET_ARCH_ARM | 2941 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |