Skip to content
Snippets Groups Projects
  • Georges Racinet's avatar
    c2480ac4c5e2
    rust-pyo3: retrieving the InnerRevlog of hg-cpython · c2480ac4c5e2
    Georges Racinet authored
    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).
    c2480ac4c5e2
    History
    rust-pyo3: retrieving the InnerRevlog of hg-cpython
    Georges Racinet authored
    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).
This project manages its dependencies using Cargo. Learn more
Cargo.toml 472 B