OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_ARM64 | 5 #if V8_TARGET_ARCH_ARM64 |
6 | 6 |
7 #include "src/api-arguments.h" | 7 #include "src/api-arguments.h" |
8 #include "src/arm64/assembler-arm64-inl.h" | 8 #include "src/arm64/assembler-arm64-inl.h" |
9 #include "src/arm64/frames-arm64.h" | 9 #include "src/arm64/frames-arm64.h" |
10 #include "src/arm64/macro-assembler-arm64-inl.h" | 10 #include "src/arm64/macro-assembler-arm64-inl.h" |
(...skipping 2810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2821 __ Bind(&fast_elements_case); | 2821 __ Bind(&fast_elements_case); |
2822 GenerateCase(masm, FAST_ELEMENTS); | 2822 GenerateCase(masm, FAST_ELEMENTS); |
2823 } | 2823 } |
2824 | 2824 |
2825 // The number of register that CallApiFunctionAndReturn will need to save on | 2825 // The number of register that CallApiFunctionAndReturn will need to save on |
2826 // the stack. The space for these registers need to be allocated in the | 2826 // the stack. The space for these registers need to be allocated in the |
2827 // ExitFrame before calling CallApiFunctionAndReturn. | 2827 // ExitFrame before calling CallApiFunctionAndReturn. |
2828 static const int kCallApiFunctionSpillSpace = 4; | 2828 static const int kCallApiFunctionSpillSpace = 4; |
2829 | 2829 |
2830 | 2830 |
2831 static int AddressOffset(ExternalReference ref0, ExternalReference ref1) { | |
2832 return static_cast<int>(ref0.address() - ref1.address()); | |
2833 } | |
2834 | |
2835 | |
2836 // Calls an API function. Allocates HandleScope, extracts returned value | 2831 // Calls an API function. Allocates HandleScope, extracts returned value |
2837 // from handle and propagates exceptions. | 2832 // from handle and propagates exceptions. |
2838 // 'stack_space' is the space to be unwound on exit (includes the call JS | 2833 // 'stack_space' is the space to be unwound on exit (includes the call JS |
2839 // arguments space and the additional space allocated for the fast call). | 2834 // arguments space and the additional space allocated for the fast call). |
2840 // 'spill_offset' is the offset from the stack pointer where | 2835 // 'spill_offset' is the offset from the stack pointer where |
2841 // CallApiFunctionAndReturn can spill registers. | 2836 // CallApiFunctionAndReturn can spill registers. |
2842 static void CallApiFunctionAndReturn( | 2837 static void CallApiFunctionAndReturn( |
2843 MacroAssembler* masm, Register function_address, | 2838 MacroAssembler* masm, Register function_address, |
2844 ExternalReference thunk_ref, int stack_space, | 2839 ExternalReference thunk_ref, int stack_space, |
2845 MemOperand* stack_space_operand, int spill_offset, | 2840 MemOperand* stack_space_operand, int spill_offset, |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2955 } | 2950 } |
2956 | 2951 |
2957 __ LeaveExitFrame(false, x1, !restore_context); | 2952 __ LeaveExitFrame(false, x1, !restore_context); |
2958 | 2953 |
2959 // Check if the function scheduled an exception. | 2954 // Check if the function scheduled an exception. |
2960 __ Mov(x5, ExternalReference::scheduled_exception_address(isolate)); | 2955 __ Mov(x5, ExternalReference::scheduled_exception_address(isolate)); |
2961 __ Ldr(x5, MemOperand(x5)); | 2956 __ Ldr(x5, MemOperand(x5)); |
2962 __ JumpIfNotRoot(x5, Heap::kTheHoleValueRootIndex, | 2957 __ JumpIfNotRoot(x5, Heap::kTheHoleValueRootIndex, |
2963 &promote_scheduled_exception); | 2958 &promote_scheduled_exception); |
2964 | 2959 |
| 2960 // Check if the function returned a valid JavaScript value. |
| 2961 __ AssertApiCallResult(x0); |
| 2962 |
2965 if (stack_space_operand != NULL) { | 2963 if (stack_space_operand != NULL) { |
2966 __ Drop(x2, 1); | 2964 __ Drop(x2, 1); |
2967 } else { | 2965 } else { |
2968 __ Drop(stack_space); | 2966 __ Drop(stack_space); |
2969 } | 2967 } |
2970 __ Ret(); | 2968 __ Ret(); |
2971 | 2969 |
2972 // Re-throw by promoting a scheduled exception. | 2970 // Re-throw by promoting a scheduled exception. |
2973 __ Bind(&promote_scheduled_exception); | 2971 __ Bind(&promote_scheduled_exception); |
2974 __ TailCallRuntime(Runtime::kPromoteScheduledException); | 2972 __ TailCallRuntime(Runtime::kPromoteScheduledException); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3032 } | 3030 } |
3033 | 3031 |
3034 __ LoadRoot(call_data, Heap::kUndefinedValueRootIndex); | 3032 __ LoadRoot(call_data, Heap::kUndefinedValueRootIndex); |
3035 Register isolate_reg = x5; | 3033 Register isolate_reg = x5; |
3036 __ Mov(isolate_reg, ExternalReference::isolate_address(masm->isolate())); | 3034 __ Mov(isolate_reg, ExternalReference::isolate_address(masm->isolate())); |
3037 | 3035 |
3038 // FunctionCallbackArguments: | 3036 // FunctionCallbackArguments: |
3039 // return value, return value default, isolate, holder. | 3037 // return value, return value default, isolate, holder. |
3040 __ Push(call_data, call_data, isolate_reg, holder); | 3038 __ Push(call_data, call_data, isolate_reg, holder); |
3041 | 3039 |
| 3040 if (!is_store()) { |
| 3041 __ Mov(x0, argc()); |
| 3042 __ Jump(masm->isolate()->builtins()->CallFunctionCallback(), |
| 3043 RelocInfo::CODE_TARGET); |
| 3044 } |
| 3045 |
3042 // Prepare arguments. | 3046 // Prepare arguments. |
3043 Register args = x6; | 3047 Register args = x6; |
3044 __ Mov(args, masm->StackPointer()); | 3048 __ Mov(args, masm->StackPointer()); |
3045 | 3049 |
3046 // Allocate the v8::Arguments structure in the arguments' space, since it's | 3050 // Allocate the v8::Arguments structure in the arguments' space, since it's |
3047 // not controlled by GC. | 3051 // not controlled by GC. |
3048 const int kApiStackSpace = 3; | 3052 const int kApiStackSpace = 3; |
3049 | 3053 |
3050 // Allocate space for CallApiFunctionAndReturn can store some scratch | 3054 // Allocate space for CallApiFunctionAndReturn can store some scratch |
3051 // registeres on the stack. | 3055 // registeres on the stack. |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3161 kStackUnwindSpace, NULL, spill_offset, | 3165 kStackUnwindSpace, NULL, spill_offset, |
3162 return_value_operand, NULL); | 3166 return_value_operand, NULL); |
3163 } | 3167 } |
3164 | 3168 |
3165 #undef __ | 3169 #undef __ |
3166 | 3170 |
3167 } // namespace internal | 3171 } // namespace internal |
3168 } // namespace v8 | 3172 } // namespace v8 |
3169 | 3173 |
3170 #endif // V8_TARGET_ARCH_ARM64 | 3174 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |