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

Unified Diff: src/isolate.cc

Issue 2161263003: [debug] use catch prediction flag for promise rejections. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: src/isolate.cc
diff --git a/src/isolate.cc b/src/isolate.cc
index dd1587082c7145559781d2604abe7522ef515dbf..a2761e58fc1d4711915c90ae03e5c75e9054b658 100644
--- a/src/isolate.cc
+++ b/src/isolate.cc
@@ -1278,7 +1278,7 @@ Isolate::CatchType Isolate::PredictExceptionCatcher() {
if (js_frame->LookupExceptionHandlerInTable(nullptr, &prediction) > 0) {
// We are conservative with our prediction: try-finally is considered
// to always rethrow, to meet the expectation of the debugger.
- if (prediction == HandlerTable::CAUGHT) return CAUGHT_BY_JAVASCRIPT;
+ if (prediction != HandlerTable::UNCAUGHT) return CAUGHT_BY_JAVASCRIPT;
Dan Ehrenberg 2016/07/21 21:07:33 This is big--it deserves a comment mentioning the
Dan Ehrenberg 2016/07/21 21:08:51 Sorry, please ignore this comment; I wrote it whil
}
}
@@ -1663,17 +1663,12 @@ bool Isolate::OptionalRescheduleException(bool is_bottom_call) {
return true;
}
-
-void Isolate::PushPromise(Handle<JSObject> promise,
- Handle<JSFunction> function) {
+void Isolate::PushPromise(Handle<JSObject> promise) {
ThreadLocalTop* tltop = thread_local_top();
PromiseOnStack* prev = tltop->promise_on_stack_;
Handle<JSObject> global_promise =
Handle<JSObject>::cast(global_handles()->Create(*promise));
- Handle<JSFunction> global_function =
- Handle<JSFunction>::cast(global_handles()->Create(*function));
- tltop->promise_on_stack_ =
- new PromiseOnStack(global_function, global_promise, prev);
+ tltop->promise_on_stack_ = new PromiseOnStack(global_promise, prev);
}
@@ -1681,11 +1676,9 @@ void Isolate::PopPromise() {
ThreadLocalTop* tltop = thread_local_top();
if (tltop->promise_on_stack_ == NULL) return;
PromiseOnStack* prev = tltop->promise_on_stack_->prev();
- Handle<Object> global_function = tltop->promise_on_stack_->function();
Handle<Object> global_promise = tltop->promise_on_stack_->promise();
delete tltop->promise_on_stack_;
tltop->promise_on_stack_ = prev;
- global_handles()->Destroy(global_function.location());
global_handles()->Destroy(global_promise.location());
}
@@ -1694,15 +1687,15 @@ Handle<Object> Isolate::GetPromiseOnStackOnThrow() {
Handle<Object> undefined = factory()->undefined_value();
ThreadLocalTop* tltop = thread_local_top();
if (tltop->promise_on_stack_ == NULL) return undefined;
- Handle<JSFunction> promise_function = tltop->promise_on_stack_->function();
// Find the top-most try-catch or try-finally handler.
if (PredictExceptionCatcher() != CAUGHT_BY_JAVASCRIPT) return undefined;
for (JavaScriptFrameIterator it(this); !it.done(); it.Advance()) {
JavaScriptFrame* frame = it.frame();
- if (frame->LookupExceptionHandlerInTable(nullptr, nullptr) > 0) {
+ HandlerTable::CatchPrediction prediction;
+ if (frame->LookupExceptionHandlerInTable(nullptr, &prediction) > 0) {
// Throwing inside a Promise only leads to a reject if not caught by an
// inner try-catch or try-finally.
- if (frame->function() == *promise_function) {
+ if (prediction == HandlerTable::PROMISE) {
Dan Ehrenberg 2016/07/21 21:07:33 Beautiful
return tltop->promise_on_stack_->promise();
}
return undefined;

Powered by Google App Engine
This is Rietveld 408576698