##// END OF EJS Templates
rust-pyo3: retrieving the InnerRevlog of hg-cpython...
rust-pyo3: retrieving the InnerRevlog of hg-cpython This allows PyO3-based code to use the InnerRevlog, access its shared data (core InnerRevlog), which will then allow, e.g., to retrieve references on the core Index. On the `hg-cpython` (`rusthg` crate, `rustext` Python extension module), we had to also build as a Rust library, and open up some accesses (see notably the public accessor for `inner`, the core `InnerRevlog`). Retrieving the Rust struct underlying a Python object defined by another extension module written in Rust is tricky because the Python type objects are duplicated in the extension modules, leading to failure of the normal type checking. See the doc-comment of `convert_cpython::extract_inner_revlog` for a complete explanation. To solve this, we import the Python type object of `rustext` (defined by `hg-cpython`) and perform a manual check. Checking the Python type is necessary, as PyO3 documentation clearly state that downcasting an object that has not the proper type is Undefined Behaviour. At this point, we do not have conversion facilities for exceptions (`PyErr` on both sides), hence the remaining unwraps).

File last commit:

r53308:c2480ac4 default
r53308:c2480ac4 default
Show More
Cargo.toml
21 lines | 472 B | application/toml | TOMLLexer
[package]
name = "hg-pyo3"
version = "0.1.0"
edition = "2021"
[lib]
name='rusthgpyo3'
crate-type = ["cdylib"]
[dependencies]
pyo3 = { version = "0.23.1", features = ["extension-module"] }
cpython = { version = "0.7.2", features = ["extension-module"] }
hg-cpython = { path = "../hg-cpython" }
python3-sys = { version = "0.7.2" }
hg-core = { path = "../hg-core"}
stable_deref_trait = "1.2.0"
log = "0.4.17"
derive_more = "0.99.17"
env_logger = "0.9.3"
lazy_static = "*"