46ac1f653f
Commita52f2b9which reworked awaiter stack unwinding and its integration with debugger introduced the following regression: it stopped treating `Future` listeners which had both `onValue` and `onError` callbacks as catch all exception handlers. Only listners with `onError` callback (those created with `Future.onError`) were treated as a catch all handler. This meant that debugger started to treat exceptions in the code below as uncaught: ``` Future<void> foo() { await 0; throw ''; } await foo().then(..., onError: (e, st) { }); ``` This change fixes this regression by checking if `FutureListener.state & stateCatchError != 0` instead of more narrow `FutureListener.state == stateCatchError` which only detects listeners which only catch errors but do not handle values. The new predicate matches `FutureListener.handlesError`. This relands38e0046cadwith a fix to ensure that we correctly detect `onError` callbacks which simply forward to a suspended async function. We do this by marking FutureListener's that originate from `await` using a bit in the state. Fixes https://github.com/dart-lang/sdk/issues/53334 TEST=service/pause_on_unhandled_async_exceptions{_zones,}_test Fixed: 53334 CoreLibraryReviewExempt: No fundamental changes to _FutureListener implementation, just additional bit to detect that this listener originates from await Change-Id: I90385fc619cbb52925e075dd5c7b171a31ca4cab Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/323481 Commit-Queue: Slava Egorov <vegorov@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>