Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index 5d01664bacfb549d40eded6a4bb7b40887d344a2..b5bd955de5c868e1e83eab3450c0f3bca6a47ef7 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -1077,6 +1077,23 @@ Failure* Isolate::TerminateExecution() { |
} |
+void Isolate::CancelTerminateExecution() { |
+ if (try_catch_handler()) { |
+ try_catch_handler()->has_terminated_ = false; |
+ } |
+ if (has_pending_exception() && |
+ pending_exception() == heap_.termination_exception()) { |
+ thread_local_top()->external_caught_exception_ = false; |
+ clear_pending_exception(); |
+ } |
+ if (has_scheduled_exception() && |
+ scheduled_exception() == heap_.termination_exception()) { |
+ thread_local_top()->external_caught_exception_ = false; |
+ clear_scheduled_exception(); |
+ } |
+} |
+ |
+ |
Failure* Isolate::Throw(Object* exception, MessageLocation* location) { |
DoThrow(exception, location); |
return Failure::Exception(); |
@@ -1990,12 +2007,14 @@ void Isolate::PropagatePendingExceptionToExternalTryCatch() { |
} else if (thread_local_top_.pending_exception_ == |
heap()->termination_exception()) { |
try_catch_handler()->can_continue_ = false; |
+ try_catch_handler()->has_terminated_ = true; |
try_catch_handler()->exception_ = heap()->null_value(); |
} else { |
// At this point all non-object (failure) exceptions have |
// been dealt with so this shouldn't fail. |
ASSERT(!pending_exception()->IsFailure()); |
try_catch_handler()->can_continue_ = true; |
+ try_catch_handler()->has_terminated_ = false; |
try_catch_handler()->exception_ = pending_exception(); |
if (!thread_local_top_.pending_message_obj_->IsTheHole()) { |
try_catch_handler()->message_ = thread_local_top_.pending_message_obj_; |