| 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_X64 | 5 #if V8_TARGET_ARCH_X64 |
| 6 | 6 |
| 7 #include "src/api-arguments.h" | 7 #include "src/api-arguments.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 2632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2643 // -- rbx : call_data | 2643 // -- rbx : call_data |
| 2644 // -- rcx : holder | 2644 // -- rcx : holder |
| 2645 // -- rdx : api_function_address | 2645 // -- rdx : api_function_address |
| 2646 // -- rsi : context | 2646 // -- rsi : context |
| 2647 // -- rax : number of arguments if argc is a register | 2647 // -- rax : number of arguments if argc is a register |
| 2648 // -- rsp[0] : return address | 2648 // -- rsp[0] : return address |
| 2649 // -- rsp[8] : last argument | 2649 // -- rsp[8] : last argument |
| 2650 // -- ... | 2650 // -- ... |
| 2651 // -- rsp[argc * 8] : first argument | 2651 // -- rsp[argc * 8] : first argument |
| 2652 // -- rsp[(argc + 1) * 8] : receiver | 2652 // -- rsp[(argc + 1) * 8] : receiver |
| 2653 // -- rsp[(argc + 2) * 8] : accessor_holder |
| 2653 // ----------------------------------- | 2654 // ----------------------------------- |
| 2654 | 2655 |
| 2655 Register callee = rdi; | 2656 Register callee = rdi; |
| 2656 Register call_data = rbx; | 2657 Register call_data = rbx; |
| 2657 Register holder = rcx; | 2658 Register holder = rcx; |
| 2658 Register api_function_address = rdx; | 2659 Register api_function_address = rdx; |
| 2659 Register context = rsi; | 2660 Register context = rsi; |
| 2660 Register return_address = r8; | 2661 Register return_address = r8; |
| 2661 | 2662 |
| 2662 typedef FunctionCallbackArguments FCA; | 2663 typedef FunctionCallbackArguments FCA; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2689 __ PushRoot(Heap::kUndefinedValueRootIndex); | 2690 __ PushRoot(Heap::kUndefinedValueRootIndex); |
| 2690 // return value default | 2691 // return value default |
| 2691 __ PushRoot(Heap::kUndefinedValueRootIndex); | 2692 __ PushRoot(Heap::kUndefinedValueRootIndex); |
| 2692 // isolate | 2693 // isolate |
| 2693 Register scratch = call_data; | 2694 Register scratch = call_data; |
| 2694 __ Move(scratch, ExternalReference::isolate_address(masm->isolate())); | 2695 __ Move(scratch, ExternalReference::isolate_address(masm->isolate())); |
| 2695 __ Push(scratch); | 2696 __ Push(scratch); |
| 2696 // holder | 2697 // holder |
| 2697 __ Push(holder); | 2698 __ Push(holder); |
| 2698 | 2699 |
| 2700 // enter a new context |
| 2701 int argc = this->argc(); |
| 2702 if (this->is_lazy()) { |
| 2703 // load context from accessor_holder |
| 2704 Register accessor_holder = context; |
| 2705 __ movp(accessor_holder, |
| 2706 MemOperand(rsp, (argc + FCA::kArgsLength + 1) * kPointerSize)); |
| 2707 __ movp(scratch, FieldOperand(accessor_holder, HeapObject::kMapOffset)); |
| 2708 __ GetMapConstructor(scratch, scratch, context); |
| 2709 __ movp(context, FieldOperand(scratch, JSFunction::kContextOffset)); |
| 2710 } else { |
| 2711 // load context from callee |
| 2712 __ movp(context, FieldOperand(callee, JSFunction::kContextOffset)); |
| 2713 } |
| 2714 |
| 2699 __ movp(scratch, rsp); | 2715 __ movp(scratch, rsp); |
| 2700 // Push return address back on stack. | 2716 // Push return address back on stack. |
| 2701 __ PushReturnAddressFrom(return_address); | 2717 __ PushReturnAddressFrom(return_address); |
| 2702 | 2718 |
| 2703 if (!this->is_lazy()) { | |
| 2704 // load context from callee | |
| 2705 __ movp(context, FieldOperand(callee, JSFunction::kContextOffset)); | |
| 2706 } | |
| 2707 | |
| 2708 // Allocate the v8::Arguments structure in the arguments' space since | 2719 // Allocate the v8::Arguments structure in the arguments' space since |
| 2709 // it's not controlled by GC. | 2720 // it's not controlled by GC. |
| 2710 const int kApiStackSpace = 3; | 2721 const int kApiStackSpace = 3; |
| 2711 | 2722 |
| 2712 PrepareCallApiFunction(masm, kApiStackSpace); | 2723 PrepareCallApiFunction(masm, kApiStackSpace); |
| 2713 | 2724 |
| 2714 // FunctionCallbackInfo::implicit_args_. | 2725 // FunctionCallbackInfo::implicit_args_. |
| 2715 int argc = this->argc(); | |
| 2716 __ movp(StackSpaceOperand(0), scratch); | 2726 __ movp(StackSpaceOperand(0), scratch); |
| 2717 __ addp(scratch, Immediate((argc + FCA::kArgsLength - 1) * kPointerSize)); | 2727 __ addp(scratch, Immediate((argc + FCA::kArgsLength - 1) * kPointerSize)); |
| 2718 // FunctionCallbackInfo::values_. | 2728 // FunctionCallbackInfo::values_. |
| 2719 __ movp(StackSpaceOperand(1), scratch); | 2729 __ movp(StackSpaceOperand(1), scratch); |
| 2720 // FunctionCallbackInfo::length_. | 2730 // FunctionCallbackInfo::length_. |
| 2721 __ Set(StackSpaceOperand(2), argc); | 2731 __ Set(StackSpaceOperand(2), argc); |
| 2722 | 2732 |
| 2723 #if defined(__MINGW64__) || defined(_WIN64) | 2733 #if defined(__MINGW64__) || defined(_WIN64) |
| 2724 Register arguments_arg = rcx; | 2734 Register arguments_arg = rcx; |
| 2725 Register callback_arg = rdx; | 2735 Register callback_arg = rdx; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2736 __ leap(arguments_arg, StackSpaceOperand(0)); | 2746 __ leap(arguments_arg, StackSpaceOperand(0)); |
| 2737 | 2747 |
| 2738 ExternalReference thunk_ref = | 2748 ExternalReference thunk_ref = |
| 2739 ExternalReference::invoke_function_callback(masm->isolate()); | 2749 ExternalReference::invoke_function_callback(masm->isolate()); |
| 2740 | 2750 |
| 2741 // Accessor for FunctionCallbackInfo and first js arg. | 2751 // Accessor for FunctionCallbackInfo and first js arg. |
| 2742 StackArgumentsAccessor args_from_rbp(rbp, FCA::kArgsLength + 1, | 2752 StackArgumentsAccessor args_from_rbp(rbp, FCA::kArgsLength + 1, |
| 2743 ARGUMENTS_DONT_CONTAIN_RECEIVER); | 2753 ARGUMENTS_DONT_CONTAIN_RECEIVER); |
| 2744 Operand context_restore_operand = args_from_rbp.GetArgumentOperand( | 2754 Operand context_restore_operand = args_from_rbp.GetArgumentOperand( |
| 2745 FCA::kArgsLength - FCA::kContextSaveIndex); | 2755 FCA::kArgsLength - FCA::kContextSaveIndex); |
| 2746 Operand length_operand = StackSpaceOperand(2); | |
| 2747 Operand return_value_operand = args_from_rbp.GetArgumentOperand( | 2756 Operand return_value_operand = args_from_rbp.GetArgumentOperand( |
| 2748 this->is_store() ? 0 : FCA::kArgsLength - FCA::kReturnValueOffset); | 2757 this->is_store() ? 0 : FCA::kArgsLength - FCA::kReturnValueOffset); |
| 2749 int stack_space = 0; | 2758 const int stack_space = argc + FCA::kArgsLength + 2; |
| 2750 Operand* stack_space_operand = &length_operand; | 2759 Operand* stack_space_operand = nullptr; |
| 2751 stack_space = argc + FCA::kArgsLength + 1; | |
| 2752 stack_space_operand = nullptr; | |
| 2753 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, callback_arg, | 2760 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, callback_arg, |
| 2754 stack_space, stack_space_operand, | 2761 stack_space, stack_space_operand, |
| 2755 return_value_operand, &context_restore_operand); | 2762 return_value_operand, &context_restore_operand); |
| 2756 } | 2763 } |
| 2757 | 2764 |
| 2758 | 2765 |
| 2759 void CallApiGetterStub::Generate(MacroAssembler* masm) { | 2766 void CallApiGetterStub::Generate(MacroAssembler* masm) { |
| 2760 #if defined(__MINGW64__) || defined(_WIN64) | 2767 #if defined(__MINGW64__) || defined(_WIN64) |
| 2761 Register getter_arg = r8; | 2768 Register getter_arg = r8; |
| 2762 Register accessor_info_arg = rdx; | 2769 Register accessor_info_arg = rdx; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2835 kStackUnwindSpace, nullptr, return_value_operand, | 2842 kStackUnwindSpace, nullptr, return_value_operand, |
| 2836 NULL); | 2843 NULL); |
| 2837 } | 2844 } |
| 2838 | 2845 |
| 2839 #undef __ | 2846 #undef __ |
| 2840 | 2847 |
| 2841 } // namespace internal | 2848 } // namespace internal |
| 2842 } // namespace v8 | 2849 } // namespace v8 |
| 2843 | 2850 |
| 2844 #endif // V8_TARGET_ARCH_X64 | 2851 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |