Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(840)

Unified Diff: src/isolate.cc

Issue 306463002: Don't clear exception pending message if we have externally TryCatch and finally on top of stack. (Closed) Base URL: git://github.com/v8/v8.git@master
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/isolate.h ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/isolate.cc
diff --git a/src/isolate.cc b/src/isolate.cc
index 3542b994ff3338ffd3860b763f49b4730dfe6d54..da956b6e25c84422c874ebdf248b0160d565c3a9 100644
--- a/src/isolate.cc
+++ b/src/isolate.cc
@@ -1144,20 +1144,15 @@ void Isolate::DoThrow(Object* exception, MessageLocation* location) {
}
-bool Isolate::IsExternallyCaught() {
+bool Isolate::HasExternalTryCatch() {
ASSERT(has_pending_exception());
- if ((thread_local_top()->catcher_ == NULL) ||
- (try_catch_handler() != thread_local_top()->catcher_)) {
- // When throwing the exception, we found no v8::TryCatch
- // which should care about this exception.
- return false;
- }
+ return (thread_local_top()->catcher_ != NULL) &&
+ (try_catch_handler() == thread_local_top()->catcher_);
+}
- if (!is_catchable_by_javascript(pending_exception())) {
- 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 +1172,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 can_clear_message = PropagatePendingExceptionToExternalTryCatch();
HandleScope scope(this);
if (thread_local_top_.pending_exception_ ==
@@ -1215,7 +1210,7 @@ void Isolate::ReportPendingMessages() {
}
}
}
- clear_pending_message();
+ if (can_clear_message) clear_pending_message();
}
@@ -1722,14 +1717,25 @@ void Isolate::InitializeThreadLocal() {
}
-void Isolate::PropagatePendingExceptionToExternalTryCatch() {
+bool Isolate::PropagatePendingExceptionToExternalTryCatch() {
ASSERT(has_pending_exception());
- bool external_caught = IsExternallyCaught();
- thread_local_top_.external_caught_exception_ = external_caught;
+ bool has_external_try_catch = HasExternalTryCatch();
+ if (!has_external_try_catch) {
+ thread_local_top_.external_caught_exception_ = false;
+ return true;
+ }
- if (!external_caught) return;
+ bool is_catchable_by_js = is_catchable_by_javascript(pending_exception());
+ if (is_catchable_by_js) {
+ bool is_finally_on_top = IsFinallyOnTop();
+ if (is_finally_on_top) {
+ thread_local_top_.external_caught_exception_ = false;
+ return false;
+ }
+ }
+ thread_local_top_.external_caught_exception_ = true;
if (thread_local_top_.pending_exception_ ==
heap()->termination_exception()) {
try_catch_handler()->can_continue_ = false;
@@ -1745,13 +1751,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;
}
« no previous file with comments | « src/isolate.h ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698