Skip to main content

pyo3_ffi/cpython/
bytesobject.rs

1use crate::object::*;
2use crate::Py_ssize_t;
3#[cfg(not(Py_LIMITED_API))]
4use std::ffi::c_char;
5use std::ffi::c_int;
6#[cfg(Py_3_15)]
7use std::ffi::c_void;
8
9#[cfg(not(any(PyPy, GraalPy, Py_LIMITED_API)))]
10#[repr(C)]
11pub struct PyBytesObject {
12    pub ob_base: PyVarObject,
13    #[cfg_attr(
14        Py_3_11,
15        deprecated(note = "Deprecated in Python 3.11 and will be removed in a future version.")
16    )]
17    pub ob_shash: crate::Py_hash_t,
18    pub ob_sval: [c_char; 1],
19}
20
21#[cfg(any(PyPy, GraalPy, Py_LIMITED_API))]
22opaque_struct!(pub PyBytesObject);
23
24extern_libpython! {
25    #[cfg_attr(PyPy, link_name = "_PyPyBytes_Resize")]
26    pub fn _PyBytes_Resize(bytes: *mut *mut PyObject, newsize: Py_ssize_t) -> c_int;
27}
28
29#[cfg(not(Py_LIMITED_API))]
30#[inline]
31pub unsafe fn PyBytes_AS_STRING(op: *mut PyObject) -> *const c_char {
32    #[cfg(not(any(PyPy, GraalPy)))]
33    return &(*op.cast::<PyBytesObject>()).ob_sval as *const c_char;
34    #[cfg(any(PyPy, GraalPy))]
35    return crate::PyBytes_AsString(op);
36}
37
38#[cfg(Py_3_15)]
39opaque_struct!(pub PyBytesWriter);
40
41#[cfg(Py_3_15)]
42extern_libpython! {
43
44    pub fn PyBytesWriter_Create(size: Py_ssize_t) -> *mut PyBytesWriter;
45
46    pub fn PyBytesWriter_Discard(writer: *mut PyBytesWriter);
47
48    pub fn PyBytesWriter_Finish(writer: *mut PyBytesWriter) -> *mut PyObject;
49
50    pub fn PyBytesWriter_FinishWithSize(
51        writer: *mut PyBytesWriter,
52        size: Py_ssize_t,
53    ) -> *mut PyObject;
54
55    pub fn PyBytesWriter_GetData(writer: *mut PyBytesWriter) -> *mut c_void;
56
57    pub fn PyBytesWriter_GetSize(writer: *mut PyBytesWriter) -> Py_ssize_t;
58
59    pub fn PyBytesWriter_Resize(writer: *mut PyBytesWriter, size: Py_ssize_t) -> c_int;
60
61    pub fn PyBytesWriter_Grow(writer: *mut PyBytesWriter, size: Py_ssize_t) -> c_int;
62}