| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 | 6 |
| 7 #include <fstream> // NOLINT(readability/streams) | 7 #include <fstream> // NOLINT(readability/streams) |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 | 9 |
| 10 #include "src/v8.h" | 10 #include "src/v8.h" |
| (...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 902 entry = api_interrupts_queue_.front(); | 902 entry = api_interrupts_queue_.front(); |
| 903 api_interrupts_queue_.pop(); | 903 api_interrupts_queue_.pop(); |
| 904 } | 904 } |
| 905 VMState<EXTERNAL> state(this); | 905 VMState<EXTERNAL> state(this); |
| 906 HandleScope handle_scope(this); | 906 HandleScope handle_scope(this); |
| 907 entry.first(reinterpret_cast<v8::Isolate*>(this), entry.second); | 907 entry.first(reinterpret_cast<v8::Isolate*>(this), entry.second); |
| 908 } | 908 } |
| 909 } | 909 } |
| 910 | 910 |
| 911 | 911 |
| 912 void Isolate::ReportBootstrappingException(Handle<Object> exception, | 912 void ReportBootstrappingException(Handle<Object> exception, |
| 913 MessageLocation* location) { | 913 MessageLocation* location) { |
| 914 base::OS::PrintError("Exception thrown during bootstrapping\n"); | 914 base::OS::PrintError("Exception thrown during bootstrapping\n"); |
| 915 if (location == NULL || location->script().is_null()) { | 915 if (location == NULL || location->script().is_null()) return; |
| 916 exception->Print(); | |
| 917 PrintStack(stdout); | |
| 918 return; | |
| 919 } | |
| 920 // We are bootstrapping and caught an error where the location is set | 916 // We are bootstrapping and caught an error where the location is set |
| 921 // and we have a script for the location. | 917 // and we have a script for the location. |
| 922 // In this case we could have an extension (or an internal error | 918 // In this case we could have an extension (or an internal error |
| 923 // somewhere) and we print out the line number at which the error occured | 919 // somewhere) and we print out the line number at which the error occured |
| 924 // to the console for easier debugging. | 920 // to the console for easier debugging. |
| 925 int line_number = | 921 int line_number = |
| 926 location->script()->GetLineNumber(location->start_pos()) + 1; | 922 location->script()->GetLineNumber(location->start_pos()) + 1; |
| 927 if (exception->IsString() && location->script()->name()->IsString()) { | 923 if (exception->IsString() && location->script()->name()->IsString()) { |
| 928 base::OS::PrintError( | 924 base::OS::PrintError( |
| 929 "Extension or internal compilation error: %s in %s at line %d.\n", | 925 "Extension or internal compilation error: %s in %s at line %d.\n", |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 978 try_catch_handler()->capture_message_; | 974 try_catch_handler()->capture_message_; |
| 979 bool rethrowing_message = thread_local_top()->rethrowing_message_; | 975 bool rethrowing_message = thread_local_top()->rethrowing_message_; |
| 980 | 976 |
| 981 thread_local_top()->rethrowing_message_ = false; | 977 thread_local_top()->rethrowing_message_ = false; |
| 982 | 978 |
| 983 // Notify debugger of exception. | 979 // Notify debugger of exception. |
| 984 if (is_catchable_by_javascript(exception)) { | 980 if (is_catchable_by_javascript(exception)) { |
| 985 debug()->OnThrow(exception_handle); | 981 debug()->OnThrow(exception_handle); |
| 986 } | 982 } |
| 987 | 983 |
| 988 if (bootstrapper()->IsActive()) { | 984 // Generate the message if required. |
| 989 // It's not safe to try to make message objects or collect stack traces | 985 if (requires_message && !rethrowing_message) { |
| 990 // while the bootstrapper is active since the infrastructure may not have | |
| 991 // been properly initialized. | |
| 992 ReportBootstrappingException(exception_handle, location); | |
| 993 } else if (requires_message && !rethrowing_message) { | |
| 994 MessageLocation potential_computed_location; | 986 MessageLocation potential_computed_location; |
| 995 if (location == NULL) { | 987 if (location == NULL) { |
| 996 // If no location was specified we use a computed one instead. | 988 // If no location was specified we use a computed one instead. |
| 997 ComputeLocation(&potential_computed_location); | 989 ComputeLocation(&potential_computed_location); |
| 998 location = &potential_computed_location; | 990 location = &potential_computed_location; |
| 999 } | 991 } |
| 1000 | 992 |
| 1001 Handle<Object> message_obj = CreateMessage(exception_handle, location); | 993 if (bootstrapper()->IsActive()) { |
| 1002 thread_local_top()->pending_message_obj_ = *message_obj; | 994 // It's not safe to try to make message objects or collect stack traces |
| 995 // while the bootstrapper is active since the infrastructure may not have |
| 996 // been properly initialized. |
| 997 ReportBootstrappingException(exception_handle, location); |
| 998 } else { |
| 999 Handle<Object> message_obj = CreateMessage(exception_handle, location); |
| 1000 thread_local_top()->pending_message_obj_ = *message_obj; |
| 1003 | 1001 |
| 1004 // If the abort-on-uncaught-exception flag is specified, abort on any | 1002 // If the abort-on-uncaught-exception flag is specified, abort on any |
| 1005 // exception not caught by JavaScript, even when an external handler is | 1003 // exception not caught by JavaScript, even when an external handler is |
| 1006 // present. This flag is intended for use by JavaScript developers, so | 1004 // present. This flag is intended for use by JavaScript developers, so |
| 1007 // print a user-friendly stack trace (not an internal one). | 1005 // print a user-friendly stack trace (not an internal one). |
| 1008 if (FLAG_abort_on_uncaught_exception && | 1006 if (FLAG_abort_on_uncaught_exception && |
| 1009 PredictExceptionCatcher() != CAUGHT_BY_JAVASCRIPT) { | 1007 PredictExceptionCatcher() != CAUGHT_BY_JAVASCRIPT) { |
| 1010 FLAG_abort_on_uncaught_exception = false; // Prevent endless recursion. | 1008 FLAG_abort_on_uncaught_exception = false; // Prevent endless recursion. |
| 1011 PrintF(stderr, "%s\n\nFROM\n", | 1009 PrintF(stderr, "%s\n\nFROM\n", |
| 1012 MessageHandler::GetLocalizedMessage(this, message_obj).get()); | 1010 MessageHandler::GetLocalizedMessage(this, message_obj).get()); |
| 1013 PrintCurrentStackTrace(stderr); | 1011 PrintCurrentStackTrace(stderr); |
| 1014 base::OS::Abort(); | 1012 base::OS::Abort(); |
| 1013 } |
| 1015 } | 1014 } |
| 1016 } | 1015 } |
| 1017 | 1016 |
| 1018 // Set the exception being thrown. | 1017 // Set the exception being thrown. |
| 1019 set_pending_exception(*exception_handle); | 1018 set_pending_exception(*exception_handle); |
| 1020 return heap()->exception(); | 1019 return heap()->exception(); |
| 1021 } | 1020 } |
| 1022 | 1021 |
| 1023 | 1022 |
| 1024 Object* Isolate::ReThrow(Object* exception) { | 1023 Object* Isolate::ReThrow(Object* exception) { |
| (...skipping 1736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2761 if (prev_ && prev_->Intercept(flag)) return true; | 2760 if (prev_ && prev_->Intercept(flag)) return true; |
| 2762 // Then check whether this scope intercepts. | 2761 // Then check whether this scope intercepts. |
| 2763 if ((flag & intercept_mask_)) { | 2762 if ((flag & intercept_mask_)) { |
| 2764 intercepted_flags_ |= flag; | 2763 intercepted_flags_ |= flag; |
| 2765 return true; | 2764 return true; |
| 2766 } | 2765 } |
| 2767 return false; | 2766 return false; |
| 2768 } | 2767 } |
| 2769 | 2768 |
| 2770 } } // namespace v8::internal | 2769 } } // namespace v8::internal |
| OLD | NEW |