changeset 775:28d8b892fd06

Python: Upgrade pyo3 from 0.17 to 0.26
author Link Mauve <linkmauve@linkmauve.fr>
date Mon, 13 Oct 2025 17:44:38 +0000
parents d08eb4c9fce3
children 94033091458b
files python/Cargo.toml python/src/glide/mod.rs python/src/lib.rs
diffstat 3 files changed, 33 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/python/Cargo.toml
+++ b/python/Cargo.toml
@@ -14,7 +14,7 @@
 
 [dependencies]
 touhou-formats = "*"
-pyo3 = "0.17"
+pyo3 = "0.26"
 image = { version = "0.24", default-features = false, features = ["png"], optional = true }
 
 [features]
--- a/python/src/glide/mod.rs
+++ b/python/src/glide/mod.rs
@@ -1,5 +1,5 @@
 use pyo3::prelude::*;
-use pyo3::types::{PyList, PyDict, PySequence};
+use pyo3::types::{PyList, PyDict, PySequence, PyListMethods};
 use pyo3::exceptions::PyTypeError;
 use std::collections::{HashMap, BTreeMap};
 use image::GenericImageView;
@@ -152,7 +152,7 @@
         println!("TODO: GameRenderer::load_background({background})");
     }
 
-    fn render_elements(&self, py: Python, elements: &PyList, shift: (f32, f32)) -> PyResult<()> {
+    fn render_elements(&self, py: Python, elements: Bound<PyList>, shift: (f32, f32)) -> PyResult<()> {
         let module = py.import("pytouhou.ui.glide.sprite")?;
         let get_sprite_rendering_data = module.getattr("get_sprite_rendering_data")?;
         let mut prev_texture = u32::MAX;
@@ -168,7 +168,7 @@
             let y: f32 = element.getattr("y")?.extract()?;
             let sprite = element.getattr("sprite")?;
             if !sprite.is_none() {
-                let (pos, mut texcoords, color): ([f32; 12], [f32; 4], u32) = get_sprite_rendering_data.call1((sprite,))?.extract()?;
+                let (pos, mut texcoords, color): ([f32; 12], [f32; 4], u32) = get_sprite_rendering_data.call1((&sprite,))?.extract()?;
                 for coord in &mut texcoords {
                     *coord *= 256.0;
                 }
@@ -189,7 +189,7 @@
         gr::buffer_clear(0x000000ff, 0xff, 0xffff);
         for things in ["enemies", "effects", "players_bullets"/*, "lasers_sprites()"*/, "players"/*, "msg_sprites()"*/, "bullets", "lasers", "cancelled_bullets", "items", "labels"] {
             let things = game.getattr(py, things)?;
-            let things: &PyList = things.extract(py)?;
+            let things = things.extract(py)?;
             self.render_elements(py, things, (32.0, 16.0))?;
         }
         let interface = game.getattr(py, "interface")?;
@@ -200,7 +200,7 @@
 
     fn render_interface(&self, py: Python, interface: PyObject, boss: bool) -> PyResult<()> {
         let items = interface.getattr(py, "items")?;
-        let items: &PyList = items.extract(py)?;
+        let items = items.extract(py)?;
         self.render_elements(py, items, (0.0, 0.0))?;
         /*
         // TODO: figure out why this doesn’t render alphanumeric characters.
@@ -210,7 +210,7 @@
         */
         if boss {
             let items = interface.getattr(py, "boss_items")?;
-            let items: &PyList = items.extract(py)?;
+            let items = items.extract(py)?;
             self.render_elements(py, items, (0.0, 0.0))?;
         }
         Ok(())
@@ -247,12 +247,22 @@
     gr::buffer_swap(1);
 }
 
-pub fn module(py: Python) -> PyResult<&PyModule> {
-    let m = PyModule::new(py, "glide")?;
-    m.add_class::<GameRenderer>()?;
-    m.add_function(wrap_pyfunction!(init, m)?)?;
-    m.add_function(wrap_pyfunction!(shutdown, m)?)?;
-    m.add_function(wrap_pyfunction!(create_window, m)?)?;
-    m.add_function(wrap_pyfunction!(buffer_swap, m)?)?;
-    Ok(&m)
+#[pymodule]
+#[pyo3(name = "glide")]
+pub mod module {
+    #[pymodule_export]
+    use super::GameRenderer;
+
+    #[pymodule_export]
+    use super::init;
+
+    #[pymodule_export]
+    use super::shutdown;
+
+    #[pymodule_export]
+    use super::create_window;
+
+    #[pymodule_export]
+    use super::buffer_swap;
+
 }
--- a/python/src/lib.rs
+++ b/python/src/lib.rs
@@ -31,16 +31,18 @@
         self.inner.list_files().cloned().collect()
     }
 
-    fn get_file(&mut self, py: Python, name: &str) -> PyObject {
+    fn get_file(&mut self, py: Python, name: &str) -> Py<PyAny> {
         let data = self.inner.get_file(name, true).unwrap();
-        PyBytes::new(py, &data).into_py(py)
+        PyBytes::new(py, &data).into()
     }
 }
 
 #[pymodule]
-fn libtouhou(py: Python, m: &PyModule) -> PyResult<()> {
-    m.add_class::<PBG3>()?;
+mod libtouhou {
+    #[pymodule_export]
+    use super::PBG3;
+
     #[cfg(feature = "glide")]
-    m.add_submodule(glide::module(py)?)?;
-    Ok(())
+    #[pymodule_export]
+    use super::glide::module;
 }