Mercurial > public > mercurial-scm > hg-stable
diff rust/pyo3-sharedref/src/lib.rs @ 52633:d85514a88706
rust-pyo3-sharedref: reworked constructors
We had previously duplicated the `new` associated function on
`PySharedRef` with a method on `PySharedRefCell`: in `rust-cpython`,
the former was hidden by the accessor defined by the `py_class!` macro,
which we did not port yet.
On `PySharedRefCell` itself, replacing the `new` associated function
by the `From` trait carries all the needed semantics, and has the
advantage of less repetititons of the type name, which will help
with further refactorings and renamings.
author | Georges Racinet <georges.racinet@cloudcrane.io> |
---|---|
date | Sun, 15 Dec 2024 14:42:53 +0100 |
parents | be765f6797cc |
children | d1e304025b90 |
line wrap: on
line diff
--- a/rust/pyo3-sharedref/src/lib.rs Sat Dec 14 18:21:56 2024 +0100 +++ b/rust/pyo3-sharedref/src/lib.rs Sun Dec 15 14:42:53 2024 +0100 @@ -83,9 +83,7 @@ /// fn new(values: &Bound<'_, PyTuple>) -> PyResult<Self> { /// let as_vec = values.extract::<Vec<i32>>()?; /// let s: HashSet<_> = as_vec.iter().copied().collect(); -/// Ok(Self { -/// rust_set: PySharedRefCell::new(s), -/// }) +/// Ok(Self { rust_set: s.into() }) /// } /// /// fn __iter__(slf: &Bound<'_, Self>) -> SetIterator { @@ -94,7 +92,7 @@ /// /// fn add(slf: &Bound<'_, Self>, i: i32) -> PyResult<()> { /// let rust_set = &slf.borrow().rust_set; -/// let shared_ref = unsafe { rust_set.borrow(slf) }; +/// let shared_ref = unsafe { rust_set.borrow_with_owner(slf) }; /// let mut set_ref = shared_ref.borrow_mut(); /// set_ref.insert(i); /// Ok(()) @@ -112,7 +110,7 @@ /// fn new(s: &Bound<'_, Set>) -> Self { /// let py = s.py(); /// let rust_set = &s.borrow().rust_set; -/// let shared_ref = unsafe { rust_set.borrow(s) }; +/// let shared_ref = unsafe { rust_set.borrow_with_owner(s) }; /// let leaked_set = shared_ref.leak_immutable(); /// let iter = unsafe { leaked_set.map(py, |o| o.iter()) }; /// Self { @@ -176,14 +174,6 @@ } impl<T> PySharedRefCell<T> { - /// Creates a new `PySharedRefCell` containing `value`. - pub fn new(value: T) -> PySharedRefCell<T> { - Self { - state: PySharedState::new(), - data: value.into(), - } - } - /// Borrows the shared data and its state, keeping a reference /// on the owner Python object. /// @@ -191,7 +181,7 @@ /// /// The `data` must be owned by the `owner`. Otherwise, calling /// `leak_immutable()` on the shared ref would create an invalid reference. - pub unsafe fn borrow<'py>( + pub unsafe fn borrow_with_owner<'py>( &'py self, owner: &'py Bound<'py, PyAny>, ) -> PySharedRef<'py, T> { @@ -203,6 +193,15 @@ } } +impl<T> From<T> for PySharedRefCell<T> { + fn from(value: T) -> Self { + Self { + state: PySharedState::new(), + data: value.into(), + } + } +} + /// Errors that can happen in `leak_immutable()` #[derive(Debug, PartialEq, Eq)] pub enum TryLeakError { @@ -231,25 +230,6 @@ } impl<'py, T: ?Sized> PySharedRef<'py, T> { - /// Creates a reference to the given `PySharedRefCell` owned by the - /// given `PyObject`. - /// - /// # Safety - /// - /// The `data` must be owned by the `owner`. Otherwise, `leak_immutable()` - /// would create an invalid reference. - #[doc(hidden)] - pub unsafe fn new( - owner: &'py Bound<'py, PyAny>, - data: &'py PySharedRefCell<T>, - ) -> Self { - Self { - owner, - state: &data.state, - data: &data.data, - } - } - /// Immutably borrows the wrapped value. /// /// # Panics