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_X64 | 7 #if V8_TARGET_ARCH_X64 |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 2777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2788 | 2788 |
2789 // Push a copy of the function (found below the arguments) and resolve | 2789 // Push a copy of the function (found below the arguments) and resolve |
2790 // eval. | 2790 // eval. |
2791 __ Push(Operand(rsp, (arg_count + 1) * kPointerSize)); | 2791 __ Push(Operand(rsp, (arg_count + 1) * kPointerSize)); |
2792 EmitResolvePossiblyDirectEval(arg_count); | 2792 EmitResolvePossiblyDirectEval(arg_count); |
2793 | 2793 |
2794 // The runtime call returns a pair of values in rax (function) and | 2794 // The runtime call returns a pair of values in rax (function) and |
2795 // rdx (receiver). Touch up the stack with the right values. | 2795 // rdx (receiver). Touch up the stack with the right values. |
2796 __ movp(Operand(rsp, (arg_count + 0) * kPointerSize), rdx); | 2796 __ movp(Operand(rsp, (arg_count + 0) * kPointerSize), rdx); |
2797 __ movp(Operand(rsp, (arg_count + 1) * kPointerSize), rax); | 2797 __ movp(Operand(rsp, (arg_count + 1) * kPointerSize), rax); |
| 2798 |
| 2799 PrepareForBailoutForId(expr->EvalOrLookupId(), NO_REGISTERS); |
2798 } | 2800 } |
2799 // Record source position for debugger. | 2801 // Record source position for debugger. |
2800 SetSourcePosition(expr->position()); | 2802 SetSourcePosition(expr->position()); |
2801 CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS); | 2803 CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS); |
2802 __ movp(rdi, Operand(rsp, (arg_count + 1) * kPointerSize)); | 2804 __ movp(rdi, Operand(rsp, (arg_count + 1) * kPointerSize)); |
2803 __ CallStub(&stub); | 2805 __ CallStub(&stub); |
2804 RecordJSReturnSite(expr); | 2806 RecordJSReturnSite(expr); |
2805 // Restore context register. | 2807 // Restore context register. |
2806 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 2808 __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
2807 context()->DropAndPlug(1, rax); | 2809 context()->DropAndPlug(1, rax); |
(...skipping 11 matching lines...) Expand all Loading... |
2819 EmitDynamicLookupFastCase(proxy, NOT_INSIDE_TYPEOF, &slow, &done); | 2821 EmitDynamicLookupFastCase(proxy, NOT_INSIDE_TYPEOF, &slow, &done); |
2820 } | 2822 } |
2821 __ bind(&slow); | 2823 __ bind(&slow); |
2822 // Call the runtime to find the function to call (returned in rax) and | 2824 // Call the runtime to find the function to call (returned in rax) and |
2823 // the object holding it (returned in rdx). | 2825 // the object holding it (returned in rdx). |
2824 __ Push(context_register()); | 2826 __ Push(context_register()); |
2825 __ Push(proxy->name()); | 2827 __ Push(proxy->name()); |
2826 __ CallRuntime(Runtime::kLoadLookupSlot, 2); | 2828 __ CallRuntime(Runtime::kLoadLookupSlot, 2); |
2827 __ Push(rax); // Function. | 2829 __ Push(rax); // Function. |
2828 __ Push(rdx); // Receiver. | 2830 __ Push(rdx); // Receiver. |
| 2831 PrepareForBailoutForId(expr->EvalOrLookupId(), NO_REGISTERS); |
2829 | 2832 |
2830 // If fast case code has been generated, emit code to push the function | 2833 // If fast case code has been generated, emit code to push the function |
2831 // and receiver and have the slow path jump around this code. | 2834 // and receiver and have the slow path jump around this code. |
2832 if (done.is_linked()) { | 2835 if (done.is_linked()) { |
2833 Label call; | 2836 Label call; |
2834 __ jmp(&call, Label::kNear); | 2837 __ jmp(&call, Label::kNear); |
2835 __ bind(&done); | 2838 __ bind(&done); |
2836 // Push function. | 2839 // Push function. |
2837 __ Push(rax); | 2840 __ Push(rax); |
2838 // The receiver is implicitly the global receiver. Indicate this by | 2841 // The receiver is implicitly the global receiver. Indicate this by |
(...skipping 2124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4963 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 4966 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
4964 Assembler::target_address_at(call_target_address, | 4967 Assembler::target_address_at(call_target_address, |
4965 unoptimized_code)); | 4968 unoptimized_code)); |
4966 return OSR_AFTER_STACK_CHECK; | 4969 return OSR_AFTER_STACK_CHECK; |
4967 } | 4970 } |
4968 | 4971 |
4969 | 4972 |
4970 } } // namespace v8::internal | 4973 } } // namespace v8::internal |
4971 | 4974 |
4972 #endif // V8_TARGET_ARCH_X64 | 4975 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |