Index: src/top.cc |
=================================================================== |
--- src/top.cc (revision 557) |
+++ src/top.cc (working copy) |
@@ -594,19 +594,25 @@ |
// reworked. |
static const char* kMessage = |
"Uncaught RangeError: Maximum call stack size exceeded"; |
- DoThrow(*exception, NULL, kMessage, false); |
+ DoThrow(*exception, NULL, kMessage); |
return Failure::Exception(); |
} |
Failure* Top::Throw(Object* exception, MessageLocation* location) { |
- DoThrow(exception, location, NULL, false); |
+ DoThrow(exception, location, NULL); |
return Failure::Exception(); |
} |
Failure* Top::ReThrow(Object* exception, MessageLocation* location) { |
- DoThrow(exception, location, NULL, true); |
+ // Check is this exception is externally caught. |
+ bool is_caught_externally = false; |
+ ShouldReportException(&is_caught_externally); |
+ thread_local_.external_caught_exception_ = is_caught_externally; |
+ |
+ // Set the exception beeing re-thrown. |
+ set_pending_exception(exception); |
return Failure::Exception(); |
} |
@@ -724,22 +730,17 @@ |
// the handler is at a higher address than the external address it |
// means that it is below it on the stack. |
- // Find the top-most try-catch or try-finally handler. |
- while (handler != NULL && handler->is_entry()) { |
+ // Find the top-most try-catch handler. |
+ while (handler != NULL && !handler->is_try_catch()) { |
handler = handler->next(); |
} |
// The exception has been externally caught if and only if there is |
- // an external handler which is above any JavaScript try-catch or |
+ // an external handler which is above any JavaScript try-catch but NOT |
// try-finally handlers. |
*is_caught_externally = has_external_handler && |
(handler == NULL || handler->address() > external_handler_address); |
- // Find the top-most try-catch handler. |
- while (handler != NULL && !handler->is_try_catch()) { |
- handler = handler->next(); |
- } |
- |
// If we have a try-catch handler then the exception is caught in |
// JavaScript code. |
bool is_uncaught_by_js = (handler == NULL); |
@@ -760,23 +761,23 @@ |
void Top::DoThrow(Object* exception, |
MessageLocation* location, |
- const char* message, |
- bool is_rethrow) { |
+ const char* message) { |
ASSERT(!has_pending_exception()); |
- ASSERT(!external_caught_exception()); |
HandleScope scope; |
Handle<Object> exception_handle(exception); |
+ // Determine reporting and whether the exception is caught externally. |
bool is_caught_externally = false; |
bool report_exception = (exception != Failure::OutOfMemoryException()) && |
- ShouldReportException(&is_caught_externally); |
- if (is_rethrow) report_exception = false; |
+ ShouldReportException(&is_caught_externally); |
+ // Generate the message. |
Handle<Object> message_obj; |
MessageLocation potential_computed_location; |
bool try_catch_needs_message = |
- is_caught_externally && thread_local_.try_catch_handler_->capture_message_; |
+ is_caught_externally && |
+ thread_local_.try_catch_handler_->capture_message_; |
if (report_exception || try_catch_needs_message) { |
if (location == NULL) { |
// If no location was specified we use a computed one instead |
@@ -812,6 +813,7 @@ |
} |
} |
thread_local_.external_caught_exception_ = is_caught_externally; |
+ |
// NOTE: Notifying the debugger or reporting the exception may have caused |
// new exceptions. For now, we just ignore that and set the pending exception |
// to the original one. |