From 5aff2ccc9e78cdf0b82f838277a1d8b6180d6fbf Mon Sep 17 00:00:00 2001 From: Samuel Colvin Date: Fri, 24 Mar 2023 15:46:49 +0000 Subject: [PATCH] stop panic on to_string, report using write_unraisable instead --- newsfragments/3062.fixed.md | 1 + src/types/mod.rs | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 newsfragments/3062.fixed.md diff --git a/newsfragments/3062.fixed.md b/newsfragments/3062.fixed.md new file mode 100644 index 00000000000..9738978f7b4 --- /dev/null +++ b/newsfragments/3062.fixed.md @@ -0,0 +1 @@ +Stop panic on `fmt::Display`, instead return `""` string and report error via `sys.unraisablehook()` diff --git a/src/types/mod.rs b/src/types/mod.rs index 8d3e2714383..235093dfa93 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -99,8 +99,15 @@ macro_rules! pyobject_native_type_base( fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::result::Result<(), ::std::fmt::Error> { - let s = self.str().or(::std::result::Result::Err(::std::fmt::Error))?; - f.write_str(&s.to_string_lossy()) + match self.str() { + ::std::result::Result::Ok(s) => return f.write_str(&s.to_string_lossy()), + ::std::result::Result::Err(err) => err.write_unraisable(self.py(), ::std::option::Option::Some(self)), + } + + match self.get_type().name() { + ::std::result::Result::Ok(name) => ::std::write!(f, "", name), + ::std::result::Result::Err(_err) => f.write_str(""), + } } }