OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1837 JSObject* holder, | 1837 JSObject* holder, |
1838 AccessorInfo* callback) { | 1838 AccessorInfo* callback) { |
1839 // ----------- S t a t e ------------- | 1839 // ----------- S t a t e ------------- |
1840 // -- rax : receiver | 1840 // -- rax : receiver |
1841 // -- rcx : name | 1841 // -- rcx : name |
1842 // -- rsp[0] : return address | 1842 // -- rsp[0] : return address |
1843 // ----------------------------------- | 1843 // ----------------------------------- |
1844 Label miss; | 1844 Label miss; |
1845 | 1845 |
1846 Failure* failure = Failure::InternalError(); | 1846 Failure* failure = Failure::InternalError(); |
1847 bool success = GenerateLoadCallback(object, holder, rax, rcx, rbx, rdx, rdi, | 1847 bool success = GenerateLoadCallback(object, holder, rax, rcx, rdx, rbx, rdi, |
1848 callback, name, &miss, &failure); | 1848 callback, name, &miss, &failure); |
1849 if (!success) { | 1849 if (!success) { |
1850 miss.Unuse(); | 1850 miss.Unuse(); |
1851 return failure; | 1851 return failure; |
1852 } | 1852 } |
1853 | 1853 |
1854 __ bind(&miss); | 1854 __ bind(&miss); |
1855 GenerateLoadMiss(masm(), Code::LOAD_IC); | 1855 GenerateLoadMiss(masm(), Code::LOAD_IC); |
1856 | 1856 |
1857 // Return the generated code. | 1857 // Return the generated code. |
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2578 // Check that the receiver isn't a smi. | 2578 // Check that the receiver isn't a smi. |
2579 __ JumpIfSmi(receiver, miss); | 2579 __ JumpIfSmi(receiver, miss); |
2580 | 2580 |
2581 // Check that the maps haven't changed. | 2581 // Check that the maps haven't changed. |
2582 Register reg = | 2582 Register reg = |
2583 CheckPrototypes(object, receiver, holder, scratch1, | 2583 CheckPrototypes(object, receiver, holder, scratch1, |
2584 scratch2, scratch3, name, miss); | 2584 scratch2, scratch3, name, miss); |
2585 | 2585 |
2586 Handle<AccessorInfo> callback_handle(callback); | 2586 Handle<AccessorInfo> callback_handle(callback); |
2587 | 2587 |
2588 __ EnterInternalFrame(); | 2588 // Insert additional parameters into the stack frame above return address. |
2589 // Push the stack address where the list of arguments ends. | 2589 ASSERT(!scratch2.is(reg)); |
2590 __ movq(scratch2, rsp); | 2590 __ pop(scratch2); // Get return address to place it below. |
2591 __ subq(scratch2, Immediate(2 * kPointerSize)); | 2591 |
2592 __ push(scratch2); | |
2593 __ push(receiver); // receiver | 2592 __ push(receiver); // receiver |
| 2593 ASSERT(!scratch3.is(reg)); |
| 2594 __ movq(scratch3, rsp); |
2594 __ push(reg); // holder | 2595 __ push(reg); // holder |
2595 if (Heap::InNewSpace(callback_handle->data())) { | 2596 if (Heap::InNewSpace(callback_handle->data())) { |
2596 __ Move(scratch2, callback_handle); | 2597 __ Move(scratch1, callback_handle); |
2597 __ push(FieldOperand(scratch2, AccessorInfo::kDataOffset)); // data | 2598 __ push(FieldOperand(scratch1, AccessorInfo::kDataOffset)); // data |
2598 } else { | 2599 } else { |
2599 __ Push(Handle<Object>(callback_handle->data())); | 2600 __ Push(Handle<Object>(callback_handle->data())); |
2600 } | 2601 } |
| 2602 __ push(scratch3); |
2601 __ push(name_reg); // name | 2603 __ push(name_reg); // name |
2602 // Save a pointer to where we pushed the arguments pointer. | 2604 // Save a pointer to where we pushed the arguments pointer. |
2603 // This will be passed as the const AccessorInfo& to the C++ callback. | 2605 // This will be passed as the const AccessorInfo& to the C++ callback. |
2604 | 2606 |
2605 #ifdef _WIN64 | 2607 #ifdef _WIN64 |
2606 // Win64 uses first register--rcx--for returned value. | 2608 // Win64 uses first register--rcx--for returned value. |
2607 Register accessor_info_arg = r8; | 2609 Register accessor_info_arg = r8; |
2608 Register name_arg = rdx; | 2610 Register name_arg = rdx; |
2609 #else | 2611 #else |
2610 Register accessor_info_arg = rdx; // temporary, copied to rsi by the stub. | 2612 Register accessor_info_arg = rsi; |
2611 Register name_arg = rdi; | 2613 Register name_arg = rdi; |
2612 #endif | 2614 #endif |
2613 | 2615 |
2614 __ movq(accessor_info_arg, rsp); | 2616 ASSERT(!name_arg.is(scratch2)); |
2615 __ addq(accessor_info_arg, Immediate(4 * kPointerSize)); | |
2616 __ movq(name_arg, rsp); | 2617 __ movq(name_arg, rsp); |
| 2618 __ push(scratch2); // Restore return address. |
2617 | 2619 |
2618 // Do call through the api. | 2620 // Do call through the api. |
2619 ASSERT_EQ(5, ApiGetterEntryStub::kStackSpace); | |
2620 Address getter_address = v8::ToCData<Address>(callback->getter()); | 2621 Address getter_address = v8::ToCData<Address>(callback->getter()); |
2621 ApiFunction fun(getter_address); | 2622 ApiFunction fun(getter_address); |
2622 ApiGetterEntryStub stub(callback_handle, &fun); | 2623 |
2623 #ifdef _WIN64 | 2624 // 3 elements array for v8::Agruments::values_, handler for name and pointer |
2624 // We need to prepare a slot for result handle on stack and put | 2625 // to the values (it considered as smi in GC). |
2625 // a pointer to it into 1st arg register. | 2626 const int kStackSpace = 5; |
2626 __ push(Immediate(0)); | 2627 const int kApiArgc = 2; |
2627 __ movq(rcx, rsp); | 2628 |
2628 #endif | 2629 __ PrepareCallApiFunction(kStackSpace, kApiArgc); |
| 2630 |
| 2631 // The context register (rsi) has been saved in PrepareCallApiFunction and |
| 2632 // could be used to pass arguments. |
| 2633 __ lea(accessor_info_arg, Operand(name_arg, 1 * kPointerSize)); |
| 2634 |
2629 // Emitting a stub call may try to allocate (if the code is not | 2635 // Emitting a stub call may try to allocate (if the code is not |
2630 // already generated). Do not allow the assembler to perform a | 2636 // already generated). Do not allow the assembler to perform a |
2631 // garbage collection but instead return the allocation failure | 2637 // garbage collection but instead return the allocation failure |
2632 // object. | 2638 // object. |
2633 MaybeObject* result = masm()->TryCallStub(&stub); | 2639 MaybeObject* result = masm()->TryCallApiFunctionAndReturn(&fun); |
2634 if (result->IsFailure()) { | 2640 if (result->IsFailure()) { |
2635 *failure = Failure::cast(result); | 2641 *failure = Failure::cast(result); |
2636 return false; | 2642 return false; |
2637 } | 2643 } |
2638 #ifdef _WIN64 | |
2639 // Discard allocated slot. | |
2640 __ addq(rsp, Immediate(kPointerSize)); | |
2641 #endif | |
2642 __ LeaveInternalFrame(); | |
2643 | |
2644 __ ret(0); | |
2645 | |
2646 return true; | 2644 return true; |
2647 } | 2645 } |
2648 | 2646 |
2649 | 2647 |
2650 Register StubCompiler::CheckPrototypes(JSObject* object, | 2648 Register StubCompiler::CheckPrototypes(JSObject* object, |
2651 Register object_reg, | 2649 Register object_reg, |
2652 JSObject* holder, | 2650 JSObject* holder, |
2653 Register holder_reg, | 2651 Register holder_reg, |
2654 Register scratch1, | 2652 Register scratch1, |
2655 Register scratch2, | 2653 Register scratch2, |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2965 // Return the generated code. | 2963 // Return the generated code. |
2966 return GetCode(); | 2964 return GetCode(); |
2967 } | 2965 } |
2968 | 2966 |
2969 | 2967 |
2970 #undef __ | 2968 #undef __ |
2971 | 2969 |
2972 } } // namespace v8::internal | 2970 } } // namespace v8::internal |
2973 | 2971 |
2974 #endif // V8_TARGET_ARCH_X64 | 2972 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |