|
| 1 | +use pyo3::types::PyAnyMethods; |
| 2 | + |
1 | 3 | macro_rules! non_zero_or { |
2 | 4 | ($num:expr, $_else:expr) => { |
3 | 5 | unsafe { core::num::NonZeroUsize::new_unchecked(if $num == 0 { $_else } else { $num }) } |
@@ -180,23 +182,36 @@ macro_rules! extract_pickle_tuple { |
180 | 182 | #[inline] |
181 | 183 | #[cfg(not(PyPy))] |
182 | 184 | pub fn pyobject_size(py: pyo3::Python<'_>, obj: &pyo3::Py<pyo3::PyAny>) -> pyo3::PyResult<usize> { |
183 | | - use pyo3::types::PyAnyMethods; |
| 185 | + static SIZEOF_METHOD_NAME: &'static std::ffi::CStr = c"__sizeof__"; |
| 186 | + |
| 187 | + // PyPy does not support __sizeof__ or sys.getsizeof |
| 188 | + let sizeof_method = obj.bind(py).getattr(SIZEOF_METHOD_NAME)?; |
184 | 189 |
|
185 | | - obj.bind(py).call_method0("__sizeof__")?.extract::<usize>() |
| 190 | + unsafe { |
| 191 | + if pyo3::ffi::PyType_Check(obj.as_ptr()) == 1 { |
| 192 | + sizeof_method.call1((obj,))?.extract::<usize>() |
| 193 | + } else { |
| 194 | + sizeof_method.call0()?.extract::<usize>() |
| 195 | + } |
| 196 | + } |
186 | 197 | } |
187 | 198 |
|
188 | 199 | #[inline] |
189 | 200 | #[cfg(PyPy)] |
190 | 201 | pub fn pyobject_size(py: pyo3::Python<'_>, obj: &pyo3::Py<pyo3::PyAny>) -> pyo3::PyResult<usize> { |
191 | | - use pyo3::types::PyAnyMethods; |
192 | | - |
193 | | - static SIZEOF_METHOD_NAME: &'static str = "__sizeof__"; |
| 202 | + static SIZEOF_METHOD_NAME: &'static std::ffi::CStr = c"__sizeof__"; |
194 | 203 |
|
195 | 204 | // PyPy does not support __sizeof__ or sys.getsizeof |
196 | | - let has_sizeof = obj.bind(py).getattr_opt(SIZEOF_METHOD_NAME)?; |
| 205 | + let sizeof_method = obj.bind(py).getattr_opt(SIZEOF_METHOD_NAME)?; |
197 | 206 |
|
198 | | - match has_sizeof { |
199 | | - Some(x) => x.call0()?.extract::<usize>(), |
| 207 | + match sizeof_method { |
| 208 | + Some(sizeof_method) => unsafe { |
| 209 | + if pyo3::ffi::PyType_Check(obj.as_ptr()) == 1 { |
| 210 | + sizeof_method.call1((obj,))?.extract::<usize>() |
| 211 | + } else { |
| 212 | + sizeof_method.call0()?.extract::<usize>() |
| 213 | + } |
| 214 | + }, |
200 | 215 | None => Ok(1), |
201 | 216 | } |
202 | 217 | } |
|
0 commit comments