| Index: src/arm/codegen-arm.cc | 
| =================================================================== | 
| --- src/arm/codegen-arm.cc	(revision 2717) | 
| +++ src/arm/codegen-arm.cc	(working copy) | 
| @@ -5701,7 +5701,8 @@ | 
| } | 
|  | 
|  | 
| -void CEntryStub::GenerateThrowOutOfMemory(MacroAssembler* masm) { | 
| +void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm, | 
| +                                          UncatchableExceptionType type) { | 
| // Adjust this code if not the case. | 
| ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize); | 
|  | 
| @@ -5725,20 +5726,22 @@ | 
|  | 
| // Set the top handler address to next handler past the current ENTRY handler. | 
| ASSERT(StackHandlerConstants::kNextOffset == 0); | 
| -  __ pop(r0); | 
| -  __ str(r0, MemOperand(r3)); | 
| +  __ pop(r2); | 
| +  __ str(r2, MemOperand(r3)); | 
|  | 
| -  // Set external caught exception to false. | 
| -  ExternalReference external_caught(Top::k_external_caught_exception_address); | 
| -  __ mov(r0, Operand(false)); | 
| -  __ mov(r2, Operand(external_caught)); | 
| -  __ str(r0, MemOperand(r2)); | 
| +  if (type == OUT_OF_MEMORY) { | 
| +    // Set external caught exception to false. | 
| +    ExternalReference external_caught(Top::k_external_caught_exception_address); | 
| +    __ mov(r0, Operand(false)); | 
| +    __ mov(r2, Operand(external_caught)); | 
| +    __ str(r0, MemOperand(r2)); | 
|  | 
| -  // Set pending exception and r0 to out of memory exception. | 
| -  Failure* out_of_memory = Failure::OutOfMemoryException(); | 
| -  __ mov(r0, Operand(reinterpret_cast<int32_t>(out_of_memory))); | 
| -  __ mov(r2, Operand(ExternalReference(Top::k_pending_exception_address))); | 
| -  __ str(r0, MemOperand(r2)); | 
| +    // Set pending exception and r0 to out of memory exception. | 
| +    Failure* out_of_memory = Failure::OutOfMemoryException(); | 
| +    __ mov(r0, Operand(reinterpret_cast<int32_t>(out_of_memory))); | 
| +    __ mov(r2, Operand(ExternalReference(Top::k_pending_exception_address))); | 
| +    __ str(r0, MemOperand(r2)); | 
| +  } | 
|  | 
| // Stack layout at this point. See also StackHandlerConstants. | 
| // sp ->   state (ENTRY) | 
| @@ -5768,6 +5771,7 @@ | 
|  | 
| void CEntryStub::GenerateCore(MacroAssembler* masm, | 
| Label* throw_normal_exception, | 
| +                              Label* throw_termination_exception, | 
| Label* throw_out_of_memory_exception, | 
| StackFrame::Type frame_type, | 
| bool do_gc, | 
| @@ -5838,10 +5842,10 @@ | 
| __ tst(r0, Operand(((1 << kFailureTypeTagSize) - 1) << kFailureTagSize)); | 
| __ b(eq, &retry); | 
|  | 
| -  Label continue_exception; | 
| -  // If the returned failure is EXCEPTION then promote Top::pending_exception(). | 
| -  __ cmp(r0, Operand(reinterpret_cast<int32_t>(Failure::Exception()))); | 
| -  __ b(ne, &continue_exception); | 
| +  // Special handling of out of memory exceptions. | 
| +  Failure* out_of_memory = Failure::OutOfMemoryException(); | 
| +  __ cmp(r0, Operand(reinterpret_cast<int32_t>(out_of_memory))); | 
| +  __ b(eq, throw_out_of_memory_exception); | 
|  | 
| // Retrieve the pending exception and clear the variable. | 
| __ mov(ip, Operand(ExternalReference::the_hole_value_location())); | 
| @@ -5850,11 +5854,10 @@ | 
| __ ldr(r0, MemOperand(ip)); | 
| __ str(r3, MemOperand(ip)); | 
|  | 
| -  __ bind(&continue_exception); | 
| -  // Special handling of out of memory exception. | 
| -  Failure* out_of_memory = Failure::OutOfMemoryException(); | 
| -  __ cmp(r0, Operand(reinterpret_cast<int32_t>(out_of_memory))); | 
| -  __ b(eq, throw_out_of_memory_exception); | 
| +  // Special handling of termination exceptions which are uncatchable | 
| +  // by javascript code. | 
| +  __ cmp(r0, Operand(Factory::termination_exception())); | 
| +  __ b(eq, throw_termination_exception); | 
|  | 
| // Handle normal exception. | 
| __ jmp(throw_normal_exception); | 
| @@ -5887,11 +5890,14 @@ | 
| // r5: pointer to builtin function (C callee-saved) | 
| // r6: pointer to first argument (C callee-saved) | 
|  | 
| +  Label throw_normal_exception; | 
| +  Label throw_termination_exception; | 
| Label throw_out_of_memory_exception; | 
| -  Label throw_normal_exception; | 
|  | 
| // Call into the runtime system. | 
| -  GenerateCore(masm, &throw_normal_exception, | 
| +  GenerateCore(masm, | 
| +               &throw_normal_exception, | 
| +               &throw_termination_exception, | 
| &throw_out_of_memory_exception, | 
| frame_type, | 
| false, | 
| @@ -5900,6 +5906,7 @@ | 
| // Do space-specific GC and retry runtime call. | 
| GenerateCore(masm, | 
| &throw_normal_exception, | 
| +               &throw_termination_exception, | 
| &throw_out_of_memory_exception, | 
| frame_type, | 
| true, | 
| @@ -5910,15 +5917,18 @@ | 
| __ mov(r0, Operand(reinterpret_cast<int32_t>(failure))); | 
| GenerateCore(masm, | 
| &throw_normal_exception, | 
| +               &throw_termination_exception, | 
| &throw_out_of_memory_exception, | 
| frame_type, | 
| true, | 
| true); | 
|  | 
| __ bind(&throw_out_of_memory_exception); | 
| -  GenerateThrowOutOfMemory(masm); | 
| -  // control flow for generated will not return. | 
| +  GenerateThrowUncatchable(masm, OUT_OF_MEMORY); | 
|  | 
| +  __ bind(&throw_termination_exception); | 
| +  GenerateThrowUncatchable(masm, TERMINATION); | 
| + | 
| __ bind(&throw_normal_exception); | 
| GenerateThrowTOS(masm); | 
| } | 
|  |