|
|
@ -1090,20 +1090,31 @@ void Isolate::DoThrow(Object* exception, MessageLocation* location) { |
|
|
|
thread_local_top()->pending_message_end_pos_ = location->end_pos(); |
|
|
|
} |
|
|
|
|
|
|
|
// 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).
|
|
|
|
// If the abort-on-uncaught-exception flag is specified, and if the
|
|
|
|
// exception is not caught by JavaScript (even when an external handler is
|
|
|
|
// present).
|
|
|
|
if (fatal_exception_depth == 0 && |
|
|
|
FLAG_abort_on_uncaught_exception && |
|
|
|
(report_exception || can_be_caught_externally)) { |
|
|
|
// If the embedder didn't specify a custom uncaught exception callback,
|
|
|
|
// or if the custom callback determined that V8 should abort, then
|
|
|
|
// abort
|
|
|
|
bool should_abort = !abort_on_uncaught_exception_callback_ || |
|
|
|
abort_on_uncaught_exception_callback_( |
|
|
|
reinterpret_cast<v8::Isolate*>(this) |
|
|
|
); |
|
|
|
|
|
|
|
if (should_abort) { |
|
|
|
fatal_exception_depth++; |
|
|
|
// 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); |
|
|
|
base::OS::Abort(); |
|
|
|
} |
|
|
|
} |
|
|
|
} else if (location != NULL && !location->script().is_null()) { |
|
|
|
// We are bootstrapping and caught an error where the location is set
|
|
|
|
// and we have a script for the location.
|
|
|
@ -1299,6 +1310,12 @@ void Isolate::SetCaptureStackTraceForUncaughtExceptions( |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Isolate::SetAbortOnUncaughtException( |
|
|
|
v8::Isolate::abort_on_uncaught_exception_t callback) { |
|
|
|
abort_on_uncaught_exception_callback_ = callback; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Handle<Context> Isolate::native_context() { |
|
|
|
return handle(context()->native_context()); |
|
|
|
} |
|
|
@ -1474,7 +1491,8 @@ Isolate::Isolate() |
|
|
|
num_sweeper_threads_(0), |
|
|
|
stress_deopt_count_(0), |
|
|
|
next_optimization_id_(0), |
|
|
|
use_counter_callback_(NULL) { |
|
|
|
use_counter_callback_(NULL), |
|
|
|
abort_on_uncaught_exception_callback_(NULL) { |
|
|
|
id_ = base::NoBarrier_AtomicIncrement(&isolate_counter_, 1); |
|
|
|
TRACE_ISOLATE(constructor); |
|
|
|
|
|
|
|