From patchwork Tue Jan 14 14:22:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D7856: revlog-native: introduced ABI version in capsule From: phabricator X-Patchwork-Id: 44313 Message-Id: To: Phabricator Cc: mercurial-devel@mercurial-scm.org Date: Tue, 14 Jan 2020 14:22:32 +0000 Closed by commit rHGe300421d67f5: revlog-native: introduced ABI version in capsule (authored by gracinet). This revision was automatically updated to reflect the committed changes. This revision was not accepted when it landed; it landed in state "Needs Review". CHANGED PRIOR TO COMMIT https://phab.mercurial-scm.org/D7856?vs=19204&id=19207#toc REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D7856?vs=19204&id=19207 CHANGES SINCE LAST ACTION https://phab.mercurial-scm.org/D7856/new/ REVISION DETAIL https://phab.mercurial-scm.org/D7856 AFFECTED FILES mercurial/cext/revlog.c rust/hg-cpython/src/cindex.rs CHANGE DETAILS To: gracinet, #hg-reviewers Cc: yuja, durin42, kevincox, mercurial-devel diff --git a/rust/hg-cpython/src/cindex.rs b/rust/hg-cpython/src/cindex.rs --- a/rust/hg-cpython/src/cindex.rs +++ b/rust/hg-cpython/src/cindex.rs @@ -10,12 +10,15 @@ //! Ideally, we should use an Index entirely implemented in Rust, //! but this will take some time to get there. -use cpython::{PyClone, PyObject, PyResult, Python}; +use cpython::{exc::ImportError, PyClone, PyErr, PyObject, PyResult, Python}; use hg::{Graph, GraphError, Revision, WORKING_DIRECTORY_REVISION}; use libc::c_int; +const REVLOG_CABI_VERSION: c_int = 1; + #[repr(C)] pub struct Revlog_CAPI { + abi_version: c_int, index_parents: unsafe extern "C" fn( index: *mut revlog_capi::RawPyObject, rev: c_int, @@ -66,9 +69,20 @@ impl Index { pub fn new(py: Python, index: PyObject) -> PyResult { + let capi = unsafe { revlog_capi::retrieve(py)? }; + if capi.abi_version != REVLOG_CABI_VERSION { + return Err(PyErr::new::( + py, + format!( + "ABI version mismatch: the C ABI revlog version {} \ + does not match the {} expected by Rust hg-cpython", + capi.abi_version, REVLOG_CABI_VERSION + ), + )); + } Ok(Index { index: index, - capi: unsafe { revlog_capi::retrieve(py)? }, + capi: capi, }) } diff --git a/mercurial/cext/revlog.c b/mercurial/cext/revlog.c --- a/mercurial/cext/revlog.c +++ b/mercurial/cext/revlog.c @@ -38,6 +38,7 @@ } nodetreenode; typedef struct { + int abi_version; int (*index_parents)(PyObject *, int, int *); } Revlog_CAPI; @@ -3037,6 +3038,9 @@ #endif /* WITH_RUST */ static Revlog_CAPI CAPI = { + /* increment the abi_version field upon each change in the Revlog_CAPI + struct or in the ABI of the listed functions */ + 1, HgRevlogIndex_GetParents, };