Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove fn backtrace and replace with usages of provider API #99431

Merged
merged 1 commit into from
Aug 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 33 additions & 41 deletions library/std/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -260,20 +260,6 @@ pub trait Error: Debug + Display {
TypeId::of::<Self>()
}

/// Returns a stack backtrace, if available, of where this error occurred.
///
/// This function allows inspecting the location, in code, of where an error
/// happened. The returned `Backtrace` contains information about the stack
/// trace of the OS thread of execution of where the error originated from.
///
/// Note that not all errors contain a `Backtrace`. Also note that a
/// `Backtrace` may actually be empty. For more information consult the
/// `Backtrace` type itself.
#[unstable(feature = "backtrace", issue = "53487")]
fn backtrace(&self) -> Option<&Backtrace> {
None
}

/// ```
/// if let Err(e) = "xc".parse::<u32>() {
/// // Print `e` itself, no need for description().
Expand Down Expand Up @@ -370,7 +356,7 @@ pub trait Error: Debug + Display {
}

#[unstable(feature = "error_generic_member_access", issue = "99301")]
impl Provider for dyn Error + 'static {
impl<'b> Provider for dyn Error + 'b {
fn provide<'a>(&'a self, req: &mut Demand<'a>) {
self.provide(req)
}
Expand Down Expand Up @@ -757,8 +743,8 @@ impl<'a, T: Error + ?Sized> Error for &'a T {
Error::source(&**self)
}

fn backtrace(&self) -> Option<&Backtrace> {
Error::backtrace(&**self)
fn provide<'b>(&'b self, req: &mut Demand<'b>) {
Error::provide(&**self, req);
}
}

Expand All @@ -778,8 +764,8 @@ impl<T: Error + ?Sized> Error for Arc<T> {
Error::source(&**self)
}

fn backtrace(&self) -> Option<&Backtrace> {
Error::backtrace(&**self)
fn provide<'a>(&'a self, req: &mut Demand<'a>) {
Error::provide(&**self, req);
}
}

Expand Down Expand Up @@ -871,6 +857,20 @@ impl Error for alloc::ffi::IntoStringError {
}
}

impl<'a> dyn Error + 'a {
/// Request a reference of type `T` as context about this error.
#[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_ref<T: ?Sized + 'static>(&'a self) -> Option<&'a T> {
core::any::request_ref(self)
}

/// Request a value of type `T` as context about this error.
#[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_value<T: 'static>(&'a self) -> Option<T> {
core::any::request_value(self)
}
}
joshtriplett marked this conversation as resolved.
Show resolved Hide resolved

// Copied from `any.rs`.
impl dyn Error + 'static {
/// Returns `true` if the inner type is the same as `T`.
Expand Down Expand Up @@ -910,18 +910,6 @@ impl dyn Error + 'static {
None
}
}

/// Request a reference of type `T` as context about this error.
#[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
core::any::request_ref(self)
}

/// Request a value of type `T` as context about this error.
#[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_value<T: 'static>(&self) -> Option<T> {
core::any::request_value(self)
}
}

impl dyn Error + 'static + Send {
Expand Down Expand Up @@ -949,13 +937,13 @@ impl dyn Error + 'static + Send {
/// Request a reference of type `T` as context about this error.
#[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
<dyn Error + 'static>::request_ref(self)
<dyn Error>::request_ref(self)
}

/// Request a value of type `T` as context about this error.
#[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_value<T: 'static>(&self) -> Option<T> {
<dyn Error + 'static>::request_value(self)
<dyn Error>::request_value(self)
}
}

Expand Down Expand Up @@ -984,13 +972,13 @@ impl dyn Error + 'static + Send + Sync {
/// Request a reference of type `T` as context about this error.
#[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
<dyn Error + 'static>::request_ref(self)
<dyn Error>::request_ref(self)
}

/// Request a value of type `T` as context about this error.
#[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_value<T: 'static>(&self) -> Option<T> {
<dyn Error + 'static>::request_value(self)
<dyn Error>::request_value(self)
}
}

Expand Down Expand Up @@ -1467,8 +1455,11 @@ impl<E> Report<E> {
/// ```rust
/// #![feature(error_reporter)]
/// #![feature(backtrace)]
/// #![feature(provide_any)]
/// #![feature(error_generic_member_access)]
/// # use std::error::Error;
/// # use std::fmt;
/// use std::any::Demand;
/// use std::error::Report;
/// use std::backtrace::Backtrace;
///
Expand Down Expand Up @@ -1498,8 +1489,9 @@ impl<E> Report<E> {
/// }
///
/// impl Error for SuperErrorSideKick {
/// fn backtrace(&self) -> Option<&Backtrace> {
/// Some(&self.backtrace)
/// fn provide<'a>(&'a self, req: &mut Demand<'a>) {
/// req
/// .provide_ref::<Backtrace>(&self.backtrace);
/// }
/// }
///
Expand Down Expand Up @@ -1552,11 +1544,11 @@ where
fn backtrace(&self) -> Option<&Backtrace> {
// have to grab the backtrace on the first error directly since that error may not be
// 'static
let backtrace = self.error.backtrace();
let backtrace = (&self.error as &dyn Error).request_ref();
joshtriplett marked this conversation as resolved.
Show resolved Hide resolved
let backtrace = backtrace.or_else(|| {
self.error
.source()
.map(|source| source.chain().find_map(|source| source.backtrace()))
.map(|source| source.chain().find_map(|source| source.request_ref()))
.flatten()
});
backtrace
Expand Down Expand Up @@ -1618,11 +1610,11 @@ impl Report<Box<dyn Error>> {
fn backtrace(&self) -> Option<&Backtrace> {
// have to grab the backtrace on the first error directly since that error may not be
// 'static
let backtrace = self.error.backtrace();
let backtrace = self.error.request_ref();
joshtriplett marked this conversation as resolved.
Show resolved Hide resolved
let backtrace = backtrace.or_else(|| {
self.error
.source()
.map(|source| source.chain().find_map(|source| source.backtrace()))
.map(|source| source.chain().find_map(|source| source.request_ref()))
.flatten()
});
backtrace
Expand Down
5 changes: 3 additions & 2 deletions library/std/src/error/tests.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use super::Error;
use crate::fmt;
use core::any::Demand;

#[derive(Debug, PartialEq)]
struct A;
Expand Down Expand Up @@ -198,8 +199,8 @@ where
self.source.as_deref()
}

fn backtrace(&self) -> Option<&Backtrace> {
self.backtrace.as_ref()
fn provide<'a>(&'a self, req: &mut Demand<'a>) {
self.backtrace.as_ref().map(|bt| req.provide_ref::<Backtrace>(bt));
}
}

Expand Down