Skip to main content

pyo3_ffi/cpython/
bytearrayobject.rs

1#[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}