Mercurial > hg
diff rust/hg-cpython/src/dirstate/dirstate_map.rs @ 43208:1ca3823aeefd
rust-cpython: add wrapper around decapsule_make_dirstate_tuple()
There are a couple of safety issues. First, the returned function pointer
must be unsafe. Second, its return value must be a raw pointer (i.e.
python27_sys::PyObject), not a cpython::PyObject. The wrapper function will
address these issues.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 13 Oct 2019 16:55:17 +0900 |
parents | b3dda04e851b |
children | 478d0b1bf0c5 |
line wrap: on
line diff
--- a/rust/hg-cpython/src/dirstate/dirstate_map.rs Sun Oct 13 02:10:26 2019 +0200 +++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs Sun Oct 13 16:55:17 2019 +0900 @@ -16,11 +16,10 @@ exc, ObjectProtocol, PyBool, PyBytes, PyClone, PyDict, PyErr, PyObject, PyResult, PyTuple, Python, PythonObject, ToPyObject, }; -use libc::c_char; use crate::{ dirstate::copymap::{CopyMap, CopyMapItemsIterator, CopyMapKeysIterator}, - dirstate::{decapsule_make_dirstate_tuple, dirs_multiset::Dirs}, + dirstate::{dirs_multiset::Dirs, make_dirstate_tuple}, ref_sharing::{PyLeakedRef, PySharedRefCell}, }; use hg::{ @@ -66,15 +65,7 @@ let key = key.extract::<PyBytes>(py)?; match self.inner(py).borrow().get(HgPath::new(key.data(py))) { Some(entry) => { - // Explicitly go through u8 first, then cast to - // platform-specific `c_char`. - let state: u8 = entry.state.into(); - Ok(Some(decapsule_make_dirstate_tuple(py)?( - state as c_char, - entry.mode, - entry.size, - entry.mtime, - ))) + Ok(Some(make_dirstate_tuple(py, entry)?)) }, None => Ok(default) } @@ -303,15 +294,7 @@ let key = HgPath::new(key.data(py)); match self.inner(py).borrow().get(key) { Some(entry) => { - // Explicitly go through u8 first, then cast to - // platform-specific `c_char`. - let state: u8 = entry.state.into(); - Ok(decapsule_make_dirstate_tuple(py)?( - state as c_char, - entry.mode, - entry.size, - entry.mtime, - )) + Ok(make_dirstate_tuple(py, entry)?) }, None => Err(PyErr::new::<exc::KeyError, _>( py, @@ -493,18 +476,9 @@ res: (&HgPathBuf, &DirstateEntry), ) -> PyResult<Option<(PyBytes, PyObject)>> { let (f, entry) = res; - - // Explicitly go through u8 first, then cast to - // platform-specific `c_char`. - let state: u8 = entry.state.into(); Ok(Some(( PyBytes::new(py, f.as_ref()), - decapsule_make_dirstate_tuple(py)?( - state as c_char, - entry.mode, - entry.size, - entry.mtime, - ), + make_dirstate_tuple(py, entry)?, ))) } }