Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: src/isolate.cc

Issue 2276243002: Mark await expressions as caught or uncaught (Closed)
Patch Set: Format Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 1293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1304 // For JSEntryStub frames we update the JS_ENTRY handler. 1304 // For JSEntryStub frames we update the JS_ENTRY handler.
1305 if (frame->is_entry() || frame->is_entry_construct()) { 1305 if (frame->is_entry() || frame->is_entry_construct()) {
1306 entry_handler = frame->top_handler()->next()->address(); 1306 entry_handler = frame->top_handler()->next()->address();
1307 } 1307 }
1308 1308
1309 // For JavaScript frames we perform a lookup in the handler table. 1309 // For JavaScript frames we perform a lookup in the handler table.
1310 if (frame->is_java_script()) { 1310 if (frame->is_java_script()) {
1311 JavaScriptFrame* js_frame = static_cast<JavaScriptFrame*>(frame); 1311 JavaScriptFrame* js_frame = static_cast<JavaScriptFrame*>(frame);
1312 HandlerTable::CatchPrediction prediction = PredictException(js_frame); 1312 HandlerTable::CatchPrediction prediction = PredictException(js_frame);
1313 if (prediction == HandlerTable::DESUGARING) return CAUGHT_BY_DESUGARING; 1313 if (prediction == HandlerTable::DESUGARING) return CAUGHT_BY_DESUGARING;
1314 if (prediction == HandlerTable::ASYNC_AWAIT) return CAUGHT_BY_ASYNC_AWAIT;
1315 if (prediction == HandlerTable::PROMISE) return CAUGHT_BY_PROMISE;
1314 if (prediction != HandlerTable::UNCAUGHT) return CAUGHT_BY_JAVASCRIPT; 1316 if (prediction != HandlerTable::UNCAUGHT) return CAUGHT_BY_JAVASCRIPT;
1315 } 1317 }
1316 1318
1317 // The exception has been externally caught if and only if there is an 1319 // The exception has been externally caught if and only if there is an
1318 // external handler which is on top of the top-most JS_ENTRY handler. 1320 // external handler which is on top of the top-most JS_ENTRY handler.
1319 if (external_handler != nullptr && !try_catch_handler()->is_verbose_) { 1321 if (external_handler != nullptr && !try_catch_handler()->is_verbose_) {
1320 if (entry_handler == nullptr || entry_handler > external_handler) { 1322 if (entry_handler == nullptr || entry_handler > external_handler) {
1321 return CAUGHT_BY_EXTERNAL; 1323 return CAUGHT_BY_EXTERNAL;
1322 } 1324 }
1323 } 1325 }
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1694 void Isolate::PopPromise() { 1696 void Isolate::PopPromise() {
1695 ThreadLocalTop* tltop = thread_local_top(); 1697 ThreadLocalTop* tltop = thread_local_top();
1696 if (tltop->promise_on_stack_ == NULL) return; 1698 if (tltop->promise_on_stack_ == NULL) return;
1697 PromiseOnStack* prev = tltop->promise_on_stack_->prev(); 1699 PromiseOnStack* prev = tltop->promise_on_stack_->prev();
1698 Handle<Object> global_promise = tltop->promise_on_stack_->promise(); 1700 Handle<Object> global_promise = tltop->promise_on_stack_->promise();
1699 delete tltop->promise_on_stack_; 1701 delete tltop->promise_on_stack_;
1700 tltop->promise_on_stack_ = prev; 1702 tltop->promise_on_stack_ = prev;
1701 global_handles()->Destroy(global_promise.location()); 1703 global_handles()->Destroy(global_promise.location());
1702 } 1704 }
1703 1705
1706 bool Isolate::PromiseHasUserDefinedRejectHandler(Handle<JSObject> promise) {
1707 Handle<JSFunction> fun = promise_has_user_defined_reject_handler();
1708 Handle<Object> has_reject_handler;
1709 ASSIGN_RETURN_ON_EXCEPTION_VALUE(this, has_reject_handler,
1710 Execution::Call(this, fun, promise, 0, NULL),
1711 false);
1712 return has_reject_handler->IsTrue(this);
1713 }
1704 1714
1705 Handle<Object> Isolate::GetPromiseOnStackOnThrow() { 1715 Handle<Object> Isolate::GetPromiseOnStackOnThrow() {
1706 Handle<Object> undefined = factory()->undefined_value(); 1716 Handle<Object> undefined = factory()->undefined_value();
1707 ThreadLocalTop* tltop = thread_local_top(); 1717 ThreadLocalTop* tltop = thread_local_top();
1708 if (tltop->promise_on_stack_ == NULL) return undefined; 1718 if (tltop->promise_on_stack_ == NULL) return undefined;
1709 // Find the top-most try-catch or try-finally handler. 1719 // Find the top-most try-catch or try-finally handler.
1710 CatchType prediction = PredictExceptionCatcher(); 1720 CatchType prediction = PredictExceptionCatcher();
1711 if (prediction == NOT_CAUGHT || prediction == CAUGHT_BY_EXTERNAL) { 1721 if (prediction == NOT_CAUGHT || prediction == CAUGHT_BY_EXTERNAL) {
1712 return undefined; 1722 return undefined;
1713 } 1723 }
1714 for (JavaScriptFrameIterator it(this); !it.done(); it.Advance()) { 1724 for (JavaScriptFrameIterator it(this); !it.done(); it.Advance()) {
1715 switch (PredictException(it.frame())) { 1725 switch (PredictException(it.frame())) {
1716 case HandlerTable::UNCAUGHT: 1726 case HandlerTable::UNCAUGHT:
1717 break; 1727 break;
1718 case HandlerTable::CAUGHT: 1728 case HandlerTable::CAUGHT:
1719 case HandlerTable::DESUGARING: 1729 case HandlerTable::DESUGARING:
1720 return undefined; 1730 return undefined;
1721 case HandlerTable::PROMISE: 1731 case HandlerTable::PROMISE:
1722 return tltop->promise_on_stack_->promise(); 1732 return tltop->promise_on_stack_->promise();
1733 case HandlerTable::ASYNC_AWAIT: {
1734 // If in an async/await, pop up successive async/await stack frames
1735 // until an asynchronous one with dependents is found, or a non-async
1736 // stack frame is encountered, in order to handle the synchronous
1737 // async/await catch prediction case: assume that async function calls
1738 // are awaited.
1739 PromiseOnStack* promise_on_stack = tltop->promise_on_stack_;
1740 for (it.Advance(); !it.done(); it.Advance()) {
1741 if (PromiseHasUserDefinedRejectHandler(promise_on_stack->promise())) {
1742 break;
1743 }
1744 JavaScriptFrame* frame = it.frame();
1745 if (!frame->function()->shared()->is_async()) {
1746 // Keep searching up the stack until an async function stack frame
1747 // is found, heuristically assuming that that will ultimately await
1748 // whatever is going on here.
1749 continue;
1750 }
1751 PromiseOnStack* next_promise_on_stack = promise_on_stack->prev();
1752 if (next_promise_on_stack == nullptr) break;
1753 switch (PredictException(it.frame())) {
1754 case HandlerTable::CAUGHT:
1755 case HandlerTable::DESUGARING: {
1756 // Mark the inner promise as caught in the "synchronous case" so
1757 // that Debug::OnException will see.
1758 Handle<Symbol> key = factory()->promise_handled_hint_symbol();
1759 JSObject::SetProperty(promise_on_stack->promise(), key, key,
1760 STRICT)
1761 .Assert();
1762 return promise_on_stack->promise();
1763 }
1764 case HandlerTable::ASYNC_AWAIT:
1765 promise_on_stack = next_promise_on_stack;
1766 continue;
1767 case HandlerTable::PROMISE:
1768 case HandlerTable::UNCAUGHT:
1769 UNREACHABLE();
1770 }
1771 }
1772 return promise_on_stack->promise();
1773 }
1723 } 1774 }
1724 } 1775 }
1725 return undefined; 1776 return undefined;
1726 } 1777 }
1727 1778
1728 1779
1729 void Isolate::SetCaptureStackTraceForUncaughtExceptions( 1780 void Isolate::SetCaptureStackTraceForUncaughtExceptions(
1730 bool capture, 1781 bool capture,
1731 int frame_limit, 1782 int frame_limit,
1732 StackTrace::StackTraceOptions options) { 1783 StackTrace::StackTraceOptions options) {
(...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after
3162 // Then check whether this scope intercepts. 3213 // Then check whether this scope intercepts.
3163 if ((flag & intercept_mask_)) { 3214 if ((flag & intercept_mask_)) {
3164 intercepted_flags_ |= flag; 3215 intercepted_flags_ |= flag;
3165 return true; 3216 return true;
3166 } 3217 }
3167 return false; 3218 return false;
3168 } 3219 }
3169 3220
3170 } // namespace internal 3221 } // namespace internal
3171 } // namespace v8 3222 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698