1e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum/* Abstract Object Interface (many thanks to Jim Fulton) */
2cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
3e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum#include "Python.h"
4fa0b6ab01a962cbe624ad55fc5068a6d6b50bd0fGuido van Rossum#include <ctype.h>
55a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#include "structmember.h" /* we need the offsetof() macro from there */
664b5ce3a69569b203a39f74c5c03348ba0a67583Tim Peters#include "longintrepr.h"
75a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
10cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Shorthands to return certain errors */
11e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
12e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumstatic PyObject *
130e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouterstype_error(const char *msg, PyObject *obj)
14e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
15f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
16f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
17e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
18e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
19052b7e1cfb241b6154d38fd10815011e820f7f69Guido van Rossumstatic PyObject *
20799124718ddfbb95440470037d8d7760b821646fFred Drakenull_error(void)
21e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
22f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyErr_Occurred())
23f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_SetString(PyExc_SystemError,
24f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        "null argument to internal routine");
25f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
26e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
27e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
28cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on any object */
29cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
30e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
31799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_Type(PyObject *o)
32e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
33f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
34e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
3571aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL) {
36f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
3771aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
3871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner
39f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = (PyObject *)o->ob_type;
40f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_INCREF(v);
41f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return v;
42e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
43e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
4418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
456253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyObject_Size(PyObject *o)
46e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
47f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *m;
48e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
49f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (o == NULL) {
50f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
51f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
52f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
53e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
54f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_sequence;
55f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_length)
56f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_length(o);
57e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
58f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyMapping_Size(o);
59e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
60e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
61cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyObject_Length
6218e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
63cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyObject_Length(PyObject *o)
64cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{
65f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyObject_Size(o);
66cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg}
67cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyObject_Length PyObject_Size
68cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg
69aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacherint
70aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher_PyObject_HasLen(PyObject *o) {
71aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
72aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
73aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher}
74255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes
75255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes/* The length hint function returns a non-negative value from o.__len__()
7674b38b190faae988b4951cf46d83f853589aa530Armin Ronacher   or o.__length_hint__(). If those methods aren't found the defaultvalue is
7774b38b190faae988b4951cf46d83f853589aa530Armin Ronacher   returned.  If one of the calls fails with an exception other than TypeError
7874b38b190faae988b4951cf46d83f853589aa530Armin Ronacher   this function returns -1.
79255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes*/
80255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes
8118e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
82aa9a79d27958ae5afb6c8769a2b342d98677c091Armin RonacherPyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
836b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger{
84b70e8a1958a15dadd4e4371427498bc11a7b8077Christian Heimes    PyObject *hint, *result;
856314d164c9ea6fb7ef52c0ccbaa335f4d3fab9cbChristian Heimes    Py_ssize_t res;
86ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson    _Py_IDENTIFIER(__length_hint__);
87f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka    if (_PyObject_HasLen(o)) {
88f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka        res = PyObject_Length(o);
89f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka        if (res < 0 && PyErr_Occurred()) {
90f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka            if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
91f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka                return -1;
92f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka            }
93f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka            PyErr_Clear();
94f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka        }
95f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka        else {
96f740d467bf4c4552cf437d41838a75fb2dc168d8Serhiy Storchaka            return res;
97aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        }
98aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    }
996314d164c9ea6fb7ef52c0ccbaa335f4d3fab9cbChristian Heimes    hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
100aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    if (hint == NULL) {
101aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        if (PyErr_Occurred()) {
102f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return -1;
103aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        }
104aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        return defaultvalue;
105aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    }
106b70e8a1958a15dadd4e4371427498bc11a7b8077Christian Heimes    result = PyObject_CallFunctionObjArgs(hint, NULL);
107aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    Py_DECREF(hint);
108aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    if (result == NULL) {
109aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        if (PyErr_ExceptionMatches(PyExc_TypeError)) {
110aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher            PyErr_Clear();
111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return defaultvalue;
112aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        }
113aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        return -1;
114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
115aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    else if (result == Py_NotImplemented) {
116aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        Py_DECREF(result);
117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return defaultvalue;
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
119aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    if (!PyLong_Check(result)) {
12074b38b190faae988b4951cf46d83f853589aa530Armin Ronacher        PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
121aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher            Py_TYPE(result)->tp_name);
122aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        Py_DECREF(result);
123aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        return -1;
124aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    }
12574b38b190faae988b4951cf46d83f853589aa530Armin Ronacher    res = PyLong_AsSsize_t(result);
126aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    Py_DECREF(result);
12774b38b190faae988b4951cf46d83f853589aa530Armin Ronacher    if (res < 0 && PyErr_Occurred()) {
128aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        return -1;
129aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    }
13074b38b190faae988b4951cf46d83f853589aa530Armin Ronacher    if (res < 0) {
131aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
132aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher        return -1;
133aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    }
13474b38b190faae988b4951cf46d83f853589aa530Armin Ronacher    return res;
1356b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger}
1366b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger
137e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
138799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_GetItem(PyObject *o, PyObject *key)
139e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMappingMethods *m;
141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
14271aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL || key == NULL) {
143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
14471aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_mapping;
147e20310fa19188f764b84fbdc40d32d6933f98af9Victor Stinner    if (m && m->mp_subscript) {
148e20310fa19188f764b84fbdc40d32d6933f98af9Victor Stinner        PyObject *item = m->mp_subscript(o, key);
149e20310fa19188f764b84fbdc40d32d6933f98af9Victor Stinner        assert((item != NULL) ^ (PyErr_Occurred() != NULL));
150e20310fa19188f764b84fbdc40d32d6933f98af9Victor Stinner        return item;
151e20310fa19188f764b84fbdc40d32d6933f98af9Victor Stinner    }
152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (o->ob_type->tp_as_sequence) {
154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PyIndex_Check(key)) {
155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_ssize_t key_value;
156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (key_value == -1 && PyErr_Occurred())
158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return NULL;
159f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return PySequence_GetItem(o, key_value);
160f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
161f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (o->ob_type->tp_as_sequence->sq_item)
162f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return type_error("sequence index must "
163f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                              "be integer, not '%.200s'", key);
164f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
165cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("'%.200s' object is not subscriptable", o);
167e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
168e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
169e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint
170799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
171e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMappingMethods *m;
173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (o == NULL || key == NULL || value == NULL) {
175f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
176f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
177f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_mapping;
179f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->mp_ass_subscript)
180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->mp_ass_subscript(o, key, value);
181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (o->ob_type->tp_as_sequence) {
183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PyIndex_Check(key)) {
184f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_ssize_t key_value;
185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (key_value == -1 && PyErr_Occurred())
187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return -1;
188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return PySequence_SetItem(o, key_value, value);
189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (o->ob_type->tp_as_sequence->sq_ass_item) {
191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            type_error("sequence index must be "
192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                       "integer, not '%.200s'", key);
193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return -1;
194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type_error("'%.200s' object does not support item assignment", o);
198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return -1;
199e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
200e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2016cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint
202799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_DelItem(PyObject *o, PyObject *key)
2036cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{
204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMappingMethods *m;
205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (o == NULL || key == NULL) {
207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_mapping;
211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->mp_ass_subscript)
212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->mp_ass_subscript(o, key, (PyObject*)NULL);
213f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (o->ob_type->tp_as_sequence) {
215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PyIndex_Check(key)) {
216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_ssize_t key_value;
217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (key_value == -1 && PyErr_Occurred())
219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return -1;
220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return PySequence_DelItem(o, key_value);
221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (o->ob_type->tp_as_sequence->sq_ass_item) {
223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            type_error("sequence index must be "
224f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                       "integer, not '%.200s'", key);
225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return -1;
226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
227f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
228f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
229f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type_error("'%.200s' object does not support item deletion", o);
230f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return -1;
2316cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum}
2326cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
233b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwisint
234c679227e31245b0e8dec74a1f7cc77710541d985Serhiy StorchakaPyObject_DelItemString(PyObject *o, const char *key)
235b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis{
236f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *okey;
237f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int ret;
238b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis
239f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (o == NULL || key == NULL) {
240f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
241f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
242f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
243f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    okey = PyUnicode_FromString(key);
244f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (okey == NULL)
245f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
246f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ret = PyObject_DelItem(o, okey);
247f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(okey);
248f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return ret;
249b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis}
250b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis
251b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant/* We release the buffer right after use of this function which could
25298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum   cause issues later on.  Don't use these functions in new code.
253b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant */
25473e5a5b65d66f4fba9c4f626bcd6400f4a7215e6Thomas Woutersint
25573e5a5b65d66f4fba9c4f626bcd6400f4a7215e6Thomas WoutersPyObject_AsCharBuffer(PyObject *obj,
256f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                      const char **buffer,
257f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                      Py_ssize_t *buffer_len)
258f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
2594fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    return PyObject_AsReadBuffer(obj, (const void **)buffer, buffer_len);
26089c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton}
2614c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
26289c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hyltonint
26389c3a22a2788cb85b89990543e33236cd60ba307Jeremy HyltonPyObject_CheckReadBuffer(PyObject *obj)
26489c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton{
265f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
266f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_buffer view;
26789c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton
268f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (pb == NULL ||
269f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        pb->bf_getbuffer == NULL)
270f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
271f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
273f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyBuffer_Release(&view);
276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 1;
2774c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum}
2784c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2794c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsReadBuffer(PyObject *obj,
280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                          const void **buffer,
281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                          Py_ssize_t *buffer_len)
282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_buffer view;
284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (obj == NULL || buffer == NULL || buffer_len == NULL) {
286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
287f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2894fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
290f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
291f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *buffer = view.buf;
293f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *buffer_len = view.len;
2944fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    PyBuffer_Release(&view);
295f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
2964c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum}
2974c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2984c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsWriteBuffer(PyObject *obj,
299f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                           void **buffer,
300f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                           Py_ssize_t *buffer_len)
301f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
302f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyBufferProcs *pb;
303f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_buffer view;
304f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
305f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (obj == NULL || buffer == NULL || buffer_len == NULL) {
306f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
307f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    pb = obj->ob_type->tp_as_buffer;
310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (pb == NULL ||
311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        pb->bf_getbuffer == NULL ||
312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_SetString(PyExc_TypeError,
314861470c83607a4312d3c65bce3e18414b965e586R David Murray                        "expected a writable bytes-like object");
315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
317f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
318f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *buffer = view.buf;
319f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *buffer_len = view.len;
3204fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    PyBuffer_Release(&view);
321f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
3224c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum}
3234c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
324b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant/* Buffer C-API for Python 3.0 */
325b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
326b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint
3278ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
328b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
3294fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
3304fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka
3314fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    if (pb == NULL || pb->bf_getbuffer == NULL) {
332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Format(PyExc_TypeError,
333861470c83607a4312d3c65bce3e18414b965e586R David Murray                     "a bytes-like object is required, not '%.100s'",
334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     Py_TYPE(obj)->tp_name);
335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
3374fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    return (*pb->bf_getbuffer)(obj, view, flags);
338b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
339b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
340b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantstatic int
3419a2d99e28a5c2989b2db4023acae4f550885f2efStefan Krah_IsFortranContiguous(const Py_buffer *view)
342b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t sd, dim;
344f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int i;
34598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
346363af44a4abff02ece61e456d55824f298448992Stefan Krah    /* 1) len = product(shape) * itemsize
347363af44a4abff02ece61e456d55824f298448992Stefan Krah       2) itemsize > 0
348363af44a4abff02ece61e456d55824f298448992Stefan Krah       3) len = 0 <==> exists i: shape[i] = 0 */
349363af44a4abff02ece61e456d55824f298448992Stefan Krah    if (view->len == 0) return 1;
350363af44a4abff02ece61e456d55824f298448992Stefan Krah    if (view->strides == NULL) {  /* C-contiguous by definition */
351363af44a4abff02ece61e456d55824f298448992Stefan Krah        /* Trivially F-contiguous */
352363af44a4abff02ece61e456d55824f298448992Stefan Krah        if (view->ndim <= 1) return 1;
353363af44a4abff02ece61e456d55824f298448992Stefan Krah
354363af44a4abff02ece61e456d55824f298448992Stefan Krah        /* ndim > 1 implies shape != NULL */
355363af44a4abff02ece61e456d55824f298448992Stefan Krah        assert(view->shape != NULL);
356363af44a4abff02ece61e456d55824f298448992Stefan Krah
357363af44a4abff02ece61e456d55824f298448992Stefan Krah        /* Effectively 1-d */
358363af44a4abff02ece61e456d55824f298448992Stefan Krah        sd = 0;
359363af44a4abff02ece61e456d55824f298448992Stefan Krah        for (i=0; i<view->ndim; i++) {
360363af44a4abff02ece61e456d55824f298448992Stefan Krah            if (view->shape[i] > 1) sd += 1;
361363af44a4abff02ece61e456d55824f298448992Stefan Krah        }
362363af44a4abff02ece61e456d55824f298448992Stefan Krah        return sd <= 1;
363363af44a4abff02ece61e456d55824f298448992Stefan Krah    }
364363af44a4abff02ece61e456d55824f298448992Stefan Krah
365363af44a4abff02ece61e456d55824f298448992Stefan Krah    /* strides != NULL implies both of these */
366363af44a4abff02ece61e456d55824f298448992Stefan Krah    assert(view->ndim > 0);
367363af44a4abff02ece61e456d55824f298448992Stefan Krah    assert(view->shape != NULL);
368fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant
369f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    sd = view->itemsize;
370f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (i=0; i<view->ndim; i++) {
371f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        dim = view->shape[i];
372363af44a4abff02ece61e456d55824f298448992Stefan Krah        if (dim > 1 && view->strides[i] != sd) {
373363af44a4abff02ece61e456d55824f298448992Stefan Krah            return 0;
374363af44a4abff02ece61e456d55824f298448992Stefan Krah        }
375f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sd *= dim;
376f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 1;
378b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
379b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
380b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantstatic int
3819a2d99e28a5c2989b2db4023acae4f550885f2efStefan Krah_IsCContiguous(const Py_buffer *view)
382b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
383f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t sd, dim;
384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int i;
38598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
386363af44a4abff02ece61e456d55824f298448992Stefan Krah    /* 1) len = product(shape) * itemsize
387363af44a4abff02ece61e456d55824f298448992Stefan Krah       2) itemsize > 0
388363af44a4abff02ece61e456d55824f298448992Stefan Krah       3) len = 0 <==> exists i: shape[i] = 0 */
389363af44a4abff02ece61e456d55824f298448992Stefan Krah    if (view->len == 0) return 1;
390363af44a4abff02ece61e456d55824f298448992Stefan Krah    if (view->strides == NULL) return 1; /* C-contiguous by definition */
391363af44a4abff02ece61e456d55824f298448992Stefan Krah
392363af44a4abff02ece61e456d55824f298448992Stefan Krah    /* strides != NULL implies both of these */
393363af44a4abff02ece61e456d55824f298448992Stefan Krah    assert(view->ndim > 0);
394363af44a4abff02ece61e456d55824f298448992Stefan Krah    assert(view->shape != NULL);
395b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    sd = view->itemsize;
397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (i=view->ndim-1; i>=0; i--) {
398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        dim = view->shape[i];
399363af44a4abff02ece61e456d55824f298448992Stefan Krah        if (dim > 1 && view->strides[i] != sd) {
400363af44a4abff02ece61e456d55824f298448992Stefan Krah            return 0;
401363af44a4abff02ece61e456d55824f298448992Stefan Krah        }
402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sd *= dim;
403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 1;
405b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
406b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
407b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint
4089a2d99e28a5c2989b2db4023acae4f550885f2efStefan KrahPyBuffer_IsContiguous(const Py_buffer *view, char order)
409b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
410b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (view->suboffsets != NULL) return 0;
412b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
4139a2d99e28a5c2989b2db4023acae4f550885f2efStefan Krah    if (order == 'C')
414f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return _IsCContiguous(view);
4159a2d99e28a5c2989b2db4023acae4f550885f2efStefan Krah    else if (order == 'F')
416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return _IsFortranContiguous(view);
4179a2d99e28a5c2989b2db4023acae4f550885f2efStefan Krah    else if (order == 'A')
418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return (_IsCContiguous(view) || _IsFortranContiguous(view));
419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
420b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
421b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
422b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
42398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumvoid*
4248ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
425b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
426f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char* pointer;
427f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int i;
428f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    pointer = (char *)view->buf;
429f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (i = 0; i < view->ndim; i++) {
430f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        pointer += view->strides[i]*indices[i];
431f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
432f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            pointer = *((char**)pointer) + view->suboffsets[i];
433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return (void*)pointer;
436b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
437b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
438b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
43998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumvoid
440f68c2a701bbca88da1299efe4aba84699827e791Antoine Pitrou_Py_add_one_to_index_F(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
441b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
442f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int k;
44398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (k=0; k<nd; k++) {
445f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (index[k] < shape[k]-1) {
446f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            index[k]++;
447f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
448f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
449f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else {
450f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            index[k] = 0;
451f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
453b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
454b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
45598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumvoid
456f68c2a701bbca88da1299efe4aba84699827e791Antoine Pitrou_Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
457b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
458f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int k;
459b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
460f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (k=nd-1; k>=0; k--) {
461f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (index[k] < shape[k]-1) {
462f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            index[k]++;
463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
464f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
465f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else {
466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            index[k] = 0;
467f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
468f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
469b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
470b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
471b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint
4728ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
473b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
474f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int k;
475f68c2a701bbca88da1299efe4aba84699827e791Antoine Pitrou    void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t *indices, elements;
477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *src, *ptr;
478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (len > view->len) {
480f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        len = view->len;
481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyBuffer_IsContiguous(view, fort)) {
484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* simplest copy is all that is needed */
485f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        memcpy(view->buf, buf, len);
486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
487f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
488f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Otherwise a more elaborate scheme is needed */
490f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
4917213fcc27ec4ca06fbda4633aff95d8ca2701e43Stefan Krah    /* view->ndim <= 64 */
492f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
493f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (indices == NULL) {
494f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_NoMemory();
495f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
496f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
497f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (k=0; k<view->ndim;k++) {
498f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        indices[k] = 0;
499f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
500f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
501f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (fort == 'F') {
502f68c2a701bbca88da1299efe4aba84699827e791Antoine Pitrou        addone = _Py_add_one_to_index_F;
503f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
504f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
505f68c2a701bbca88da1299efe4aba84699827e791Antoine Pitrou        addone = _Py_add_one_to_index_C;
506f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
507f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    src = buf;
508f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* XXX : This is not going to be the fastest code in the world
509f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             several optimizations are possible.
510f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
511f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    elements = len / view->itemsize;
512f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while (elements--) {
513f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        ptr = PyBuffer_GetPointer(view, indices);
514f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        memcpy(ptr, src, view->itemsize);
515f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        src += view->itemsize;
5167213fcc27ec4ca06fbda4633aff95d8ca2701e43Stefan Krah        addone(view->ndim, indices, view->shape);
517f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
518f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
519f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMem_Free(indices);
520f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
521b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
522b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
52398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumint PyObject_CopyData(PyObject *dest, PyObject *src)
524b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_buffer view_dest, view_src;
526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int k;
527f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t *indices, elements;
528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *dptr, *sptr;
529f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
530f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyObject_CheckBuffer(dest) ||
531f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        !PyObject_CheckBuffer(src)) {
532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_SetString(PyExc_TypeError,
533861470c83607a4312d3c65bce3e18414b965e586R David Murray                        "both destination and source must be "\
534861470c83607a4312d3c65bce3e18414b965e586R David Murray                        "bytes-like objects");
535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
536f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
538f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyBuffer_Release(&view_dest);
541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
542f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
543f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (view_dest.len < view_src.len) {
545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_SetString(PyExc_BufferError,
546f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        "destination is too small to receive data from source");
547f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyBuffer_Release(&view_dest);
548f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyBuffer_Release(&view_src);
549f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
550f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou         PyBuffer_IsContiguous(&view_src, 'C')) ||
554f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (PyBuffer_IsContiguous(&view_dest, 'F') &&
555f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou         PyBuffer_IsContiguous(&view_src, 'F'))) {
556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* simplest copy is all that is needed */
557f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        memcpy(view_dest.buf, view_src.buf, view_src.len);
558f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyBuffer_Release(&view_dest);
559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyBuffer_Release(&view_src);
560f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
563f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Otherwise a more elaborate copy scheme is needed */
564f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
565f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* XXX(nnorwitz): need to check for overflow! */
566f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
567f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (indices == NULL) {
568f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_NoMemory();
569f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyBuffer_Release(&view_dest);
570f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyBuffer_Release(&view_src);
571f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
572f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
573f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (k=0; k<view_src.ndim;k++) {
574f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        indices[k] = 0;
575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    elements = 1;
577f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (k=0; k<view_src.ndim; k++) {
578f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX(nnorwitz): can this overflow? */
579f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        elements *= view_src.shape[k];
580f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
581f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while (elements--) {
582f68c2a701bbca88da1299efe4aba84699827e791Antoine Pitrou        _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
583f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        dptr = PyBuffer_GetPointer(&view_dest, indices);
584f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sptr = PyBuffer_GetPointer(&view_src, indices);
585f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        memcpy(dptr, sptr, view_src.itemsize);
586f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
587f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMem_Free(indices);
588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyBuffer_Release(&view_dest);
589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyBuffer_Release(&view_src);
590f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
591b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
592b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
593b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantvoid
594b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. OliphantPyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                               Py_ssize_t *strides, int itemsize,
596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                               char fort)
597f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
598f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int k;
599f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t sd;
600f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
601f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    sd = itemsize;
602f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (fort == 'F') {
603f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (k=0; k<nd; k++) {
604f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            strides[k] = sd;
605f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            sd *= shape[k];
606f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
607f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
608f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (k=nd-1; k>=0; k--) {
610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            strides[k] = sd;
611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            sd *= shape[k];
612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return;
615b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
616b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
617b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint
618423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. LöwisPyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
6194e14174e249f9c16b38cf3b1fff0693543849385Stefan Krah                  int readonly, int flags)
620f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
6215178d91be09d73900699655b3ddecc0482e7942fStefan Krah    if (view == NULL) {
6225178d91be09d73900699655b3ddecc0482e7942fStefan Krah        PyErr_SetString(PyExc_BufferError,
6235178d91be09d73900699655b3ddecc0482e7942fStefan Krah            "PyBuffer_FillInfo: view==NULL argument is obsolete");
6245178d91be09d73900699655b3ddecc0482e7942fStefan Krah        return -1;
6255178d91be09d73900699655b3ddecc0482e7942fStefan Krah    }
6265178d91be09d73900699655b3ddecc0482e7942fStefan Krah
627f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
628f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (readonly == 1)) {
629f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_SetString(PyExc_BufferError,
630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        "Object is not writable.");
631f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
632f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
633f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
634f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->obj = obj;
635f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (obj)
636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(obj);
637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->buf = buf;
638f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->len = len;
639f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->readonly = readonly;
640f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->itemsize = 1;
641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->format = NULL;
642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        view->format = "B";
644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->ndim = 1;
645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->shape = NULL;
646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((flags & PyBUF_ND) == PyBUF_ND)
647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        view->shape = &(view->len);
648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->strides = NULL;
649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        view->strides = &(view->itemsize);
651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->suboffsets = NULL;
652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->internal = NULL;
653f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
654b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
655b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
656423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwisvoid
657423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. LöwisPyBuffer_Release(Py_buffer *view)
658423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis{
659f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *obj = view->obj;
6604fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    PyBufferProcs *pb;
6614fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    if (obj == NULL)
6624fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka        return;
6634fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    pb = Py_TYPE(obj)->tp_as_buffer;
6644fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    if (pb && pb->bf_releasebuffer)
6654fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka        pb->bf_releasebuffer(obj, view);
666f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    view->obj = NULL;
6674fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    Py_DECREF(obj);
668423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis}
669423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis
6708fd3eba0501a77eec463179f529f56025ff4b40bEric SmithPyObject *
6718fd3eba0501a77eec463179f529f56025ff4b40bEric SmithPyObject_Format(PyObject *obj, PyObject *format_spec)
6728fd3eba0501a77eec463179f529f56025ff4b40bEric Smith{
6738fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    PyObject *meth;
6748fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    PyObject *empty = NULL;
6758fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    PyObject *result = NULL;
676ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson    _Py_IDENTIFIER(__format__);
6778fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
678ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka    if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
679ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka        PyErr_Format(PyExc_SystemError,
680ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka                     "Format specifier must be a string, not %.200s",
681ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka                     Py_TYPE(format_spec)->tp_name);
682ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka        return NULL;
683ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka    }
684ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka
685ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka    /* Fast path for common types. */
686ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka    if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
687ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka        if (PyUnicode_CheckExact(obj)) {
688ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka            Py_INCREF(obj);
689ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka            return obj;
690ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka        }
691ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka        if (PyLong_CheckExact(obj)) {
692ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka            return PyObject_Str(obj);
693ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka        }
694ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka    }
695ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka
6968fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    /* If no format_spec is provided, use an empty string */
6978fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    if (format_spec == NULL) {
6989d3b93ba305e8a83bf1cec5146def2078e40b1a5Victor Stinner        empty = PyUnicode_New(0, 0);
699da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson        format_spec = empty;
7008fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    }
7018fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
702ea525a2d1a798f529b015f86b174d478806ac7ecSerhiy Storchaka    /* Find the (unbound!) __format__ method */
703ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson    meth = _PyObject_LookupSpecial(obj, &PyId___format__);
7048fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    if (meth == NULL) {
705da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson        if (!PyErr_Occurred())
706da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson            PyErr_Format(PyExc_TypeError,
707da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson                         "Type %.100s doesn't define __format__",
708da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson                         Py_TYPE(obj)->tp_name);
709f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto done;
7108fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    }
7118fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
712da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson    /* And call it. */
713da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson    result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL);
7146f889ad32f5297f9e0775df3477788a7e19bcac3Benjamin Peterson    Py_DECREF(meth);
7158fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
7168fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    if (result && !PyUnicode_Check(result)) {
717b95b56150fc3e7834783b54acdddeaed4fe44e27Ethan Furman        PyErr_Format(PyExc_TypeError,
718b95b56150fc3e7834783b54acdddeaed4fe44e27Ethan Furman             "__format__ must return a str, not %.200s",
719b95b56150fc3e7834783b54acdddeaed4fe44e27Ethan Furman             Py_TYPE(result)->tp_name);
720da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson        Py_DECREF(result);
721da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson        result = NULL;
722da2cf04c2807e3b2f80e06306242238ddddaa260Benjamin Peterson        goto done;
7238fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    }
7248fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
7258fd3eba0501a77eec463179f529f56025ff4b40bEric Smithdone:
7268fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    Py_XDECREF(empty);
7278fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    return result;
7288fd3eba0501a77eec463179f529f56025ff4b40bEric Smith}
729cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on numbers */
730cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
731cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
732799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Check(PyObject *o)
733e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
734f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return o && o->ob_type->tp_as_number &&
735f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           (o->ob_type->tp_as_number->nb_int ||
736f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        o->ob_type->tp_as_number->nb_float);
737e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
738e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
739cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Binary operators */
740e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
7415a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_SLOT(x) offsetof(PyNumberMethods, x)
7425a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_BINOP(nb_methods, slot) \
743f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
7445a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_TERNOP(nb_methods, slot) \
745f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
746e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
7475a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/*
7485a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer  Calling scheme used for binary operations:
749e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
7504886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz  Order operations are tried until either a valid result or error:
751f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    w.op(v,w)[*], v.op(v,w), w.op(v,w)
752e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
7534bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum  [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
7544bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum      v->ob_type
7555a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */
7565a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
7575a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
7585a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op1(PyObject *v, PyObject *w, const int op_slot)
7595a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{
760f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *x;
761f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    binaryfunc slotv = NULL;
762f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    binaryfunc slotw = NULL;
763f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
764f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v->ob_type->tp_as_number != NULL)
765f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
766f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (w->ob_type != v->ob_type &&
767f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        w->ob_type->tp_as_number != NULL) {
768f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
769f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (slotw == slotv)
770f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            slotw = NULL;
771f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
772f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (slotv) {
773f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
774f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            x = slotw(v, w);
775f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (x != Py_NotImplemented)
776f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return x;
777f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(x); /* can't do it */
778f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            slotw = NULL;
779f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
780f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        x = slotv(v, w);
781f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (x != Py_NotImplemented)
782f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return x;
783f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(x); /* can't do it */
784f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
785f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (slotw) {
786f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        x = slotw(v, w);
787f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (x != Py_NotImplemented)
788f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return x;
789f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(x); /* can't do it */
790f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
791dfc80e3d97680ee26e509daba4a08502fefe22eeBrian Curtin    Py_RETURN_NOTIMPLEMENTED;
792e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
7937766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum
7945a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
795d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinop_type_error(PyObject *v, PyObject *w, const char *op_name)
796d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
797f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Format(PyExc_TypeError,
798f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                 "unsupported operand type(s) for %.100s: "
799f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                 "'%.100s' and '%.100s'",
800f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                 op_name,
801f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                 v->ob_type->tp_name,
802f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                 w->ob_type->tp_name);
803f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
804d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
805d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
806d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject *
8075a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
808e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
809f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = binary_op1(v, w, op_slot);
810f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == Py_NotImplemented) {
811f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
812f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return binop_type_error(v, w, op_name);
813f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
814f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
815e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
816e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
817cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
8185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/*
8195a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer  Calling scheme used for ternary operations:
820e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
8214886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz  Order operations are tried until either a valid result or error:
822f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
8235a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */
824cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
8255a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
8265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerternary_op(PyObject *v,
827f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           PyObject *w,
828f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           PyObject *z,
829f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           const int op_slot,
830f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           const char *op_name)
831f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
832f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyNumberMethods *mv, *mw, *mz;
833f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *x = NULL;
834f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ternaryfunc slotv = NULL;
835f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ternaryfunc slotw = NULL;
836f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ternaryfunc slotz = NULL;
837f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
838f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mv = v->ob_type->tp_as_number;
839f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mw = w->ob_type->tp_as_number;
840f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mv != NULL)
841f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        slotv = NB_TERNOP(mv, op_slot);
842f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (w->ob_type != v->ob_type &&
843f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        mw != NULL) {
844f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        slotw = NB_TERNOP(mw, op_slot);
845f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (slotw == slotv)
846f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            slotw = NULL;
847f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
848f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (slotv) {
849f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
850f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            x = slotw(v, w, z);
851f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (x != Py_NotImplemented)
852f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return x;
853f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(x); /* can't do it */
854f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            slotw = NULL;
855f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
856f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        x = slotv(v, w, z);
857f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (x != Py_NotImplemented)
858f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return x;
859f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(x); /* can't do it */
860f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
861f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (slotw) {
862f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        x = slotw(v, w, z);
863f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (x != Py_NotImplemented)
864f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return x;
865f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(x); /* can't do it */
866f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
867f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mz = z->ob_type->tp_as_number;
868f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mz != NULL) {
869f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        slotz = NB_TERNOP(mz, op_slot);
870f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (slotz == slotv || slotz == slotw)
871f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            slotz = NULL;
872f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (slotz) {
873f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            x = slotz(v, w, z);
874f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (x != Py_NotImplemented)
875f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return x;
876f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(x); /* can't do it */
877f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
878f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
879f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
880f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (z == Py_None)
881f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Format(
882f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyExc_TypeError,
883f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "unsupported operand type(s) for ** or pow(): "
884f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "'%.100s' and '%.100s'",
885f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            v->ob_type->tp_name,
886f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            w->ob_type->tp_name);
887f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else
888f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Format(
889f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyExc_TypeError,
890f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "unsupported operand type(s) for pow(): "
891f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "'%.100s', '%.100s', '%.100s'",
892f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            v->ob_type->tp_name,
893f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            w->ob_type->tp_name,
894f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            z->ob_type->tp_name);
895f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
896e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
897e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
8985a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define BINARY_FUNC(func, op, op_name) \
8995a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer    PyObject * \
9005a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer    func(PyObject *v, PyObject *w) { \
901f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return binary_op(v, w, NB_SLOT(op), op_name); \
9025a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer    }
9035a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
9045a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Or, nb_or, "|")
9055a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Xor, nb_xor, "^")
9065a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_And, nb_and, "&")
9075a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
9085a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
9095a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
9105a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
9115a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
912e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
9135a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerPyNumber_Add(PyObject *v, PyObject *w)
914e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
915f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
916f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == Py_NotImplemented) {
917f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySequenceMethods *m = v->ob_type->tp_as_sequence;
918f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
919f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (m && m->sq_concat) {
920f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return (*m->sq_concat)(v, w);
921f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
922f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        result = binop_type_error(v, w, "+");
923f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
924f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
925e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
926e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
927d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject *
92818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwissequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
929d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
930f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t count;
931f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyIndex_Check(n)) {
932f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
933f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (count == -1 && PyErr_Occurred())
934f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
935f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
936f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
937f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return type_error("can't multiply sequence by "
938f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                          "non-int of type '%.200s'", n);
939f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
940f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return (*repeatfunc)(seq, count);
941d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
942d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
943d4b0fea43a8655d15562fa42d56def93fe2348efNeil SchemenauerPyObject *
944d4b0fea43a8655d15562fa42d56def93fe2348efNeil SchemenauerPyNumber_Multiply(PyObject *v, PyObject *w)
945d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
946f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
947f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == Py_NotImplemented) {
948f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySequenceMethods *mv = v->ob_type->tp_as_sequence;
949f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySequenceMethods *mw = w->ob_type->tp_as_sequence;
950f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
951f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if  (mv && mv->sq_repeat) {
952f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return sequence_repeat(mv->sq_repeat, v, w);
953f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
954f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (mw && mw->sq_repeat) {
955f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return sequence_repeat(mw->sq_repeat, w, v);
956f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
957f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        result = binop_type_error(v, w, "*");
958f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
959f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
960d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
961d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
962e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
963d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin PetersonPyNumber_MatrixMultiply(PyObject *v, PyObject *w)
964d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin Peterson{
965d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin Peterson    return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
966d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin Peterson}
967d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin Peterson
968d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin PetersonPyObject *
9694668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_FloorDivide(PyObject *v, PyObject *w)
9704668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
971f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
9724668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
9734668b000a1d9113394941ad39875c827634feb49Guido van Rossum
9744668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
9754668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_TrueDivide(PyObject *v, PyObject *w)
9764668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
977f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
9784668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
9794668b000a1d9113394941ad39875c827634feb49Guido van Rossum
9804668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
981799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Remainder(PyObject *v, PyObject *w)
982e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
983f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return binary_op(v, w, NB_SLOT(nb_remainder), "%");
984e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
985e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
986e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
987799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
988e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
989f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
990e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
991e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
992e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* Binary in-place operators */
993e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
994e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* The in-place operators are defined to fall back to the 'normal',
9955a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer   non in-place operations, if the in-place methods are not in place.
996e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
9975a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer   - If the left hand object has the appropriate struct members, and
9985a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     they are filled, call the appropriate function and return the
9995a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     result.  No coercion is done on the arguments; the left-hand object
10005a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     is the one the operation is performed on, and it's up to the
10015a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     function to deal with the right-hand object.
10027766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum
10035a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer   - Otherwise, in-place modification is not supported. Handle it exactly as
10045a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     a non in-place operation of the same kind.
1005e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1006e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters   */
1007e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
10085a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
1009d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
10105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{
1011f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyNumberMethods *mv = v->ob_type->tp_as_number;
1012f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mv != NULL) {
1013f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        binaryfunc slot = NB_BINOP(mv, iop_slot);
1014f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (slot) {
1015f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyObject *x = (slot)(v, w);
1016f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (x != Py_NotImplemented) {
1017f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return x;
1018f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1019f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(x);
1020f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1021f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1022f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return binary_op1(v, w, op_slot);
1023d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
1024d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
1025d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject *
1026d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1027f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                const char *op_name)
1028d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
1029f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1030f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == Py_NotImplemented) {
1031f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
1032f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return binop_type_error(v, w, op_name);
1033f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1034f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
1035e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1036e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
10375a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define INPLACE_BINOP(func, iop, op, op_name) \
1038f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject * \
1039f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    func(PyObject *v, PyObject *w) { \
1040f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1041f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1042e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
10435a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
10445a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
10455a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
10465a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
10475a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
10485a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1049d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin PetersonINPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
1050e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1051e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
10524668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
10534668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
1054f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1055f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                      NB_SLOT(nb_floor_divide), "//=");
10564668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
10574668b000a1d9113394941ad39875c827634feb49Guido van Rossum
10584668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
10594668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
10604668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
1061f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1062f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                      NB_SLOT(nb_true_divide), "/=");
10634668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
10644668b000a1d9113394941ad39875c827634feb49Guido van Rossum
10654668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
1066e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1067e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1068f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1069f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                   NB_SLOT(nb_add));
1070f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == Py_NotImplemented) {
1071f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySequenceMethods *m = v->ob_type->tp_as_sequence;
1072f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
1073f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (m != NULL) {
1074f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            binaryfunc f = NULL;
1075f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            f = m->sq_inplace_concat;
1076f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (f == NULL)
1077f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                f = m->sq_concat;
1078f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (f != NULL)
1079f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return (*f)(v, w);
1080f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1081f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        result = binop_type_error(v, w, "+=");
1082f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1083f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
1084e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1085e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1086e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
1087e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1088e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1089f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1090f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                   NB_SLOT(nb_multiply));
1091f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == Py_NotImplemented) {
1092f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        ssizeargfunc f = NULL;
1093f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1094f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1095f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
1096f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (mv != NULL) {
1097f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            f = mv->sq_inplace_repeat;
1098f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (f == NULL)
1099f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                f = mv->sq_repeat;
1100f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (f != NULL)
1101f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return sequence_repeat(f, v, w);
1102f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1103f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (mw != NULL) {
1104f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* Note that the right hand operand should not be
1105f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             * mutated in this case so sq_inplace_repeat is not
1106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             * used. */
1107f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (mw->sq_repeat)
1108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return sequence_repeat(mw->sq_repeat, w, v);
1109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        result = binop_type_error(v, w, "*=");
1111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
1113e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1114e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1115e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
1116d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin PetersonPyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1117d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin Peterson{
1118d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin Peterson    return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1119d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin Peterson                      NB_SLOT(nb_matrix_multiply), "@=");
1120d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin Peterson}
1121d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin Peterson
1122d51374ed78a3e3145911a16cdf3b9b84b3ba7d15Benjamin PetersonPyObject *
1123e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1124e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                            NB_SLOT(nb_remainder), "%=");
1127e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1128e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1129e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
1130e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1131e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v->ob_type->tp_as_number &&
1133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
1135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1139e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1140e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1141e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1142cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Unary operators and functions */
1143e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1144e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1145799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Negative(PyObject *o)
1146e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyNumberMethods *m;
1148cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
114971aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL) {
1150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
115171aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
115271aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner
1153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_number;
1154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->nb_negative)
1155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return (*m->nb_negative)(o);
1156cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("bad operand type for unary -: '%.200s'", o);
1158e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1159e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1160e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1161799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Positive(PyObject *o)
1162e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1163f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyNumberMethods *m;
1164cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
116571aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL) {
1166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
116771aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
116871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner
1169f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_number;
1170f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->nb_positive)
1171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return (*m->nb_positive)(o);
1172cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("bad operand type for unary +: '%.200s'", o);
1174e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1175e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1176e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1177799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Invert(PyObject *o)
1178e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1179f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyNumberMethods *m;
1180cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
118171aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL) {
1182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
118371aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
118471aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner
1185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_number;
1186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->nb_invert)
1187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return (*m->nb_invert)(o);
1188cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("bad operand type for unary ~: '%.200s'", o);
1190e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1191e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1192e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1193799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Absolute(PyObject *o)
1194e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyNumberMethods *m;
1196e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
119771aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL) {
1198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
119971aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
120071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner
1201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_number;
1202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->nb_absolute)
1203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->nb_absolute(o);
1204e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("bad operand type for abs(): '%.200s'", o);
1206e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1207e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
120831a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka/* Return a Python int from the object item.
12099594942716a8f9c557b85d31751753d89cd7cebfSerhiy Storchaka   Raise TypeError if the result is not an int
121098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum   or if the object cannot be interpreted as an index.
121100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters*/
121200ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPyObject *
121338fff8c4e4276e4e57660a78f305e68bfa87874bGuido van RossumPyNumber_Index(PyObject *item)
121438fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum{
1215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = NULL;
121671aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (item == NULL) {
1217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
121871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
121971aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner
1220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyLong_Check(item)) {
1221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(item);
1222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return item;
1223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
122431a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka    if (!PyIndex_Check(item)) {
1225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Format(PyExc_TypeError,
1226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     "'%.200s' object cannot be interpreted "
1227f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     "as an integer", item->ob_type->tp_name);
122831a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka        return NULL;
122931a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka    }
123031a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka    result = item->ob_type->tp_as_number->nb_index(item);
123131a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka    if (!result || PyLong_CheckExact(result))
123231a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka        return result;
123331a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka    if (!PyLong_Check(result)) {
123431a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka        PyErr_Format(PyExc_TypeError,
123531a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka                     "__index__ returned non-int (type %.200s)",
123631a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka                     result->ob_type->tp_name);
123731a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka        Py_DECREF(result);
123831a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka        return NULL;
123931a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka    }
124031a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka    /* Issue #17576: warn if 'result' not of exact type int. */
124131a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka    if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
124231a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka            "__index__ returned non-int (type %.200s).  "
124331a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka            "The ability to return an instance of a strict subclass of int "
124431a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka            "is deprecated, and may be removed in a future version of Python.",
124531a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka            result->ob_type->tp_name)) {
124631a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka        Py_DECREF(result);
124731a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka        return NULL;
1248f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1249f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
125000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters}
125100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
125200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters/* Return an error on Overflow only if err is not NULL*/
125300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
125400ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPy_ssize_t
125500ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPyNumber_AsSsize_t(PyObject *item, PyObject *err)
125600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters{
1257f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t result;
1258f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *runerr;
1259f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *value = PyNumber_Index(item);
1260f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (value == NULL)
1261f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1262f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1263f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* We're done if PyLong_AsSsize_t() returns without error. */
1264f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = PyLong_AsSsize_t(value);
1265f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result != -1 || !(runerr = PyErr_Occurred()))
1266f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finish;
1267f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1268f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Error handling code -- only manage OverflowError differently */
1269f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1270f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finish;
1271f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Clear();
1273f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* If no error-handling desired then the default clipping
1274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       is sufficient.
1275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
1276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!err) {
1277f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        assert(PyLong_Check(value));
1278f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Whether or not it is less than or equal to
1279f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           zero is determined by the sign of ob_size
1280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        */
1281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (_PyLong_Sign(value) < 0)
1282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            result = PY_SSIZE_T_MIN;
1283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
1284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            result = PY_SSIZE_T_MAX;
1285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1287f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Otherwise replace the error with caller's error object. */
1288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Format(err,
1289f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     "cannot fit '%.200s' into an index-sized integer",
1290f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     item->ob_type->tp_name);
1291f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
129298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
129300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters finish:
1294f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(value);
1295f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
129638fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum}
129738fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum
129800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
1299e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1300799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Long(PyObject *o)
1301e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
130254cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka    PyObject *result;
1303f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyNumberMethods *m;
1304f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *trunc_func;
13054fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    Py_buffer view;
13069fc9bf465af96bf753217b0c370e4452882ecd86Benjamin Peterson    _Py_IDENTIFIER(__trunc__);
1307f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
130871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL) {
1309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
131071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
131171aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner
1312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyLong_CheckExact(o)) {
1313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(o);
1314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return o;
1315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_number;
1317f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->nb_int) { /* This should include subclasses of int */
131854cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        result = (PyObject *)_PyLong_FromNbInt(o);
131954cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        if (result != NULL && !PyLong_CheckExact(result)) {
132054cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka            Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
132154cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        }
132254cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        return result;
1323f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
13241b1a8e7cb514d95546af9dcfd42b83cea27182faBenjamin Peterson    trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
1325f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (trunc_func) {
132654cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        result = PyEval_CallObject(trunc_func, NULL);
1327f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(trunc_func);
132854cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        if (result == NULL || PyLong_CheckExact(result)) {
132954cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka            return result;
133054cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        }
133154cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        if (PyLong_Check(result)) {
133254cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka            Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
133354cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka            return result;
133454cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        }
1335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* __trunc__ is specified to return an Integral type,
13367462b64911f1e2df2de2285ddbf8b156b5cdc418Martin Panter           but int() needs to return an int. */
133754cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        m = result->ob_type->tp_as_number;
133831a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka        if (m == NULL || m->nb_int == NULL) {
133931a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka            PyErr_Format(
134031a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka                PyExc_TypeError,
134131a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka                "__trunc__ returned non-Integral (type %.200s)",
134254cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka                result->ob_type->tp_name);
134354cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka            Py_DECREF(result);
134431a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka            return NULL;
134531a655411a79b00517cdcd0a2752824d183db792Serhiy Storchaka        }
134654cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        Py_SETREF(result, (PyObject *)_PyLong_FromNbInt(result));
134754cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        if (result != NULL && !PyLong_CheckExact(result)) {
134854cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka            Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
134954cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        }
135054cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        return result;
1351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
13521b1a8e7cb514d95546af9dcfd42b83cea27182faBenjamin Peterson    if (PyErr_Occurred())
13531b1a8e7cb514d95546af9dcfd42b83cea27182faBenjamin Peterson        return NULL;
1354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
13554fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    if (PyUnicode_Check(o))
13564fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka        /* The below check is done in PyLong_FromUnicode(). */
13574fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka        return PyLong_FromUnicodeObject(o, 10);
13584fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka
1359eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter    if (PyBytes_Check(o))
1360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* need to do extra error checking that PyLong_FromString()
1361f6d0aeeadce3f1aea240b900da5e1fbb430257b2Serhiy Storchaka         * doesn't do.  In particular int('9\x005') must raise an
1362f6d0aeeadce3f1aea240b900da5e1fbb430257b2Serhiy Storchaka         * exception, not truncate at the null.
1363f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou         */
1364eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter        return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1365eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter                                 PyBytes_GET_SIZE(o), 10);
1366eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter
1367eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter    if (PyByteArray_Check(o))
1368eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter        return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1369eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter                                 PyByteArray_GET_SIZE(o), 10);
1370eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter
1371eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter    if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
137254cd1969eacf27405e2fe265817ee60a8ece93abSerhiy Storchaka        PyObject *bytes;
1373eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter
1374eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter        /* Copy to NUL-terminated buffer. */
1375eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter        bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1376eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter        if (bytes == NULL) {
1377eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter            PyBuffer_Release(&view);
1378eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter            return NULL;
1379eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter        }
1380eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter        result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1381eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter                                   PyBytes_GET_SIZE(bytes), 10);
1382eeb896c4116dd763efea45cb3c1b53257128f4e4Martin Panter        Py_DECREF(bytes);
13834fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka        PyBuffer_Release(&view);
13844fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka        return result;
13854fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    }
1386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
13874fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka    return type_error("int() argument must be a string, a bytes-like object "
13884fdb68491e8b2d044c9173babf625bbb815c39d1Serhiy Storchaka                      "or a number, not '%.200s'", o);
1389e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1390e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1391e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1392799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Float(PyObject *o)
1393e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1394f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyNumberMethods *m;
1395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
139671aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL) {
1397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
139871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
139971aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner
140016931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka    if (PyFloat_CheckExact(o)) {
140116931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        Py_INCREF(o);
140216931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        return o;
140316931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka    }
1404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_number;
1405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->nb_float) { /* This should include subclasses of float */
1406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *res = m->nb_float(o);
140716931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        double val;
140816931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        if (!res || PyFloat_CheckExact(res)) {
140916931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka            return res;
141016931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        }
141116931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        if (!PyFloat_Check(res)) {
1412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Format(PyExc_TypeError,
141316931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka                         "%.50s.__float__ returned non-float (type %.50s)",
141416931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka                         o->ob_type->tp_name, res->ob_type->tp_name);
141516931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka            Py_DECREF(res);
141616931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka            return NULL;
141716931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        }
141816931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        /* Issue #26983: warn if 'res' not of exact type float. */
141916931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
142016931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka                "%.50s.__float__ returned non-float (type %.50s).  "
142116931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka                "The ability to return an instance of a strict subclass of float "
142216931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka                "is deprecated, and may be removed in a future version of Python.",
142316931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka                o->ob_type->tp_name, res->ob_type->tp_name)) {
1424f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(res);
1425f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
1426f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
142716931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        val = PyFloat_AS_DOUBLE(res);
142816931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        Py_DECREF(res);
142916931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        return PyFloat_FromDouble(val);
1430f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1431f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
143216931c3559689cfa9d98e3b56e612b7e1e635b7aSerhiy Storchaka        return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
1433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyFloat_FromString(o);
1435e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1436e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1437cd16bf640405065e4702539632ce577536207d88Guido van Rossum
1438cd16bf640405065e4702539632ce577536207d88Guido van RossumPyObject *
1439cd16bf640405065e4702539632ce577536207d88Guido van RossumPyNumber_ToBase(PyObject *n, int base)
1440cd16bf640405065e4702539632ce577536207d88Guido van Rossum{
1441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *res = NULL;
1442f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *index = PyNumber_Index(n);
1443cd16bf640405065e4702539632ce577536207d88Guido van Rossum
1444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!index)
1445f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1446f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyLong_Check(index))
1447f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        res = _PyLong_Format(index, base);
1448f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else
1449f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* It should not be possible to get here, as
1450f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           PyNumber_Index already has a check for the same
1451f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           condition */
14529594942716a8f9c557b85d31751753d89cd7cebfSerhiy Storchaka        PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not int");
1453f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(index);
1454f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return res;
1455cd16bf640405065e4702539632ce577536207d88Guido van Rossum}
1456cd16bf640405065e4702539632ce577536207d88Guido van Rossum
1457cd16bf640405065e4702539632ce577536207d88Guido van Rossum
1458cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on sequences */
1459e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1460cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
1461799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Check(PyObject *s)
1462e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyDict_Check(s))
1464f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
1465f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return s != NULL && s->ob_type->tp_as_sequence &&
1466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        s->ob_type->tp_as_sequence->sq_item != NULL;
1467e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1468e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
146918e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
14706253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPySequence_Size(PyObject *s)
1471e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *m;
1473e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1474f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (s == NULL) {
1475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
1476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1478e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = s->ob_type->tp_as_sequence;
1480f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_length)
1481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_length(s);
1482e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type_error("object of type '%.200s' has no len()", s);
1484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return -1;
1485e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1486e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1487cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PySequence_Length
148818e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
1489cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPySequence_Length(PyObject *s)
1490cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{
1491f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PySequence_Size(s);
1492cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg}
1493cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PySequence_Length PySequence_Size
1494cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg
1495e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1496799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Concat(PyObject *s, PyObject *o)
1497e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1498f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *m;
1499cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
150071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (s == NULL || o == NULL) {
1501f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
150271aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
1503e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1504f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = s->ob_type->tp_as_sequence;
1505f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_concat)
1506f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_concat(s, o);
1507e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1508f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Instances of user classes defining an __add__() method only
1509f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       have an nb_add slot, not an sq_concat slot.      So we fall back
1510f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       to nb_add if both arguments appear to be sequences. */
1511f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PySequence_Check(s) && PySequence_Check(o)) {
1512f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1513f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (result != Py_NotImplemented)
1514f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return result;
1515f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
1516f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1517f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("'%.200s' object can't be concatenated", s);
1518e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1519e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1520e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
152118e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_Repeat(PyObject *o, Py_ssize_t count)
1522e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1523f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *m;
1524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
152571aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL) {
1526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
152771aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
1528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1529f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_sequence;
1530f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_repeat)
1531f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_repeat(o, count);
1532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1533f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Instances of user classes defining a __mul__() method only
1534f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       have an nb_multiply slot, not an sq_repeat slot. so we fall back
1535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       to nb_multiply if o appears to be a sequence. */
1536f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PySequence_Check(o)) {
1537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *n, *result;
1538f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        n = PyLong_FromSsize_t(count);
1539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (n == NULL)
1540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
1541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        result = binary_op1(o, n, NB_SLOT(nb_multiply));
1542f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(n);
1543f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (result != Py_NotImplemented)
1544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return result;
1545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
1546f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1547f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("'%.200s' object can't be repeated", o);
1548e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1549e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1550e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1551e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPySequence_InPlaceConcat(PyObject *s, PyObject *o)
1552e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *m;
1554e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
155571aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (s == NULL || o == NULL) {
1556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
155771aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
1558e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = s->ob_type->tp_as_sequence;
1560f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_inplace_concat)
1561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_inplace_concat(s, o);
1562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_concat)
1563f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_concat(s, o);
1564e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1565f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PySequence_Check(s) && PySequence_Check(o)) {
1566f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1567f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                       NB_SLOT(nb_add));
1568f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (result != Py_NotImplemented)
1569f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return result;
1570f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
1571f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1572f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("'%.200s' object can't be concatenated", s);
1573e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1574e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1575e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
157618e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
1577e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1578f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *m;
1579f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
158071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL) {
1581f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
158271aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
1583f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1584f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_sequence;
1585f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_inplace_repeat)
1586f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_inplace_repeat(o, count);
1587f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_repeat)
1588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_repeat(o, count);
1589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1590f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PySequence_Check(o)) {
1591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *n, *result;
1592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        n = PyLong_FromSsize_t(count);
1593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (n == NULL)
1594f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
1595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                             NB_SLOT(nb_multiply));
1597f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(n);
1598f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (result != Py_NotImplemented)
1599f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return result;
1600f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
1601f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1602f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("'%.200s' object can't be repeated", o);
1603e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1604e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1605e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
160618e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_GetItem(PyObject *s, Py_ssize_t i)
1607e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1608f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *m;
1609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
161071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (s == NULL) {
1611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
161271aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
1613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = s->ob_type->tp_as_sequence;
1615f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_item) {
1616f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (i < 0) {
1617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (m->sq_length) {
1618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_ssize_t l = (*m->sq_length)(s);
1619e20310fa19188f764b84fbdc40d32d6933f98af9Victor Stinner                if (l < 0) {
1620e20310fa19188f764b84fbdc40d32d6933f98af9Victor Stinner                    assert(PyErr_Occurred());
1621f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    return NULL;
1622e20310fa19188f764b84fbdc40d32d6933f98af9Victor Stinner                }
1623f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                i += l;
1624f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_item(s, i);
1627f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1628e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1629f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("'%.200s' object does not support indexing", s);
1630e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1631e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1632e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
163318e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
1634e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1635f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMappingMethods *mp;
1636cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
163771aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (!s) {
163871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner        return null_error();
163971aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
1640cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mp = s->ob_type->tp_as_mapping;
1642568867a6f20c5944c0c0aba69603a4d8ff62dae6Benjamin Peterson    if (mp && mp->mp_subscript) {
1643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *res;
1644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *slice = _PySlice_FromIndices(i1, i2);
1645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!slice)
1646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
1647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        res = mp->mp_subscript(s, slice);
1648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(slice);
1649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return res;
1650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
16514669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum
1652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return type_error("'%.200s' object is unsliceable", s);
1653e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1654e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1655e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint
165618e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
1657e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1658f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *m;
1659cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1660f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (s == NULL) {
1661f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
1662f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1663f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1664cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1665f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = s->ob_type->tp_as_sequence;
1666f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_ass_item) {
1667f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (i < 0) {
1668f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (m->sq_length) {
1669f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_ssize_t l = (*m->sq_length)(s);
1670f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (l < 0)
1671f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    return -1;
1672f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                i += l;
1673f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1674f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1675f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_ass_item(s, i, o);
1676f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1677cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1678f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type_error("'%.200s' object does not support item assignment", s);
1679f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return -1;
1680e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1681e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
16826cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint
168318e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_DelItem(PyObject *s, Py_ssize_t i)
16846cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{
1685f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *m;
1686cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (s == NULL) {
1688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
1689f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1691cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = s->ob_type->tp_as_sequence;
1693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->sq_ass_item) {
1694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (i < 0) {
1695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (m->sq_length) {
1696f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_ssize_t l = (*m->sq_length)(s);
1697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (l < 0)
1698f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    return -1;
1699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                i += l;
1700f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1702f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->sq_ass_item(s, i, (PyObject *)NULL);
1703f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1704cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1705f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type_error("'%.200s' object doesn't support item deletion", s);
1706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return -1;
17076cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum}
17086cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1709cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
171018e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
1711e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1712f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMappingMethods *mp;
1713e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1714f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (s == NULL) {
1715f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
1716f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1717f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1718e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1719f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mp = s->ob_type->tp_as_mapping;
1720568867a6f20c5944c0c0aba69603a4d8ff62dae6Benjamin Peterson    if (mp && mp->mp_ass_subscript) {
1721f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int res;
1722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *slice = _PySlice_FromIndices(i1, i2);
1723f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!slice)
1724f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return -1;
1725f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        res = mp->mp_ass_subscript(s, slice, o);
1726f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(slice);
1727f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return res;
1728f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
17291d75a79c009e500923128716a02efbe86135e64eThomas Wouters
1730f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type_error("'%.200s' object doesn't support slice assignment", s);
1731f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return -1;
1732e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1733e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1734cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
173518e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
17366cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{
1737f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMappingMethods *mp;
17386cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1739f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (s == NULL) {
1740f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
1741f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1742f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
17436cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1744f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mp = s->ob_type->tp_as_mapping;
1745568867a6f20c5944c0c0aba69603a4d8ff62dae6Benjamin Peterson    if (mp && mp->mp_ass_subscript) {
1746f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int res;
1747f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *slice = _PySlice_FromIndices(i1, i2);
1748f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!slice)
1749f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return -1;
1750f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        res = mp->mp_ass_subscript(s, slice, NULL);
1751f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(slice);
1752f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return res;
1753f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1754f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type_error("'%.200s' object doesn't support slice deletion", s);
1755f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return -1;
17566cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum}
17576cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1758e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1759799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Tuple(PyObject *v)
1760e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1761f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *it;  /* iter(v) */
1762f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t n;             /* guess for result tuple size */
1763f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result = NULL;
1764f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t j;
1765f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
176671aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (v == NULL) {
1767f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
176871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
1769f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1770f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Special-case the common tuple and list cases, for efficiency. */
1771f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyTuple_CheckExact(v)) {
1772f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Note that we can't know whether it's safe to return
1773f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           a tuple *subclass* instance as-is, hence the restriction
1774f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           to exact tuples here.  In contrast, lists always make
1775f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           a copy, so there's no need for exactness below. */
1776f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(v);
1777f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return v;
1778f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1779610a51f364f6cb5ffb5167d9bf4dcecc1815107cRaymond Hettinger    if (PyList_CheckExact(v))
1780f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return PyList_AsTuple(v);
1781f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1782f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Get iterator. */
1783f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    it = PyObject_GetIter(v);
1784f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (it == NULL)
1785f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1786f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1787f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Guess result size and allocate space. */
1788aa9a79d27958ae5afb6c8769a2b342d98677c091Armin Ronacher    n = PyObject_LengthHint(v, 10);
1789f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n == -1)
1790f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto Fail;
1791f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = PyTuple_New(n);
1792f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL)
1793f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto Fail;
1794f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1795f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Fill the tuple. */
1796f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (j = 0; ; ++j) {
1797f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *item = PyIter_Next(it);
1798f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (item == NULL) {
1799f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (PyErr_Occurred())
1800f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                goto Fail;
1801f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
1802f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1803f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (j >= n) {
1804e8db861f4743fa1702c3119c219c821790e11a9cMartin Panter            size_t newn = (size_t)n;
1805f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* The over-allocation strategy can grow a bit faster
1806f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               than for lists because unlike lists the
1807f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               over-allocation isn't permanent -- we reclaim
1808f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               the excess before the end of this routine.
1809f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               So, grow by ten and then add 25%.
1810f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            */
1811e8db861f4743fa1702c3119c219c821790e11a9cMartin Panter            newn += 10u;
1812e8db861f4743fa1702c3119c219c821790e11a9cMartin Panter            newn += newn >> 2;
1813e8db861f4743fa1702c3119c219c821790e11a9cMartin Panter            if (newn > PY_SSIZE_T_MAX) {
1814f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* Check for overflow */
1815f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                PyErr_NoMemory();
1816f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_DECREF(item);
1817f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                goto Fail;
1818f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1819e8db861f4743fa1702c3119c219c821790e11a9cMartin Panter            n = (Py_ssize_t)newn;
1820f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (_PyTuple_Resize(&result, n) != 0) {
1821f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_DECREF(item);
1822f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                goto Fail;
1823f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1824f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1825f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyTuple_SET_ITEM(result, j, item);
1826f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1827f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1828f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Cut tuple back if guess was too large. */
1829f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (j < n &&
1830f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyTuple_Resize(&result, j) != 0)
1831f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto Fail;
1832f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1833f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(it);
1834f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
18356912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters
18366912d4ddf0504a3d5611ddd12cbde3354bd48279Tim PetersFail:
1837f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(result);
1838f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(it);
1839f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
1840e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1841e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
18423c5936afc5f067b3b591f554c31e1cfdce460fadGuido van RossumPyObject *
1843799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_List(PyObject *v)
18443c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum{
1845f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result;  /* result list */
1846f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *rv;          /* return value from PyList_Extend */
1847cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
184871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (v == NULL) {
1849f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
185071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
18515dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum
1852f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = PyList_New(0);
1853f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL)
1854f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1855f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters
1856f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    rv = _PyList_Extend((PyListObject *)result, v);
1857f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (rv == NULL) {
1858f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
1859f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1860f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1861f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(rv);
1862f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
1863cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
18644669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum
186574042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. KuchlingPyObject *
1866799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Fast(PyObject *v, const char *m)
186774042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling{
1868f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *it;
18692fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger
187071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (v == NULL) {
1871f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
187271aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
187374042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
1874f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
1875f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(v);
1876f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return v;
1877f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
187874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
1879f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    it = PyObject_GetIter(v);
1880f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (it == NULL) {
1881f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PyErr_ExceptionMatches(PyExc_TypeError))
1882f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_SetString(PyExc_TypeError, m);
1883f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1884f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
18852fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger
1886f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PySequence_List(it);
1887f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(it);
188874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
1889f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return v;
189074042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling}
189174042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
189216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters/* Iterate over seq.  Result depends on the operation:
1893f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou   PY_ITERSEARCH_COUNT:  -1 if error, else # of times obj appears in seq.
1894f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou   PY_ITERSEARCH_INDEX:  0-based index of first occurrence of obj in seq;
1895f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    set ValueError and return -1 if none found; also return -1 on error.
189616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters   Py_ITERSEARCH_CONTAINS:  return 1 if obj in seq, else 0; -1 on error.
189716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters*/
18981fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t
189916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
1900cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{
1901f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t n;
1902f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int wrapped;  /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1903f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *it;  /* iter(seq) */
1904f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1905f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (seq == NULL || obj == NULL) {
1906f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
1907f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1908f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1909f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1910f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    it = PyObject_GetIter(seq);
1911f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (it == NULL) {
1912f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        type_error("argument of type '%.200s' is not iterable", seq);
1913f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1914f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1915f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1916f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    n = wrapped = 0;
1917f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (;;) {
1918f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int cmp;
1919f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *item = PyIter_Next(it);
1920f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (item == NULL) {
1921f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (PyErr_Occurred())
1922f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                goto Fail;
1923f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
1924f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1925f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1926f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
1927f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(item);
1928f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (cmp < 0)
1929f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto Fail;
1930f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (cmp > 0) {
1931f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            switch (operation) {
1932f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            case PY_ITERSEARCH_COUNT:
1933f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (n == PY_SSIZE_T_MAX) {
1934f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    PyErr_SetString(PyExc_OverflowError,
1935f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                           "count exceeds C integer size");
1936f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    goto Fail;
1937f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
1938f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                ++n;
1939f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                break;
1940f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1941f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            case PY_ITERSEARCH_INDEX:
1942f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (wrapped) {
1943f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    PyErr_SetString(PyExc_OverflowError,
1944f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                           "index exceeds C integer size");
1945f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    goto Fail;
1946f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
1947f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                goto Done;
1948f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1949f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            case PY_ITERSEARCH_CONTAINS:
1950f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                n = 1;
1951f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                goto Done;
1952f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1953f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            default:
1954f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                assert(!"unknown operation");
1955f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1956f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1957f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1958f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (operation == PY_ITERSEARCH_INDEX) {
1959f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (n == PY_SSIZE_T_MAX)
1960f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                wrapped = 1;
1961f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            ++n;
1962f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1963f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1964f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1965f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (operation != PY_ITERSEARCH_INDEX)
1966f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto Done;
1967f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1968f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_SetString(PyExc_ValueError,
1969f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    "sequence.index(x): x not in sequence");
1970f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* fall into failure code */
197175f8e35ef41aa6e7c915d99de8bd40be2745955cTim PetersFail:
1972f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    n = -1;
1973f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* fall through */
197416a77adfbd745c202878fabb0b921514fec7ca16Tim PetersDone:
1975f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(it);
1976f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return n;
197716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
19783c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum}
19793c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum
198016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters/* Return # of times o appears in s. */
19811fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t
198216a77adfbd745c202878fabb0b921514fec7ca16Tim PetersPySequence_Count(PyObject *s, PyObject *o)
1983e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1984f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
1985e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1986e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1987cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
198816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters * Use sq_contains if possible, else defer to _PySequence_IterSearch().
1989cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters */
1990cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Petersint
1991cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim PetersPySequence_Contains(PyObject *seq, PyObject *ob)
1992cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters{
1993f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t result;
1994f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1995f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (sqm != NULL && sqm->sq_contains != NULL)
1996f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return (*sqm->sq_contains)(seq, ob);
1997f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1998f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
1999cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters}
2000cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters
2001cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Backwards compatibility */
2002cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum#undef PySequence_In
2003cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
2004799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_In(PyObject *w, PyObject *v)
2005e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2006f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PySequence_Contains(w, v);
2007e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2008e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
20091fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t
2010799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Index(PyObject *s, PyObject *o)
2011e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2012f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
2013e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2014e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2015cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on mappings */
2016cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2017cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
2018799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_Check(PyObject *o)
2019e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
20202199227be420a7dfbd2b6ae994088dc78bfbe422Benjamin Peterson    return o && o->ob_type->tp_as_mapping &&
2021f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        o->ob_type->tp_as_mapping->mp_subscript;
2022e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2023e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
202418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
20256253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyMapping_Size(PyObject *o)
2026e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2027f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMappingMethods *m;
2028e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2029f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (o == NULL) {
2030f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
2031f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
2032f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2033e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2034f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = o->ob_type->tp_as_mapping;
2035f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m && m->mp_length)
2036f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return m->mp_length(o);
2037e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2038f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type_error("object of type '%.200s' has no len()", o);
2039f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return -1;
2040e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2041e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2042cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyMapping_Length
204318e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
2044cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyMapping_Length(PyObject *o)
2045cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{
2046f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyMapping_Size(o);
2047cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg}
2048cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyMapping_Length PyMapping_Size
2049cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg
2050cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van RossumPyObject *
2051c679227e31245b0e8dec74a1f7cc77710541d985Serhiy StorchakaPyMapping_GetItemString(PyObject *o, const char *key)
2052cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{
2053f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *okey, *r;
2054cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
205571aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (key == NULL) {
2056f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
205771aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
2058cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2059f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    okey = PyUnicode_FromString(key);
2060f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (okey == NULL)
2061f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2062f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    r = PyObject_GetItem(o, okey);
2063f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(okey);
2064f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return r;
2065cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
2066cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2067cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
2068c679227e31245b0e8dec74a1f7cc77710541d985Serhiy StorchakaPyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
2069cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{
2070f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *okey;
2071f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int r;
2072cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2073f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (key == NULL) {
2074f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        null_error();
2075f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
2076f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2077cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2078f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    okey = PyUnicode_FromString(key);
2079f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (okey == NULL)
2080f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
2081f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    r = PyObject_SetItem(o, okey, value);
2082f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(okey);
2083f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return r;
2084cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
2085cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2086cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
2087c679227e31245b0e8dec74a1f7cc77710541d985Serhiy StorchakaPyMapping_HasKeyString(PyObject *o, const char *key)
2088e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2089f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
2090cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2091f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PyMapping_GetItemString(o, key);
2092f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v) {
2093f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(v);
2094f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
2095f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2096f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Clear();
2097f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
2098e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2099e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2100cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
2101799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_HasKey(PyObject *o, PyObject *key)
2102e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2103f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
2104cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2105f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PyObject_GetItem(o, key);
2106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v) {
2107f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(v);
2108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
2109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Clear();
2111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
2112e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2113e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2114cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject *
2115cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Keys(PyObject *o)
2116cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{
2117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *keys;
2118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *fast;
2119bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(keys);
2120cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyDict_CheckExact(o))
2122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return PyDict_Keys(o);
2123afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    keys = _PyObject_CallMethodId(o, &PyId_keys, NULL);
2124f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (keys == NULL)
2125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fast = PySequence_Fast(keys, "o.keys() are not iterable");
2127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(keys);
2128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return fast;
2129cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum}
2130cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2131cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject *
2132cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Items(PyObject *o)
2133cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{
2134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *items;
2135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *fast;
2136bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(items);
2137cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyDict_CheckExact(o))
2139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return PyDict_Items(o);
2140afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    items = _PyObject_CallMethodId(o, &PyId_items, NULL);
2141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (items == NULL)
2142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fast = PySequence_Fast(items, "o.items() are not iterable");
2144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(items);
2145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return fast;
2146cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum}
2147cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2148cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject *
2149cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Values(PyObject *o)
2150cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{
2151f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *values;
2152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *fast;
2153bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(values);
2154cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyDict_CheckExact(o))
2156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return PyDict_Values(o);
2157afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    values = _PyObject_CallMethodId(o, &PyId_values, NULL);
2158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (values == NULL)
2159f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2160f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fast = PySequence_Fast(values, "o.values() are not iterable");
2161f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(values);
2162f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return fast;
2163cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum}
2164cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2165cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on callable objects */
2166cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2167cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* XXX PyCallable_Check() is in object.c */
2168cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2169e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
2170799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_CallObject(PyObject *o, PyObject *a)
2171e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyEval_CallObjectWithKeywords(o, a, NULL);
2173cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
2174e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
21754a7cc8847276df27c8f52987cda619ca279687c2Victor StinnerPyObject*
2176efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner_Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where)
21774a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner{
21784a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    int err_occurred = (PyErr_Occurred() != NULL);
21794a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner
2180efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner    assert((func != NULL) ^ (where != NULL));
2181efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner
21824a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    if (result == NULL) {
21834a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner        if (!err_occurred) {
2184efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner            if (func)
2185efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner                PyErr_Format(PyExc_SystemError,
2186efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner                             "%R returned NULL without setting an error",
2187efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner                             func);
2188efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner            else
2189efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner                PyErr_Format(PyExc_SystemError,
2190efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner                             "%s returned NULL without setting an error",
2191efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner                             where);
2192944fbcc478e36523add77574e172caf518647c74Victor Stinner#ifdef Py_DEBUG
21935697c4b6419e5a90a59e616e4509a6fff7ebf1a8Serhiy Storchaka            /* Ensure that the bug is caught in debug mode */
2194944fbcc478e36523add77574e172caf518647c74Victor Stinner            Py_FatalError("a function returned NULL without setting an error");
2195944fbcc478e36523add77574e172caf518647c74Victor Stinner#endif
2196944fbcc478e36523add77574e172caf518647c74Victor Stinner            return NULL;
21974a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner        }
21984a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    }
21994a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    else {
22004a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner        if (err_occurred) {
22014a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner            Py_DECREF(result);
22024a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner
2203467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka            if (func) {
2204467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka                _PyErr_FormatFromCause(PyExc_SystemError,
2205467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka                        "%R returned a result with an error set",
2206467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka                        func);
2207467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka            }
2208467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka            else {
2209467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka                _PyErr_FormatFromCause(PyExc_SystemError,
2210467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka                        "%s returned a result with an error set",
2211467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka                        where);
2212467ab194fc6189d9f7310c89937c51abeac56839Serhiy Storchaka            }
2213944fbcc478e36523add77574e172caf518647c74Victor Stinner#ifdef Py_DEBUG
22142275e626b1694557f646fd8a06608074731d6c82Martin Panter            /* Ensure that the bug is caught in debug mode */
2215944fbcc478e36523add77574e172caf518647c74Victor Stinner            Py_FatalError("a function returned a result with an error set");
2216944fbcc478e36523add77574e172caf518647c74Victor Stinner#endif
2217944fbcc478e36523add77574e172caf518647c74Victor Stinner            return NULL;
22184a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner        }
22194a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    }
22204a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    return result;
22214a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner}
22224a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner
2223e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
22248a31c820930536ffe3b44d99252ba9f3bb98ce58Victor StinnerPyObject_Call(PyObject *func, PyObject *args, PyObject *kwargs)
22256d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters{
2226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ternaryfunc call;
22274a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    PyObject *result;
2228f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
22298f4ec8d3ef9a75d7238c93cb55fdfcd0fe4ddc02Victor Stinner    /* PyObject_Call() must not be called with an exception set,
22308f4ec8d3ef9a75d7238c93cb55fdfcd0fe4ddc02Victor Stinner       because it may clear it (directly or indirectly) and so the
2231ec1aa5c2a1d0848351dd9d7d2758c553f18e56b2Martin Panter       caller loses its exception */
22328f4ec8d3ef9a75d7238c93cb55fdfcd0fe4ddc02Victor Stinner    assert(!PyErr_Occurred());
22338a31c820930536ffe3b44d99252ba9f3bb98ce58Victor Stinner    assert(PyTuple_Check(args));
22348a31c820930536ffe3b44d99252ba9f3bb98ce58Victor Stinner    assert(kwargs == NULL || PyDict_Check(kwargs));
22358f4ec8d3ef9a75d7238c93cb55fdfcd0fe4ddc02Victor Stinner
22364a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    call = func->ob_type->tp_call;
22374a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    if (call == NULL) {
22384a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner        PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
22394a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner                     func->ob_type->tp_name);
22404a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner        return NULL;
2241f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
22424a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner
22434a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    if (Py_EnterRecursiveCall(" while calling a Python object"))
22444a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner        return NULL;
22454a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner
22468a31c820930536ffe3b44d99252ba9f3bb98ce58Victor Stinner    result = (*call)(func, args, kwargs);
22474a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner
22484a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner    Py_LeaveRecursiveCall();
22494a7cc8847276df27c8f52987cda619ca279687c2Victor Stinner
2250efde146b0c42f2643f96d00896c99a90d501fb69Victor Stinner    return _Py_CheckFunctionResult(func, result, NULL);
22516d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters}
22526d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters
22539be7e7b52fa4b48012e956167a344df691195a04Victor StinnerPyObject*
22549be7e7b52fa4b48012e956167a344df691195a04Victor Stinner_PyStack_AsTuple(PyObject **stack, Py_ssize_t nargs)
22559be7e7b52fa4b48012e956167a344df691195a04Victor Stinner{
22569be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    PyObject *args;
22579be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    Py_ssize_t i;
22589be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
22599be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    args = PyTuple_New(nargs);
22609be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    if (args == NULL) {
22619be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        return NULL;
22629be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    }
22639be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
22649be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    for (i=0; i < nargs; i++) {
22659be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        PyObject *item = stack[i];
22669be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        Py_INCREF(item);
22679be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        PyTuple_SET_ITEM(args, i, item);
22689be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    }
22699be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
22709be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    return args;
22719be7e7b52fa4b48012e956167a344df691195a04Victor Stinner}
22729be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
22739be7e7b52fa4b48012e956167a344df691195a04Victor StinnerPyObject *
227474319ae219e049ae78897513b897c513f2d06445Victor Stinner_PyObject_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs,
2275b9009391868f739f4ddf09fa04061f6af05228b3Victor Stinner                       PyObject *kwargs)
22769be7e7b52fa4b48012e956167a344df691195a04Victor Stinner{
22779be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    ternaryfunc call;
22789be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    PyObject *result = NULL;
22799be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
2280559bb6a71399af3b1b2a0ba97230d2bcc649e993Victor Stinner    /* _PyObject_FastCallDict() must not be called with an exception set,
22819be7e7b52fa4b48012e956167a344df691195a04Victor Stinner       because it may clear it (directly or indirectly) and so the
22829be7e7b52fa4b48012e956167a344df691195a04Victor Stinner       caller loses its exception */
22839be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    assert(!PyErr_Occurred());
22849be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
22859be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    assert(func != NULL);
22869be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    assert(nargs >= 0);
22879be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    assert(nargs == 0 || args != NULL);
2288b9009391868f739f4ddf09fa04061f6af05228b3Victor Stinner    assert(kwargs == NULL || PyDict_Check(kwargs));
22899be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
22909be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    if (Py_EnterRecursiveCall(" while calling a Python object")) {
22919be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        return NULL;
22929be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    }
22939be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
22949be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    if (PyFunction_Check(func)) {
2295b9009391868f739f4ddf09fa04061f6af05228b3Victor Stinner        result = _PyFunction_FastCallDict(func, args, nargs, kwargs);
22969be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    }
22979be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    else if (PyCFunction_Check(func)) {
2298b9009391868f739f4ddf09fa04061f6af05228b3Victor Stinner        result = _PyCFunction_FastCallDict(func, args, nargs, kwargs);
22999be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    }
23009be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    else {
23019be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        PyObject *tuple;
23029be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
23039be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        /* Slow-path: build a temporary tuple */
23049be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        call = func->ob_type->tp_call;
23059be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        if (call == NULL) {
23069be7e7b52fa4b48012e956167a344df691195a04Victor Stinner            PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
23079be7e7b52fa4b48012e956167a344df691195a04Victor Stinner                         func->ob_type->tp_name);
23089be7e7b52fa4b48012e956167a344df691195a04Victor Stinner            goto exit;
23099be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        }
23109be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
23119be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        tuple = _PyStack_AsTuple(args, nargs);
23129be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        if (tuple == NULL) {
23139be7e7b52fa4b48012e956167a344df691195a04Victor Stinner            goto exit;
23149be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        }
23159be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
23169be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        result = (*call)(func, tuple, kwargs);
23179be7e7b52fa4b48012e956167a344df691195a04Victor Stinner        Py_DECREF(tuple);
23189be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
231953cb489ed08c6940b026c1be6b7aec87eb1f02fdVictor Stinner        result = _Py_CheckFunctionResult(func, result, NULL);
232053cb489ed08c6940b026c1be6b7aec87eb1f02fdVictor Stinner    }
23219be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
23229be7e7b52fa4b48012e956167a344df691195a04Victor Stinnerexit:
23239be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    Py_LeaveRecursiveCall();
23249be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
23259be7e7b52fa4b48012e956167a344df691195a04Victor Stinner    return result;
23269be7e7b52fa4b48012e956167a344df691195a04Victor Stinner}
23279be7e7b52fa4b48012e956167a344df691195a04Victor Stinner
2328186b204997166932fec475ed08bcb324ae102a30Martin Panter/* Positional arguments are obj followed by args. */
23293f1057a4b62d8c94ae77f34f950b74a45499b218Victor StinnerPyObject *
23303f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner_PyObject_Call_Prepend(PyObject *func,
23313f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner                       PyObject *obj, PyObject *args, PyObject *kwargs)
23323f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner{
23333f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    PyObject *small_stack[8];
23343f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    PyObject **stack;
23353f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    Py_ssize_t argcount;
23363f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    PyObject *result;
23373f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner
23383f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    assert(PyTuple_Check(args));
23393f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner
23403f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    argcount = PyTuple_GET_SIZE(args);
23413f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
23423f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner        stack = small_stack;
23433f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    }
23443f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    else {
23453f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner        stack = PyMem_Malloc((argcount + 1) * sizeof(PyObject *));
23463f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner        if (stack == NULL) {
23473f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner            PyErr_NoMemory();
23483f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner            return NULL;
23493f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner        }
23503f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    }
23513f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner
23523f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    /* use borrowed references */
23533f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    stack[0] = obj;
2354f051e43b22af014364e231c36489e6745993ea34Christian Heimes    memcpy(&stack[1],
23553f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner              &PyTuple_GET_ITEM(args, 0),
23563f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner              argcount * sizeof(PyObject *));
23573f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner
23583f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    result = _PyObject_FastCallDict(func,
23593f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner                                    stack, argcount + 1,
23603f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner                                    kwargs);
23613f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    if (stack != small_stack) {
23623f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner        PyMem_Free(stack);
23633f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    }
23643f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner    return result;
23653f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner}
23663f1057a4b62d8c94ae77f34f950b74a45499b218Victor Stinner
2367ae8b69c410b83d92c6c35bbe342c3c2e92be6aa1Victor StinnerPyObject *
2368b8d768b0199c55d408f5c8b86d14555aa7be9f98Victor Stinner_PyStack_AsDict(PyObject **values, PyObject *kwnames)
2369d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner{
2370b8d768b0199c55d408f5c8b86d14555aa7be9f98Victor Stinner    Py_ssize_t nkwargs = PyTuple_GET_SIZE(kwnames);
2371d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    PyObject *kwdict;
2372d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    Py_ssize_t i;
2373d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner
2374d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    kwdict = PyDict_New();
2375d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    if (kwdict == NULL) {
2376d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner        return NULL;
2377d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    }
2378d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner
2379b8d768b0199c55d408f5c8b86d14555aa7be9f98Victor Stinner    for (i = 0; i < nkwargs; i++) {
2380d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner        PyObject *key = PyTuple_GET_ITEM(kwnames, i);
2381d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner        PyObject *value = *values++;
2382b8d768b0199c55d408f5c8b86d14555aa7be9f98Victor Stinner        assert(PyUnicode_CheckExact(key));
2383b8d768b0199c55d408f5c8b86d14555aa7be9f98Victor Stinner        assert(PyDict_GetItem(kwdict, key) == NULL);
2384b8d768b0199c55d408f5c8b86d14555aa7be9f98Victor Stinner        if (PyDict_SetItem(kwdict, key, value)) {
2385d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner            Py_DECREF(kwdict);
2386d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner            return NULL;
2387d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner        }
2388d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    }
2389d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    return kwdict;
2390d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner}
2391d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner
2392a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor StinnerPyObject **
2393a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner_PyStack_UnpackDict(PyObject **args, Py_ssize_t nargs, PyObject *kwargs,
2394a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner                    PyObject **p_kwnames, PyObject *func)
2395a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner{
2396a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    PyObject **stack, **kwstack;
2397a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    Py_ssize_t nkwargs;
2398a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    Py_ssize_t pos, i;
2399a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    PyObject *key, *value;
2400a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    PyObject *kwnames;
2401a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner
2402a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    assert(nargs >= 0);
2403a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    assert(kwargs == NULL || PyDict_CheckExact(kwargs));
2404a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner
2405a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    nkwargs = (kwargs != NULL) ? PyDict_Size(kwargs) : 0;
2406a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    if (!nkwargs) {
2407a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        *p_kwnames = NULL;
2408a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        return args;
2409a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    }
2410a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner
2411a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    if ((size_t)nargs > PY_SSIZE_T_MAX / sizeof(stack[0]) - (size_t)nkwargs) {
2412a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        PyErr_NoMemory();
2413a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        return NULL;
2414a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    }
2415a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner
2416a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    stack = PyMem_Malloc((nargs + nkwargs) * sizeof(stack[0]));
2417a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    if (stack == NULL) {
2418a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        PyErr_NoMemory();
2419a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        return NULL;
2420a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    }
2421a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner
2422a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    kwnames = PyTuple_New(nkwargs);
2423a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    if (kwnames == NULL) {
2424a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        PyMem_Free(stack);
2425a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        return NULL;
2426a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    }
2427a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner
2428a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    /* Copy position arguments (borrowed references) */
2429f051e43b22af014364e231c36489e6745993ea34Christian Heimes    memcpy(stack, args, nargs * sizeof(stack[0]));
2430a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner
2431a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    kwstack = stack + nargs;
2432a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    pos = i = 0;
2433a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    /* This loop doesn't support lookup function mutating the dictionary
2434a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner       to change its size. It's a deliberate choice for speed, this function is
2435a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner       called in the performance critical hot code. */
2436a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    while (PyDict_Next(kwargs, &pos, &key, &value)) {
2437a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        Py_INCREF(key);
2438a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        PyTuple_SET_ITEM(kwnames, i, key);
2439a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        /* The stack contains borrowed references */
2440a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        kwstack[i] = value;
2441a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner        i++;
2442a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    }
2443a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner
2444a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    *p_kwnames = kwnames;
2445a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner    return stack;
2446a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner}
2447a9efb2f56eb6bcb97cebfadf1e778b4cb979357fVictor Stinner
2448d8735720955557d8056bc1fca41ad1c3b48aa63cVictor StinnerPyObject *
2449d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner_PyObject_FastCallKeywords(PyObject *func, PyObject **stack, Py_ssize_t nargs,
2450d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner                           PyObject *kwnames)
2451d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner{
2452d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    PyObject *kwdict, *result;
2453d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames);
2454d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner
2455d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    assert(nargs >= 0);
2456d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    assert(kwnames == NULL || PyTuple_CheckExact(kwnames));
2457d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    assert((nargs == 0 && nkwargs == 0) || stack != NULL);
245857f91ac95aec1922ba104019a81a6508485862c4Victor Stinner    /* kwnames must only contains str strings, no subclass, and all keys must
245957f91ac95aec1922ba104019a81a6508485862c4Victor Stinner       be unique: these are implemented in Python/ceval.c and
246057f91ac95aec1922ba104019a81a6508485862c4Victor Stinner       _PyArg_ParseStack(). */
2461d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner
2462d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    if (PyFunction_Check(func)) {
2463d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner        return _PyFunction_FastCallKeywords(func, stack, nargs, kwnames);
2464d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    }
2465d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner
2466ae8b69c410b83d92c6c35bbe342c3c2e92be6aa1Victor Stinner    if (PyCFunction_Check(func)) {
2467ae8b69c410b83d92c6c35bbe342c3c2e92be6aa1Victor Stinner        return _PyCFunction_FastCallKeywords(func, stack, nargs, kwnames);
2468ae8b69c410b83d92c6c35bbe342c3c2e92be6aa1Victor Stinner    }
2469ae8b69c410b83d92c6c35bbe342c3c2e92be6aa1Victor Stinner
2470d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    if (nkwargs > 0) {
2471b8d768b0199c55d408f5c8b86d14555aa7be9f98Victor Stinner        kwdict = _PyStack_AsDict(stack + nargs, kwnames);
2472d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner        if (kwdict == NULL) {
2473d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner            return NULL;
2474d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner        }
2475d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    }
2476d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    else {
2477d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner        kwdict = NULL;
2478d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    }
2479d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner
2480d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    result = _PyObject_FastCallDict(func, stack, nargs, kwdict);
2481d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    Py_XDECREF(kwdict);
2482d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner    return result;
2483d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner}
2484d8735720955557d8056bc1fca41ad1c3b48aa63cVictor Stinner
248549fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersstatic PyObject*
248649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouterscall_function_tail(PyObject *callable, PyObject *args)
248749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
24888880708f8149856b99abf480f913760a64203c39Victor Stinner    PyObject *result;
248949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
249064faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    assert(args != NULL);
249149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
2492f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyTuple_Check(args)) {
2493559bb6a71399af3b1b2a0ba97230d2bcc649e993Victor Stinner        result = _PyObject_CallArg1(callable, args);
24948880708f8149856b99abf480f913760a64203c39Victor Stinner    }
24958880708f8149856b99abf480f913760a64203c39Victor Stinner    else {
24968880708f8149856b99abf480f913760a64203c39Victor Stinner        result = PyObject_Call(callable, args, NULL);
2497f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
249849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
24998880708f8149856b99abf480f913760a64203c39Victor Stinner    return result;
250049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
250149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
25026d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim PetersPyObject *
25031cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy StorchakaPyObject_CallFunction(PyObject *callable, const char *format, ...)
2504e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2505f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_list va;
250664faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    PyObject *args, *result;
2507e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
250871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (callable == NULL) {
2509f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
251071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
2511cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
25120d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    if (!format || !*format) {
2513559bb6a71399af3b1b2a0ba97230d2bcc649e993Victor Stinner        return _PyObject_CallNoArg(callable);
251464faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    }
25150d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner
25160d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    va_start(va, format);
25170d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    args = Py_VaBuildValue(format, va);
25180d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    va_end(va);
251964faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    if (args == NULL) {
25200b0c86717807bf86ba5d1d7d332529ad08179934Victor Stinner        return NULL;
252164faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    }
2522cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
252364faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    result = call_function_tail(callable, args);
252464faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    Py_DECREF(args);
252564faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    return result;
252649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
2527cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
252849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyObject *
25291cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy Storchaka_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
253049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2531f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_list va;
253264faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    PyObject *args, *result;
2533cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
253471aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (callable == NULL) {
2535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
253671aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
2537cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
25380d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    if (!format || !*format) {
2539559bb6a71399af3b1b2a0ba97230d2bcc649e993Victor Stinner        return _PyObject_CallNoArg(callable);
254064faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    }
25410d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner
25420d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    va_start(va, format);
25430d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    args = _Py_VaBuildValue_SizeT(format, va);
25440d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    va_end(va);
254564faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    if (args == NULL) {
254664faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner        return NULL;
254764faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    }
2548cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
254964faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    result = call_function_tail(callable, args);
255064faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    Py_DECREF(args);
255164faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    return result;
2552e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2553e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2554afe55bba33a20f87a58f940186359237064b428fMartin v. Löwisstatic PyObject*
25551cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy Storchakacallmethod(PyObject* func, const char *format, va_list va, int is_size_t)
2556e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
255764faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    PyObject *args, *result;
2558e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2559d042f1f5eb8b7cfacacc4610df73a6e56f2947b5Victor Stinner    assert(func != NULL);
2560d042f1f5eb8b7cfacacc4610df73a6e56f2947b5Victor Stinner
2561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyCallable_Check(func)) {
2562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        type_error("attribute of type '%.200s' is not callable", func);
256364faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner        return NULL;
2564f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2565e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
25660d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    if (!format || !*format) {
2567559bb6a71399af3b1b2a0ba97230d2bcc649e993Victor Stinner        return _PyObject_CallNoArg(func);
25680d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    }
25690d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner
25700d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner    if (is_size_t) {
25710d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner        args = _Py_VaBuildValue_SizeT(format, va);
2572f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
257364faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    else {
25740d1a799343dd956c8e4a1d6e0ac3fa9ac007704eVictor Stinner        args = Py_VaBuildValue(format, va);
257564faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    }
257664faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    if (args == NULL) {
257764faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner        return NULL;
257864faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    }
2579cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
258064faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    result = call_function_tail(func, args);
258164faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    Py_DECREF(args);
258264faad6e459c207cd1bce1db2fd9053b44b0a4acVictor Stinner    return result;
258349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
258449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
258549fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyObject *
25861cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy StorchakaPyObject_CallMethod(PyObject *o, const char *name, const char *format, ...)
258749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_list va;
2589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *func = NULL;
2590f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *retval = NULL;
259149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
259271aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL || name == NULL) {
2593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
259471aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
259549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
2596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    func = PyObject_GetAttrString(o, name);
25971791c224dd87ba86236c399c2c8ea916635981c2Benjamin Peterson    if (func == NULL)
25981791c224dd87ba86236c399c2c8ea916635981c2Benjamin Peterson        return NULL;
2599cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2600afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_start(va, format);
2601afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    retval = callmethod(func, format, va, 0);
2602afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_end(va);
2603d042f1f5eb8b7cfacacc4610df73a6e56f2947b5Victor Stinner    Py_DECREF(func);
2604afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    return retval;
2605afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis}
260649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
2607afe55bba33a20f87a58f940186359237064b428fMartin v. LöwisPyObject *
26081cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy Storchaka_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name,
26091cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy Storchaka                       const char *format, ...)
2610afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis{
2611afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_list va;
2612afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    PyObject *func = NULL;
2613afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    PyObject *retval = NULL;
2614afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis
261571aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL || name == NULL) {
2616afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis        return null_error();
261771aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
2618afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis
2619afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    func = _PyObject_GetAttrId(o, name);
26201791c224dd87ba86236c399c2c8ea916635981c2Benjamin Peterson    if (func == NULL)
26211791c224dd87ba86236c399c2c8ea916635981c2Benjamin Peterson        return NULL;
262249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
2623afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_start(va, format);
2624afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    retval = callmethod(func, format, va, 0);
2625afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_end(va);
2626d042f1f5eb8b7cfacacc4610df73a6e56f2947b5Victor Stinner    Py_DECREF(func);
2627afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    return retval;
2628afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis}
2629cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2630afe55bba33a20f87a58f940186359237064b428fMartin v. LöwisPyObject *
26311cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy Storchaka_PyObject_CallMethod_SizeT(PyObject *o, const char *name,
26321cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy Storchaka                           const char *format, ...)
2633afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis{
2634afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_list va;
2635afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    PyObject *func = NULL;
2636afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    PyObject *retval;
2637afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis
263871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL || name == NULL) {
2639afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis        return null_error();
264071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
2641cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2642afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    func = PyObject_GetAttrString(o, name);
26431791c224dd87ba86236c399c2c8ea916635981c2Benjamin Peterson    if (func == NULL)
26441791c224dd87ba86236c399c2c8ea916635981c2Benjamin Peterson        return NULL;
2645afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_start(va, format);
2646afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    retval = callmethod(func, format, va, 1);
2647afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_end(va);
2648d042f1f5eb8b7cfacacc4610df73a6e56f2947b5Victor Stinner    Py_DECREF(func);
2649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return retval;
2650e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2651823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2652afe55bba33a20f87a58f940186359237064b428fMartin v. LöwisPyObject *
26531cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy Storchaka_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name,
26541cfebc73e0ecbcde0b564567606882d70c7812ecSerhiy Storchaka                             const char *format, ...)
2655afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis{
2656afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_list va;
2657afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    PyObject *func = NULL;
2658afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    PyObject *retval;
2659afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis
266071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (o == NULL || name == NULL) {
2661afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis        return null_error();
266271aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
2663afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis
2664afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    func = _PyObject_GetAttrId(o, name);
2665afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    if (func == NULL) {
2666afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis        return NULL;
2667afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    }
2668afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_start(va, format);
2669afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    retval = callmethod(func, format, va, 1);
2670afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    va_end(va);
2671d042f1f5eb8b7cfacacc4610df73a6e56f2947b5Victor Stinner    Py_DECREF(func);
2672afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    return retval;
2673afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis}
2674823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2675dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinnerstatic PyObject **
2676dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinnerobjargs_mkstack(PyObject **small_stack, Py_ssize_t small_stack_size,
2677dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner                va_list va, Py_ssize_t *p_nargs)
2678b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{
2679dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    Py_ssize_t i, n;
2680f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_list countva;
2681dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject **stack;
2682b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2683dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    /* Count the number of arguments */
26840c21214f3e583d541227df2239de377e796b55faBenjamin Peterson    va_copy(countva, va);
2685e62b85260542df5a7cb0c5b47507875ca7ffff23Victor Stinner
2686dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    n = 0;
2687dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    while (1) {
26887b7228a709097e7fa5e7fdbf204f128d249223e9Benjamin Peterson        PyObject *arg = va_arg(countva, PyObject *);
2689dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        if (arg == NULL) {
2690dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner            break;
2691e62b85260542df5a7cb0c5b47507875ca7ffff23Victor Stinner        }
2692dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        n++;
2693e62b85260542df5a7cb0c5b47507875ca7ffff23Victor Stinner    }
2694dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    *p_nargs = n;
2695dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner
2696dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    /* Copy arguments */
2697dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    if (n <= small_stack_size) {
2698dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        stack = small_stack;
2699dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    }
2700dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    else {
2701dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        stack = PyMem_Malloc(n * sizeof(stack[0]));
2702dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        if (stack == NULL) {
27032f2fee19ec63a09b184fbe09135ecb2f16a0e257Christian Heimes            va_end(countva);
2704dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner            PyErr_NoMemory();
2705dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner            return NULL;
2706dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        }
2707dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    }
2708dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner
2709dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    for (i = 0; i < n; ++i) {
2710dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        stack[i] = va_arg(va, PyObject *);
2711dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    }
27122f2fee19ec63a09b184fbe09135ecb2f16a0e257Christian Heimes    va_end(countva);
2713dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    return stack;
2714b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake}
2715b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2716b421b8c19105d08b97122b7c84eec37ad83c6de4Fred DrakePyObject *
2717b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred DrakePyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
2718b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{
2719dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject *small_stack[5];
2720dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject **stack;
2721dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    Py_ssize_t nargs;
2722dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject *result;
2723f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_list vargs;
2724b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
272571aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (callable == NULL || name == NULL) {
2726f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
272771aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
2728b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2729f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    callable = PyObject_GetAttr(callable, name);
2730f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (callable == NULL)
2731f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2732b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2733f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* count the args */
2734f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_start(vargs, name);
2735dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    stack = objargs_mkstack(small_stack, Py_ARRAY_LENGTH(small_stack),
2736dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner                            vargs, &nargs);
2737f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_end(vargs);
2738dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    if (stack == NULL) {
2739f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(callable);
2740f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2741f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2742dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner
2743dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    result = _PyObject_FastCall(callable, stack, nargs);
2744f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(callable);
2745dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    if (stack != small_stack) {
2746dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        PyMem_Free(stack);
2747dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    }
2748b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2749dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    return result;
2750b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake}
2751b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2752b421b8c19105d08b97122b7c84eec37ad83c6de4Fred DrakePyObject *
2753865eaa1b53b7f87e13e07f0e96c5659edf003ab1Alexandre Vassalotti_PyObject_CallMethodIdObjArgs(PyObject *callable,
2754fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        struct _Py_Identifier *name, ...)
2755fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon{
2756dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject *small_stack[5];
2757dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject **stack;
2758dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    Py_ssize_t nargs;
2759dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject *result;
2760fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    va_list vargs;
2761fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
276271aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (callable == NULL || name == NULL) {
2763fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        return null_error();
276471aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
2765fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
2766fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    callable = _PyObject_GetAttrId(callable, name);
2767fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    if (callable == NULL)
2768fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        return NULL;
2769fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
2770fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    /* count the args */
2771fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    va_start(vargs, name);
2772dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    stack = objargs_mkstack(small_stack, Py_ARRAY_LENGTH(small_stack),
2773dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner                            vargs, &nargs);
2774fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    va_end(vargs);
2775dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    if (stack == NULL) {
2776fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        Py_DECREF(callable);
2777fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        return NULL;
2778fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    }
2779dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner
2780dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    result = _PyObject_FastCall(callable, stack, nargs);
2781fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    Py_DECREF(callable);
2782dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    if (stack != small_stack) {
2783dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        PyMem_Free(stack);
2784dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    }
2785fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
2786dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    return result;
2787fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon}
2788fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
2789fd0741555b733f66c0a35c698d0cac5e73010ae0Brett CannonPyObject *
2790b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred DrakePyObject_CallFunctionObjArgs(PyObject *callable, ...)
2791b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{
2792dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject *small_stack[5];
2793dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject **stack;
2794dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    Py_ssize_t nargs;
2795dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    PyObject *result;
2796f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_list vargs;
2797b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
279871aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    if (callable == NULL) {
2799f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return null_error();
280071aea8e98176c333a8fc4710b3765d72ea6b04c5Victor Stinner    }
2801b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2802f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* count the args */
2803f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_start(vargs, callable);
2804dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    stack = objargs_mkstack(small_stack, Py_ARRAY_LENGTH(small_stack),
2805dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner                            vargs, &nargs);
2806f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    va_end(vargs);
2807dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    if (stack == NULL) {
2808f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2809dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    }
2810e62b85260542df5a7cb0c5b47507875ca7ffff23Victor Stinner
2811dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    result = _PyObject_FastCall(callable, stack, nargs);
2812dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    if (stack != small_stack) {
2813dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner        PyMem_Free(stack);
2814dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    }
2815dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner
2816dd69564c38de21f2ede269c55fce6db24bb27941Victor Stinner    return result;
2817b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake}
2818b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2819b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2820823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum/* isinstance(), issubclass() */
2821823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
28229fc9bf465af96bf753217b0c370e4452882ecd86Benjamin Peterson/* abstract_get_bases() has logically 4 return states:
2823f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2824f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 1. getattr(cls, '__bases__') could raise an AttributeError
2825f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 2. getattr(cls, '__bases__') could raise some other exception
2826f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 3. getattr(cls, '__bases__') could return a tuple
2827f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 4. getattr(cls, '__bases__') could return something other than a tuple
2828f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2829f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Only state #3 is a non-error state and only it returns a non-NULL object
2830f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * (it returns the retrieved tuple).
2831f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2832f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Any raised AttributeErrors are masked by clearing the exception and
2833f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * returning NULL.  If an object other than a tuple comes out of __bases__,
2834f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * then again, the return value is NULL.  So yes, these two situations
2835f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * produce exactly the same results: NULL is returned and no error is set.
2836f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2837f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * If some exception other than AttributeError is raised, then NULL is also
2838f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * returned, but the exception is not cleared.  That's because we want the
2839f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * exception to be propagated along.
2840f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2841f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Callers are expected to test for PyErr_Occurred() when the return value
2842f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * is NULL to decide whether a valid exception should be propagated or not.
2843f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * When there's no exception to propagate, it's customary for the caller to
2844f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * set a TypeError.
2845f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw */
28466b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerstatic PyObject *
28476b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerabstract_get_bases(PyObject *cls)
2848823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{
28499fc9bf465af96bf753217b0c370e4452882ecd86Benjamin Peterson    _Py_IDENTIFIER(__bases__);
2850f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *bases;
2851f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2852f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ALLOW_RECURSION
28539fc9bf465af96bf753217b0c370e4452882ecd86Benjamin Peterson    bases = _PyObject_GetAttrId(cls, &PyId___bases__);
2854f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_END_ALLOW_RECURSION
2855f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (bases == NULL) {
2856f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PyErr_ExceptionMatches(PyExc_AttributeError))
2857f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
2858f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2859f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2860f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyTuple_Check(bases)) {
2861f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(bases);
2862f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2863f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2864f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return bases;
28656b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer}
28666b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
28676b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
28686b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerstatic int
28696b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerabstract_issubclass(PyObject *derived, PyObject *cls)
28706b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer{
2871f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *bases = NULL;
2872f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t i, n;
2873f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int r = 0;
2874f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2875f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while (1) {
2876f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (derived == cls)
2877f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return 1;
2878f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        bases = abstract_get_bases(derived);
2879f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (bases == NULL) {
2880f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (PyErr_Occurred())
2881f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return -1;
2882f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return 0;
2883f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2884f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        n = PyTuple_GET_SIZE(bases);
2885f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (n == 0) {
2886f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(bases);
2887f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return 0;
2888f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2889f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Avoid recursivity in the single inheritance case */
2890f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (n == 1) {
2891f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            derived = PyTuple_GET_ITEM(bases, 0);
2892f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(bases);
2893f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            continue;
2894f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2895f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (i = 0; i < n; i++) {
2896f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2897f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (r != 0)
2898f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                break;
2899f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2900f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(bases);
2901f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return r;
2902f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2903823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum}
2904823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2905d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwaldstatic int
2906d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwaldcheck_class(PyObject *cls, const char *error)
2907d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald{
2908f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *bases = abstract_get_bases(cls);
2909f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (bases == NULL) {
2910f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Do not mask errors. */
2911f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!PyErr_Occurred())
2912f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_SetString(PyExc_TypeError, error);
2913f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
2914f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2915f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(bases);
2916f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return -1;
2917d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald}
2918d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald
29194f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonstatic int
2920ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrourecursive_isinstance(PyObject *inst, PyObject *cls)
2921823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{
2922f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *icls;
2923f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int retval = 0;
29249fc9bf465af96bf753217b0c370e4452882ecd86Benjamin Peterson    _Py_IDENTIFIER(__class__);
2925f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2926f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyType_Check(cls)) {
2927f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2928f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (retval == 0) {
29299fc9bf465af96bf753217b0c370e4452882ecd86Benjamin Peterson            PyObject *c = _PyObject_GetAttrId(inst, &PyId___class__);
2930f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (c == NULL) {
293172288d4f3cf1e4a66ed8575cb3063ad6a6810f82Benjamin Peterson                if (PyErr_ExceptionMatches(PyExc_AttributeError))
29326bb9989ae38cd2610e661d6e8899ef58dd9562e3R. David Murray                    PyErr_Clear();
293372288d4f3cf1e4a66ed8575cb3063ad6a6810f82Benjamin Peterson                else
29346bb9989ae38cd2610e661d6e8899ef58dd9562e3R. David Murray                    retval = -1;
2935f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
2936f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else {
2937f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (c != (PyObject *)(inst->ob_type) &&
2938f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    PyType_Check(c))
2939f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    retval = PyType_IsSubtype(
2940f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        (PyTypeObject *)c,
2941f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        (PyTypeObject *)cls);
2942f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_DECREF(c);
2943f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
2944f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2945f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2946f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
2947f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!check_class(cls,
2948e893af5ab78d2cfb6403ffa6ae31145010b88101Benjamin Peterson            "isinstance() arg 2 must be a type or tuple of types"))
2949f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return -1;
29509fc9bf465af96bf753217b0c370e4452882ecd86Benjamin Peterson        icls = _PyObject_GetAttrId(inst, &PyId___class__);
2951f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (icls == NULL) {
295272288d4f3cf1e4a66ed8575cb3063ad6a6810f82Benjamin Peterson            if (PyErr_ExceptionMatches(PyExc_AttributeError))
29536bb9989ae38cd2610e661d6e8899ef58dd9562e3R. David Murray                PyErr_Clear();
295472288d4f3cf1e4a66ed8575cb3063ad6a6810f82Benjamin Peterson            else
29556bb9989ae38cd2610e661d6e8899ef58dd9562e3R. David Murray                retval = -1;
2956f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2957f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else {
2958f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            retval = abstract_issubclass(icls, cls);
2959f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(icls);
2960f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2961f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2962f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2963f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return retval;
2964823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum}
2965823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2966823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossumint
29674f65331483197a9909b19694688c55fdf9ca7a37Brett CannonPyObject_IsInstance(PyObject *inst, PyObject *cls)
29684f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon{
2969ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson    _Py_IDENTIFIER(__instancecheck__);
2970f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *checker;
2971f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2972f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Quick test for an exact match */
2973f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_TYPE(inst) == (PyTypeObject *)cls)
2974f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
2975f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
297672b8a80e5975a75398872a8406e4215937874165Georg Brandl    /* We know what type's __instancecheck__ does. */
297772b8a80e5975a75398872a8406e4215937874165Georg Brandl    if (PyType_CheckExact(cls)) {
297872b8a80e5975a75398872a8406e4215937874165Georg Brandl        return recursive_isinstance(inst, cls);
297972b8a80e5975a75398872a8406e4215937874165Georg Brandl    }
298072b8a80e5975a75398872a8406e4215937874165Georg Brandl
2981f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyTuple_Check(cls)) {
2982f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_ssize_t i;
2983f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_ssize_t n;
2984f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int r = 0;
2985f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2986f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (Py_EnterRecursiveCall(" in __instancecheck__"))
2987f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return -1;
2988f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        n = PyTuple_GET_SIZE(cls);
2989f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (i = 0; i < n; ++i) {
2990f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyObject *item = PyTuple_GET_ITEM(cls, i);
2991f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            r = PyObject_IsInstance(inst, item);
2992f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (r != 0)
2993f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* either found it, or got an error */
2994f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                break;
2995f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2996f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_LeaveRecursiveCall();
2997f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return r;
2998f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2999f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
3000ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson    checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
3001f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (checker != NULL) {
3002f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *res;
3003f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int ok = -1;
3004f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (Py_EnterRecursiveCall(" in __instancecheck__")) {
3005f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(checker);
3006f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return ok;
3007f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
3008f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
3009f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_LeaveRecursiveCall();
3010f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(checker);
3011f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (res != NULL) {
3012f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            ok = PyObject_IsTrue(res);
3013f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(res);
3014f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
3015f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return ok;
3016f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
3017f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (PyErr_Occurred())
3018f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
301972b8a80e5975a75398872a8406e4215937874165Georg Brandl    /* Probably never reached anymore. */
3020f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return recursive_isinstance(inst, cls);
3021f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou}
3022f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
3023f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroustatic  int
3024ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrourecursive_issubclass(PyObject *derived, PyObject *cls)
3025823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{
3026f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyType_Check(cls) && PyType_Check(derived)) {
3027f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Fast path (non-recursive) */
3028f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
3029f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
3030f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!check_class(derived,
3031f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     "issubclass() arg 1 must be a class"))
3032f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
3033f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!check_class(cls,
3034f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    "issubclass() arg 2 must be a class"
3035f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    " or tuple of classes"))
3036f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
3037823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
3038f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return abstract_issubclass(derived, cls);
3039823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum}
304059d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum
30414f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonint
30424f65331483197a9909b19694688c55fdf9ca7a37Brett CannonPyObject_IsSubclass(PyObject *derived, PyObject *cls)
30434f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon{
3044ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson    _Py_IDENTIFIER(__subclasscheck__);
3045f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *checker;
3046f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
304772b8a80e5975a75398872a8406e4215937874165Georg Brandl    /* We know what type's __subclasscheck__ does. */
304872b8a80e5975a75398872a8406e4215937874165Georg Brandl    if (PyType_CheckExact(cls)) {
304972b8a80e5975a75398872a8406e4215937874165Georg Brandl        /* Quick test for an exact match */
305072b8a80e5975a75398872a8406e4215937874165Georg Brandl        if (derived == cls)
305172b8a80e5975a75398872a8406e4215937874165Georg Brandl            return 1;
305272b8a80e5975a75398872a8406e4215937874165Georg Brandl        return recursive_issubclass(derived, cls);
305372b8a80e5975a75398872a8406e4215937874165Georg Brandl    }
305472b8a80e5975a75398872a8406e4215937874165Georg Brandl
3055f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyTuple_Check(cls)) {
3056f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_ssize_t i;
3057f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_ssize_t n;
3058f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int r = 0;
3059f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
3060f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3061f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return -1;
3062f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        n = PyTuple_GET_SIZE(cls);
3063f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (i = 0; i < n; ++i) {
3064f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyObject *item = PyTuple_GET_ITEM(cls, i);
3065f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            r = PyObject_IsSubclass(derived, item);
3066f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (r != 0)
3067f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* either found it, or got an error */
3068f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                break;
3069f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
3070f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_LeaveRecursiveCall();
3071f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return r;
3072f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
3073f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
3074ce798520778e9cb41adfdc4f0a3cb5085a0b11beBenjamin Peterson    checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
3075f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (checker != NULL) {
3076f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *res;
3077f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int ok = -1;
3078f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
3079f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(checker);
3080f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return ok;
3081f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
3082f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3083f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_LeaveRecursiveCall();
3084f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(checker);
3085f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (res != NULL) {
3086f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            ok = PyObject_IsTrue(res);
3087f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(res);
3088f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
3089f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return ok;
3090f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
3091f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (PyErr_Occurred())
3092f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
309372b8a80e5975a75398872a8406e4215937874165Georg Brandl    /* Probably never reached anymore. */
3094f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return recursive_issubclass(derived, cls);
3095ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou}
3096ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou
3097ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrouint
3098ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
3099ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou{
3100f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return recursive_isinstance(inst, cls);
3101ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou}
3102ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou
3103ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrouint
3104ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
3105ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou{
3106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return recursive_issubclass(derived, cls);
31074f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon}
31084f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
31094f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
311059d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject *
311159d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject_GetIter(PyObject *o)
311259d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum{
3113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyTypeObject *t = o->ob_type;
3114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    getiterfunc f = NULL;
3115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    f = t->tp_iter;
3116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (f == NULL) {
3117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PySequence_Check(o))
3118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return PySeqIter_New(o);
3119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return type_error("'%.200s' object is not iterable", o);
3120f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
3121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
3122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *res = (*f)(o);
3123f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (res != NULL && !PyIter_Check(res)) {
3124f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Format(PyExc_TypeError,
3125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                         "iter() returned non-iterator "
3126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                         "of type '%.100s'",
3127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                         res->ob_type->tp_name);
3128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(res);
3129f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            res = NULL;
3130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
3131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return res;
3132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
3133213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum}
3134213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum
3135f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters/* Return next item.
3136f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If an error occurs, return NULL.  PyErr_Occurred() will be true.
3137f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If the iteration terminates normally, return NULL and clear the
3138f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * PyExc_StopIteration exception (if it was set).  PyErr_Occurred()
3139f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * will be false.
3140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * Else return the next object.  PyErr_Occurred() will be false.
3141f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters */
3142213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyObject *
3143213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyIter_Next(PyObject *iter)
3144213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum{
3145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result;
3146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = (*iter->ob_type->tp_iternext)(iter);
3147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL &&
3148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Occurred() &&
3149f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_ExceptionMatches(PyExc_StopIteration))
3150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
3151f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return result;
315259d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum}
3153fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
3154fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
3155fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith/*
3156fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * Flatten a sequence of bytes() objects into a C array of
3157fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * NULL terminated string pointers with a NULL char* terminating the array.
3158fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * (ie: an argv or env list)
3159fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith *
31600e2d3cf2cba644f573968737e3ee4f76285d54d3Victor Stinner * Memory allocated for the returned list is allocated using PyMem_Malloc()
31610e2d3cf2cba644f573968737e3ee4f76285d54d3Victor Stinner * and MUST be freed by _Py_FreeCharPArray().
3162fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith */
3163fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithchar *const *
3164fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith_PySequence_BytesToCharpArray(PyObject* self)
3165fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith{
3166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char **array;
3167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t i, argc;
3168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *item = NULL;
31690e2d3cf2cba644f573968737e3ee4f76285d54d3Victor Stinner    Py_ssize_t size;
3170f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
3171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    argc = PySequence_Size(self);
3172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (argc == -1)
3173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
3174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
31757cacd2eb92dad7e63a0249974617de33f4c4a0e0Stefan Krah    assert(argc >= 0);
31767cacd2eb92dad7e63a0249974617de33f4c4a0e0Stefan Krah
31777cacd2eb92dad7e63a0249974617de33f4c4a0e0Stefan Krah    if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
31787cacd2eb92dad7e63a0249974617de33f4c4a0e0Stefan Krah        PyErr_NoMemory();
31797cacd2eb92dad7e63a0249974617de33f4c4a0e0Stefan Krah        return NULL;
31807cacd2eb92dad7e63a0249974617de33f4c4a0e0Stefan Krah    }
31817cacd2eb92dad7e63a0249974617de33f4c4a0e0Stefan Krah
31820e2d3cf2cba644f573968737e3ee4f76285d54d3Victor Stinner    array = PyMem_Malloc((argc + 1) * sizeof(char *));
3183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (array == NULL) {
3184f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_NoMemory();
3185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
3186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
3187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (i = 0; i < argc; ++i) {
3188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        char *data;
3189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        item = PySequence_GetItem(self, i);
3190fd24f9e51e80fb050e4239f6909eaff2d29ec30dStefan Krah        if (item == NULL) {
3191fd24f9e51e80fb050e4239f6909eaff2d29ec30dStefan Krah            /* NULL terminate before freeing. */
3192fd24f9e51e80fb050e4239f6909eaff2d29ec30dStefan Krah            array[i] = NULL;
3193fd24f9e51e80fb050e4239f6909eaff2d29ec30dStefan Krah            goto fail;
3194fd24f9e51e80fb050e4239f6909eaff2d29ec30dStefan Krah        }
3195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        data = PyBytes_AsString(item);
3196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (data == NULL) {
3197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* NULL terminate before freeing. */
3198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            array[i] = NULL;
3199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto fail;
3200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
32010e2d3cf2cba644f573968737e3ee4f76285d54d3Victor Stinner        size = PyBytes_GET_SIZE(item) + 1;
32020e2d3cf2cba644f573968737e3ee4f76285d54d3Victor Stinner        array[i] = PyMem_Malloc(size);
3203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!array[i]) {
3204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_NoMemory();
3205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto fail;
3206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
32070e2d3cf2cba644f573968737e3ee4f76285d54d3Victor Stinner        memcpy(array[i], data, size);
3208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(item);
3209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
3210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    array[argc] = NULL;
3211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
3212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return array;
3213fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
3214fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithfail:
3215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(item);
3216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _Py_FreeCharPArray(array);
3217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
3218fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith}
3219fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
3220fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
3221fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith/* Free's a NULL terminated char** array of C strings. */
3222fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithvoid
3223fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith_Py_FreeCharPArray(char *const array[])
3224fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith{
3225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_ssize_t i;
3226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (i = 0; array[i] != NULL; ++i) {
32270e2d3cf2cba644f573968737e3ee4f76285d54d3Victor Stinner        PyMem_Free(array[i]);
3228f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
32290e2d3cf2cba644f573968737e3ee4f76285d54d3Victor Stinner    PyMem_Free((void*)array);
3230fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith}
3231