Mercurial > public > mercurial-scm > hg
annotate rust/hg-cpython/src/debug.rs @ 52411:c2480ac4c5e2
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).
author | Georges Racinet <georges.racinet@cloudcrane.io> |
---|---|
date | Sat, 30 Nov 2024 20:57:02 +0100 |
parents | 9f96beb9bafe |
children |
rev | line source |
---|---|
44531
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
1 // debug.rs |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
2 // |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
3 // Copyright 2020 Raphaël Gomès <rgomes@octobus.net> |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
4 // |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
5 // This software may be used and distributed according to the terms of the |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
6 // GNU General Public License version 2 or any later version. |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
7 |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
8 //! Module to get debug information about Rust extensions. |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
9 use cpython::{PyDict, PyModule, PyResult, Python}; |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
10 |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
11 /// Create the module, with `__package__` given from parent |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
12 pub fn init_module(py: Python, package: &str) -> PyResult<PyModule> { |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
13 let dotted_name = &format!("{}.debug", package); |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
14 let m = PyModule::new(py, dotted_name)?; |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
15 |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
16 m.add(py, "__package__", package)?; |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
17 m.add(py, "__doc__", "Rust debugging information")?; |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
18 |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
19 let sys = PyModule::import(py, "sys")?; |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
20 let sys_modules: PyDict = sys.get(py, "modules")?.extract(py)?; |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
21 sys_modules.set_item(py, dotted_name, &m)?; |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
22 |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
23 Ok(m) |
d4f19eb471ca
rust-cpython: add `debug` module to expose debug information to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff
changeset
|
24 } |