rust/hg-cpython/src/cindex.rs
changeset 43959 f384d68d8ea8
parent 43213 0246bbe1045d
child 43960 ab3fd8077f5e
--- a/rust/hg-cpython/src/cindex.rs	Sun Dec 22 23:09:37 2019 -0500
+++ b/rust/hg-cpython/src/cindex.rs	Wed Nov 27 17:59:58 2019 +0100
@@ -14,15 +14,18 @@
 use hg::{Graph, GraphError, Revision, WORKING_DIRECTORY_REVISION};
 use libc::c_int;
 
-py_capsule_fn!(
-    from mercurial.cext.parsers import index_get_parents_CAPI
-        as get_parents_capi
-        signature (
-            index: *mut RawPyObject,
-            rev: c_int,
-            ps: *mut [c_int; 2],
-        ) -> c_int
-);
+#[repr(C)]
+pub struct Revlog_CAPI {
+    index_parents: unsafe extern "C" fn(
+        index: *mut revlog_capi::RawPyObject,
+        rev: c_int,
+        ps: *mut [c_int; 2],
+    ) -> c_int,
+}
+
+py_capsule!(
+    from mercurial.cext.parsers import revlog_CAPI
+        as revlog_capi for Revlog_CAPI);
 
 /// A `Graph` backed up by objects and functions from revlog.c
 ///
@@ -58,14 +61,14 @@
 /// mechanisms in other contexts.
 pub struct Index {
     index: PyObject,
-    parents: get_parents_capi::CapsuleFn,
+    capi: &'static Revlog_CAPI,
 }
 
 impl Index {
     pub fn new(py: Python, index: PyObject) -> PyResult<Self> {
         Ok(Index {
             index: index,
-            parents: get_parents_capi::retrieve(py)?,
+            capi: unsafe { revlog_capi::retrieve(py)? },
         })
     }
 }
@@ -75,7 +78,7 @@
         let guard = Python::acquire_gil();
         Index {
             index: self.index.clone_ref(guard.python()),
-            parents: self.parents.clone(),
+            capi: self.capi,
         }
     }
 }
@@ -88,7 +91,7 @@
         }
         let mut res: [c_int; 2] = [0; 2];
         let code = unsafe {
-            (self.parents)(
+            (self.capi.index_parents)(
                 self.index.as_ptr(),
                 rev as c_int,
                 &mut res as *mut [c_int; 2],