10#include "nuitka/prelude.h"
13bool SEQUENCE_SET_ITEM(PyObject *sequence, Py_ssize_t index, PyObject *value) {
14 CHECK_OBJECT(sequence);
17 PySequenceMethods *tp_as_sequence = Py_TYPE(sequence)->tp_as_sequence;
19 if (tp_as_sequence != NULL && tp_as_sequence->sq_ass_item) {
21 if (tp_as_sequence->sq_length) {
22 Py_ssize_t length = (*tp_as_sequence->sq_length)(sequence);
32 int res = tp_as_sequence->sq_ass_item(sequence, index, value);
34 if (unlikely(res == -1)) {
40 SET_CURRENT_EXCEPTION_TYPE_COMPLAINT(
"'%s' object does not support item assignment", sequence);
45Py_ssize_t Nuitka_PyObject_Size(PyObject *sequence) {
46 CHECK_OBJECT(sequence);
48 PySequenceMethods *tp_as_sequence = Py_TYPE(sequence)->tp_as_sequence;
50 if (tp_as_sequence && tp_as_sequence->sq_length) {
51 return tp_as_sequence->sq_length(sequence);
54 return Nuitka_PyMapping_Size(sequence);
57PyObject *Nuitka_Number_Index(PyObject *item) {
60#if PYTHON_VERSION < 0x300
61 if (PyInt_Check(item) || PyLong_Check(item))
63 if (PyLong_Check(item))
70 if (unlikely(!Nuitka_Index_Check(item))) {
71 SET_CURRENT_EXCEPTION_TYPE_COMPLAINT(
"'%s' object cannot be interpreted as an integer", item);
75 PyObject *result = Py_TYPE(item)->tp_as_number->nb_index(item);
77#if PYTHON_VERSION < 0x300
78 if (result == NULL || PyInt_CheckExact(result) || PyLong_CheckExact(result)) {
82 if (result == NULL || PyLong_CheckExact(result)) {
87#if PYTHON_VERSION < 0x300
88 if (!PyInt_Check(result) && !PyLong_Check(result))
90 if (!PyLong_Check(result))
93#if PYTHON_VERSION < 0x300
94 char const *message =
"__index__ returned non-(int,long) (type %s)";
96 char const *message =
"__index__ returned non-int (type %s)";
98 SET_CURRENT_EXCEPTION_TYPE_COMPLAINT(message, result);
107#if PYTHON_VERSION >= 0x3a0
108PyObject *Nuitka_Number_IndexAsLong(PyObject *item) {
109 PyObject *result = Nuitka_Number_Index(item);
111 if (result != NULL) {
112 PyObject *converted_long = _PyLong_Copy((PyLongObject *)result);
115 return converted_long;