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