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