| 33 | namespace detail { |
| 34 | |
| 35 | void PySliceUnpack(PyObject* object, Py_ssize_t* start, Py_ssize_t* stop, Py_ssize_t* step) { |
| 36 | PySliceObject* obj = (PySliceObject*)object; |
| 37 | if (obj->step == Py_None) { |
| 38 | *step = 1; |
| 39 | } else { |
| 40 | CHECK_OR_THROW(_PyEval_SliceIndex(obj->step, step)) |
| 41 | << "Invalid slice " << PyObjectToReprStr(object); |
| 42 | CHECK_NE_OR_THROW(*step, 0) << "slice step cannot be zero."; |
| 43 | if (*step < -PY_SSIZE_T_MAX) *step = -PY_SSIZE_T_MAX; |
| 44 | } |
| 45 | if (obj->start == Py_None) { |
| 46 | *start = *step < 0 ? PY_SSIZE_T_MAX : 0; |
| 47 | } else { |
| 48 | CHECK_OR_THROW(_PyEval_SliceIndex(obj->start, start)) |
| 49 | << "Invalid slice " << PyObjectToReprStr(object); |
| 50 | } |
| 51 | if (obj->stop == Py_None) { |
| 52 | *stop = *step < 0 ? PY_SSIZE_T_MIN : PY_SSIZE_T_MAX; |
| 53 | } else { |
| 54 | CHECK_OR_THROW(_PyEval_SliceIndex(obj->stop, stop)) |
| 55 | << "Invalid slice " << PyObjectToReprStr(object); |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | DataType InferScalarType(PyObject* object) { |
| 60 | if (PyBool_Check(object)) { |
no test coverage detected