1 | use crate::object::*; |
2 | use crate::pyport::Py_ssize_t; |
3 | use std::os::raw::c_int; |
4 | use std::ptr::addr_of_mut; |
5 | |
6 | #[cfg_attr (windows, link(name = "pythonXY" ))] |
7 | unsafeextern "C" { |
8 | #[cfg (not(GraalPy))] |
9 | #[cfg_attr (PyPy, link_name = "_PyPy_EllipsisObject" )] |
10 | unsafestatic mut _Py_EllipsisObject: PyObject; |
11 | |
12 | #[cfg (GraalPy)] |
13 | static mut _Py_EllipsisObjectReference: *mut PyObject; |
14 | } |
15 | |
16 | #[inline ] |
17 | pub 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)] |
26 | pub 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" ))] |
37 | unsafeextern "C" { |
38 | #[cfg_attr (PyPy, link_name = "PyPySlice_Type" )] |
39 | pub unsafestatic mut PySlice_Type: PyTypeObject; |
40 | pub unsafestatic mut PyEllipsis_Type: PyTypeObject; |
41 | } |
42 | |
43 | #[inline ] |
44 | pub unsafe fn PySlice_Check(op: *mut PyObject) -> c_int { |
45 | (Py_TYPE(ob:op) == addr_of_mut!(PySlice_Type)) as c_int |
46 | } |
47 | |
48 | unsafeextern "C" { |
49 | #[cfg_attr (PyPy, link_name = "PyPySlice_New" )] |
50 | pub unsafefn PySlice_New( |
51 | start: *mut PyObject, |
52 | stop: *mut PyObject, |
53 | step: *mut PyObject, |
54 | ) -> *mut PyObject; |
55 | |
56 | // skipped non-limited _PySlice_FromIndices |
57 | // skipped non-limited _PySlice_GetLongIndices |
58 | |
59 | #[cfg_attr (PyPy, link_name = "PyPySlice_GetIndices" )] |
60 | pub unsafefn 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 ] |
70 | pub 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 | |
87 | unsafeextern "C" { |
88 | #[cfg_attr (PyPy, link_name = "PyPySlice_Unpack" )] |
89 | pub unsafefn 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 unsafefn 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 | } |
104 | |