[PATCH 5 of 6] rust: look up HgRevlogIndex_GetParents() from symbol table
Georges Racinet
gracinet at anybox.fr
Mon Dec 10 13:00:43 EST 2018
On 12/5/18 2:43 PM, Yuya Nishihara wrote:
> # HG changeset patch
> # User Yuya Nishihara <yuya at tcha.org>
> # Date 1543756838 -32400
> # Sun Dec 02 22:20:38 2018 +0900
> # Node ID f5cdfa49994e3943ba7c4ce2d66708142f0c7058
> # Parent 716a73bab79be30c20c75e13324c44205d5e2120
> rust: look up HgRevlogIndex_GetParents() from symbol table
>
> And removes the unused index_get_parents_checked() function.
>
> I expect the Index struct will be turned into a pyobject type, though I
> haven't written any PoC-level patches yet.
I'm not sure what you mean exactly with turning Index into a pyobject
type. Would you care to elaborate ?
No question about the rest of the patch.
>
> diff --git a/mercurial/cext/revlog.c b/mercurial/cext/revlog.c
> --- a/mercurial/cext/revlog.c
> +++ b/mercurial/cext/revlog.c
> @@ -2710,27 +2710,15 @@ struct rustlazyancestorsObjectStruct {
> };
>
> /* FFI exposed from Rust code */
> -rustlazyancestorsObject *
> -rustlazyancestors_init(indexObject *index,
> - /* to pass index_get_parents() */
> - int (*)(indexObject *, Py_ssize_t, int *, int),
> - /* intrevs vector */
> - Py_ssize_t initrevslen, long *initrevs, long stoprev,
> - int inclusive);
> +rustlazyancestorsObject *rustlazyancestors_init(indexObject *index,
> + /* intrevs vector */
> + Py_ssize_t initrevslen,
> + long *initrevs, long stoprev,
> + int inclusive);
> void rustlazyancestors_drop(rustlazyancestorsObject *self);
> int rustlazyancestors_next(rustlazyancestorsObject *self);
> int rustlazyancestors_contains(rustlazyancestorsObject *self, long rev);
>
> -static int index_get_parents_checked(indexObject *self, Py_ssize_t rev, int *ps,
> - int maxrev)
> -{
> - if (rev < 0 || rev >= index_length(self)) {
> - PyErr_SetString(PyExc_ValueError, "rev out of range");
> - return -1;
> - }
> - return index_get_parents(self, rev, ps, maxrev);
> -}
> -
> /* CPython instance methods */
> static int rustla_init(rustlazyancestorsObject *self, PyObject *args)
> {
> @@ -2768,12 +2756,12 @@ static int rustla_init(rustlazyancestors
> if (PyErr_Occurred())
> goto bail;
>
> - self->iter = rustlazyancestors_init(index, index_get_parents, linit,
> - initrevs, stoprev, inclusive);
> + self->iter =
> + rustlazyancestors_init(index, linit, initrevs, stoprev, inclusive);
> if (self->iter == NULL) {
> /* if this is because of GraphError::ParentOutOfRange
> - * index_get_parents_checked() has already set the proper
> - * ValueError */
> + * HgRevlogIndex_GetParents() has already set the proper
> + * exception */
> goto bail;
> }
>
> diff --git a/rust/hg-direct-ffi/src/ancestors.rs b/rust/hg-direct-ffi/src/ancestors.rs
> --- a/rust/hg-direct-ffi/src/ancestors.rs
> +++ b/rust/hg-direct-ffi/src/ancestors.rs
> @@ -16,9 +16,14 @@ use std::ptr::null_mut;
> use std::slice;
>
> type IndexPtr = *mut c_void;
> -type IndexParentsFn =
> - unsafe extern "C" fn(index: IndexPtr, rev: ssize_t, ps: *mut [c_int; 2], max_rev: c_int)
> - -> c_int;
> +
> +extern "C" {
> + fn HgRevlogIndex_GetParents(
> + op: IndexPtr,
> + rev: c_int,
> + parents: *mut [c_int; 2],
> + ) -> c_int;
> +}
>
> /// A Graph backed up by objects and functions from revlog.c
> ///
> @@ -27,14 +32,12 @@ type IndexParentsFn =
> /// - the `index_get_parents()` function (`parents` member)
> pub struct Index {
> index: IndexPtr,
> - parents: IndexParentsFn,
> }
>
> impl Index {
> - pub fn new(index: IndexPtr, parents: IndexParentsFn) -> Self {
> + pub fn new(index: IndexPtr) -> Self {
> Index {
> index: index,
> - parents: parents,
> }
> }
> }
> @@ -44,7 +47,7 @@ impl Graph for Index {
> fn parents(&self, rev: Revision) -> Result<(Revision, Revision), GraphError> {
> let mut res: [c_int; 2] = [0; 2];
> let code =
> - unsafe { (self.parents)(self.index, rev as ssize_t, &mut res as *mut [c_int; 2], rev) };
> + unsafe { HgRevlogIndex_GetParents(self.index, rev, &mut res as *mut [c_int; 2]) };
> match code {
> 0 => Ok((res[0], res[1])),
> _ => Err(GraphError::ParentOutOfRange(rev)),
> @@ -59,7 +62,6 @@ impl Graph for Index {
> #[no_mangle]
> pub extern "C" fn rustlazyancestors_init(
> index: IndexPtr,
> - parents: IndexParentsFn,
> initrevslen: ssize_t,
> initrevs: *mut c_long,
> stoprev: c_long,
> @@ -68,7 +70,7 @@ pub extern "C" fn rustlazyancestors_init
> assert!(initrevslen >= 0);
> unsafe {
> raw_init(
> - Index::new(index, parents),
> + Index::new(index),
> initrevslen as usize,
> initrevs,
> stoprev,
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
--
Georges Racinet
Anybox SAS, http://anybox.fr
Téléphone: +33 6 51 32 07 27
GPG: B59E 22AB B842 CAED 77F7 7A7F C34F A519 33AB 0A35, sur serveurs publics
More information about the Mercurial-devel
mailing list