| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
| 8 | 8 |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 4858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4869 __ mov(eax, edi); | 4869 __ mov(eax, edi); |
| 4870 __ jmp(&leave_exit_frame); | 4870 __ jmp(&leave_exit_frame); |
| 4871 } | 4871 } |
| 4872 | 4872 |
| 4873 | 4873 |
| 4874 static void CallApiFunctionStubHelper(MacroAssembler* masm, | 4874 static void CallApiFunctionStubHelper(MacroAssembler* masm, |
| 4875 const ParameterCount& argc, | 4875 const ParameterCount& argc, |
| 4876 bool return_first_arg, | 4876 bool return_first_arg, |
| 4877 bool call_data_undefined) { | 4877 bool call_data_undefined) { |
| 4878 // ----------- S t a t e ------------- | 4878 // ----------- S t a t e ------------- |
| 4879 // -- eax : callee | 4879 // -- edi : callee |
| 4880 // -- ebx : call_data | 4880 // -- ebx : call_data |
| 4881 // -- ecx : holder | 4881 // -- ecx : holder |
| 4882 // -- edx : api_function_address | 4882 // -- edx : api_function_address |
| 4883 // -- esi : context | 4883 // -- esi : context |
| 4884 // -- edi : number of arguments if argc is a register | 4884 // -- eax : number of arguments if argc is a register |
| 4885 // -- | 4885 // -- |
| 4886 // -- esp[0] : return address | 4886 // -- esp[0] : return address |
| 4887 // -- esp[4] : last argument | 4887 // -- esp[4] : last argument |
| 4888 // -- ... | 4888 // -- ... |
| 4889 // -- esp[argc * 4] : first argument | 4889 // -- esp[argc * 4] : first argument |
| 4890 // -- esp[(argc + 1) * 4] : receiver | 4890 // -- esp[(argc + 1) * 4] : receiver |
| 4891 // ----------------------------------- | 4891 // ----------------------------------- |
| 4892 | 4892 |
| 4893 Register callee = eax; | 4893 Register callee = edi; |
| 4894 Register call_data = ebx; | 4894 Register call_data = ebx; |
| 4895 Register holder = ecx; | 4895 Register holder = ecx; |
| 4896 Register api_function_address = edx; | 4896 Register api_function_address = edx; |
| 4897 Register context = esi; | 4897 Register context = esi; |
| 4898 Register return_address = eax; |
| 4898 | 4899 |
| 4899 typedef FunctionCallbackArguments FCA; | 4900 typedef FunctionCallbackArguments FCA; |
| 4900 | 4901 |
| 4901 STATIC_ASSERT(FCA::kContextSaveIndex == 6); | 4902 STATIC_ASSERT(FCA::kContextSaveIndex == 6); |
| 4902 STATIC_ASSERT(FCA::kCalleeIndex == 5); | 4903 STATIC_ASSERT(FCA::kCalleeIndex == 5); |
| 4903 STATIC_ASSERT(FCA::kDataIndex == 4); | 4904 STATIC_ASSERT(FCA::kDataIndex == 4); |
| 4904 STATIC_ASSERT(FCA::kReturnValueOffset == 3); | 4905 STATIC_ASSERT(FCA::kReturnValueOffset == 3); |
| 4905 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); | 4906 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); |
| 4906 STATIC_ASSERT(FCA::kIsolateIndex == 1); | 4907 STATIC_ASSERT(FCA::kIsolateIndex == 1); |
| 4907 STATIC_ASSERT(FCA::kHolderIndex == 0); | 4908 STATIC_ASSERT(FCA::kHolderIndex == 0); |
| 4908 STATIC_ASSERT(FCA::kArgsLength == 7); | 4909 STATIC_ASSERT(FCA::kArgsLength == 7); |
| 4909 | 4910 |
| 4910 DCHECK(argc.is_immediate() || edi.is(argc.reg())); | 4911 DCHECK(argc.is_immediate() || eax.is(argc.reg())); |
| 4911 | 4912 |
| 4912 // pop return address and save context | 4913 if (argc.is_immediate()) { |
| 4913 __ xchg(context, Operand(esp, 0)); | 4914 __ pop(return_address); |
| 4915 // context save. |
| 4916 __ push(context); |
| 4917 } else { |
| 4918 // pop return address and save context |
| 4919 __ xchg(context, Operand(esp, 0)); |
| 4920 return_address = context; |
| 4921 } |
| 4914 | 4922 |
| 4915 // callee | 4923 // callee |
| 4916 __ push(callee); | 4924 __ push(callee); |
| 4917 | 4925 |
| 4918 // call data | 4926 // call data |
| 4919 __ push(call_data); | 4927 __ push(call_data); |
| 4920 | 4928 |
| 4921 Register scratch = call_data; | 4929 Register scratch = call_data; |
| 4922 if (!call_data_undefined) { | 4930 if (!call_data_undefined) { |
| 4923 // return value | 4931 // return value |
| 4924 __ push(Immediate(masm->isolate()->factory()->undefined_value())); | 4932 __ push(Immediate(masm->isolate()->factory()->undefined_value())); |
| 4925 // return value default | 4933 // return value default |
| 4926 __ push(Immediate(masm->isolate()->factory()->undefined_value())); | 4934 __ push(Immediate(masm->isolate()->factory()->undefined_value())); |
| 4927 } else { | 4935 } else { |
| 4928 // return value | 4936 // return value |
| 4929 __ push(scratch); | 4937 __ push(scratch); |
| 4930 // return value default | 4938 // return value default |
| 4931 __ push(scratch); | 4939 __ push(scratch); |
| 4932 } | 4940 } |
| 4933 // isolate | 4941 // isolate |
| 4934 __ push(Immediate(reinterpret_cast<int>(masm->isolate()))); | 4942 __ push(Immediate(reinterpret_cast<int>(masm->isolate()))); |
| 4935 // holder | 4943 // holder |
| 4936 __ push(holder); | 4944 __ push(holder); |
| 4937 | 4945 |
| 4938 __ mov(scratch, esp); | 4946 __ mov(scratch, esp); |
| 4939 | 4947 |
| 4940 // push return address | 4948 // push return address |
| 4941 __ push(context); | 4949 __ push(return_address); |
| 4942 | 4950 |
| 4943 // load context from callee | 4951 // load context from callee |
| 4944 __ mov(context, FieldOperand(callee, JSFunction::kContextOffset)); | 4952 __ mov(context, FieldOperand(callee, JSFunction::kContextOffset)); |
| 4945 | 4953 |
| 4946 // API function gets reference to the v8::Arguments. If CPU profiler | 4954 // API function gets reference to the v8::Arguments. If CPU profiler |
| 4947 // is enabled wrapper function will be called and we need to pass | 4955 // is enabled wrapper function will be called and we need to pass |
| 4948 // address of the callback as additional parameter, always allocate | 4956 // address of the callback as additional parameter, always allocate |
| 4949 // space for it. | 4957 // space for it. |
| 4950 const int kApiArgc = 1 + 1; | 4958 const int kApiArgc = 1 + 1; |
| 4951 | 4959 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5004 stack_space_operand = nullptr; | 5012 stack_space_operand = nullptr; |
| 5005 } | 5013 } |
| 5006 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 5014 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
| 5007 ApiParameterOperand(1), stack_space, | 5015 ApiParameterOperand(1), stack_space, |
| 5008 stack_space_operand, return_value_operand, | 5016 stack_space_operand, return_value_operand, |
| 5009 &context_restore_operand); | 5017 &context_restore_operand); |
| 5010 } | 5018 } |
| 5011 | 5019 |
| 5012 | 5020 |
| 5013 void CallApiFunctionStub::Generate(MacroAssembler* masm) { | 5021 void CallApiFunctionStub::Generate(MacroAssembler* masm) { |
| 5014 // TODO(dcarney): make eax contain the function address. | |
| 5015 bool call_data_undefined = this->call_data_undefined(); | 5022 bool call_data_undefined = this->call_data_undefined(); |
| 5016 CallApiFunctionStubHelper(masm, ParameterCount(edi), false, | 5023 CallApiFunctionStubHelper(masm, ParameterCount(eax), false, |
| 5017 call_data_undefined); | 5024 call_data_undefined); |
| 5018 } | 5025 } |
| 5019 | 5026 |
| 5020 | 5027 |
| 5021 void CallApiAccessorStub::Generate(MacroAssembler* masm) { | 5028 void CallApiAccessorStub::Generate(MacroAssembler* masm) { |
| 5022 bool is_store = this->is_store(); | 5029 bool is_store = this->is_store(); |
| 5023 int argc = this->argc(); | 5030 int argc = this->argc(); |
| 5024 bool call_data_undefined = this->call_data_undefined(); | 5031 bool call_data_undefined = this->call_data_undefined(); |
| 5025 CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store, | 5032 CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store, |
| 5026 call_data_undefined); | 5033 call_data_undefined); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5062 ApiParameterOperand(2), kStackSpace, nullptr, | 5069 ApiParameterOperand(2), kStackSpace, nullptr, |
| 5063 Operand(ebp, 7 * kPointerSize), NULL); | 5070 Operand(ebp, 7 * kPointerSize), NULL); |
| 5064 } | 5071 } |
| 5065 | 5072 |
| 5066 | 5073 |
| 5067 #undef __ | 5074 #undef __ |
| 5068 | 5075 |
| 5069 } } // namespace v8::internal | 5076 } } // namespace v8::internal |
| 5070 | 5077 |
| 5071 #endif // V8_TARGET_ARCH_IA32 | 5078 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |