From 101563c703954c305d16b06f313535eee886d613 Mon Sep 17 00:00:00 2001 From: David Hewitt Date: Wed, 28 Feb 2024 07:25:47 +0000 Subject: [PATCH] review: LilyFoote, Icxolu feedback --- pyo3-macros-backend/src/method.rs | 2 +- pyo3-macros-backend/src/params.rs | 4 ++-- pyo3-macros-backend/src/pymethod.rs | 2 +- src/impl_/pymethods.rs | 8 ++++++++ src/types/dict.rs | 4 ++++ 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pyo3-macros-backend/src/method.rs b/pyo3-macros-backend/src/method.rs index 46fb779cc19..6ee87fb99a6 100644 --- a/pyo3-macros-backend/src/method.rs +++ b/pyo3-macros-backend/src/method.rs @@ -196,7 +196,7 @@ impl SelfType { holders.push(quote_spanned! { *span => #[allow(clippy::let_unit_value)] let mut #holder = _pyo3::impl_::extract_argument::FunctionArgumentHolder::INIT; - let mut #slf = _pyo3::Borrowed::from_ptr(#py, #slf); + let mut #slf = _pyo3::impl_::pymethods::BoundRef::ref_from_ptr(#py, &#slf); }); error_mode.handle_error(quote_spanned! { *span => _pyo3::impl_::extract_argument::#method::<#cls>( diff --git a/pyo3-macros-backend/src/params.rs b/pyo3-macros-backend/src/params.rs index 13547839fda..679d3e4260a 100644 --- a/pyo3-macros-backend/src/params.rs +++ b/pyo3-macros-backend/src/params.rs @@ -44,8 +44,8 @@ pub fn impl_arg_params( .collect::>()?; return Ok(( quote! { - let _args = _pyo3::Borrowed::from_ptr(py, _args); - let _kwargs = _pyo3::Borrowed::from_ptr_or_opt(py, _kwargs); + let _args = _pyo3::impl_::pymethods::BoundRef::ref_from_ptr(py, &_args); + let _kwargs = _pyo3::impl_::pymethods::BoundRef::ref_from_ptr_or_opt(py, &_kwargs); }, arg_convert, )); diff --git a/pyo3-macros-backend/src/pymethod.rs b/pyo3-macros-backend/src/pymethod.rs index 854e9e39d46..4cb07a9ad2a 100644 --- a/pyo3-macros-backend/src/pymethod.rs +++ b/pyo3-macros-backend/src/pymethod.rs @@ -990,7 +990,7 @@ fn extract_object( }); extract_error_mode.handle_error(quote! { _pyo3::impl_::extract_argument::extract_argument( - &_pyo3::Borrowed::from_ptr(py, #source_ptr), + &_pyo3::impl_::pymethods::BoundRef::ref_from_ptr(py, &#source_ptr), &mut #holder, #name ) diff --git a/src/impl_/pymethods.rs b/src/impl_/pymethods.rs index 468395657ae..70c95ca0883 100644 --- a/src/impl_/pymethods.rs +++ b/src/impl_/pymethods.rs @@ -561,3 +561,11 @@ impl From> for Py { bound.0.clone().unbind() } } + +impl<'py, T> std::ops::Deref for BoundRef<'_, 'py, T> { + type Target = Bound<'py, T>; + #[inline] + fn deref(&self) -> &Self::Target { + self.0 + } +} diff --git a/src/types/dict.rs b/src/types/dict.rs index e89ece97ce9..daae753c6cc 100644 --- a/src/types/dict.rs +++ b/src/types/dict.rs @@ -692,11 +692,15 @@ mod borrowed_iter { let mut key: *mut ffi::PyObject = std::ptr::null_mut(); let mut value: *mut ffi::PyObject = std::ptr::null_mut(); + // Safety: self.dict lives sufficiently long that the pointer is not dangling if unsafe { ffi::PyDict_Next(self.dict.as_ptr(), &mut self.ppos, &mut key, &mut value) } != 0 { let py = self.dict.py(); self.len -= 1; + // Safety: + // - PyDict_Next returns borrowed values + // - we have already checked that `PyDict_Next` succeeded, so we can assume these to be non-null Some(unsafe { (key.assume_borrowed(py), value.assume_borrowed(py)) }) } else { None