OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 4791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4802 __ bind(&skip); | 4802 __ bind(&skip); |
4803 | 4803 |
4804 __ ret(0); | 4804 __ ret(0); |
4805 } | 4805 } |
4806 | 4806 |
4807 | 4807 |
4808 void CEntryStub::GenerateCore(MacroAssembler* masm, | 4808 void CEntryStub::GenerateCore(MacroAssembler* masm, |
4809 Label* throw_normal_exception, | 4809 Label* throw_normal_exception, |
4810 Label* throw_out_of_memory_exception, | 4810 Label* throw_out_of_memory_exception, |
4811 StackFrame::Type frame_type, | 4811 StackFrame::Type frame_type, |
4812 bool do_gc) { | 4812 bool do_gc, |
| 4813 bool always_allocate_scope) { |
4813 // eax: result parameter for PerformGC, if any | 4814 // eax: result parameter for PerformGC, if any |
4814 // ebx: pointer to C function (C callee-saved) | 4815 // ebx: pointer to C function (C callee-saved) |
4815 // ebp: frame pointer (restored after C call) | 4816 // ebp: frame pointer (restored after C call) |
4816 // esp: stack pointer (restored after C call) | 4817 // esp: stack pointer (restored after C call) |
4817 // edi: number of arguments including receiver (C callee-saved) | 4818 // edi: number of arguments including receiver (C callee-saved) |
4818 // esi: pointer to the first argument (C callee-saved) | 4819 // esi: pointer to the first argument (C callee-saved) |
4819 | 4820 |
4820 if (do_gc) { | 4821 if (do_gc) { |
4821 __ mov(Operand(esp, 0 * kPointerSize), eax); // Result. | 4822 __ mov(Operand(esp, 0 * kPointerSize), eax); // Result. |
4822 __ call(FUNCTION_ADDR(Runtime::PerformGC), RelocInfo::RUNTIME_ENTRY); | 4823 __ call(FUNCTION_ADDR(Runtime::PerformGC), RelocInfo::RUNTIME_ENTRY); |
4823 } | 4824 } |
4824 | 4825 |
| 4826 ExternalReference scope_depth = |
| 4827 ExternalReference::heap_always_allocate_scope_depth(); |
| 4828 if (always_allocate_scope) { |
| 4829 __ inc(Operand::StaticVariable(scope_depth)); |
| 4830 } |
| 4831 |
4825 // Call C function. | 4832 // Call C function. |
4826 __ mov(Operand(esp, 0 * kPointerSize), edi); // argc. | 4833 __ mov(Operand(esp, 0 * kPointerSize), edi); // argc. |
4827 __ mov(Operand(esp, 1 * kPointerSize), esi); // argv. | 4834 __ mov(Operand(esp, 1 * kPointerSize), esi); // argv. |
4828 __ call(Operand(ebx)); | 4835 __ call(Operand(ebx)); |
4829 // Result is in eax or edx:eax - do not destroy these registers! | 4836 // Result is in eax or edx:eax - do not destroy these registers! |
4830 | 4837 |
| 4838 if (always_allocate_scope) { |
| 4839 __ dec(Operand::StaticVariable(scope_depth)); |
| 4840 } |
| 4841 |
4831 // Check for failure result. | 4842 // Check for failure result. |
4832 Label failure_returned; | 4843 Label failure_returned; |
4833 ASSERT(((kFailureTag + 1) & kFailureTagMask) == 0); | 4844 ASSERT(((kFailureTag + 1) & kFailureTagMask) == 0); |
4834 __ lea(ecx, Operand(eax, 1)); | 4845 __ lea(ecx, Operand(eax, 1)); |
4835 // Lower 2 bits of ecx are 0 iff eax has failure tag. | 4846 // Lower 2 bits of ecx are 0 iff eax has failure tag. |
4836 __ test(ecx, Immediate(kFailureTagMask)); | 4847 __ test(ecx, Immediate(kFailureTagMask)); |
4837 __ j(zero, &failure_returned, not_taken); | 4848 __ j(zero, &failure_returned, not_taken); |
4838 | 4849 |
4839 // Exit the JavaScript to C++ exit frame. | 4850 // Exit the JavaScript to C++ exit frame. |
4840 __ LeaveExitFrame(frame_type); | 4851 __ LeaveExitFrame(frame_type); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4956 | 4967 |
4957 // Call into the runtime system. Collect garbage before the call if | 4968 // Call into the runtime system. Collect garbage before the call if |
4958 // running with --gc-greedy set. | 4969 // running with --gc-greedy set. |
4959 if (FLAG_gc_greedy) { | 4970 if (FLAG_gc_greedy) { |
4960 Failure* failure = Failure::RetryAfterGC(0); | 4971 Failure* failure = Failure::RetryAfterGC(0); |
4961 __ mov(Operand(eax), Immediate(reinterpret_cast<int32_t>(failure))); | 4972 __ mov(Operand(eax), Immediate(reinterpret_cast<int32_t>(failure))); |
4962 } | 4973 } |
4963 GenerateCore(masm, &throw_normal_exception, | 4974 GenerateCore(masm, &throw_normal_exception, |
4964 &throw_out_of_memory_exception, | 4975 &throw_out_of_memory_exception, |
4965 frame_type, | 4976 frame_type, |
4966 FLAG_gc_greedy); | 4977 FLAG_gc_greedy, |
| 4978 false); |
4967 | 4979 |
4968 // Do space-specific GC and retry runtime call. | 4980 // Do space-specific GC and retry runtime call. |
4969 GenerateCore(masm, | 4981 GenerateCore(masm, |
4970 &throw_normal_exception, | 4982 &throw_normal_exception, |
4971 &throw_out_of_memory_exception, | 4983 &throw_out_of_memory_exception, |
4972 frame_type, | 4984 frame_type, |
4973 true); | 4985 true, |
| 4986 false); |
4974 | 4987 |
4975 // Do full GC and retry runtime call one final time. | 4988 // Do full GC and retry runtime call one final time. |
4976 Failure* failure = Failure::InternalError(); | 4989 Failure* failure = Failure::InternalError(); |
4977 __ mov(Operand(eax), Immediate(reinterpret_cast<int32_t>(failure))); | 4990 __ mov(Operand(eax), Immediate(reinterpret_cast<int32_t>(failure))); |
4978 GenerateCore(masm, | 4991 GenerateCore(masm, |
4979 &throw_normal_exception, | 4992 &throw_normal_exception, |
4980 &throw_out_of_memory_exception, | 4993 &throw_out_of_memory_exception, |
4981 frame_type, | 4994 frame_type, |
| 4995 true, |
4982 true); | 4996 true); |
4983 | 4997 |
4984 __ bind(&throw_out_of_memory_exception); | 4998 __ bind(&throw_out_of_memory_exception); |
4985 GenerateThrowOutOfMemory(masm); | 4999 GenerateThrowOutOfMemory(masm); |
4986 // control flow for generated will not return. | 5000 // control flow for generated will not return. |
4987 | 5001 |
4988 __ bind(&throw_normal_exception); | 5002 __ bind(&throw_normal_exception); |
4989 GenerateThrowTOS(masm); | 5003 GenerateThrowTOS(masm); |
4990 } | 5004 } |
4991 | 5005 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5120 | 5134 |
5121 // Slow-case: Go through the JavaScript implementation. | 5135 // Slow-case: Go through the JavaScript implementation. |
5122 __ bind(&slow); | 5136 __ bind(&slow); |
5123 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); | 5137 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); |
5124 } | 5138 } |
5125 | 5139 |
5126 | 5140 |
5127 #undef __ | 5141 #undef __ |
5128 | 5142 |
5129 } } // namespace v8::internal | 5143 } } // namespace v8::internal |
OLD | NEW |