Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index 3fff6b2ef7a491d5f0ac3c0a93b70bef3ae0827d..bad26eddad9bd1dc55f60395e565043cb7a7432b 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -1014,11 +1014,21 @@ Object* Isolate::Throw(Object* exception, MessageLocation* location) { |
// print a user-friendly stack trace (not an internal one). |
if (FLAG_abort_on_uncaught_exception && |
PredictExceptionCatcher() != CAUGHT_BY_JAVASCRIPT) { |
- FLAG_abort_on_uncaught_exception = false; // Prevent endless recursion. |
- PrintF(stderr, "%s\n\nFROM\n", |
- MessageHandler::GetLocalizedMessage(this, message_obj).get()); |
- PrintCurrentStackTrace(stderr); |
- base::OS::Abort(); |
+ // If the embedder didn't specify a custom uncaught exception callback, |
+ // or if the custom callback determined that V8 should abort, then |
+ // abort |
Michael Starzinger
2015/10/01 16:34:38
nit: Punctuation.
julien.gilli
2015/10/01 19:18:11
Acknowledged.
julien.gilli
2015/10/05 17:24:24
Done.
|
+ bool should_abort = !abort_on_uncaught_exception_callback_ || |
+ abort_on_uncaught_exception_callback_( |
+ reinterpret_cast<v8::Isolate*>(this)); |
+ |
+ if (should_abort) { |
+ // Prevent endless recursion. |
+ FLAG_abort_on_uncaught_exception = false; |
+ PrintF(stderr, "%s\n\nFROM\n", |
+ MessageHandler::GetLocalizedMessage(this, message_obj).get()); |
+ PrintCurrentStackTrace(stderr); |
+ base::OS::Abort(); |
+ } |
} |
} |
} |
@@ -1602,6 +1612,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 +1786,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_); |