Index: src/execution.cc |
=================================================================== |
--- src/execution.cc (revision 2717) |
+++ src/execution.cc (working copy) |
@@ -156,7 +156,8 @@ |
ASSERT(catcher.HasCaught()); |
ASSERT(Top::has_pending_exception()); |
ASSERT(Top::external_caught_exception()); |
- Top::optional_reschedule_exception(true); |
+ bool is_bottom_call = HandleScopeImplementer::instance()->CallDepthIsZero(); |
+ Top::OptionalRescheduleException(is_bottom_call, true); |
result = v8::Utils::OpenHandle(*catcher.Exception()); |
} |
@@ -328,6 +329,19 @@ |
} |
+bool StackGuard::IsTerminateExecution() { |
+ ExecutionAccess access; |
+ return thread_local_.interrupt_flags_ & TERMINATE; |
+} |
+ |
+ |
+void StackGuard::TerminateExecution() { |
+ ExecutionAccess access; |
+ thread_local_.interrupt_flags_ |= TERMINATE; |
+ set_limits(kInterruptLimit, access); |
+} |
+ |
+ |
#ifdef ENABLE_DEBUGGER_SUPPORT |
bool StackGuard::IsDebugBreak() { |
ExecutionAccess access; |
@@ -638,6 +652,10 @@ |
} |
#endif |
if (StackGuard::IsPreempted()) RuntimePreempt(); |
+ if (StackGuard::IsTerminateExecution()) { |
+ StackGuard::Continue(TERMINATE); |
+ return Top::TerminateExecution(); |
+ } |
if (StackGuard::IsInterrupted()) { |
// interrupt |
StackGuard::Continue(INTERRUPT); |