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