changeset 44010:2728fcb8127c

rust-index: make it possible to clone the struct referencing the C index If we are to hand over the C index object to other code, we need to be able to create a new python reference to it. Differential Revision: https://phab.mercurial-scm.org/D7656
author Georges Racinet <georges.racinet@octobus.net>
date Fri, 13 Dec 2019 19:52:26 +0100
parents e685fac56693
children c627f1b2f3c3
files rust/hg-cpython/src/cindex.rs rust/hg-cpython/src/revlog.rs
diffstat 2 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/rust/hg-cpython/src/cindex.rs	Fri Dec 06 20:40:02 2019 -0500
+++ b/rust/hg-cpython/src/cindex.rs	Fri Dec 13 19:52:26 2019 +0100
@@ -88,6 +88,15 @@
     }
 }
 
+impl PyClone for Index {
+    fn clone_ref(&self, py: Python) -> Self {
+        Index {
+            index: self.index.clone_ref(py),
+            capi: self.capi,
+        }
+    }
+}
+
 impl Graph for Index {
     /// wrap a call to the C extern parents function
     fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> {
--- a/rust/hg-cpython/src/revlog.rs	Fri Dec 06 20:40:02 2019 -0500
+++ b/rust/hg-cpython/src/revlog.rs	Fri Dec 13 19:52:26 2019 +0100
@@ -7,17 +7,14 @@
 
 use crate::cindex;
 use cpython::{
-    ObjectProtocol, PyDict, PyModule, PyObject, PyResult, PyTuple, Python,
-    PythonObject, ToPyObject,
+    ObjectProtocol, PyClone, PyDict, PyModule, PyObject, PyResult, PyTuple, Python, PythonObject,
+    ToPyObject,
 };
 use hg::Revision;
 use std::cell::RefCell;
 
 /// Return a Struct implementing the Graph trait
-pub(crate) fn pyindex_to_graph(
-    py: Python,
-    index: PyObject,
-) -> PyResult<cindex::Index> {
+pub(crate) fn pyindex_to_graph(py: Python, index: PyObject) -> PyResult<cindex::Index> {
     cindex::Index::new(py, index)
 }
 
@@ -198,6 +195,10 @@
             .inner()
             .call_method(py, name, args, kwargs)
     }
+
+    pub fn clone_cindex(&self, py: Python) -> cindex::Index {
+        self.cindex(py).borrow().clone_ref(py)
+    }
 }
 
 /// Create the module, with __package__ given from parent