Skip to content
Snippets Groups Projects
Commit 7d0405e458a0 authored by Simon Sapin's avatar Simon Sapin
Browse files

persistent-nodemap: Fix Rust declarations for Revlog_CAPI signatures

Use Rust’s `libc::ssize_t` as the closest match to C’s `Py_ssize_t`.
See details in test comment.

Going forward we should find a way to have such Rust declarations
auto-generated from C headers at build time,
or auto-checked against them in a test.

Differential Revision: https://phab.mercurial-scm.org/D9901
parent 3df00f905458
No related branches found
No related tags found
No related merge requests found
......@@ -16,7 +16,7 @@
};
use hg::revlog::{Node, RevlogIndex};
use hg::{Graph, GraphError, Revision, WORKING_DIRECTORY_REVISION};
use libc::c_int;
use libc::{c_int, ssize_t};
const REVLOG_CABI_VERSION: c_int = 2;
......@@ -24,6 +24,6 @@
pub struct Revlog_CAPI {
abi_version: c_int,
index_length:
unsafe extern "C" fn(index: *mut revlog_capi::RawPyObject) -> c_int,
unsafe extern "C" fn(index: *mut revlog_capi::RawPyObject) -> ssize_t,
index_node: unsafe extern "C" fn(
index: *mut revlog_capi::RawPyObject,
......@@ -28,6 +28,6 @@
index_node: unsafe extern "C" fn(
index: *mut revlog_capi::RawPyObject,
rev: c_int,
rev: ssize_t,
) -> *const Node,
index_parents: unsafe extern "C" fn(
index: *mut revlog_capi::RawPyObject,
......@@ -157,7 +157,7 @@
fn node(&self, rev: Revision) -> Option<&Node> {
let raw = unsafe {
(self.capi.index_node)(self.index.as_ptr(), rev as c_int)
(self.capi.index_node)(self.index.as_ptr(), rev as ssize_t)
};
if raw.is_null() {
None
......
......@@ -33,5 +33,9 @@
#if rust
Reported bug: some Rust code panics when handling the null revision
Regression test for a previous bug in Rust/C FFI for the `Revlog_CAPI` capsule:
in places where `mercurial/cext/revlog.c` function signatures use `Py_ssize_t`
(64 bits on Linux x86_64), corresponding declarations in `rust/hg-cpython/src/cindex.rs`
incorrectly used `libc::c_int` (32 bits).
As a result, -1 passed from Rust for the null revision became 4294967295 in C.
......@@ -37,6 +41,10 @@
$ hg log -r 00000000 2>&1 | grep panicked
thread '<unnamed>' panicked at 'called `Option::unwrap()` on a `None` value', hg-cpython/src/revlog.rs:* (glob)
$ hg log -r 00000000
changeset: -1:000000000000
tag: tip
user:
date: Thu Jan 01 00:00:00 1970 +0000
#endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment