Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index 3542b994ff3338ffd3860b763f49b4730dfe6d54..2ae9b4d59e7ebe436ac6f3322a94aac50e835567 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -1154,10 +1154,11 @@ bool Isolate::IsExternallyCaught() { |
return false; |
} |
- if (!is_catchable_by_javascript(pending_exception())) { |
- return true; |
- } |
+ return true; |
+} |
+ |
+bool Isolate::IsFinallyOnTop() { |
// Get the address of the external handler so we can compare the address to |
// determine which one is closer to the top of the stack. |
Address external_handler_address = |
@@ -1177,18 +1178,18 @@ bool Isolate::IsExternallyCaught() { |
StackHandler::FromAddress(Isolate::handler(thread_local_top())); |
while (handler != NULL && handler->address() < external_handler_address) { |
ASSERT(!handler->is_catch()); |
- if (handler->is_finally()) return false; |
+ if (handler->is_finally()) return true; |
handler = handler->next(); |
} |
- return true; |
+ return false; |
} |
void Isolate::ReportPendingMessages() { |
ASSERT(has_pending_exception()); |
- PropagatePendingExceptionToExternalTryCatch(); |
+ bool canClearMessage = PropagatePendingExceptionToExternalTryCatch(); |
HandleScope scope(this); |
if (thread_local_top_.pending_exception_ == |
@@ -1215,7 +1216,8 @@ void Isolate::ReportPendingMessages() { |
} |
} |
} |
- clear_pending_message(); |
+ if (canClearMessage) |
+ clear_pending_message(); |
} |
@@ -1722,13 +1724,19 @@ void Isolate::InitializeThreadLocal() { |
} |
-void Isolate::PropagatePendingExceptionToExternalTryCatch() { |
+// Return true. if we don't pending message and can remove it |
vsevik
2014/05/28 18:00:31
Either comment on particular actions inside the me
|
+bool Isolate::PropagatePendingExceptionToExternalTryCatch() { |
ASSERT(has_pending_exception()); |
bool external_caught = IsExternallyCaught(); |
vsevik
2014/05/28 18:00:31
I think correct naming for the methods would be Ha
|
- thread_local_top_.external_caught_exception_ = external_caught; |
+ bool finally_on_top = IsFinallyOnTop(); |
- if (!external_caught) return; |
+ bool next_external_caught = external_caught && !finally_on_top; |
+ thread_local_top_.external_caught_exception_ = next_external_caught; |
+ |
+ // if no v8::TryCatch - we don't need store exception andf can clear it |
+ if (!external_caught) return true; |
+ if (finally_on_top) return false; |
if (thread_local_top_.pending_exception_ == |
heap()->termination_exception()) { |
@@ -1745,13 +1753,14 @@ void Isolate::PropagatePendingExceptionToExternalTryCatch() { |
handler->has_terminated_ = false; |
handler->exception_ = pending_exception(); |
// Propagate to the external try-catch only if we got an actual message. |
- if (thread_local_top_.pending_message_obj_->IsTheHole()) return; |
+ if (thread_local_top_.pending_message_obj_->IsTheHole()) return true; |
handler->message_obj_ = thread_local_top_.pending_message_obj_; |
handler->message_script_ = thread_local_top_.pending_message_script_; |
handler->message_start_pos_ = thread_local_top_.pending_message_start_pos_; |
handler->message_end_pos_ = thread_local_top_.pending_message_end_pos_; |
} |
+ return true; |
} |