optimize is_instance for PyBaseException

This commit is contained in:
David Hewitt 2023-07-11 21:48:46 +01:00
parent 89b9bc384a
commit 272997555e
2 changed files with 7 additions and 7 deletions

View file

@ -181,12 +181,10 @@ impl PyErr {
/// }); /// });
/// ``` /// ```
pub fn from_value(obj: &PyAny) -> PyErr { pub fn from_value(obj: &PyAny) -> PyErr {
let ptr = obj.as_ptr(); let state = if let Ok(obj) = obj.downcast::<PyBaseException>() {
let state = if unsafe { ffi::PyExceptionInstance_Check(ptr) } != 0 {
PyErrState::Normalized(PyErrStateNormalized { PyErrState::Normalized(PyErrStateNormalized {
ptype: obj.get_type().into(), ptype: obj.get_type().into(),
pvalue: unsafe { Py::from_borrowed_ptr(obj.py(), obj.as_ptr()) }, pvalue: obj.into(),
ptraceback: None, ptraceback: None,
}) })
} else if unsafe { ffi::PyExceptionClass_Check(obj.as_ptr()) } != 0 { } else if unsafe { ffi::PyExceptionClass_Check(obj.as_ptr()) } != 0 {

View file

@ -260,13 +260,13 @@ macro_rules! create_exception_type_object {
} }
macro_rules! impl_native_exception ( macro_rules! impl_native_exception (
($name:ident, $exc_name:ident, $doc:expr, $layout:path) => ( ($name:ident, $exc_name:ident, $doc:expr, $layout:path $(, #checkfunction=$checkfunction:path)?) => (
#[doc = $doc] #[doc = $doc]
#[allow(clippy::upper_case_acronyms)] #[allow(clippy::upper_case_acronyms)]
pub struct $name($crate::PyAny); pub struct $name($crate::PyAny);
$crate::impl_exception_boilerplate!($name); $crate::impl_exception_boilerplate!($name);
$crate::pyobject_native_type!($name, $layout, |_py| unsafe { $crate::ffi::$exc_name as *mut $crate::ffi::PyTypeObject }); $crate::pyobject_native_type!($name, $layout, |_py| unsafe { $crate::ffi::$exc_name as *mut $crate::ffi::PyTypeObject } $(, #checkfunction=$checkfunction)?);
); );
($name:ident, $exc_name:ident, $doc:expr) => ( ($name:ident, $exc_name:ident, $doc:expr) => (
impl_native_exception!($name, $exc_name, $doc, $crate::ffi::PyBaseExceptionObject); impl_native_exception!($name, $exc_name, $doc, $crate::ffi::PyBaseExceptionObject);
@ -359,7 +359,9 @@ Python::with_gil(|py| {
impl_native_exception!( impl_native_exception!(
PyBaseException, PyBaseException,
PyExc_BaseException, PyExc_BaseException,
native_doc!("BaseException") native_doc!("BaseException"),
ffi::PyBaseExceptionObject,
#checkfunction=ffi::PyExceptionInstance_Check
); );
impl_native_exception!(PyException, PyExc_Exception, native_doc!("Exception")); impl_native_exception!(PyException, PyExc_Exception, native_doc!("Exception"));
impl_native_exception!( impl_native_exception!(