# HG changeset patch # User Yuya Nishihara # Date 2019-09-08 04:08:59 # Node ID 74d67c645278c144d9b1d855925ed7ed40edc7e4 # Parent ea91a126c803dca31d97aaedf3465a1108b9f5dc rust-cpython: remove Option<_> from interface of py_shared_iterator It's the implementation detail of the py_shared_iterator that the leaked reference is kept in Option<_> so that it can be dropped early. diff --git a/rust/hg-cpython/src/dirstate/dirstate_map.rs b/rust/hg-cpython/src/dirstate/dirstate_map.rs --- a/rust/hg-cpython/src/dirstate/dirstate_map.rs +++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs @@ -323,7 +323,7 @@ py_class!(pub class DirstateMap |py| { let (leak_handle, leaked_ref) = unsafe { self.leak_immutable(py)? }; DirstateMapKeysIterator::from_inner( py, - Some(leak_handle), + leak_handle, leaked_ref.iter(), ) } @@ -332,7 +332,7 @@ py_class!(pub class DirstateMap |py| { let (leak_handle, leaked_ref) = unsafe { self.leak_immutable(py)? }; DirstateMapItemsIterator::from_inner( py, - Some(leak_handle), + leak_handle, leaked_ref.iter(), ) } @@ -341,7 +341,7 @@ py_class!(pub class DirstateMap |py| { let (leak_handle, leaked_ref) = unsafe { self.leak_immutable(py)? }; DirstateMapKeysIterator::from_inner( py, - Some(leak_handle), + leak_handle, leaked_ref.iter(), ) } @@ -438,7 +438,7 @@ py_class!(pub class DirstateMap |py| { let (leak_handle, leaked_ref) = unsafe { self.leak_immutable(py)? }; CopyMapKeysIterator::from_inner( py, - Some(leak_handle), + leak_handle, leaked_ref.copy_map.iter(), ) } @@ -447,7 +447,7 @@ py_class!(pub class DirstateMap |py| { let (leak_handle, leaked_ref) = unsafe { self.leak_immutable(py)? }; CopyMapItemsIterator::from_inner( py, - Some(leak_handle), + leak_handle, leaked_ref.copy_map.iter(), ) } diff --git a/rust/hg-cpython/src/ref_sharing.rs b/rust/hg-cpython/src/ref_sharing.rs --- a/rust/hg-cpython/src/ref_sharing.rs +++ b/rust/hg-cpython/src/ref_sharing.rs @@ -378,12 +378,12 @@ macro_rules! py_shared_iterator { impl $name { pub fn from_inner( py: Python, - leaked: Option<$leaked>, + leaked: $leaked, it: $iterator_type ) -> PyResult { Self::create_instance( py, - RefCell::new(leaked), + RefCell::new(Some(leaked)), RefCell::new(it) ) }