| Index: src/arm/builtins-arm.cc
|
| ===================================================================
|
| --- src/arm/builtins-arm.cc (revision 3200)
|
| +++ src/arm/builtins-arm.cc (working copy)
|
| @@ -1029,44 +1029,24 @@
|
| __ push(r0);
|
| __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_JS);
|
|
|
| - Label no_preemption, retry_preemption;
|
| - __ bind(&retry_preemption);
|
| - ExternalReference stack_guard_limit_address =
|
| - ExternalReference::address_of_stack_guard_limit();
|
| - __ mov(r2, Operand(stack_guard_limit_address));
|
| - __ ldr(r2, MemOperand(r2));
|
| - __ cmp(sp, r2);
|
| - __ b(hi, &no_preemption);
|
| -
|
| - // We have encountered a preemption or stack overflow already before we push
|
| - // the array contents. Save r0 which is the Smi-tagged length of the array.
|
| - __ push(r0);
|
| -
|
| - // Runtime routines expect at least one argument, so give it a Smi.
|
| - __ mov(r0, Operand(Smi::FromInt(0)));
|
| - __ push(r0);
|
| - __ CallRuntime(Runtime::kStackGuard, 1);
|
| -
|
| - // Since we returned, it wasn't a stack overflow. Restore r0 and try again.
|
| - __ pop(r0);
|
| - __ b(&retry_preemption);
|
| -
|
| - __ bind(&no_preemption);
|
| -
|
| - // Eagerly check for stack-overflow before starting to push the arguments.
|
| - // r0: number of arguments.
|
| - // r2: stack limit.
|
| + // Check the stack for overflow. We are not trying need to catch
|
| + // interruptions (e.g. debug break and preemption) here, so the "real stack
|
| + // limit" is checked.
|
| Label okay;
|
| + __ LoadRoot(r2, Heap::kRealStackLimitRootIndex);
|
| + // Make r2 the space we have left. The stack might already be overflowed
|
| + // here which will cause r2 to become negative.
|
| __ sub(r2, sp, r2);
|
| -
|
| + // Check if the arguments will overflow the stack.
|
| __ cmp(r2, Operand(r0, LSL, kPointerSizeLog2 - kSmiTagSize));
|
| - __ b(hi, &okay);
|
| + __ b(gt, &okay); // Signed comparison.
|
|
|
| // Out of stack space.
|
| __ ldr(r1, MemOperand(fp, kFunctionOffset));
|
| __ push(r1);
|
| __ push(r0);
|
| __ InvokeBuiltin(Builtins::APPLY_OVERFLOW, CALL_JS);
|
| + // End of stack check.
|
|
|
| // Push current limit and index.
|
| __ bind(&okay);
|
|
|