Author: [EMAIL PROTECTED] Date: Fri Sep 26 05:11:35 2008 New Revision: 385
Modified: branches/bleeding_edge/src/builtins-ia32.cc Log: Fix stack check wraparound problem for ARM simulator. Review URL: http://codereview.chromium.org/2926 Modified: branches/bleeding_edge/src/builtins-ia32.cc ============================================================================== --- branches/bleeding_edge/src/builtins-ia32.cc (original) +++ branches/bleeding_edge/src/builtins-ia32.cc Fri Sep 26 05:11:35 2008 @@ -515,17 +515,40 @@ __ push(Operand(ebp, 2 * kPointerSize)); // push arguments __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_FUNCTION); - // Eagerly check for stack-overflow before pushing all the arguments - // to the stack. 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); + + // 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); + + __ bind(&no_preemption); + Label okay; - __ lea(ecx, Operand(esp, -3 * kPointerSize)); // receiver, limit, index + // 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); - __ sub(ecx, Operand(edx)); - ExternalReference stack_guard_limit_address = - ExternalReference::address_of_stack_guard_limit(); - __ cmp(ecx, Operand::StaticVariable(stack_guard_limit_address)); + __ cmp(ecx, Operand(edx)); __ j(greater, &okay, taken); // Too bad: Out of stack space. --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list v8-dev@googlegroups.com http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---