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

Unified Diff: src/isolate.cc

Issue 15669003: Fix TryCatch.ReThrow() to not clobber Message. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 7 years, 7 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
===================================================================
--- src/isolate.cc (revision 14909)
+++ src/isolate.cc (working copy)
@@ -107,6 +107,7 @@
// is complete.
pending_exception_ = NULL;
has_pending_message_ = false;
+ restoring_message_ = false;
pending_message_obj_ = NULL;
pending_message_script_ = NULL;
scheduled_exception_ = NULL;
@@ -480,7 +481,8 @@
block != NULL;
block = TRY_CATCH_FROM_ADDRESS(block->next_)) {
v->VisitPointer(BitCast<Object**>(&(block->exception_)));
- v->VisitPointer(BitCast<Object**>(&(block->message_)));
+ v->VisitPointer(BitCast<Object**>(&(block->message_obj_)));
+ v->VisitPointer(BitCast<Object**>(&(block->message_script_)));
}
// Iterate over pointers on native execution stack.
@@ -1156,6 +1158,19 @@
}
+void Isolate::RestoreMessage(Object* message, Script* script,
+ int start_pos, int end_pos) {
+ // Flag is checked in DoThrow(), which immediately follows.
+ thread_local_top()->restoring_message_ = true;
+ thread_local_top()->pending_message_obj_ = message;
+ if (script) {
+ thread_local_top()->pending_message_script_ = script;
+ }
+ thread_local_top()->pending_message_start_pos_ = start_pos;
+ thread_local_top()->pending_message_end_pos_ = end_pos;
+}
+
+
Failure* Isolate::PromoteScheduledException() {
MaybeObject* thrown = scheduled_exception();
clear_scheduled_exception();
@@ -1273,10 +1288,18 @@
bool should_report_exception =
ShouldReportException(&can_be_caught_externally, catchable_by_javascript);
bool report_exception = catchable_by_javascript && should_report_exception;
+ // When determining if a message needs to be generated, make sure to check
+ // restoring_message_. If an external TryCatch re-threw an exception, it
+ // will have already called RestoreMessage() to put the original message,
+ // script, and location back in place. In that case, this code must not
+ // clobber the values computed from the original exception.
bool try_catch_needs_message =
- can_be_caught_externally && try_catch_handler()->capture_message_;
+ can_be_caught_externally && try_catch_handler()->capture_message_ &&
+ !thread_local_top_.restoring_message_;
bool bootstrapping = bootstrapper()->IsActive();
+ thread_local_top_.restoring_message_ = false;
+
#ifdef ENABLE_DEBUGGER_SUPPORT
// Notify debugger of exception.
if (catchable_by_javascript) {
@@ -2041,7 +2064,16 @@
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_;
+ try_catch_handler()->message_obj_ =
+ thread_local_top_.pending_message_obj_;
+ if (!thread_local_top_.pending_message_script_->IsTheHole()) {
+ try_catch_handler()->message_script_ =
+ thread_local_top_.pending_message_script_;
+ }
+ try_catch_handler()->message_start_pos_ =
+ thread_local_top_.pending_message_start_pos_;
+ try_catch_handler()->message_end_pos_ =
+ thread_local_top_.pending_message_end_pos_;
}
}
}
« 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