Show More
@@ -40,5 +40,3 b' impl GraphError {' | |||||
40 | } |
|
40 | } | |
41 |
|
41 | |||
42 | py_exception!(rustext, HgPathPyError, RuntimeError); |
|
42 | py_exception!(rustext, HgPathPyError, RuntimeError); | |
43 |
|
||||
44 | py_exception!(shared_ref, AlreadyBorrowed, RuntimeError); |
|
@@ -22,10 +22,10 b'' | |||||
22 |
|
22 | |||
23 | //! Macros for use in the `hg-cpython` bridge library. |
|
23 | //! Macros for use in the `hg-cpython` bridge library. | |
24 |
|
24 | |||
25 | use crate::exceptions::AlreadyBorrowed; |
|
|||
26 | use cpython::{exc, PyClone, PyErr, PyObject, PyResult, Python}; |
|
25 | use cpython::{exc, PyClone, PyErr, PyObject, PyResult, Python}; | |
27 | use std::cell::{Ref, RefCell, RefMut}; |
|
26 | use std::cell::{BorrowMutError, Ref, RefCell, RefMut}; | |
28 | use std::ops::{Deref, DerefMut}; |
|
27 | use std::ops::{Deref, DerefMut}; | |
|
28 | use std::result; | |||
29 | use std::sync::atomic::{AtomicUsize, Ordering}; |
|
29 | use std::sync::atomic::{AtomicUsize, Ordering}; | |
30 |
|
30 | |||
31 | /// Manages the shared state between Python and Rust |
|
31 | /// Manages the shared state between Python and Rust | |
@@ -139,17 +139,14 b' impl<T> PySharedRefCell<T> {' | |||||
139 | fn try_borrow_mut<'a>( |
|
139 | fn try_borrow_mut<'a>( | |
140 | &'a self, |
|
140 | &'a self, | |
141 | py: Python<'a>, |
|
141 | py: Python<'a>, | |
142 |
) -> |
|
142 | ) -> result::Result<RefMut<'a, T>, BorrowMutError> { | |
143 | if self.py_shared_state.current_borrow_count(py) > 0 { |
|
143 | if self.py_shared_state.current_borrow_count(py) > 0 { | |
144 | return Err(AlreadyBorrowed::new( |
|
144 | // propagate borrow-by-leaked state to inner to get BorrowMutError | |
145 | py, |
|
145 | let _dummy = self.inner.borrow(); | |
146 | "Cannot borrow mutably while immutably borrowed", |
|
146 | self.inner.try_borrow_mut()?; | |
147 | )); |
|
147 | unreachable!("BorrowMutError must be returned"); | |
148 | } |
|
148 | } | |
149 | let inner_ref = self |
|
149 | let inner_ref = self.inner.try_borrow_mut()?; | |
150 | .inner |
|
|||
151 | .try_borrow_mut() |
|
|||
152 | .map_err(|e| AlreadyBorrowed::new(py, e.to_string()))?; |
|
|||
153 | self.py_shared_state.increment_generation(py); |
|
150 | self.py_shared_state.increment_generation(py); | |
154 | Ok(inner_ref) |
|
151 | Ok(inner_ref) | |
155 | } |
|
152 | } | |
@@ -191,7 +188,9 b" impl<'a, T> PySharedRef<'a, T> {" | |||||
191 |
|
188 | |||
192 | /// Mutably borrows the wrapped value, returning an error if the value |
|
189 | /// Mutably borrows the wrapped value, returning an error if the value | |
193 | /// is currently borrowed. |
|
190 | /// is currently borrowed. | |
194 | pub fn try_borrow_mut(&self) -> PyResult<RefMut<'a, T>> { |
|
191 | pub fn try_borrow_mut( | |
|
192 | &self, | |||
|
193 | ) -> result::Result<RefMut<'a, T>, BorrowMutError> { | |||
195 | self.data.try_borrow_mut(self.py) |
|
194 | self.data.try_borrow_mut(self.py) | |
196 | } |
|
195 | } | |
197 |
|
196 |
General Comments 0
You need to be logged in to leave comments.
Login now