Index: src/top.cc |
=================================================================== |
--- src/top.cc (revision 917) |
+++ src/top.cc (working copy) |
@@ -66,9 +66,6 @@ |
void Top::Iterate(ObjectVisitor* v, ThreadLocalTop* thread) { |
v->VisitPointer(&(thread->pending_exception_)); |
- v->VisitPointer(&(thread->pending_message_obj_)); |
- v->VisitPointer( |
- bit_cast<Object**, Script**>(&(thread->pending_message_script_))); |
v->VisitPointer(bit_cast<Object**, Context**>(&(thread->context_))); |
v->VisitPointer(&(thread->scheduled_exception_)); |
@@ -102,7 +99,6 @@ |
thread_local_.external_caught_exception_ = false; |
thread_local_.failed_access_check_callback_ = NULL; |
clear_pending_exception(); |
- clear_pending_message(); |
clear_scheduled_exception(); |
thread_local_.save_context_ = NULL; |
thread_local_.catcher_ = NULL; |
@@ -795,14 +791,9 @@ |
// Determine reporting and whether the exception is caught externally. |
bool is_caught_externally = false; |
- bool is_out_of_memory = exception == Failure::OutOfMemoryException(); |
- bool should_return_exception = ShouldReportException(&is_caught_externally); |
- bool report_exception = !is_out_of_memory && should_return_exception; |
+ bool report_exception = (exception != Failure::OutOfMemoryException()) && |
+ ShouldReportException(&is_caught_externally); |
- |
- // Notify debugger of exception. |
- Debugger::OnException(exception_handle, report_exception); |
- |
// Generate the message. |
Handle<Object> message_obj; |
MessageLocation potential_computed_location; |
@@ -821,63 +812,35 @@ |
location, HandleVector<Object>(&exception_handle, 1), stack_trace); |
} |
- // Save the message for reporting if the the exception remains uncaught. |
- thread_local_.pending_message_ = message; |
- if (!message_obj.is_null()) { |
- thread_local_.pending_message_obj_ = *message_obj; |
- if (location != NULL) { |
- thread_local_.pending_message_script_ = *location->script(); |
- thread_local_.pending_message_start_pos_ = location->start_pos(); |
- thread_local_.pending_message_end_pos_ = location->end_pos(); |
- } |
- } |
- |
+ // If the exception is caught externally, we store it in the |
+ // try/catch handler. The C code can find it later and process it if |
+ // necessary. |
+ thread_local_.catcher_ = NULL; |
if (is_caught_externally) { |
thread_local_.catcher_ = thread_local_.try_catch_handler_; |
+ thread_local_.try_catch_handler_->exception_ = |
+ reinterpret_cast<void*>(*exception_handle); |
+ if (!message_obj.is_null()) { |
+ thread_local_.try_catch_handler_->message_ = |
+ reinterpret_cast<void*>(*message_obj); |
+ } |
} |
- // NOTE: Notifying the debugger or generating the message |
- // may have caused new exceptions. For now, we just ignore |
- // that and set the pending exception to the original one. |
- set_pending_exception(*exception_handle); |
-} |
+ // Notify debugger of exception. |
+ Debugger::OnException(exception_handle, report_exception); |
- |
-void Top::ReportPendingMessages() { |
- ASSERT(has_pending_exception()); |
- setup_external_caught(); |
- // If the pending exception is OutOfMemoryException set out_of_memory in |
- // the global context. Note: We have to mark the global context here |
- // since the GenerateThrowOutOfMemory stub cannot make a RuntimeCall to |
- // set it. |
- HandleScope scope; |
- if (thread_local_.pending_exception_ == Failure::OutOfMemoryException()) { |
- context()->mark_out_of_memory(); |
- } else { |
- Handle<Object> exception(pending_exception()); |
- if (thread_local_.external_caught_exception_) { |
- thread_local_.try_catch_handler_->exception_ = |
- thread_local_.pending_exception_; |
- if (!thread_local_.pending_message_obj_->IsTheHole()) { |
- try_catch_handler()->message_ = thread_local_.pending_message_obj_; |
- } |
- } else if (thread_local_.pending_message_ != NULL) { |
- MessageHandler::ReportMessage(thread_local_.pending_message_); |
- } else if (!thread_local_.pending_message_obj_->IsTheHole()) { |
- Handle<Object> message_obj(thread_local_.pending_message_obj_); |
- if (thread_local_.pending_message_script_ != NULL) { |
- Handle<Script> script(thread_local_.pending_message_script_); |
- int start_pos = thread_local_.pending_message_start_pos_; |
- int end_pos = thread_local_.pending_message_end_pos_; |
- MessageLocation location(script, start_pos, end_pos); |
- MessageHandler::ReportMessage(&location, message_obj); |
- } else { |
- MessageHandler::ReportMessage(NULL, message_obj); |
- } |
+ if (report_exception) { |
+ if (message != NULL) { |
+ MessageHandler::ReportMessage(message); |
+ } else if (!message_obj.is_null()) { |
+ MessageHandler::ReportMessage(location, message_obj); |
} |
- set_pending_exception(*exception); |
} |
- clear_pending_message(); |
+ |
+ // 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. |
+ set_pending_exception(*exception_handle); |
} |