Check buffer protocol support before getting buffer in sequence protocol specialization

This avoids calling a expensive `PyErr_Format` inside of
`PyObject_GetBuffer` when buffer protocol is unsupported
This commit is contained in:
messense 2021-03-16 13:32:14 +08:00
parent b7376da739
commit ba7644849d
1 changed files with 6 additions and 4 deletions

View File

@ -287,12 +287,14 @@ macro_rules! array_impls {
fn extract(obj: &'source PyAny) -> PyResult<Self> {
let mut array = [T::default(); $N];
// first try buffer protocol
if let Ok(buf) = crate::buffer::PyBuffer::get(obj) {
if buf.dimensions() == 1 && buf.copy_to_slice(obj.py(), &mut array).is_ok() {
if unsafe { ffi::PyObject_CheckBuffer(obj.as_ptr()) } == 1 {
if let Ok(buf) = crate::buffer::PyBuffer::get(obj) {
if buf.dimensions() == 1 && buf.copy_to_slice(obj.py(), &mut array).is_ok() {
buf.release(obj.py());
return Ok(array);
}
buf.release(obj.py());
return Ok(array);
}
buf.release(obj.py());
}
// fall back to sequence protocol
extract_sequence_into_slice(obj, &mut array)?;