1use crate::object::*;
2use crate::pyport::Py_ssize_t;
3use std::ffi::c_int;
4
5extern_libpython! {
6 #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))]
7 #[cfg_attr(PyPy, link_name = "_PyPy_EllipsisObject")]
8 static mut _Py_EllipsisObject: PyObject;
9
10 #[cfg(GraalPy)]
11 static mut _Py_EllipsisObjectReference: *mut PyObject;
12}
13
14#[inline]
15pub unsafe fn Py_Ellipsis() -> *mut PyObject {
16 #[cfg(all(not(GraalPy), all(Py_3_13, Py_LIMITED_API)))]
17 return Py_GetConstantBorrowed(Py_CONSTANT_ELLIPSIS);
18
19 #[cfg(all(not(GraalPy), not(all(Py_3_13, Py_LIMITED_API))))]
20 return &raw mut _Py_EllipsisObject;
21
22 #[cfg(GraalPy)]
23 return _Py_EllipsisObjectReference;
24}
25
26#[cfg(not(Py_LIMITED_API))]
27#[repr(C)]
28pub struct PySliceObject {
29 pub ob_base: PyObject,
30 #[cfg(not(GraalPy))]
31 pub start: *mut PyObject,
32 #[cfg(not(GraalPy))]
33 pub stop: *mut PyObject,
34 #[cfg(not(GraalPy))]
35 pub step: *mut PyObject,
36}
37
38extern_libpython! {
39 #[cfg_attr(PyPy, link_name = "PyPySlice_Type")]
40 pub static mut PySlice_Type: PyTypeObject;
41 pub static mut PyEllipsis_Type: PyTypeObject;
42}
43
44#[inline]
45pub unsafe fn PySlice_Check(op: *mut PyObject) -> c_int {
46 (Py_TYPE(op) == &raw mut PySlice_Type) as c_int
47}
48
49extern_libpython! {
50 #[cfg_attr(PyPy, link_name = "PyPySlice_New")]
51 pub fn PySlice_New(
52 start: *mut PyObject,
53 stop: *mut PyObject,
54 step: *mut PyObject,
55 ) -> *mut PyObject;
56
57 #[cfg_attr(PyPy, link_name = "PyPySlice_GetIndices")]
61 pub fn PySlice_GetIndices(
62 r: *mut PyObject,
63 length: Py_ssize_t,
64 start: *mut Py_ssize_t,
65 stop: *mut Py_ssize_t,
66 step: *mut Py_ssize_t,
67 ) -> c_int;
68}
69
70#[inline]
71pub unsafe fn PySlice_GetIndicesEx(
72 slice: *mut PyObject,
73 length: Py_ssize_t,
74 start: *mut Py_ssize_t,
75 stop: *mut Py_ssize_t,
76 step: *mut Py_ssize_t,
77 slicelength: *mut Py_ssize_t,
78) -> c_int {
79 if PySlice_Unpack(slice, start, stop, step) < 0 {
80 *slicelength = 0;
81 -1
82 } else {
83 *slicelength = PySlice_AdjustIndices(length, start, stop, *step);
84 0
85 }
86}
87
88extern_libpython! {
89 #[cfg_attr(PyPy, link_name = "PyPySlice_Unpack")]
90 pub fn PySlice_Unpack(
91 slice: *mut PyObject,
92 start: *mut Py_ssize_t,
93 stop: *mut Py_ssize_t,
94 step: *mut Py_ssize_t,
95 ) -> c_int;
96
97 #[cfg_attr(PyPy, link_name = "PyPySlice_AdjustIndices")]
98 pub fn PySlice_AdjustIndices(
99 length: Py_ssize_t,
100 start: *mut Py_ssize_t,
101 stop: *mut Py_ssize_t,
102 step: Py_ssize_t,
103 ) -> Py_ssize_t;
104}