1use crate::object::*;
2use crate::pyport::Py_ssize_t;
3use core::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
38#[cfg(not(RustPython))]
39extern_libpython! {
40 #[cfg_attr(PyPy, link_name = "PyPySlice_Type")]
41 pub static mut PySlice_Type: PyTypeObject;
42 pub static mut PyEllipsis_Type: PyTypeObject;
43}
44
45#[inline]
46#[cfg(not(RustPython))]
47pub unsafe fn PySlice_Check(op: *mut PyObject) -> c_int {
48 Py_IS_TYPE(op, &raw mut PySlice_Type)
49}
50
51extern_libpython! {
52 #[cfg(RustPython)]
53 pub fn PySlice_Check(op: *mut PyObject) -> c_int;
54
55 #[cfg_attr(PyPy, link_name = "PyPySlice_New")]
56 pub fn PySlice_New(
57 start: *mut PyObject,
58 stop: *mut PyObject,
59 step: *mut PyObject,
60 ) -> *mut PyObject;
61
62 #[cfg_attr(PyPy, link_name = "PyPySlice_GetIndices")]
66 pub fn PySlice_GetIndices(
67 r: *mut PyObject,
68 length: Py_ssize_t,
69 start: *mut Py_ssize_t,
70 stop: *mut Py_ssize_t,
71 step: *mut Py_ssize_t,
72 ) -> c_int;
73}
74
75#[inline]
76pub unsafe fn PySlice_GetIndicesEx(
77 slice: *mut PyObject,
78 length: Py_ssize_t,
79 start: *mut Py_ssize_t,
80 stop: *mut Py_ssize_t,
81 step: *mut Py_ssize_t,
82 slicelength: *mut Py_ssize_t,
83) -> c_int {
84 if PySlice_Unpack(slice, start, stop, step) < 0 {
85 *slicelength = 0;
86 -1
87 } else {
88 *slicelength = PySlice_AdjustIndices(length, start, stop, *step);
89 0
90 }
91}
92
93extern_libpython! {
94 #[cfg_attr(PyPy, link_name = "PyPySlice_Unpack")]
95 pub fn PySlice_Unpack(
96 slice: *mut PyObject,
97 start: *mut Py_ssize_t,
98 stop: *mut Py_ssize_t,
99 step: *mut Py_ssize_t,
100 ) -> c_int;
101
102 #[cfg_attr(PyPy, link_name = "PyPySlice_AdjustIndices")]
103 pub fn PySlice_AdjustIndices(
104 length: Py_ssize_t,
105 start: *mut Py_ssize_t,
106 stop: *mut Py_ssize_t,
107 step: Py_ssize_t,
108 ) -> Py_ssize_t;
109}