| 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 "src/isolate.h" | 5 #include "src/isolate.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 | 8 |
| 9 #include <fstream> // NOLINT(readability/streams) | 9 #include <fstream> // NOLINT(readability/streams) |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 1124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 } else { | 1135 } else { |
| 1136 Handle<Object> message_obj = CreateMessage(exception_handle, location); | 1136 Handle<Object> message_obj = CreateMessage(exception_handle, location); |
| 1137 thread_local_top()->pending_message_obj_ = *message_obj; | 1137 thread_local_top()->pending_message_obj_ = *message_obj; |
| 1138 | 1138 |
| 1139 // For any exception not caught by JavaScript, even when an external | 1139 // For any exception not caught by JavaScript, even when an external |
| 1140 // handler is present: | 1140 // handler is present: |
| 1141 // If the abort-on-uncaught-exception flag is specified, and if the | 1141 // If the abort-on-uncaught-exception flag is specified, and if the |
| 1142 // embedder didn't specify a custom uncaught exception callback, | 1142 // embedder didn't specify a custom uncaught exception callback, |
| 1143 // or if the custom callback determined that V8 should abort, then | 1143 // or if the custom callback determined that V8 should abort, then |
| 1144 // abort. | 1144 // abort. |
| 1145 CatchType prediction = PredictExceptionCatcher(); |
| 1145 if (FLAG_abort_on_uncaught_exception && | 1146 if (FLAG_abort_on_uncaught_exception && |
| 1146 PredictExceptionCatcher() != CAUGHT_BY_JAVASCRIPT && | 1147 (prediction == NOT_CAUGHT || prediction == CAUGHT_BY_EXTERNAL) && |
| 1147 (!abort_on_uncaught_exception_callback_ || | 1148 (!abort_on_uncaught_exception_callback_ || |
| 1148 abort_on_uncaught_exception_callback_( | 1149 abort_on_uncaught_exception_callback_( |
| 1149 reinterpret_cast<v8::Isolate*>(this)))) { | 1150 reinterpret_cast<v8::Isolate*>(this)))) { |
| 1150 // Prevent endless recursion. | 1151 // Prevent endless recursion. |
| 1151 FLAG_abort_on_uncaught_exception = false; | 1152 FLAG_abort_on_uncaught_exception = false; |
| 1152 // This flag is intended for use by JavaScript developers, so | 1153 // This flag is intended for use by JavaScript developers, so |
| 1153 // print a user-friendly stack trace (not an internal one). | 1154 // print a user-friendly stack trace (not an internal one). |
| 1154 PrintF(stderr, "%s\n\nFROM\n", | 1155 PrintF(stderr, "%s\n\nFROM\n", |
| 1155 MessageHandler::GetLocalizedMessage(this, message_obj).get()); | 1156 MessageHandler::GetLocalizedMessage(this, message_obj).get()); |
| 1156 PrintCurrentStackTrace(stderr); | 1157 PrintCurrentStackTrace(stderr); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1332 StackFrame* frame = iter.frame(); | 1333 StackFrame* frame = iter.frame(); |
| 1333 | 1334 |
| 1334 // For JSEntryStub frames we update the JS_ENTRY handler. | 1335 // For JSEntryStub frames we update the JS_ENTRY handler. |
| 1335 if (frame->is_entry() || frame->is_entry_construct()) { | 1336 if (frame->is_entry() || frame->is_entry_construct()) { |
| 1336 entry_handler = frame->top_handler()->next()->address(); | 1337 entry_handler = frame->top_handler()->next()->address(); |
| 1337 } | 1338 } |
| 1338 | 1339 |
| 1339 // For JavaScript frames we perform a lookup in the handler table. | 1340 // For JavaScript frames we perform a lookup in the handler table. |
| 1340 if (frame->is_java_script()) { | 1341 if (frame->is_java_script()) { |
| 1341 JavaScriptFrame* js_frame = static_cast<JavaScriptFrame*>(frame); | 1342 JavaScriptFrame* js_frame = static_cast<JavaScriptFrame*>(frame); |
| 1342 if (PredictException(js_frame) != HandlerTable::UNCAUGHT) { | 1343 HandlerTable::CatchPrediction prediction = PredictException(js_frame); |
| 1343 return CAUGHT_BY_JAVASCRIPT; | 1344 if (prediction == HandlerTable::DESUGARING) return CAUGHT_BY_DESUGARING; |
| 1344 } | 1345 if (prediction != HandlerTable::UNCAUGHT) return CAUGHT_BY_JAVASCRIPT; |
| 1345 } | 1346 } |
| 1346 | 1347 |
| 1347 // The exception has been externally caught if and only if there is an | 1348 // The exception has been externally caught if and only if there is an |
| 1348 // external handler which is on top of the top-most JS_ENTRY handler. | 1349 // external handler which is on top of the top-most JS_ENTRY handler. |
| 1349 if (external_handler != nullptr && !try_catch_handler()->is_verbose_) { | 1350 if (external_handler != nullptr && !try_catch_handler()->is_verbose_) { |
| 1350 if (entry_handler == nullptr || entry_handler > external_handler) { | 1351 if (entry_handler == nullptr || entry_handler > external_handler) { |
| 1351 return CAUGHT_BY_EXTERNAL; | 1352 return CAUGHT_BY_EXTERNAL; |
| 1352 } | 1353 } |
| 1353 } | 1354 } |
| 1354 } | 1355 } |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1743 tltop->promise_on_stack_ = prev; | 1744 tltop->promise_on_stack_ = prev; |
| 1744 global_handles()->Destroy(global_promise.location()); | 1745 global_handles()->Destroy(global_promise.location()); |
| 1745 } | 1746 } |
| 1746 | 1747 |
| 1747 | 1748 |
| 1748 Handle<Object> Isolate::GetPromiseOnStackOnThrow() { | 1749 Handle<Object> Isolate::GetPromiseOnStackOnThrow() { |
| 1749 Handle<Object> undefined = factory()->undefined_value(); | 1750 Handle<Object> undefined = factory()->undefined_value(); |
| 1750 ThreadLocalTop* tltop = thread_local_top(); | 1751 ThreadLocalTop* tltop = thread_local_top(); |
| 1751 if (tltop->promise_on_stack_ == NULL) return undefined; | 1752 if (tltop->promise_on_stack_ == NULL) return undefined; |
| 1752 // Find the top-most try-catch or try-finally handler. | 1753 // Find the top-most try-catch or try-finally handler. |
| 1753 if (PredictExceptionCatcher() != CAUGHT_BY_JAVASCRIPT) return undefined; | 1754 CatchType prediction = PredictExceptionCatcher(); |
| 1755 if (prediction == NOT_CAUGHT || prediction == CAUGHT_BY_EXTERNAL) { |
| 1756 return undefined; |
| 1757 } |
| 1754 for (JavaScriptFrameIterator it(this); !it.done(); it.Advance()) { | 1758 for (JavaScriptFrameIterator it(this); !it.done(); it.Advance()) { |
| 1755 switch (PredictException(it.frame())) { | 1759 switch (PredictException(it.frame())) { |
| 1756 case HandlerTable::UNCAUGHT: | 1760 case HandlerTable::UNCAUGHT: |
| 1757 break; | 1761 break; |
| 1758 case HandlerTable::CAUGHT: | 1762 case HandlerTable::CAUGHT: |
| 1763 case HandlerTable::DESUGARING: |
| 1759 return undefined; | 1764 return undefined; |
| 1760 case HandlerTable::PROMISE: | 1765 case HandlerTable::PROMISE: |
| 1761 return tltop->promise_on_stack_->promise(); | 1766 return tltop->promise_on_stack_->promise(); |
| 1762 } | 1767 } |
| 1763 } | 1768 } |
| 1764 return undefined; | 1769 return undefined; |
| 1765 } | 1770 } |
| 1766 | 1771 |
| 1767 | 1772 |
| 1768 void Isolate::SetCaptureStackTraceForUncaughtExceptions( | 1773 void Isolate::SetCaptureStackTraceForUncaughtExceptions( |
| (...skipping 1430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3199 // Then check whether this scope intercepts. | 3204 // Then check whether this scope intercepts. |
| 3200 if ((flag & intercept_mask_)) { | 3205 if ((flag & intercept_mask_)) { |
| 3201 intercepted_flags_ |= flag; | 3206 intercepted_flags_ |= flag; |
| 3202 return true; | 3207 return true; |
| 3203 } | 3208 } |
| 3204 return false; | 3209 return false; |
| 3205 } | 3210 } |
| 3206 | 3211 |
| 3207 } // namespace internal | 3212 } // namespace internal |
| 3208 } // namespace v8 | 3213 } // namespace v8 |
| OLD | NEW |