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/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 2780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2791 | 2791 |
2792 // Push a copy of the function (found below the arguments) and | 2792 // Push a copy of the function (found below the arguments) and |
2793 // resolve eval. | 2793 // resolve eval. |
2794 __ push(Operand(esp, (arg_count + 1) * kPointerSize)); | 2794 __ push(Operand(esp, (arg_count + 1) * kPointerSize)); |
2795 EmitResolvePossiblyDirectEval(arg_count); | 2795 EmitResolvePossiblyDirectEval(arg_count); |
2796 | 2796 |
2797 // The runtime call returns a pair of values in eax (function) and | 2797 // The runtime call returns a pair of values in eax (function) and |
2798 // edx (receiver). Touch up the stack with the right values. | 2798 // edx (receiver). Touch up the stack with the right values. |
2799 __ mov(Operand(esp, (arg_count + 0) * kPointerSize), edx); | 2799 __ mov(Operand(esp, (arg_count + 0) * kPointerSize), edx); |
2800 __ mov(Operand(esp, (arg_count + 1) * kPointerSize), eax); | 2800 __ mov(Operand(esp, (arg_count + 1) * kPointerSize), eax); |
| 2801 |
| 2802 PrepareForBailoutForId(expr->EvalOrLookupId(), NO_REGISTERS); |
2801 } | 2803 } |
2802 // Record source position for debugger. | 2804 // Record source position for debugger. |
2803 SetSourcePosition(expr->position()); | 2805 SetSourcePosition(expr->position()); |
2804 CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS); | 2806 CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS); |
2805 __ mov(edi, Operand(esp, (arg_count + 1) * kPointerSize)); | 2807 __ mov(edi, Operand(esp, (arg_count + 1) * kPointerSize)); |
2806 __ CallStub(&stub); | 2808 __ CallStub(&stub); |
2807 RecordJSReturnSite(expr); | 2809 RecordJSReturnSite(expr); |
2808 // Restore context register. | 2810 // Restore context register. |
2809 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); | 2811 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
2810 context()->DropAndPlug(1, eax); | 2812 context()->DropAndPlug(1, eax); |
(...skipping 11 matching lines...) Expand all Loading... |
2822 EmitDynamicLookupFastCase(proxy, NOT_INSIDE_TYPEOF, &slow, &done); | 2824 EmitDynamicLookupFastCase(proxy, NOT_INSIDE_TYPEOF, &slow, &done); |
2823 } | 2825 } |
2824 __ bind(&slow); | 2826 __ bind(&slow); |
2825 // Call the runtime to find the function to call (returned in eax) and | 2827 // Call the runtime to find the function to call (returned in eax) and |
2826 // the object holding it (returned in edx). | 2828 // the object holding it (returned in edx). |
2827 __ push(context_register()); | 2829 __ push(context_register()); |
2828 __ push(Immediate(proxy->name())); | 2830 __ push(Immediate(proxy->name())); |
2829 __ CallRuntime(Runtime::kLoadLookupSlot, 2); | 2831 __ CallRuntime(Runtime::kLoadLookupSlot, 2); |
2830 __ push(eax); // Function. | 2832 __ push(eax); // Function. |
2831 __ push(edx); // Receiver. | 2833 __ push(edx); // Receiver. |
| 2834 PrepareForBailoutForId(expr->EvalOrLookupId(), NO_REGISTERS); |
2832 | 2835 |
2833 // If fast case code has been generated, emit code to push the function | 2836 // If fast case code has been generated, emit code to push the function |
2834 // and receiver and have the slow path jump around this code. | 2837 // and receiver and have the slow path jump around this code. |
2835 if (done.is_linked()) { | 2838 if (done.is_linked()) { |
2836 Label call; | 2839 Label call; |
2837 __ jmp(&call, Label::kNear); | 2840 __ jmp(&call, Label::kNear); |
2838 __ bind(&done); | 2841 __ bind(&done); |
2839 // Push function. | 2842 // Push function. |
2840 __ push(eax); | 2843 __ push(eax); |
2841 // The receiver is implicitly the global receiver. Indicate this by | 2844 // The receiver is implicitly the global receiver. Indicate this by |
(...skipping 2109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4951 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 4954 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
4952 Assembler::target_address_at(call_target_address, | 4955 Assembler::target_address_at(call_target_address, |
4953 unoptimized_code)); | 4956 unoptimized_code)); |
4954 return OSR_AFTER_STACK_CHECK; | 4957 return OSR_AFTER_STACK_CHECK; |
4955 } | 4958 } |
4956 | 4959 |
4957 | 4960 |
4958 } } // namespace v8::internal | 4961 } } // namespace v8::internal |
4959 | 4962 |
4960 #endif // V8_TARGET_ARCH_IA32 | 4963 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |