| 1 | use crate::object::*; |
| 2 | use crate::pyport::Py_ssize_t; |
| 3 | #[cfg (any(Py_3_12, all(Py_3_8, not(Py_LIMITED_API))))] |
| 4 | use libc::size_t; |
| 5 | use std::os::raw::{c_char, c_int}; |
| 6 | |
| 7 | #[inline ] |
| 8 | #[cfg (all( |
| 9 | not(Py_3_13), // CPython exposed as a function in 3.13, in object.h |
| 10 | not(all(PyPy, not(Py_3_11))) // PyPy exposed as a function until PyPy 3.10, macro in 3.11+ |
| 11 | ))] |
| 12 | pub unsafe fn PyObject_DelAttrString(o: *mut PyObject, attr_name: *const c_char) -> c_int { |
| 13 | PyObject_SetAttrString(arg1:o, arg2:attr_name, arg3:std::ptr::null_mut()) |
| 14 | } |
| 15 | |
| 16 | #[inline ] |
| 17 | #[cfg (all( |
| 18 | not(Py_3_13), // CPython exposed as a function in 3.13, in object.h |
| 19 | not(all(PyPy, not(Py_3_11))) // PyPy exposed as a function until PyPy 3.10, macro in 3.11+ |
| 20 | ))] |
| 21 | pub unsafe fn PyObject_DelAttr(o: *mut PyObject, attr_name: *mut PyObject) -> c_int { |
| 22 | PyObject_SetAttr(arg1:o, arg2:attr_name, arg3:std::ptr::null_mut()) |
| 23 | } |
| 24 | |
| 25 | unsafeextern "C" { |
| 26 | #[cfg (all( |
| 27 | not(PyPy), |
| 28 | any(Py_3_10, all(not(Py_LIMITED_API), Py_3_9)) // Added to python in 3.9 but to limited API in 3.10 |
| 29 | ))] |
| 30 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallNoArgs" )] |
| 31 | pub unsafefn PyObject_CallNoArgs(func: *mut PyObject) -> *mut PyObject; |
| 32 | #[cfg_attr (PyPy, link_name = "PyPyObject_Call" )] |
| 33 | pub unsafefn PyObject_Call( |
| 34 | callable_object: *mut PyObject, |
| 35 | args: *mut PyObject, |
| 36 | kw: *mut PyObject, |
| 37 | ) -> *mut PyObject; |
| 38 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallObject" )] |
| 39 | pub unsafefn PyObject_CallObject( |
| 40 | callable_object: *mut PyObject, |
| 41 | args: *mut PyObject, |
| 42 | ) -> *mut PyObject; |
| 43 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallFunction" )] |
| 44 | pub unsafefn PyObject_CallFunction( |
| 45 | callable_object: *mut PyObject, |
| 46 | format: *const c_char, |
| 47 | ... |
| 48 | ) -> *mut PyObject; |
| 49 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallMethod" )] |
| 50 | pub unsafefn PyObject_CallMethod( |
| 51 | o: *mut PyObject, |
| 52 | method: *const c_char, |
| 53 | format: *const c_char, |
| 54 | ... |
| 55 | ) -> *mut PyObject; |
| 56 | |
| 57 | #[cfg (not(Py_3_13))] |
| 58 | #[cfg_attr (PyPy, link_name = "_PyPyObject_CallFunction_SizeT" )] |
| 59 | pub unsafefn _PyObject_CallFunction_SizeT( |
| 60 | callable_object: *mut PyObject, |
| 61 | format: *const c_char, |
| 62 | ... |
| 63 | ) -> *mut PyObject; |
| 64 | #[cfg (not(Py_3_13))] |
| 65 | #[cfg_attr (PyPy, link_name = "_PyPyObject_CallMethod_SizeT" )] |
| 66 | pub unsafefn _PyObject_CallMethod_SizeT( |
| 67 | o: *mut PyObject, |
| 68 | method: *const c_char, |
| 69 | format: *const c_char, |
| 70 | ... |
| 71 | ) -> *mut PyObject; |
| 72 | |
| 73 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallFunctionObjArgs" )] |
| 74 | pub unsafefn PyObject_CallFunctionObjArgs(callable: *mut PyObject, ...) -> *mut PyObject; |
| 75 | #[cfg_attr (PyPy, link_name = "PyPyObject_CallMethodObjArgs" )] |
| 76 | pub unsafefn PyObject_CallMethodObjArgs( |
| 77 | o: *mut PyObject, |
| 78 | method: *mut PyObject, |
| 79 | ... |
| 80 | ) -> *mut PyObject; |
| 81 | } |
| 82 | #[cfg (any(Py_3_12, all(Py_3_8, not(Py_LIMITED_API))))] |
| 83 | pub const PY_VECTORCALL_ARGUMENTS_OFFSET: size_t = |
| 84 | 1 << (8 * std::mem::size_of::<size_t>() as size_t - 1); |
| 85 | |
| 86 | unsafeextern "C" { |
| 87 | #[cfg_attr (PyPy, link_name = "PyPyObject_Vectorcall" )] |
| 88 | #[cfg (any(Py_3_12, all(Py_3_11, not(Py_LIMITED_API))))] |
| 89 | pub fn PyObject_Vectorcall( |
| 90 | callable: *mut PyObject, |
| 91 | args: *const *mut PyObject, |
| 92 | nargsf: size_t, |
| 93 | kwnames: *mut PyObject, |
| 94 | ) -> *mut PyObject; |
| 95 | |
| 96 | #[cfg (any(Py_3_12, all(Py_3_9, not(any(Py_LIMITED_API, PyPy, GraalPy)))))] |
| 97 | pub fn PyObject_VectorcallMethod( |
| 98 | name: *mut PyObject, |
| 99 | args: *const *mut PyObject, |
| 100 | nargsf: size_t, |
| 101 | kwnames: *mut PyObject, |
| 102 | ) -> *mut PyObject; |
| 103 | #[cfg_attr (PyPy, link_name = "PyPyObject_Type" )] |
| 104 | pub unsafefn PyObject_Type(o: *mut PyObject) -> *mut PyObject; |
| 105 | #[cfg_attr (PyPy, link_name = "PyPyObject_Size" )] |
| 106 | pub unsafefn PyObject_Size(o: *mut PyObject) -> Py_ssize_t; |
| 107 | } |
| 108 | |
| 109 | #[inline ] |
| 110 | pub unsafe fn PyObject_Length(o: *mut PyObject) -> Py_ssize_t { |
| 111 | PyObject_Size(o) |
| 112 | } |
| 113 | |
| 114 | unsafeextern "C" { |
| 115 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetItem" )] |
| 116 | pub unsafefn PyObject_GetItem(o: *mut PyObject, key: *mut PyObject) -> *mut PyObject; |
| 117 | #[cfg_attr (PyPy, link_name = "PyPyObject_SetItem" )] |
| 118 | pub unsafefn PyObject_SetItem(o: *mut PyObject, key: *mut PyObject, v: *mut PyObject) -> c_int; |
| 119 | #[cfg_attr (PyPy, link_name = "PyPyObject_DelItemString" )] |
| 120 | pub unsafefn PyObject_DelItemString(o: *mut PyObject, key: *const c_char) -> c_int; |
| 121 | #[cfg_attr (PyPy, link_name = "PyPyObject_DelItem" )] |
| 122 | pub unsafefn PyObject_DelItem(o: *mut PyObject, key: *mut PyObject) -> c_int; |
| 123 | } |
| 124 | |
| 125 | unsafeextern "C" { |
| 126 | #[cfg_attr (PyPy, link_name = "PyPyObject_Format" )] |
| 127 | pub unsafefn PyObject_Format(obj: *mut PyObject, format_spec: *mut PyObject) -> *mut PyObject; |
| 128 | #[cfg_attr (PyPy, link_name = "PyPyObject_GetIter" )] |
| 129 | pub unsafefn PyObject_GetIter(arg1: *mut PyObject) -> *mut PyObject; |
| 130 | } |
| 131 | |
| 132 | // Before 3.8 PyIter_Check was defined in CPython as a macro, |
| 133 | // but the implementation of that in PyO3 did not work, see |
| 134 | // https://github.com/PyO3/pyo3/pull/2914 |
| 135 | // |
| 136 | // This is a slow implementation which should function equivalently. |
| 137 | #[cfg (not(any(Py_3_8, PyPy)))] |
| 138 | #[inline ] |
| 139 | pub unsafe fn PyIter_Check(o: *mut PyObject) -> c_int { |
| 140 | crate::PyObject_HasAttrString(crate::Py_TYPE(o).cast(), c_str!("__next__" ).as_ptr()) |
| 141 | } |
| 142 | |
| 143 | unsafeextern "C" { |
| 144 | #[cfg (any(Py_3_8, PyPy))] |
| 145 | #[cfg_attr (PyPy, link_name = "PyPyIter_Check" )] |
| 146 | pub unsafefn PyIter_Check(obj: *mut PyObject) -> c_int; |
| 147 | |
| 148 | #[cfg_attr (PyPy, link_name = "PyPyIter_Next" )] |
| 149 | pub unsafefn PyIter_Next(arg1: *mut PyObject) -> *mut PyObject; |
| 150 | #[cfg (all(not(PyPy), Py_3_10))] |
| 151 | #[cfg_attr (PyPy, link_name = "PyPyIter_Send" )] |
| 152 | pub unsafefn PyIter_Send( |
| 153 | iter: *mut PyObject, |
| 154 | arg: *mut PyObject, |
| 155 | presult: *mut *mut PyObject, |
| 156 | ) -> PySendResult; |
| 157 | |
| 158 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Check" )] |
| 159 | pub unsafefn PyNumber_Check(o: *mut PyObject) -> c_int; |
| 160 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Add" )] |
| 161 | pub unsafefn PyNumber_Add(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 162 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Subtract" )] |
| 163 | pub unsafefn PyNumber_Subtract(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 164 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Multiply" )] |
| 165 | pub unsafefn PyNumber_Multiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 166 | #[cfg_attr (PyPy, link_name = "PyPyNumber_MatrixMultiply" )] |
| 167 | pub unsafefn PyNumber_MatrixMultiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 168 | #[cfg_attr (PyPy, link_name = "PyPyNumber_FloorDivide" )] |
| 169 | pub unsafefn PyNumber_FloorDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 170 | #[cfg_attr (PyPy, link_name = "PyPyNumber_TrueDivide" )] |
| 171 | pub unsafefn PyNumber_TrueDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 172 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Remainder" )] |
| 173 | pub unsafefn PyNumber_Remainder(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 174 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Divmod" )] |
| 175 | pub unsafefn PyNumber_Divmod(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 176 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Power" )] |
| 177 | pub unsafefn PyNumber_Power(o1: *mut PyObject, o2: *mut PyObject, o3: *mut PyObject) |
| 178 | -> *mut PyObject; |
| 179 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Negative" )] |
| 180 | pub unsafefn PyNumber_Negative(o: *mut PyObject) -> *mut PyObject; |
| 181 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Positive" )] |
| 182 | pub unsafefn PyNumber_Positive(o: *mut PyObject) -> *mut PyObject; |
| 183 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Absolute" )] |
| 184 | pub unsafefn PyNumber_Absolute(o: *mut PyObject) -> *mut PyObject; |
| 185 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Invert" )] |
| 186 | pub unsafefn PyNumber_Invert(o: *mut PyObject) -> *mut PyObject; |
| 187 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Lshift" )] |
| 188 | pub unsafefn PyNumber_Lshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 189 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Rshift" )] |
| 190 | pub unsafefn PyNumber_Rshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 191 | #[cfg_attr (PyPy, link_name = "PyPyNumber_And" )] |
| 192 | pub unsafefn PyNumber_And(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 193 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Xor" )] |
| 194 | pub unsafefn PyNumber_Xor(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 195 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Or" )] |
| 196 | pub unsafefn PyNumber_Or(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 197 | } |
| 198 | |
| 199 | // Defined as this macro in Python limited API, but relies on |
| 200 | // non-limited PyTypeObject. Don't expose this since it cannot be used. |
| 201 | #[cfg (not(any(Py_LIMITED_API, PyPy)))] |
| 202 | #[inline ] |
| 203 | pub unsafe fn PyIndex_Check(o: *mut PyObject) -> c_int { |
| 204 | let tp_as_number = (*Py_TYPE(o)).tp_as_number; |
| 205 | (!tp_as_number.is_null() && (*tp_as_number).nb_index.is_some()) as c_int |
| 206 | } |
| 207 | |
| 208 | unsafeextern "C" { |
| 209 | #[cfg (any(all(Py_3_8, Py_LIMITED_API), PyPy))] |
| 210 | #[link_name = "PyPyIndex_Check" ] |
| 211 | pub unsafefn PyIndex_Check(o: *mut PyObject) -> c_int; |
| 212 | |
| 213 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Index" )] |
| 214 | pub unsafefn PyNumber_Index(o: *mut PyObject) -> *mut PyObject; |
| 215 | #[cfg_attr (PyPy, link_name = "PyPyNumber_AsSsize_t" )] |
| 216 | pub unsafefn PyNumber_AsSsize_t(o: *mut PyObject, exc: *mut PyObject) -> Py_ssize_t; |
| 217 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Long" )] |
| 218 | pub unsafefn PyNumber_Long(o: *mut PyObject) -> *mut PyObject; |
| 219 | #[cfg_attr (PyPy, link_name = "PyPyNumber_Float" )] |
| 220 | pub unsafefn PyNumber_Float(o: *mut PyObject) -> *mut PyObject; |
| 221 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceAdd" )] |
| 222 | pub unsafefn PyNumber_InPlaceAdd(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 223 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceSubtract" )] |
| 224 | pub unsafefn PyNumber_InPlaceSubtract(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 225 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceMultiply" )] |
| 226 | pub unsafefn PyNumber_InPlaceMultiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 227 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceMatrixMultiply" )] |
| 228 | pub unsafefn PyNumber_InPlaceMatrixMultiply(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 229 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceFloorDivide" )] |
| 230 | pub unsafefn PyNumber_InPlaceFloorDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 231 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceTrueDivide" )] |
| 232 | pub unsafefn PyNumber_InPlaceTrueDivide(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 233 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceRemainder" )] |
| 234 | pub unsafefn PyNumber_InPlaceRemainder(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 235 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlacePower" )] |
| 236 | pub unsafefn PyNumber_InPlacePower( |
| 237 | o1: *mut PyObject, |
| 238 | o2: *mut PyObject, |
| 239 | o3: *mut PyObject, |
| 240 | ) -> *mut PyObject; |
| 241 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceLshift" )] |
| 242 | pub unsafefn PyNumber_InPlaceLshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 243 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceRshift" )] |
| 244 | pub unsafefn PyNumber_InPlaceRshift(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 245 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceAnd" )] |
| 246 | pub unsafefn PyNumber_InPlaceAnd(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 247 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceXor" )] |
| 248 | pub unsafefn PyNumber_InPlaceXor(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 249 | #[cfg_attr (PyPy, link_name = "PyPyNumber_InPlaceOr" )] |
| 250 | pub unsafefn PyNumber_InPlaceOr(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 251 | pub unsafefn PyNumber_ToBase(n: *mut PyObject, base: c_int) -> *mut PyObject; |
| 252 | |
| 253 | #[cfg_attr (PyPy, link_name = "PyPySequence_Check" )] |
| 254 | pub unsafefn PySequence_Check(o: *mut PyObject) -> c_int; |
| 255 | #[cfg_attr (PyPy, link_name = "PyPySequence_Size" )] |
| 256 | pub unsafefn PySequence_Size(o: *mut PyObject) -> Py_ssize_t; |
| 257 | |
| 258 | #[cfg (PyPy)] |
| 259 | #[link_name = "PyPySequence_Length" ] |
| 260 | pub fn PySequence_Length(o: *mut PyObject) -> Py_ssize_t; |
| 261 | } |
| 262 | |
| 263 | #[inline ] |
| 264 | #[cfg (not(PyPy))] |
| 265 | pub unsafe fn PySequence_Length(o: *mut PyObject) -> Py_ssize_t { |
| 266 | PySequence_Size(o) |
| 267 | } |
| 268 | |
| 269 | unsafeextern "C" { |
| 270 | #[cfg_attr (PyPy, link_name = "PyPySequence_Concat" )] |
| 271 | pub unsafefn PySequence_Concat(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 272 | #[cfg_attr (PyPy, link_name = "PyPySequence_Repeat" )] |
| 273 | pub unsafefn PySequence_Repeat(o: *mut PyObject, count: Py_ssize_t) -> *mut PyObject; |
| 274 | #[cfg_attr (PyPy, link_name = "PyPySequence_GetItem" )] |
| 275 | pub unsafefn PySequence_GetItem(o: *mut PyObject, i: Py_ssize_t) -> *mut PyObject; |
| 276 | #[cfg_attr (PyPy, link_name = "PyPySequence_GetSlice" )] |
| 277 | pub unsafefn PySequence_GetSlice(o: *mut PyObject, i1: Py_ssize_t, i2: Py_ssize_t) -> *mut PyObject; |
| 278 | #[cfg_attr (PyPy, link_name = "PyPySequence_SetItem" )] |
| 279 | pub unsafefn PySequence_SetItem(o: *mut PyObject, i: Py_ssize_t, v: *mut PyObject) -> c_int; |
| 280 | #[cfg_attr (PyPy, link_name = "PyPySequence_DelItem" )] |
| 281 | pub unsafefn PySequence_DelItem(o: *mut PyObject, i: Py_ssize_t) -> c_int; |
| 282 | #[cfg_attr (PyPy, link_name = "PyPySequence_SetSlice" )] |
| 283 | pub unsafefn PySequence_SetSlice( |
| 284 | o: *mut PyObject, |
| 285 | i1: Py_ssize_t, |
| 286 | i2: Py_ssize_t, |
| 287 | v: *mut PyObject, |
| 288 | ) -> c_int; |
| 289 | #[cfg_attr (PyPy, link_name = "PyPySequence_DelSlice" )] |
| 290 | pub unsafefn PySequence_DelSlice(o: *mut PyObject, i1: Py_ssize_t, i2: Py_ssize_t) -> c_int; |
| 291 | #[cfg_attr (PyPy, link_name = "PyPySequence_Tuple" )] |
| 292 | pub unsafefn PySequence_Tuple(o: *mut PyObject) -> *mut PyObject; |
| 293 | #[cfg_attr (PyPy, link_name = "PyPySequence_List" )] |
| 294 | pub unsafefn PySequence_List(o: *mut PyObject) -> *mut PyObject; |
| 295 | #[cfg_attr (PyPy, link_name = "PyPySequence_Fast" )] |
| 296 | pub unsafefn PySequence_Fast(o: *mut PyObject, m: *const c_char) -> *mut PyObject; |
| 297 | // skipped PySequence_Fast_GET_SIZE |
| 298 | // skipped PySequence_Fast_GET_ITEM |
| 299 | // skipped PySequence_Fast_GET_ITEMS |
| 300 | pub unsafefn PySequence_Count(o: *mut PyObject, value: *mut PyObject) -> Py_ssize_t; |
| 301 | #[cfg_attr (PyPy, link_name = "PyPySequence_Contains" )] |
| 302 | pub unsafefn PySequence_Contains(seq: *mut PyObject, ob: *mut PyObject) -> c_int; |
| 303 | } |
| 304 | |
| 305 | #[inline ] |
| 306 | pub unsafe fn PySequence_In(o: *mut PyObject, value: *mut PyObject) -> c_int { |
| 307 | PySequence_Contains(seq:o, ob:value) |
| 308 | } |
| 309 | |
| 310 | unsafeextern "C" { |
| 311 | #[cfg_attr (PyPy, link_name = "PyPySequence_Index" )] |
| 312 | pub unsafefn PySequence_Index(o: *mut PyObject, value: *mut PyObject) -> Py_ssize_t; |
| 313 | #[cfg_attr (PyPy, link_name = "PyPySequence_InPlaceConcat" )] |
| 314 | pub unsafefn PySequence_InPlaceConcat(o1: *mut PyObject, o2: *mut PyObject) -> *mut PyObject; |
| 315 | #[cfg_attr (PyPy, link_name = "PyPySequence_InPlaceRepeat" )] |
| 316 | pub unsafefn PySequence_InPlaceRepeat(o: *mut PyObject, count: Py_ssize_t) -> *mut PyObject; |
| 317 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Check" )] |
| 318 | pub unsafefn PyMapping_Check(o: *mut PyObject) -> c_int; |
| 319 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Size" )] |
| 320 | pub unsafefn PyMapping_Size(o: *mut PyObject) -> Py_ssize_t; |
| 321 | |
| 322 | #[cfg (PyPy)] |
| 323 | #[link_name = "PyPyMapping_Length" ] |
| 324 | pub fn PyMapping_Length(o: *mut PyObject) -> Py_ssize_t; |
| 325 | } |
| 326 | |
| 327 | #[inline ] |
| 328 | #[cfg (not(PyPy))] |
| 329 | pub unsafe fn PyMapping_Length(o: *mut PyObject) -> Py_ssize_t { |
| 330 | PyMapping_Size(o) |
| 331 | } |
| 332 | |
| 333 | #[inline ] |
| 334 | pub unsafe fn PyMapping_DelItemString(o: *mut PyObject, key: *mut c_char) -> c_int { |
| 335 | PyObject_DelItemString(o, key) |
| 336 | } |
| 337 | |
| 338 | #[inline ] |
| 339 | pub unsafe fn PyMapping_DelItem(o: *mut PyObject, key: *mut PyObject) -> c_int { |
| 340 | PyObject_DelItem(o, key) |
| 341 | } |
| 342 | |
| 343 | unsafeextern "C" { |
| 344 | #[cfg_attr (PyPy, link_name = "PyPyMapping_HasKeyString" )] |
| 345 | pub unsafefn PyMapping_HasKeyString(o: *mut PyObject, key: *const c_char) -> c_int; |
| 346 | #[cfg_attr (PyPy, link_name = "PyPyMapping_HasKey" )] |
| 347 | pub unsafefn PyMapping_HasKey(o: *mut PyObject, key: *mut PyObject) -> c_int; |
| 348 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Keys" )] |
| 349 | pub unsafefn PyMapping_Keys(o: *mut PyObject) -> *mut PyObject; |
| 350 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Values" )] |
| 351 | pub unsafefn PyMapping_Values(o: *mut PyObject) -> *mut PyObject; |
| 352 | #[cfg_attr (PyPy, link_name = "PyPyMapping_Items" )] |
| 353 | pub unsafefn PyMapping_Items(o: *mut PyObject) -> *mut PyObject; |
| 354 | #[cfg_attr (PyPy, link_name = "PyPyMapping_GetItemString" )] |
| 355 | pub unsafefn PyMapping_GetItemString(o: *mut PyObject, key: *const c_char) -> *mut PyObject; |
| 356 | #[cfg_attr (PyPy, link_name = "PyPyMapping_SetItemString" )] |
| 357 | pub unsafefn PyMapping_SetItemString( |
| 358 | o: *mut PyObject, |
| 359 | key: *const c_char, |
| 360 | value: *mut PyObject, |
| 361 | ) -> c_int; |
| 362 | #[cfg_attr (PyPy, link_name = "PyPyObject_IsInstance" )] |
| 363 | pub unsafefn PyObject_IsInstance(object: *mut PyObject, typeorclass: *mut PyObject) -> c_int; |
| 364 | #[cfg_attr (PyPy, link_name = "PyPyObject_IsSubclass" )] |
| 365 | pub unsafefn PyObject_IsSubclass(object: *mut PyObject, typeorclass: *mut PyObject) -> c_int; |
| 366 | } |
| 367 | |