frame_unwind_try_unwinder (struct frame_info *this_frame, void **this_cache,
const struct frame_unwind *unwinder)
{
- struct cleanup *old_cleanup;
int res = 0;
- old_cleanup = frame_prepare_for_sniffer (this_frame, unwinder);
+ frame_prepare_for_sniffer (this_frame, unwinder);
TRY
{
res = unwinder->sniffer (unwinder, this_frame, this_cache);
}
- CATCH (ex, RETURN_MASK_ERROR)
+ CATCH (ex, RETURN_MASK_ALL)
{
+ /* Catch all exceptions, caused by either interrupt or error.
+ Reset *THIS_CACHE. */
+ *this_cache = NULL;
if (ex.error == NOT_AVAILABLE_ERROR)
{
/* This usually means that not even the PC is available,
thus most unwinders aren't able to determine if they're
the best fit. Keep trying. Fallback prologue unwinders
should always accept the frame. */
- do_cleanups (old_cleanup);
+ frame_cleanup_after_sniffer (this_frame);
return 0;
}
throw_exception (ex);
END_CATCH
if (res)
- {
- discard_cleanups (old_cleanup);
- return 1;
- }
+ return 1;
else
{
- do_cleanups (old_cleanup);
+ /* Don't set *THIS_CACHE to NULL here, because sniffer has to do
+ so. */
+ frame_cleanup_after_sniffer (this_frame);
return 0;
}
gdb_assert_not_reached ("frame_unwind_try_unwinder");
return reg_val;
}
-/* -Wmissing-prototypes */
-extern initialize_file_ftype _initialize_frame_unwind;
-
void
_initialize_frame_unwind (void)
{