Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index 3fff6b2ef7a491d5f0ac3c0a93b70bef3ae0827d..481cb42f05fb71b694662bceed417bbd6dfdd88b 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -1008,13 +1008,21 @@ Object* Isolate::Throw(Object* exception, MessageLocation* location) { |
Handle<Object> message_obj = CreateMessage(exception_handle, location); |
thread_local_top()->pending_message_obj_ = *message_obj; |
- // If the abort-on-uncaught-exception flag is specified, abort on any |
- // exception not caught by JavaScript, even when an external handler is |
- // present. This flag is intended for use by JavaScript developers, so |
- // print a user-friendly stack trace (not an internal one). |
+ // For any exception not caught by JavaScript, even when an external |
+ // handler is present: |
+ // If the abort-on-uncaught-exception flag is specified, and if the |
+ // embedder didn't specify a custom uncaught exception callback, |
+ // or if the custom callback determined that V8 should abort, then |
+ // abort. |
if (FLAG_abort_on_uncaught_exception && |
- PredictExceptionCatcher() != CAUGHT_BY_JAVASCRIPT) { |
- FLAG_abort_on_uncaught_exception = false; // Prevent endless recursion. |
+ PredictExceptionCatcher() != CAUGHT_BY_JAVASCRIPT && |
+ (!abort_on_uncaught_exception_callback_ || |
+ abort_on_uncaught_exception_callback_( |
+ reinterpret_cast<v8::Isolate*>(this)))) { |
+ // Prevent endless recursion. |
+ FLAG_abort_on_uncaught_exception = false; |
+ // This flag is intended for use by JavaScript developers, so |
+ // print a user-friendly stack trace (not an internal one). |
PrintF(stderr, "%s\n\nFROM\n", |
MessageHandler::GetLocalizedMessage(this, message_obj).get()); |
PrintCurrentStackTrace(stderr); |
@@ -1602,6 +1610,12 @@ void Isolate::SetCaptureStackTraceForUncaughtExceptions( |
} |
+void Isolate::SetAbortOnUncaughtExceptionCallback( |
+ v8::Isolate::AbortOnUncaughtExceptionCallback callback) { |
+ abort_on_uncaught_exception_callback_ = callback; |
+} |
+ |
+ |
Handle<Context> Isolate::native_context() { |
return handle(context()->native_context()); |
} |
@@ -1770,7 +1784,8 @@ Isolate::Isolate(bool enable_serializer) |
next_unique_sfi_id_(0), |
#endif |
use_counter_callback_(NULL), |
- basic_block_profiler_(NULL) { |
+ basic_block_profiler_(NULL), |
+ abort_on_uncaught_exception_callback_(NULL) { |
{ |
base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); |
CHECK(thread_data_table_); |