diff --git a/newsfragments/5966.added.md b/newsfragments/5966.added.md new file mode 100644 index 00000000000..2dfdd12d86c --- /dev/null +++ b/newsfragments/5966.added.md @@ -0,0 +1 @@ +Add non-limited API counterpart of bytearrayobject.rs diff --git a/pyo3-ffi/src/bytearrayobject.rs b/pyo3-ffi/src/bytearrayobject.rs index f99c0ebc589..f161dedbcdd 100644 --- a/pyo3-ffi/src/bytearrayobject.rs +++ b/pyo3-ffi/src/bytearrayobject.rs @@ -2,24 +2,6 @@ use crate::object::*; use crate::pyport::Py_ssize_t; use std::ffi::{c_char, c_int}; -#[cfg(not(any(PyPy, GraalPy, Py_LIMITED_API)))] -#[repr(C)] -pub struct PyByteArrayObject { - pub ob_base: PyVarObject, - pub ob_alloc: Py_ssize_t, - pub ob_bytes: *mut c_char, - pub ob_start: *mut c_char, - #[cfg(Py_3_9)] - pub ob_exports: Py_ssize_t, - #[cfg(not(Py_3_9))] - pub ob_exports: c_int, - #[cfg(Py_3_15)] - pub ob_bytes_object: *mut PyObject, -} - -#[cfg(any(PyPy, GraalPy, Py_LIMITED_API))] -opaque_struct!(pub PyByteArrayObject); - extern_libpython! { #[cfg_attr(PyPy, link_name = "PyPyByteArray_Type")] pub static mut PyByteArray_Type: PyTypeObject; diff --git a/pyo3-ffi/src/cpython/bytearrayobject.rs b/pyo3-ffi/src/cpython/bytearrayobject.rs new file mode 100644 index 00000000000..a39158bace4 --- /dev/null +++ b/pyo3-ffi/src/cpython/bytearrayobject.rs @@ -0,0 +1,48 @@ +use crate::object::*; +use crate::pyport::Py_ssize_t; +#[cfg(not(any(PyPy, GraalPy)))] +use std::ffi::c_char; +#[cfg(not(Py_3_9))] +use std::ffi::c_int; + +#[cfg(not(any(PyPy, GraalPy, Py_LIMITED_API)))] +#[repr(C)] +pub struct PyByteArrayObject { + pub ob_base: PyVarObject, + pub ob_alloc: Py_ssize_t, + pub ob_bytes: *mut c_char, + pub ob_start: *mut c_char, + #[cfg(Py_3_9)] + pub ob_exports: Py_ssize_t, + #[cfg(not(Py_3_9))] + pub ob_exports: c_int, + #[cfg(Py_3_15)] + pub ob_bytes_object: *mut PyObject, +} + +#[cfg(any(PyPy, GraalPy))] +opaque_struct!(pub PyByteArrayObject); + +#[inline] +#[cfg(not(any(PyPy, GraalPy)))] +pub unsafe fn PyByteArray_AS_STRING(op: *mut PyObject) -> *mut c_char { + let byte_array = op as *mut PyByteArrayObject; + (*byte_array).ob_start +} + +/* +#[inline] +#[cfg(Py_GIL_DISABLED)] +pub unsafe fn PyByteArray_GET_SIZE(op: *mut PyObject) -> Py_ssize_t { + let byte_array = op as *mut PyByteArrayObject; + // _Py_atomic_load_ssize_relaxed and _PyVarObject_CAST not implemented + // Insert Rust equivalent of the next line: + return _Py_atomic_load_ssize_relaxed(&(_PyVarObject_CAST(byte_array)->ob_size)); +} +*/ + +#[inline] +#[cfg(not(Py_GIL_DISABLED))] +pub unsafe fn PyByteArray_GET_SIZE(op: *mut PyObject) -> Py_ssize_t { + Py_SIZE(op) +} diff --git a/pyo3-ffi/src/cpython/mod.rs b/pyo3-ffi/src/cpython/mod.rs index 6e73d3bab64..1f538a76937 100644 --- a/pyo3-ffi/src/cpython/mod.rs +++ b/pyo3-ffi/src/cpython/mod.rs @@ -1,5 +1,5 @@ pub(crate) mod abstract_; -// skipped bytearrayobject.h +pub(crate) mod bytearrayobject; pub(crate) mod bytesobject; #[cfg(not(PyPy))] pub(crate) mod ceval; @@ -45,6 +45,7 @@ pub(crate) mod unicodeobject; pub(crate) mod weakrefobject; pub use self::abstract_::*; +pub use self::bytearrayobject::*; pub use self::bytesobject::*; #[cfg(not(PyPy))] pub use self::ceval::*;