| Index: src/ia32/builtins-ia32.cc
|
| ===================================================================
|
| --- src/ia32/builtins-ia32.cc (revision 3148)
|
| +++ src/ia32/builtins-ia32.cc (working copy)
|
| @@ -520,48 +520,48 @@
|
| __ push(Operand(ebp, 2 * kPointerSize)); // push arguments
|
| __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_FUNCTION);
|
|
|
| - if (FLAG_check_stack) {
|
| - // We need to catch preemptions right here, otherwise an unlucky preemption
|
| - // could show up as a failed apply.
|
| - ExternalReference stack_guard_limit =
|
| - ExternalReference::address_of_stack_guard_limit();
|
| - Label retry_preemption;
|
| - Label no_preemption;
|
| - __ bind(&retry_preemption);
|
| - __ mov(edi, Operand::StaticVariable(stack_guard_limit));
|
| - __ cmp(esp, Operand(edi));
|
| - __ j(above, &no_preemption, taken);
|
| + // Check the stack for overflow or a break request.
|
| + // We need to catch preemptions right here, otherwise an unlucky preemption
|
| + // could show up as a failed apply.
|
| + ExternalReference stack_guard_limit =
|
| + ExternalReference::address_of_stack_guard_limit();
|
| + Label retry_preemption;
|
| + Label no_preemption;
|
| + __ bind(&retry_preemption);
|
| + __ mov(edi, Operand::StaticVariable(stack_guard_limit));
|
| + __ cmp(esp, Operand(edi));
|
| + __ j(above, &no_preemption, taken);
|
|
|
| - // Preemption!
|
| - // Because builtins always remove the receiver from the stack, we
|
| - // have to fake one to avoid underflowing the stack.
|
| - __ push(eax);
|
| - __ push(Immediate(Smi::FromInt(0)));
|
| + // Preemption!
|
| + // Because builtins always remove the receiver from the stack, we
|
| + // have to fake one to avoid underflowing the stack.
|
| + __ push(eax);
|
| + __ push(Immediate(Smi::FromInt(0)));
|
|
|
| - // Do call to runtime routine.
|
| - __ CallRuntime(Runtime::kStackGuard, 1);
|
| - __ pop(eax);
|
| - __ jmp(&retry_preemption);
|
| + // Do call to runtime routine.
|
| + __ CallRuntime(Runtime::kStackGuard, 1);
|
| + __ pop(eax);
|
| + __ jmp(&retry_preemption);
|
|
|
| - __ bind(&no_preemption);
|
| + __ bind(&no_preemption);
|
|
|
| - Label okay;
|
| - // Make ecx the space we have left.
|
| - __ mov(ecx, Operand(esp));
|
| - __ sub(ecx, Operand(edi));
|
| - // Make edx the space we need for the array when it is unrolled onto the
|
| - // stack.
|
| - __ mov(edx, Operand(eax));
|
| - __ shl(edx, kPointerSizeLog2 - kSmiTagSize);
|
| - __ cmp(ecx, Operand(edx));
|
| - __ j(greater, &okay, taken);
|
| + Label okay;
|
| + // Make ecx the space we have left.
|
| + __ mov(ecx, Operand(esp));
|
| + __ sub(ecx, Operand(edi));
|
| + // Make edx the space we need for the array when it is unrolled onto the
|
| + // stack.
|
| + __ mov(edx, Operand(eax));
|
| + __ shl(edx, kPointerSizeLog2 - kSmiTagSize);
|
| + __ cmp(ecx, Operand(edx));
|
| + __ j(greater, &okay, taken);
|
|
|
| - // Too bad: Out of stack space.
|
| - __ push(Operand(ebp, 4 * kPointerSize)); // push this
|
| - __ push(eax);
|
| - __ InvokeBuiltin(Builtins::APPLY_OVERFLOW, CALL_FUNCTION);
|
| - __ bind(&okay);
|
| - }
|
| + // Too bad: Out of stack space.
|
| + __ push(Operand(ebp, 4 * kPointerSize)); // push this
|
| + __ push(eax);
|
| + __ InvokeBuiltin(Builtins::APPLY_OVERFLOW, CALL_FUNCTION);
|
| + __ bind(&okay);
|
| + // End of stack check.
|
|
|
| // Push current index and limit.
|
| const int kLimitOffset =
|
|
|