Chromium Code Reviews| Index: src/isolate.cc |
| diff --git a/src/isolate.cc b/src/isolate.cc |
| index 632ecdc50a32b569ba3224c9428a165ef10deccb..34f68d8386afd7b7ca2d630a128711e196fed059 100644 |
| --- a/src/isolate.cc |
| +++ b/src/isolate.cc |
| @@ -1198,6 +1198,7 @@ bool Isolate::IsErrorObject(Handle<Object> obj) { |
| return false; |
| } |
| +static int fatal_exception_depth = 0; |
| void Isolate::DoThrow(Object* exception, MessageLocation* location) { |
| ASSERT(!has_pending_exception()); |
| @@ -1281,6 +1282,36 @@ void Isolate::DoThrow(Object* exception, MessageLocation* location) { |
| thread_local_top()->pending_message_start_pos_ = location->start_pos(); |
| 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 (fatal_exception_depth == 0 && |
| + FLAG_abort_on_uncaught_exception && |
| + (report_exception || can_be_caught_externally)) { |
| + fatal_exception_depth++; |
| + fprintf(stderr, "UNCAUGHT EXCEPTION: "); |
| + exception->ShortPrint(stderr); |
| + |
| + if (IsErrorObject(exception_handle)) { |
| + Handle<String> key = factory()->InternalizeOneByteString( |
| + STATIC_ASCII_VECTOR("message")); |
| + MaybeObject *maybeMessage = |
| + JSObject::cast(*exception_handle)->GetProperty(*key); |
| + Object *messageObject; |
| + if (maybeMessage->ToObject(&messageObject)) { |
| + String *message = String::cast(messageObject); |
| + fprintf(stderr, "\nEXCEPTION MESSAGE: "); |
| + message->PrintOn(stderr); |
| + } |
| + } |
|
Yang
2013/04/02 10:42:30
I was actually suggesting to replace the entire ab
|
| + |
| + fprintf(stderr, "\nFROM:\n"); |
| + PrintCurrentStackTrace(stderr); |
| + 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. |