From b5be40e3ca4029bbb6e0fb6cc93c4ba3e52e2191 Mon Sep 17 00:00:00 2001 From: Bas Schoenmaeckers Date: Wed, 8 Jul 2026 14:18:26 +0200 Subject: [PATCH] Add memoryview support to c-api --- crates/capi/src/lib.rs | 1 + crates/capi/src/memoryobject.rs | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 crates/capi/src/memoryobject.rs diff --git a/crates/capi/src/lib.rs b/crates/capi/src/lib.rs index 15632648961..a980c95dcdd 100644 --- a/crates/capi/src/lib.rs +++ b/crates/capi/src/lib.rs @@ -22,6 +22,7 @@ pub mod genericaliasobject; pub mod import; pub mod listobject; pub mod longobject; +pub mod memoryobject; pub mod methodobject; pub mod moduleobject; pub mod object; diff --git a/crates/capi/src/memoryobject.rs b/crates/capi/src/memoryobject.rs new file mode 100644 index 00000000000..11019524e6c --- /dev/null +++ b/crates/capi/src/memoryobject.rs @@ -0,0 +1,37 @@ +use crate::object::define_py_check; +use crate::{PyObject, pystate::with_vm}; +use rustpython_vm::PyPayload; +use rustpython_vm::builtins::PyMemoryView; + +define_py_check!(fn PyMemoryView_Check, types.memoryview_type); + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyMemoryView_FromObject(obj: *mut PyObject) -> *mut PyObject { + with_vm(|vm| { + let obj = unsafe { &*obj }; + Ok(PyMemoryView::from_object(obj, vm)?.into_ref(&vm.ctx)) + }) +} + +#[cfg(test)] +mod tests { + use pyo3::prelude::*; + use pyo3::types::{PyBytes, PyMemoryView}; + + #[test] + fn memoryview_from_bytes() { + Python::attach(|py| { + let bytes = PyBytes::new(py, b"hello"); + let view = PyMemoryView::from(&bytes).unwrap(); + + assert!(view.is_instance_of::()); + + let copied = view + .call_method1("tobytes", ()) + .unwrap() + .cast_into::() + .unwrap(); + assert_eq!(copied.as_bytes(), b"hello"); + }) + } +}