| Index: src/isolate.cc | 
| diff --git a/src/isolate.cc b/src/isolate.cc | 
| index eb139499f24f9d225ab5cfbaca55e3b2e7218c32..1e0b0947acb6f454f02e2bbeef48b292d6a9d06b 100644 | 
| --- a/src/isolate.cc | 
| +++ b/src/isolate.cc | 
| @@ -1166,15 +1166,20 @@ void Isolate::DoThrow(Object* exception, MessageLocation* location) { | 
| } | 
|  | 
|  | 
| -bool Isolate::HasExternalTryCatch() { | 
| +bool Isolate::IsExternallyCaught() { | 
| ASSERT(has_pending_exception()); | 
|  | 
| -  return (thread_local_top()->catcher_ != NULL) && | 
| -      (try_catch_handler() == thread_local_top()->catcher_); | 
| -} | 
| +  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; | 
| +  } | 
|  | 
| +  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 = | 
| @@ -1194,18 +1199,18 @@ bool Isolate::IsFinallyOnTop() { | 
| StackHandler::FromAddress(Isolate::handler(thread_local_top())); | 
| while (handler != NULL && handler->address() < external_handler_address) { | 
| ASSERT(!handler->is_catch()); | 
| -    if (handler->is_finally()) return true; | 
| +    if (handler->is_finally()) return false; | 
|  | 
| handler = handler->next(); | 
| } | 
|  | 
| -  return false; | 
| +  return true; | 
| } | 
|  | 
|  | 
| void Isolate::ReportPendingMessages() { | 
| ASSERT(has_pending_exception()); | 
| -  bool can_clear_message = PropagatePendingExceptionToExternalTryCatch(); | 
| +  PropagatePendingExceptionToExternalTryCatch(); | 
|  | 
| HandleScope scope(this); | 
| if (thread_local_top_.pending_exception_ == | 
| @@ -1232,7 +1237,7 @@ void Isolate::ReportPendingMessages() { | 
| } | 
| } | 
| } | 
| -  if (can_clear_message) clear_pending_message(); | 
| +  clear_pending_message(); | 
| } | 
|  | 
|  | 
| @@ -1737,18 +1742,13 @@ void Isolate::InitializeThreadLocal() { | 
| } | 
|  | 
|  | 
| -bool Isolate::PropagatePendingExceptionToExternalTryCatch() { | 
| +void Isolate::PropagatePendingExceptionToExternalTryCatch() { | 
| ASSERT(has_pending_exception()); | 
|  | 
| -  bool has_external_try_catch = HasExternalTryCatch(); | 
| -  bool is_catchable_by_js = is_catchable_by_javascript(pending_exception()); | 
| -  bool is_finally_on_top  = IsFinallyOnTop(); | 
| +  bool external_caught = IsExternallyCaught(); | 
| +  thread_local_top_.external_caught_exception_ = external_caught; | 
|  | 
| -  bool should_propagate_now = has_external_try_catch && | 
| -    (!is_catchable_by_js || !is_finally_on_top); | 
| -  thread_local_top_.external_caught_exception_ = should_propagate_now; | 
| - | 
| -  if (!should_propagate_now) return !has_external_try_catch; | 
| +  if (!external_caught) return; | 
|  | 
| if (thread_local_top_.pending_exception_ == | 
| heap()->termination_exception()) { | 
| @@ -1765,14 +1765,13 @@ bool 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 true; | 
| +    if (thread_local_top_.pending_message_obj_->IsTheHole()) return; | 
|  | 
| 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; | 
| } | 
|  | 
|  | 
|  |