stop panic on to_string, report using write_unraisable instead

This commit is contained in:
Samuel Colvin 2023-03-24 15:46:49 +00:00 committed by Adam Reichold
parent c27a6333d6
commit 5aff2ccc9e
2 changed files with 10 additions and 2 deletions

View File

@ -0,0 +1 @@
Stop panic on `fmt::Display`, instead return `"<unprintable object>"` string and report error via `sys.unraisablehook()`

View File

@ -99,8 +99,15 @@ macro_rules! pyobject_native_type_base(
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>)
-> ::std::result::Result<(), ::std::fmt::Error> -> ::std::result::Result<(), ::std::fmt::Error>
{ {
let s = self.str().or(::std::result::Result::Err(::std::fmt::Error))?; match self.str() {
f.write_str(&s.to_string_lossy()) ::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, "<unprintable {} object>", name),
::std::result::Result::Err(_err) => f.write_str("<unprintable object>"),
}
} }
} }