diff -r ce6dd1cee4c8 -r ffc1fbd7d1f5 rust/hg-cpython/src/dirstate/dirstate_map.rs --- a/rust/hg-cpython/src/dirstate/dirstate_map.rs Sun Sep 15 22:06:19 2019 +0900 +++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs Sun Sep 15 22:19:10 2019 +0900 @@ -304,35 +304,26 @@ } def keys(&self) -> PyResult { - let mut leak_handle = - unsafe { self.inner_shared(py).leak_immutable()? }; - let leaked_ref = leak_handle.data.take().unwrap(); + let leaked_ref = self.inner_shared(py).leak_immutable()?; DirstateMapKeysIterator::from_inner( py, - leak_handle, - leaked_ref.iter(), + unsafe { leaked_ref.map(py, |o| o.iter()) }, ) } def items(&self) -> PyResult { - let mut leak_handle = - unsafe { self.inner_shared(py).leak_immutable()? }; - let leaked_ref = leak_handle.data.take().unwrap(); + let leaked_ref = self.inner_shared(py).leak_immutable()?; DirstateMapItemsIterator::from_inner( py, - leak_handle, - leaked_ref.iter(), + unsafe { leaked_ref.map(py, |o| o.iter()) }, ) } def __iter__(&self) -> PyResult { - let mut leak_handle = - unsafe { self.inner_shared(py).leak_immutable()? }; - let leaked_ref = leak_handle.data.take().unwrap(); + let leaked_ref = self.inner_shared(py).leak_immutable()?; DirstateMapKeysIterator::from_inner( py, - leak_handle, - leaked_ref.iter(), + unsafe { leaked_ref.map(py, |o| o.iter()) }, ) } @@ -446,24 +437,18 @@ } def copymapiter(&self) -> PyResult { - let mut leak_handle = - unsafe { self.inner_shared(py).leak_immutable()? }; - let leaked_ref = leak_handle.data.take().unwrap(); + let leaked_ref = self.inner_shared(py).leak_immutable()?; CopyMapKeysIterator::from_inner( py, - leak_handle, - leaked_ref.copy_map.iter(), + unsafe { leaked_ref.map(py, |o| o.copy_map.iter()) }, ) } def copymapitemsiter(&self) -> PyResult { - let mut leak_handle = - unsafe { self.inner_shared(py).leak_immutable()? }; - let leaked_ref = leak_handle.data.take().unwrap(); + let leaked_ref = self.inner_shared(py).leak_immutable()?; CopyMapItemsIterator::from_inner( py, - leak_handle, - leaked_ref.copy_map.iter(), + unsafe { leaked_ref.map(py, |o| o.copy_map.iter()) }, ) } @@ -498,16 +483,14 @@ py_shared_iterator!( DirstateMapKeysIterator, - PyLeakedRef<&'static RustDirstateMap>, - StateMapIter<'static>, + PyLeakedRef>, DirstateMap::translate_key, Option ); py_shared_iterator!( DirstateMapItemsIterator, - PyLeakedRef<&'static RustDirstateMap>, - StateMapIter<'static>, + PyLeakedRef>, DirstateMap::translate_key_value, Option<(PyBytes, PyObject)> );