pyo3_ffi/cpython/
bytearrayobject.rs1#[cfg(Py_GIL_DISABLED)]
2use crate::cpython::pyatomic::_Py_atomic_load_ssize_relaxed;
3use crate::object::*;
4use crate::pyport::Py_ssize_t;
5use crate::PyByteArray_Check;
6#[cfg(not(any(PyPy, GraalPy)))]
7use core::ffi::c_char;
8#[cfg(not(Py_3_9))]
9use core::ffi::c_int;
10
11#[cfg(not(any(PyPy, GraalPy, Py_LIMITED_API)))]
12#[repr(C)]
13pub struct PyByteArrayObject {
14 pub ob_base: PyVarObject,
15 pub ob_alloc: Py_ssize_t,
16 pub ob_bytes: *mut c_char,
17 pub ob_start: *mut c_char,
18 #[cfg(Py_3_9)]
19 pub ob_exports: Py_ssize_t,
20 #[cfg(not(Py_3_9))]
21 pub ob_exports: c_int,
22 #[cfg(Py_3_15)]
23 pub ob_bytes_object: *mut PyObject,
24}
25
26#[cfg(any(PyPy, GraalPy))]
27opaque_struct!(pub PyByteArrayObject);
28
29#[inline]
30pub(crate) unsafe fn _PyByteArray_CAST(op: *mut PyObject) -> *mut PyByteArrayObject {
31 debug_assert_eq!(PyByteArray_Check(op), 1);
32 op.cast()
33}
34
35#[inline]
36#[cfg(not(any(PyPy, GraalPy)))]
37pub unsafe fn PyByteArray_AS_STRING(op: *mut PyObject) -> *mut c_char {
38 (*_PyByteArray_CAST(op)).ob_start
39}
40
41#[inline]
42pub unsafe fn PyByteArray_GET_SIZE(op: *mut PyObject) -> Py_ssize_t {
43 let byte_array = _PyByteArray_CAST(op);
44 #[cfg(Py_GIL_DISABLED)]
45 {
46 _Py_atomic_load_ssize_relaxed(&raw const (*_PyVarObject_CAST(byte_array.cast())).ob_size)
47 }
48 #[cfg(not(Py_GIL_DISABLED))]
49 {
50 Py_SIZE(byte_array.cast())
51 }
52}