abstract.c revision fb94c5f1e5bb9ccd28bcd311f388db7bea35c865
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{ 150e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name); 16cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 17e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 18e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 19052b7e1cfb241b6154d38fd10815011e820f7f69Guido van Rossumstatic PyObject * 20799124718ddfbb95440470037d8d7760b821646fFred Drakenull_error(void) 21e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 22cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (!PyErr_Occurred()) 23cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_SetString(PyExc_SystemError, 24cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum "null argument to internal routine"); 25cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 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{ 33e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum PyObject *v; 34e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 35cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 36cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 37e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum v = (PyObject *)o->ob_type; 38e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum Py_INCREF(v); 39e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum return v; 40e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 41e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 4218e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t 436253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyObject_Size(PyObject *o) 44e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 45cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 46e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 47cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) { 48cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 49cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 50cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 51e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 52cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_sequence; 53cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_length) 54cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_length(o); 55e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 566253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy Hylton return PyMapping_Size(o); 57e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 58e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 59cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyObject_Length 6018e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t 61cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyObject_Length(PyObject *o) 62cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{ 63cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg return PyObject_Size(o); 64cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg} 65cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyObject_Length PyObject_Size 66cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg 67255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes 68255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes/* The length hint function returns a non-negative value from o.__len__() 69255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes or o.__length_hint__(). If those methods aren't found or return a negative 70e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger value, then the defaultvalue is returned. If one of the calls fails, 71e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger this function returns -1. 72255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes*/ 73255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes 7418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t 75255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue) 766b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger{ 77255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes static PyObject *hintstrobj = NULL; 78a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson PyObject *ro, *hintmeth; 79255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes Py_ssize_t rv; 80255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes 81255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes /* try o.__len__() */ 82255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes rv = PyObject_Size(o); 83255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes if (rv >= 0) 846b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger return rv; 85e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger if (PyErr_Occurred()) { 86b0ba27dff1442fe6dc7b00ce7d8488afb159d9b8Benjamin Peterson if (!PyErr_ExceptionMatches(PyExc_TypeError)) 87b0ba27dff1442fe6dc7b00ce7d8488afb159d9b8Benjamin Peterson return -1; 88255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes PyErr_Clear(); 89e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger } 90255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes 91255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes /* try o.__length_hint__() */ 92a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj); 9394c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson if (hintmeth == NULL) { 9494c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson if (PyErr_Occurred()) 9594c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson return -1; 9694c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson else 9794c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson return defaultvalue; 9894c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson } 99a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson ro = PyObject_CallFunctionObjArgs(hintmeth, NULL); 100a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson Py_DECREF(hintmeth); 101e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger if (ro == NULL) { 102a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson if (!PyErr_ExceptionMatches(PyExc_TypeError)) 103a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson return -1; 104e18df23d5d76e931f5163872bbdf7943f6ef7c5bBenjamin Peterson PyErr_Clear(); 105e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger return defaultvalue; 106e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger } 1075d65412d35231ffab837478f575fcd326bbcac80Raymond Hettinger rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue; 108255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes Py_DECREF(ro); 109e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger return rv; 1106b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger} 1116b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger 112e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 113799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_GetItem(PyObject *o, PyObject *key) 114e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 115cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyMappingMethods *m; 116e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 117cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL || key == NULL) 118cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 119e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 120cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_mapping; 121cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->mp_subscript) 122cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->mp_subscript(o, key); 123e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 12421308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum if (o->ob_type->tp_as_sequence) { 12500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters if (PyIndex_Check(key)) { 12600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters Py_ssize_t key_value; 12700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); 1280f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling if (key_value == -1 && PyErr_Occurred()) 1290f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return NULL; 1300f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return PySequence_GetItem(o, key_value); 1310f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling } 13264585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum else if (o->ob_type->tp_as_sequence->sq_item) 1330e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("sequence index must " 1340e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters "be integer, not '%.200s'", key); 13521308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum } 136cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1370192bffe9002e5878fcbeb1604739286ee0d138fGeorg Brandl return type_error("'%.200s' object is not subscriptable", o); 138e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 139e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 140e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint 141799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_SetItem(PyObject *o, PyObject *key, PyObject *value) 142e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 143cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyMappingMethods *m; 144e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 145cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL || key == NULL || value == NULL) { 146cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 147cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 148cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 149cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_mapping; 150cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->mp_ass_subscript) 151cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->mp_ass_subscript(o, key, value); 152cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 15321308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum if (o->ob_type->tp_as_sequence) { 15400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters if (PyIndex_Check(key)) { 15500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters Py_ssize_t key_value; 15600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); 1570f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling if (key_value == -1 && PyErr_Occurred()) 1580f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return -1; 1590f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return PySequence_SetItem(o, key_value, value); 1600f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling } 16164585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum else if (o->ob_type->tp_as_sequence->sq_ass_item) { 1620e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("sequence index must be " 1630e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters "integer, not '%.200s'", key); 16464585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum return -1; 16564585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum } 16621308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum } 167e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1680e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("'%.200s' object does not support item assignment", o); 169cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 170e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 171e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1726cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint 173799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_DelItem(PyObject *o, PyObject *key) 1746cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{ 175cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyMappingMethods *m; 176cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 177cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL || key == NULL) { 178cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 179cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 180cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 181cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_mapping; 182cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->mp_ass_subscript) 183cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->mp_ass_subscript(o, key, (PyObject*)NULL); 1846cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 18521308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum if (o->ob_type->tp_as_sequence) { 18600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters if (PyIndex_Check(key)) { 18700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters Py_ssize_t key_value; 18800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); 1890f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling if (key_value == -1 && PyErr_Occurred()) 1900f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return -1; 1910f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return PySequence_DelItem(o, key_value); 1920f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling } 19364585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum else if (o->ob_type->tp_as_sequence->sq_ass_item) { 1940e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("sequence index must be " 1950e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters "integer, not '%.200s'", key); 19664585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum return -1; 19764585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum } 19821308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum } 1996cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 2000e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("'%.200s' object does not support item deletion", o); 201cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 2026cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum} 2036cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 204b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwisint 205b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. LöwisPyObject_DelItemString(PyObject *o, char *key) 206b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis{ 207b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis PyObject *okey; 208b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis int ret; 209b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis 210b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis if (o == NULL || key == NULL) { 211b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis null_error(); 212b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis return -1; 213b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis } 2145b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis okey = PyUnicode_FromString(key); 215b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis if (okey == NULL) 216b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis return -1; 217b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis ret = PyObject_DelItem(o, okey); 218b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis Py_DECREF(okey); 219b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis return ret; 220b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis} 221b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis 222b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant/* We release the buffer right after use of this function which could 22398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum cause issues later on. Don't use these functions in new code. 224b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant */ 22573e5a5b65d66f4fba9c4f626bcd6400f4a7215e6Thomas Woutersint 22673e5a5b65d66f4fba9c4f626bcd6400f4a7215e6Thomas WoutersPyObject_AsCharBuffer(PyObject *obj, 227fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant const char **buffer, 228fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_ssize_t *buffer_len) 2294c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{ 2304c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyBufferProcs *pb; 231fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_buffer view; 2324c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2334c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (obj == NULL || buffer == NULL || buffer_len == NULL) { 2344c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum null_error(); 2354c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return -1; 2364c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 2374c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb = obj->ob_type->tp_as_buffer; 238b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant if (pb == NULL || pb->bf_getbuffer == NULL) { 2394c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyErr_SetString(PyExc_TypeError, 240b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant "expected an object with the buffer interface"); 24189c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton return -1; 242fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 243ddacf968682818a34a90ec6702fbb44098914a9dTravis E. Oliphant if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1; 244b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 245b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant *buffer = view.buf; 246b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant *buffer_len = view.len; 247fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (pb->bf_releasebuffer != NULL) 248fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant (*pb->bf_releasebuffer)(obj, &view); 2499edd2bd35cfc5f33b53c5def02cac23e7bb6e84bBenjamin Peterson Py_XDECREF(view.obj); 2504c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return 0; 25189c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton} 2524c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 25389c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hyltonint 25489c3a22a2788cb85b89990543e33236cd60ba307Jeremy HyltonPyObject_CheckReadBuffer(PyObject *obj) 25589c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton{ 25698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum PyBufferProcs *pb = obj->ob_type->tp_as_buffer; 25760320cb3e4fa0d77ae5f8634d83de497bba003f6Benjamin Peterson Py_buffer view; 25889c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton 25989c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton if (pb == NULL || 260b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant pb->bf_getbuffer == NULL) 261fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 26260320cb3e4fa0d77ae5f8634d83de497bba003f6Benjamin Peterson if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) { 263fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyErr_Clear(); 264fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 265fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 26660320cb3e4fa0d77ae5f8634d83de497bba003f6Benjamin Peterson PyBuffer_Release(&view); 26789c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton return 1; 2684c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum} 2694c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2704c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsReadBuffer(PyObject *obj, 2714c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum const void **buffer, 27218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis Py_ssize_t *buffer_len) 2734c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{ 2744c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyBufferProcs *pb; 275fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_buffer view; 2764c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2774c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (obj == NULL || buffer == NULL || buffer_len == NULL) { 2784c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum null_error(); 2794c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return -1; 2804c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 2814c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb = obj->ob_type->tp_as_buffer; 28289c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton if (pb == NULL || 283fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant pb->bf_getbuffer == NULL) { 2844c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyErr_SetString(PyExc_TypeError, 285b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant "expected an object with a buffer interface"); 28689c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton return -1; 2874c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 288b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 289fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1; 290b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 291b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant *buffer = view.buf; 292b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant *buffer_len = view.len; 293fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (pb->bf_releasebuffer != NULL) 294fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant (*pb->bf_releasebuffer)(obj, &view); 2959edd2bd35cfc5f33b53c5def02cac23e7bb6e84bBenjamin Peterson Py_XDECREF(view.obj); 2964c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return 0; 2974c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum} 2984c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2994c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsWriteBuffer(PyObject *obj, 3004c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum void **buffer, 30118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis Py_ssize_t *buffer_len) 3024c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{ 3034c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyBufferProcs *pb; 304fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_buffer view; 3054c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 3064c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (obj == NULL || buffer == NULL || buffer_len == NULL) { 3074c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum null_error(); 3084c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return -1; 3094c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 3104c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb = obj->ob_type->tp_as_buffer; 31189c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton if (pb == NULL || 312fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant pb->bf_getbuffer == NULL || 313fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) { 31498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum PyErr_SetString(PyExc_TypeError, 315fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant "expected an object with a writable buffer interface"); 31689c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton return -1; 3174c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 318b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 319b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant *buffer = view.buf; 320b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant *buffer_len = view.len; 321fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (pb->bf_releasebuffer != NULL) 322fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant (*pb->bf_releasebuffer)(obj, &view); 3239edd2bd35cfc5f33b53c5def02cac23e7bb6e84bBenjamin Peterson Py_XDECREF(view.obj); 3244c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return 0; 3254c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum} 3264c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 327b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant/* Buffer C-API for Python 3.0 */ 328b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 329b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint 3308ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) 331b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 332fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (!PyObject_CheckBuffer(obj)) { 33398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum PyErr_Format(PyExc_TypeError, 33461b96dc2fe814595651b6e1af394b34cb41fb485Georg Brandl "'%100s' does not support the buffer interface", 33590aa7646affbaee9628ca6ea6a702aec17b3b550Christian Heimes Py_TYPE(obj)->tp_name); 336fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return -1; 337fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 338fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags); 339b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 340b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 341b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantstatic int 3428ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. Oliphant_IsFortranContiguous(Py_buffer *view) 343b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 344fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_ssize_t sd, dim; 345fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int i; 34698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 347fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view->ndim == 0) return 1; 348fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view->strides == NULL) return (view->ndim == 1); 349fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant 350fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sd = view->itemsize; 351fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view->ndim == 1) return (view->shape[0] == 1 || 352fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sd == view->strides[0]); 353fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (i=0; i<view->ndim; i++) { 354fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant dim = view->shape[i]; 355fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (dim == 0) return 1; 356fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view->strides[i] != sd) return 0; 357fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sd *= dim; 358fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 359fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 1; 360b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 361b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 362b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantstatic int 3638ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. Oliphant_IsCContiguous(Py_buffer *view) 364b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 365fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_ssize_t sd, dim; 366fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int i; 36798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 368fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view->ndim == 0) return 1; 369fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view->strides == NULL) return 1; 370b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 371fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sd = view->itemsize; 372fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view->ndim == 1) return (view->shape[0] == 1 || 373fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sd == view->strides[0]); 374fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (i=view->ndim-1; i>=0; i--) { 375fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant dim = view->shape[i]; 376fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (dim == 0) return 1; 377fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view->strides[i] != sd) return 0; 378fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sd *= dim; 379fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 38098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum return 1; 381b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 382b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 383b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint 3848ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_IsContiguous(Py_buffer *view, char fort) 385b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 386b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 387fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view->suboffsets != NULL) return 0; 388b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 389fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (fort == 'C') 390fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return _IsCContiguous(view); 39198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum else if (fort == 'F') 392fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return _IsFortranContiguous(view); 393fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant else if (fort == 'A') 394fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return (_IsCContiguous(view) || _IsFortranContiguous(view)); 395fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 396b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 397b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 398b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 39998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumvoid* 4008ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices) 401b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 402fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant char* pointer; 403fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int i; 404fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant pointer = (char *)view->buf; 405fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (i = 0; i < view->ndim; i++) { 406fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant pointer += view->strides[i]*indices[i]; 407fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) { 408fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant pointer = *((char**)pointer) + view->suboffsets[i]; 409fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 410fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 411fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return (void*)pointer; 412b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 413b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 414b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 41598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumvoid 416b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape) 417b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 418fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int k; 41998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 420fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (k=0; k<nd; k++) { 421fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (index[k] < shape[k]-1) { 422fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant index[k]++; 423fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant break; 424fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 425fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant else { 426fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant index[k] = 0; 427fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 428fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 429b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 430b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 43198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumvoid 432b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape) 433b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 434fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int k; 435b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 436fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (k=nd-1; k>=0; k--) { 437fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (index[k] < shape[k]-1) { 438fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant index[k]++; 439fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant break; 440fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 441fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant else { 442fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant index[k] = 0; 443fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 444fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 445b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 446b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 447b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant /* view is not checked for consistency in either of these. It is 44898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum assumed that the size of the buffer is view->len in 449b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant view->len / view->itemsize elements. 450b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant */ 451b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 45298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumint 4538ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort) 454b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 455fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int k; 456fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant void (*addone)(int, Py_ssize_t *, Py_ssize_t *); 457fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_ssize_t *indices, elements; 458fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant char *dest, *ptr; 459fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant 460fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (len > view->len) { 461fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant len = view->len; 462fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 46398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 464fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (PyBuffer_IsContiguous(view, fort)) { 465fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant /* simplest copy is all that is needed */ 466fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant memcpy(buf, view->buf, len); 467fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 468fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 469fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant 470fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant /* Otherwise a more elaborate scheme is needed */ 47198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 472faa54a392951468090f0095ffa927b16fcb20ca4Neal Norwitz /* XXX(nnorwitz): need to check for overflow! */ 473fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim)); 474fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (indices == NULL) { 475fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyErr_NoMemory(); 476fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return -1; 477fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 478fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (k=0; k<view->ndim;k++) { 479fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant indices[k] = 0; 480fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 48198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 482fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (fort == 'F') { 483fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant addone = _add_one_to_index_F; 484fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 485fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant else { 486fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant addone = _add_one_to_index_C; 487fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 488fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant dest = buf; 489fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant /* XXX : This is not going to be the fastest code in the world 49098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum several optimizations are possible. 491fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant */ 492fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant elements = len / view->itemsize; 493fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant while (elements--) { 494fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant addone(view->ndim, indices, view->shape); 495fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant ptr = PyBuffer_GetPointer(view, indices); 496fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant memcpy(dest, ptr, view->itemsize); 497fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant dest += view->itemsize; 49898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum } 499fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyMem_Free(indices); 500fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 501b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 502b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 503b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint 5048ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort) 505b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 506fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int k; 507fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant void (*addone)(int, Py_ssize_t *, Py_ssize_t *); 508fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_ssize_t *indices, elements; 509fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant char *src, *ptr; 510b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 511fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (len > view->len) { 512fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant len = view->len; 513fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 514b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 515fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (PyBuffer_IsContiguous(view, fort)) { 516fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant /* simplest copy is all that is needed */ 517fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant memcpy(view->buf, buf, len); 518fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 519fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 520b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 521fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant /* Otherwise a more elaborate scheme is needed */ 52298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 523faa54a392951468090f0095ffa927b16fcb20ca4Neal Norwitz /* XXX(nnorwitz): need to check for overflow! */ 524fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim)); 525fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (indices == NULL) { 526fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyErr_NoMemory(); 527fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return -1; 528fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 529fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (k=0; k<view->ndim;k++) { 530fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant indices[k] = 0; 531fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 53298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 533fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (fort == 'F') { 534fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant addone = _add_one_to_index_F; 535fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 536fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant else { 537fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant addone = _add_one_to_index_C; 538fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 539fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant src = buf; 540fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant /* XXX : This is not going to be the fastest code in the world 54198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum several optimizations are possible. 542fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant */ 543fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant elements = len / view->itemsize; 544fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant while (elements--) { 545fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant addone(view->ndim, indices, view->shape); 546fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant ptr = PyBuffer_GetPointer(view, indices); 547fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant memcpy(ptr, src, view->itemsize); 548fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant src += view->itemsize; 549fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 55098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 551fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyMem_Free(indices); 552fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 553b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 554b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 55598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumint PyObject_CopyData(PyObject *dest, PyObject *src) 556b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{ 557fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_buffer view_dest, view_src; 558fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int k; 559fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_ssize_t *indices, elements; 560fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant char *dptr, *sptr; 561fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant 562fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (!PyObject_CheckBuffer(dest) || 563fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant !PyObject_CheckBuffer(src)) { 564fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyErr_SetString(PyExc_TypeError, 565fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant "both destination and source must have the "\ 566fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant "buffer interface"); 567fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return -1; 568fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 569fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant 570fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1; 571fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) { 572423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyBuffer_Release(&view_dest); 573fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return -1; 574fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 575fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant 576fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view_dest.len < view_src.len) { 57798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum PyErr_SetString(PyExc_BufferError, 578fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant "destination is too small to receive data from source"); 579423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyBuffer_Release(&view_dest); 580423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyBuffer_Release(&view_src); 581fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return -1; 582fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 583fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant 58498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum if ((PyBuffer_IsContiguous(&view_dest, 'C') && 585fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyBuffer_IsContiguous(&view_src, 'C')) || 58698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum (PyBuffer_IsContiguous(&view_dest, 'F') && 587fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyBuffer_IsContiguous(&view_src, 'F'))) { 588fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant /* simplest copy is all that is needed */ 589fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant memcpy(view_dest.buf, view_src.buf, view_src.len); 590423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyBuffer_Release(&view_dest); 591423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyBuffer_Release(&view_src); 592fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 593fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 594fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant 595fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant /* Otherwise a more elaborate copy scheme is needed */ 59698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 597faa54a392951468090f0095ffa927b16fcb20ca4Neal Norwitz /* XXX(nnorwitz): need to check for overflow! */ 598fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim); 599fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (indices == NULL) { 600fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyErr_NoMemory(); 601423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyBuffer_Release(&view_dest); 602423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyBuffer_Release(&view_src); 603fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return -1; 604fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 605fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (k=0; k<view_src.ndim;k++) { 606fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant indices[k] = 0; 60798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum } 608fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant elements = 1; 609fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (k=0; k<view_src.ndim; k++) { 610faa54a392951468090f0095ffa927b16fcb20ca4Neal Norwitz /* XXX(nnorwitz): can this overflow? */ 611fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant elements *= view_src.shape[k]; 612fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 613fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant while (elements--) { 614fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant _add_one_to_index_C(view_src.ndim, indices, view_src.shape); 615fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant dptr = PyBuffer_GetPointer(&view_dest, indices); 616fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sptr = PyBuffer_GetPointer(&view_src, indices); 617fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant memcpy(dptr, sptr, view_src.itemsize); 61898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum } 619fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyMem_Free(indices); 620423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyBuffer_Release(&view_dest); 621423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyBuffer_Release(&view_src); 622fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 623b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 624b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 625b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantvoid 626b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. OliphantPyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape, 627fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_ssize_t *strides, int itemsize, 628fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant char fort) 629fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant{ 630fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int k; 631fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_ssize_t sd; 63298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 633fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sd = itemsize; 634fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (fort == 'F') { 635fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (k=0; k<nd; k++) { 636fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant strides[k] = sd; 637fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sd *= shape[k]; 63898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum } 639fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 640fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant else { 641fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant for (k=nd-1; k>=0; k--) { 642fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant strides[k] = sd; 643fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant sd *= shape[k]; 644fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 645fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 646fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return; 647b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 648b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 649b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint 650423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. LöwisPyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len, 651fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant int readonly, int flags) 65298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum{ 653fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (view == NULL) return 0; 654fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) && 655fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant (readonly == 1)) { 656fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyErr_SetString(PyExc_BufferError, 657fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant "Object is not writable."); 658fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return -1; 659fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant } 66098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 661423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis view->obj = obj; 66274bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis if (obj) 66374bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis Py_INCREF(obj); 664fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->buf = buf; 665fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->len = len; 666fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->readonly = readonly; 667fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->itemsize = 1; 668fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->format = NULL; 66998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) 670fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->format = "B"; 671fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->ndim = 1; 672fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->shape = NULL; 673fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if ((flags & PyBUF_ND) == PyBUF_ND) 674fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->shape = &(view->len); 675fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->strides = NULL; 676fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES) 677fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->strides = &(view->itemsize); 678fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->suboffsets = NULL; 679fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant view->internal = NULL; 680fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return 0; 681b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant} 682b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant 683423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwisvoid 684423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. LöwisPyBuffer_Release(Py_buffer *view) 685423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis{ 686423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis PyObject *obj = view->obj; 68774bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer) 68874bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view); 68974bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis Py_XDECREF(obj); 69074bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis view->obj = NULL; 691423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis} 692423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis 6938fd3eba0501a77eec463179f529f56025ff4b40bEric SmithPyObject * 6948fd3eba0501a77eec463179f529f56025ff4b40bEric SmithPyObject_Format(PyObject *obj, PyObject *format_spec) 6958fd3eba0501a77eec463179f529f56025ff4b40bEric Smith{ 6968fd3eba0501a77eec463179f529f56025ff4b40bEric Smith static PyObject * str__format__ = NULL; 6978fd3eba0501a77eec463179f529f56025ff4b40bEric Smith PyObject *meth; 6988fd3eba0501a77eec463179f529f56025ff4b40bEric Smith PyObject *empty = NULL; 6998fd3eba0501a77eec463179f529f56025ff4b40bEric Smith PyObject *result = NULL; 7008fd3eba0501a77eec463179f529f56025ff4b40bEric Smith 7018fd3eba0501a77eec463179f529f56025ff4b40bEric Smith /* Initialize cached value */ 7028fd3eba0501a77eec463179f529f56025ff4b40bEric Smith if (str__format__ == NULL) { 7038fd3eba0501a77eec463179f529f56025ff4b40bEric Smith /* Initialize static variable needed by _PyType_Lookup */ 7048fd3eba0501a77eec463179f529f56025ff4b40bEric Smith str__format__ = PyUnicode_FromString("__format__"); 7058fd3eba0501a77eec463179f529f56025ff4b40bEric Smith if (str__format__ == NULL) 7068fd3eba0501a77eec463179f529f56025ff4b40bEric Smith goto done; 7078fd3eba0501a77eec463179f529f56025ff4b40bEric Smith } 7088fd3eba0501a77eec463179f529f56025ff4b40bEric Smith 7098fd3eba0501a77eec463179f529f56025ff4b40bEric Smith /* If no format_spec is provided, use an empty string */ 7108fd3eba0501a77eec463179f529f56025ff4b40bEric Smith if (format_spec == NULL) { 7118fd3eba0501a77eec463179f529f56025ff4b40bEric Smith empty = PyUnicode_FromUnicode(NULL, 0); 7128fd3eba0501a77eec463179f529f56025ff4b40bEric Smith format_spec = empty; 7138fd3eba0501a77eec463179f529f56025ff4b40bEric Smith } 7148fd3eba0501a77eec463179f529f56025ff4b40bEric Smith 7158fd3eba0501a77eec463179f529f56025ff4b40bEric Smith /* Make sure the type is initialized. float gets initialized late */ 7168fd3eba0501a77eec463179f529f56025ff4b40bEric Smith if (Py_TYPE(obj)->tp_dict == NULL) 7178fd3eba0501a77eec463179f529f56025ff4b40bEric Smith if (PyType_Ready(Py_TYPE(obj)) < 0) 7188fd3eba0501a77eec463179f529f56025ff4b40bEric Smith goto done; 7198fd3eba0501a77eec463179f529f56025ff4b40bEric Smith 7208fd3eba0501a77eec463179f529f56025ff4b40bEric Smith /* Find the (unbound!) __format__ method (a borrowed reference) */ 7218fd3eba0501a77eec463179f529f56025ff4b40bEric Smith meth = _PyType_Lookup(Py_TYPE(obj), str__format__); 7228fd3eba0501a77eec463179f529f56025ff4b40bEric Smith if (meth == NULL) { 7238fd3eba0501a77eec463179f529f56025ff4b40bEric Smith PyErr_Format(PyExc_TypeError, 7248fd3eba0501a77eec463179f529f56025ff4b40bEric Smith "Type %.100s doesn't define __format__", 7258fd3eba0501a77eec463179f529f56025ff4b40bEric Smith Py_TYPE(obj)->tp_name); 7268fd3eba0501a77eec463179f529f56025ff4b40bEric Smith goto done; 7278fd3eba0501a77eec463179f529f56025ff4b40bEric Smith } 7288fd3eba0501a77eec463179f529f56025ff4b40bEric Smith 7298fd3eba0501a77eec463179f529f56025ff4b40bEric Smith /* And call it, binding it to the value */ 7308fd3eba0501a77eec463179f529f56025ff4b40bEric Smith result = PyObject_CallFunctionObjArgs(meth, obj, format_spec, NULL); 7318fd3eba0501a77eec463179f529f56025ff4b40bEric Smith 7328fd3eba0501a77eec463179f529f56025ff4b40bEric Smith if (result && !PyUnicode_Check(result)) { 7338fd3eba0501a77eec463179f529f56025ff4b40bEric Smith PyErr_SetString(PyExc_TypeError, 7348fd3eba0501a77eec463179f529f56025ff4b40bEric Smith "__format__ method did not return string"); 7358fd3eba0501a77eec463179f529f56025ff4b40bEric Smith Py_DECREF(result); 7368fd3eba0501a77eec463179f529f56025ff4b40bEric Smith result = NULL; 7378fd3eba0501a77eec463179f529f56025ff4b40bEric Smith goto done; 7388fd3eba0501a77eec463179f529f56025ff4b40bEric Smith } 7398fd3eba0501a77eec463179f529f56025ff4b40bEric Smith 7408fd3eba0501a77eec463179f529f56025ff4b40bEric Smithdone: 7418fd3eba0501a77eec463179f529f56025ff4b40bEric Smith Py_XDECREF(empty); 7428fd3eba0501a77eec463179f529f56025ff4b40bEric Smith return result; 7438fd3eba0501a77eec463179f529f56025ff4b40bEric Smith} 744cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on numbers */ 745cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 746cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 747799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Check(PyObject *o) 748e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 7496921eca227ac2283ebcdf98e10aebea57bd5daf3Guido van Rossum return o && o->ob_type->tp_as_number && 7506921eca227ac2283ebcdf98e10aebea57bd5daf3Guido van Rossum (o->ob_type->tp_as_number->nb_int || 7516921eca227ac2283ebcdf98e10aebea57bd5daf3Guido van Rossum o->ob_type->tp_as_number->nb_float); 752e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 753e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 754cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Binary operators */ 755e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 7565a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_SLOT(x) offsetof(PyNumberMethods, x) 7575a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_BINOP(nb_methods, slot) \ 758b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer (*(binaryfunc*)(& ((char*)nb_methods)[slot])) 7595a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_TERNOP(nb_methods, slot) \ 760b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer (*(ternaryfunc*)(& ((char*)nb_methods)[slot])) 761e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 7625a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/* 7635a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Calling scheme used for binary operations: 764e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 7654886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz Order operations are tried until either a valid result or error: 7664886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz w.op(v,w)[*], v.op(v,w), w.op(v,w) 767e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 7684bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of 7694bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum v->ob_type 7705a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */ 7715a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 7725a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject * 7735a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op1(PyObject *v, PyObject *w, const int op_slot) 7745a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{ 7755a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *x; 7764bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum binaryfunc slotv = NULL; 7774bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum binaryfunc slotw = NULL; 7784bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum 7793cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum if (v->ob_type->tp_as_number != NULL) 780b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot); 7814bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum if (w->ob_type != v->ob_type && 7823cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum w->ob_type->tp_as_number != NULL) { 783b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot); 7844bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum if (slotw == slotv) 7854bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum slotw = NULL; 7865a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 7874bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum if (slotv) { 78889c4264792da06293b197e14f581763f46138935Guido van Rossum if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { 78989c4264792da06293b197e14f581763f46138935Guido van Rossum x = slotw(v, w); 79089c4264792da06293b197e14f581763f46138935Guido van Rossum if (x != Py_NotImplemented) 79189c4264792da06293b197e14f581763f46138935Guido van Rossum return x; 79289c4264792da06293b197e14f581763f46138935Guido van Rossum Py_DECREF(x); /* can't do it */ 79389c4264792da06293b197e14f581763f46138935Guido van Rossum slotw = NULL; 79489c4264792da06293b197e14f581763f46138935Guido van Rossum } 7954bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum x = slotv(v, w); 7964bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum if (x != Py_NotImplemented) 7974bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum return x; 7984bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum Py_DECREF(x); /* can't do it */ 7994bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum } 8004bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum if (slotw) { 8014bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum x = slotw(v, w); 8024bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum if (x != Py_NotImplemented) 8034bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum return x; 8044bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum Py_DECREF(x); /* can't do it */ 8055a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 8065a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_INCREF(Py_NotImplemented); 8075a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return Py_NotImplemented; 808e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 8097766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum 8105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject * 811d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinop_type_error(PyObject *v, PyObject *w, const char *op_name) 812d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{ 813d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PyErr_Format(PyExc_TypeError, 8140e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters "unsupported operand type(s) for %.100s: " 8150e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters "'%.100s' and '%.100s'", 816d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer op_name, 817d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer v->ob_type->tp_name, 818d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer w->ob_type->tp_name); 819d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return NULL; 820d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer} 821d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer 822d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject * 8235a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) 824e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 8255a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *result = binary_op1(v, w, op_slot); 8265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (result == Py_NotImplemented) { 827d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer Py_DECREF(result); 828d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return binop_type_error(v, w, op_name); 829e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 8305a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return result; 831e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 832e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 833cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 8345a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/* 8355a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Calling scheme used for ternary operations: 836e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 8374886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz Order operations are tried until either a valid result or error: 8384886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz v.op(v,w,z), w.op(v,w,z), z.op(v,w,z) 8395a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */ 840cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 8415a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject * 8425a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerternary_op(PyObject *v, 8435a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *w, 8445a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *z, 8455a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer const int op_slot, 8465a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer const char *op_name) 8475a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{ 8485a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyNumberMethods *mv, *mw, *mz; 84984675acb49071977741a97d56c21967fbc520948Guido van Rossum PyObject *x = NULL; 85084675acb49071977741a97d56c21967fbc520948Guido van Rossum ternaryfunc slotv = NULL; 85184675acb49071977741a97d56c21967fbc520948Guido van Rossum ternaryfunc slotw = NULL; 85284675acb49071977741a97d56c21967fbc520948Guido van Rossum ternaryfunc slotz = NULL; 8537766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum 8545a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer mv = v->ob_type->tp_as_number; 8554bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum mw = w->ob_type->tp_as_number; 8563cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum if (mv != NULL) 857b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer slotv = NB_TERNOP(mv, op_slot); 85884675acb49071977741a97d56c21967fbc520948Guido van Rossum if (w->ob_type != v->ob_type && 8593cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum mw != NULL) { 860b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer slotw = NB_TERNOP(mw, op_slot); 86184675acb49071977741a97d56c21967fbc520948Guido van Rossum if (slotw == slotv) 86284675acb49071977741a97d56c21967fbc520948Guido van Rossum slotw = NULL; 8634bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum } 86484675acb49071977741a97d56c21967fbc520948Guido van Rossum if (slotv) { 86589c4264792da06293b197e14f581763f46138935Guido van Rossum if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { 86689c4264792da06293b197e14f581763f46138935Guido van Rossum x = slotw(v, w, z); 86789c4264792da06293b197e14f581763f46138935Guido van Rossum if (x != Py_NotImplemented) 86889c4264792da06293b197e14f581763f46138935Guido van Rossum return x; 86989c4264792da06293b197e14f581763f46138935Guido van Rossum Py_DECREF(x); /* can't do it */ 87089c4264792da06293b197e14f581763f46138935Guido van Rossum slotw = NULL; 87189c4264792da06293b197e14f581763f46138935Guido van Rossum } 87284675acb49071977741a97d56c21967fbc520948Guido van Rossum x = slotv(v, w, z); 87384675acb49071977741a97d56c21967fbc520948Guido van Rossum if (x != Py_NotImplemented) 87484675acb49071977741a97d56c21967fbc520948Guido van Rossum return x; 87584675acb49071977741a97d56c21967fbc520948Guido van Rossum Py_DECREF(x); /* can't do it */ 87684675acb49071977741a97d56c21967fbc520948Guido van Rossum } 87784675acb49071977741a97d56c21967fbc520948Guido van Rossum if (slotw) { 87884675acb49071977741a97d56c21967fbc520948Guido van Rossum x = slotw(v, w, z); 87984675acb49071977741a97d56c21967fbc520948Guido van Rossum if (x != Py_NotImplemented) 88084675acb49071977741a97d56c21967fbc520948Guido van Rossum return x; 88184675acb49071977741a97d56c21967fbc520948Guido van Rossum Py_DECREF(x); /* can't do it */ 882e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 8835a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer mz = z->ob_type->tp_as_number; 8843cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum if (mz != NULL) { 885b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer slotz = NB_TERNOP(mz, op_slot); 88684675acb49071977741a97d56c21967fbc520948Guido van Rossum if (slotz == slotv || slotz == slotw) 88784675acb49071977741a97d56c21967fbc520948Guido van Rossum slotz = NULL; 88884675acb49071977741a97d56c21967fbc520948Guido van Rossum if (slotz) { 88984675acb49071977741a97d56c21967fbc520948Guido van Rossum x = slotz(v, w, z); 8905a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (x != Py_NotImplemented) 8915a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 89284675acb49071977741a97d56c21967fbc520948Guido van Rossum Py_DECREF(x); /* can't do it */ 8931991ddc3e134e89e6c15d60e180fc67ad4c1ca01Andrew M. Kuchling } 8945a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 8955a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 8965c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum if (z == Py_None) 8975c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum PyErr_Format( 8985c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum PyExc_TypeError, 8995c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum "unsupported operand type(s) for ** or pow(): " 9000e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters "'%.100s' and '%.100s'", 9015c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum v->ob_type->tp_name, 9025c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum w->ob_type->tp_name); 9035c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum else 9045c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum PyErr_Format( 9055c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum PyExc_TypeError, 9065c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum "unsupported operand type(s) for pow(): " 9070e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters "'%.100s', '%.100s', '%.100s'", 9085c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum v->ob_type->tp_name, 9095c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum w->ob_type->tp_name, 9105c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum z->ob_type->tp_name); 9115a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return NULL; 912e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 913e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 9145a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define BINARY_FUNC(func, op, op_name) \ 9155a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject * \ 9165a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer func(PyObject *v, PyObject *w) { \ 9175a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_op(v, w, NB_SLOT(op), op_name); \ 9185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 9195a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 9205a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Or, nb_or, "|") 9215a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Xor, nb_xor, "^") 9225a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_And, nb_and, "&") 9235a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<") 9245a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>") 9255a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Subtract, nb_subtract, "-") 9265a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()") 9275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 928e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 9295a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerPyNumber_Add(PyObject *v, PyObject *w) 930e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 9315a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *result = binary_op1(v, w, NB_SLOT(nb_add)); 9325a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (result == Py_NotImplemented) { 9335a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PySequenceMethods *m = v->ob_type->tp_as_sequence; 934fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo Py_DECREF(result); 9350522d9891aec9b7d49049a8a47b687c81929e02dJeremy Hylton if (m && m->sq_concat) { 936fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo return (*m->sq_concat)(v, w); 9370522d9891aec9b7d49049a8a47b687c81929e02dJeremy Hylton } 938fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo result = binop_type_error(v, w, "+"); 939e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 9405a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return result; 941e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 942e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 943d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject * 94418e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwissequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n) 945d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{ 94638fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum Py_ssize_t count; 94700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters if (PyIndex_Check(n)) { 94800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters count = PyNumber_AsSsize_t(n, PyExc_OverflowError); 949d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (count == -1 && PyErr_Occurred()) 950d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return NULL; 951d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer } 952d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer else { 9530e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("can't multiply sequence by " 9540e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters "non-int of type '%.200s'", n); 955d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer } 95638fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum return (*repeatfunc)(seq, count); 957d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer} 958d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer 959d4b0fea43a8655d15562fa42d56def93fe2348efNeil SchemenauerPyObject * 960d4b0fea43a8655d15562fa42d56def93fe2348efNeil SchemenauerPyNumber_Multiply(PyObject *v, PyObject *w) 961d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{ 962d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply)); 963d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (result == Py_NotImplemented) { 964d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PySequenceMethods *mv = v->ob_type->tp_as_sequence; 965d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PySequenceMethods *mw = w->ob_type->tp_as_sequence; 966a3a243e9779b671efe59d407ca77edff01a32a57Guido van Rossum Py_DECREF(result); 967d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (mv && mv->sq_repeat) { 968d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return sequence_repeat(mv->sq_repeat, v, w); 969d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer } 970d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer else if (mw && mw->sq_repeat) { 971d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return sequence_repeat(mw->sq_repeat, w, v); 972d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer } 973d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer result = binop_type_error(v, w, "*"); 974d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer } 975d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return result; 976d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer} 977d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer 978e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 9794668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_FloorDivide(PyObject *v, PyObject *w) 9804668b000a1d9113394941ad39875c827634feb49Guido van Rossum{ 9814668b000a1d9113394941ad39875c827634feb49Guido van Rossum return binary_op(v, w, NB_SLOT(nb_floor_divide), "//"); 9824668b000a1d9113394941ad39875c827634feb49Guido van Rossum} 9834668b000a1d9113394941ad39875c827634feb49Guido van Rossum 9844668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject * 9854668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_TrueDivide(PyObject *v, PyObject *w) 9864668b000a1d9113394941ad39875c827634feb49Guido van Rossum{ 9874668b000a1d9113394941ad39875c827634feb49Guido van Rossum return binary_op(v, w, NB_SLOT(nb_true_divide), "/"); 9884668b000a1d9113394941ad39875c827634feb49Guido van Rossum} 9894668b000a1d9113394941ad39875c827634feb49Guido van Rossum 9904668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject * 991799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Remainder(PyObject *v, PyObject *w) 992e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 9935a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_op(v, w, NB_SLOT(nb_remainder), "%"); 994e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 995e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 996e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 997799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Power(PyObject *v, PyObject *w, PyObject *z) 998e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 9995a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()"); 1000e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1001e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1002e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* Binary in-place operators */ 1003e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1004e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* The in-place operators are defined to fall back to the 'normal', 10055a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer non in-place operations, if the in-place methods are not in place. 1006e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 10075a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer - If the left hand object has the appropriate struct members, and 10085a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer they are filled, call the appropriate function and return the 10095a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer result. No coercion is done on the arguments; the left-hand object 10105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer is the one the operation is performed on, and it's up to the 10115a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer function to deal with the right-hand object. 10127766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum 10135a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer - Otherwise, in-place modification is not supported. Handle it exactly as 10145a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer a non in-place operation of the same kind. 1015e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1016e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters */ 1017e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 10185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject * 1019d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot) 10205a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{ 10215a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyNumberMethods *mv = v->ob_type->tp_as_number; 10223cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum if (mv != NULL) { 1023b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer binaryfunc slot = NB_BINOP(mv, iop_slot); 1024b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer if (slot) { 1025b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer PyObject *x = (slot)(v, w); 10265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (x != Py_NotImplemented) { 10275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 10285a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 10295a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(x); 10305a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 1031e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 1032d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return binary_op1(v, w, op_slot); 1033d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer} 1034d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer 1035d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject * 1036d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot, 1037d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer const char *op_name) 1038d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{ 1039d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PyObject *result = binary_iop1(v, w, iop_slot, op_slot); 1040d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (result == Py_NotImplemented) { 1041d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer Py_DECREF(result); 1042d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return binop_type_error(v, w, op_name); 1043d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer } 1044d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return result; 1045e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 1046e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 10475a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define INPLACE_BINOP(func, iop, op, op_name) \ 10485a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject * \ 10495a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer func(PyObject *v, PyObject *w) { \ 10505a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \ 1051e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 1052e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 10535a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=") 10545a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=") 10555a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=") 10565a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=") 10575a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=") 10585a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=") 1059e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1060e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 10614668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w) 10624668b000a1d9113394941ad39875c827634feb49Guido van Rossum{ 10634668b000a1d9113394941ad39875c827634feb49Guido van Rossum return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide), 10644668b000a1d9113394941ad39875c827634feb49Guido van Rossum NB_SLOT(nb_floor_divide), "//="); 10654668b000a1d9113394941ad39875c827634feb49Guido van Rossum} 10664668b000a1d9113394941ad39875c827634feb49Guido van Rossum 10674668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject * 10684668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w) 10694668b000a1d9113394941ad39875c827634feb49Guido van Rossum{ 10704668b000a1d9113394941ad39875c827634feb49Guido van Rossum return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide), 10714668b000a1d9113394941ad39875c827634feb49Guido van Rossum NB_SLOT(nb_true_divide), "/="); 10724668b000a1d9113394941ad39875c827634feb49Guido van Rossum} 10734668b000a1d9113394941ad39875c827634feb49Guido van Rossum 10744668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject * 1075e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceAdd(PyObject *v, PyObject *w) 1076e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 1077d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add), 1078d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer NB_SLOT(nb_add)); 1079d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (result == Py_NotImplemented) { 1080d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PySequenceMethods *m = v->ob_type->tp_as_sequence; 1081d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer Py_DECREF(result); 1082d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (m != NULL) { 1083d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer binaryfunc f = NULL; 1084fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant f = m->sq_inplace_concat; 1085d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (f == NULL) 1086d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer f = m->sq_concat; 1087d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (f != NULL) 1088d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return (*f)(v, w); 1089d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer } 1090d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer result = binop_type_error(v, w, "+="); 1091bb8be93a50b0293b812634575a493c4eaf676773Guido van Rossum } 1092d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return result; 1093e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 1094e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1095e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 1096e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceMultiply(PyObject *v, PyObject *w) 1097e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 1098d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply), 1099d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer NB_SLOT(nb_multiply)); 1100d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (result == Py_NotImplemented) { 110118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis ssizeargfunc f = NULL; 1102d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PySequenceMethods *mv = v->ob_type->tp_as_sequence; 1103d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer PySequenceMethods *mw = w->ob_type->tp_as_sequence; 1104d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer Py_DECREF(result); 1105d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (mv != NULL) { 11063cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum f = mv->sq_inplace_repeat; 1107d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (f == NULL) 1108d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer f = mv->sq_repeat; 1109d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (f != NULL) 1110d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return sequence_repeat(f, v, w); 1111e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 1112d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer else if (mw != NULL) { 1113d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer /* Note that the right hand operand should not be 1114d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer * mutated in this case so sq_inplace_repeat is not 1115d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer * used. */ 1116d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer if (mw->sq_repeat) 1117d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return sequence_repeat(mw->sq_repeat, w, v); 1118e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 1119d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer result = binop_type_error(v, w, "*="); 1120e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 1121d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer return result; 1122e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 1123e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1124e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 1125e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceRemainder(PyObject *v, PyObject *w) 1126e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 1127d46fbc322d0a057c3c4f0af801d28ea65074c4c7Neil Schemenauer return binary_iop(v, w, NB_SLOT(nb_inplace_remainder), 1128d46fbc322d0a057c3c4f0af801d28ea65074c4c7Neil Schemenauer NB_SLOT(nb_remainder), "%="); 1129e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 1130e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1131e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 1132e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z) 1133e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 11343cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum if (v->ob_type->tp_as_number && 11355a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer v->ob_type->tp_as_number->nb_inplace_power != NULL) { 11365a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**="); 11375a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 11385a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer else { 11395a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return ternary_op(v, w, z, NB_SLOT(nb_power), "**="); 1140e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 1141e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 1142e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1143e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1144cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Unary operators and functions */ 1145e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1146e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1147799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Negative(PyObject *o) 1148e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1149cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 1150cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1151cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 1152cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1153cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 1154cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_negative) 1155cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return (*m->nb_negative)(o); 1156cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 11570e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters 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{ 1163cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 1164cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1165cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 1166cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1167cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 1168cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_positive) 1169cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return (*m->nb_positive)(o); 1170cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 11710e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("bad operand type for unary +: '%.200s'", o); 1172e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1173e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1174e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1175799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Invert(PyObject *o) 1176e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1177cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 1178cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1179cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 1180cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1181cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 1182cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_invert) 1183cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return (*m->nb_invert)(o); 1184cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 11850e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("bad operand type for unary ~: '%.200s'", o); 1186e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1187e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1188e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1189799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Absolute(PyObject *o) 1190e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1191cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 1192e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1193cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 1194cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1195cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 1196cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_absolute) 1197cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->nb_absolute(o); 1198e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 11990e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("bad operand type for abs(): '%.200s'", o); 1200e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1201e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 120298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum/* Return a Python Int or Long from the object item 120300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters Raise TypeError if the result is not an int-or-long 120498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum or if the object cannot be interpreted as an index. 120500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters*/ 120600ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPyObject * 120738fff8c4e4276e4e57660a78f305e68bfa87874bGuido van RossumPyNumber_Index(PyObject *item) 120838fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum{ 120900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters PyObject *result = NULL; 121000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters if (item == NULL) 121100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters return null_error(); 12121fe5f388529dcdf674d53f7d67abc16c9c6ca5e5Neal Norwitz if (PyLong_Check(item)) { 121300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters Py_INCREF(item); 121400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters return item; 121500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters } 121600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters if (PyIndex_Check(item)) { 12177179220b57faca4606430b97847308b34f45f623Trent Nelson result = item->ob_type->tp_as_number->nb_index(item); 12181fe5f388529dcdf674d53f7d67abc16c9c6ca5e5Neal Norwitz if (result && !PyLong_Check(result)) { 121900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters PyErr_Format(PyExc_TypeError, 1220032a284752c4258be41a8b6a9658da55bb157273Guido van Rossum "__index__ returned non-int " 122100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters "(type %.200s)", 122200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters result->ob_type->tp_name); 122300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters Py_DECREF(result); 122400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters return NULL; 122500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters } 122638fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum } 12277179220b57faca4606430b97847308b34f45f623Trent Nelson else { 122849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyErr_Format(PyExc_TypeError, 122949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters "'%.200s' object cannot be interpreted " 1230032a284752c4258be41a8b6a9658da55bb157273Guido van Rossum "as an integer", item->ob_type->tp_name); 123138fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum } 123200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters return result; 123300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters} 123400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters 123500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters/* Return an error on Overflow only if err is not NULL*/ 123600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters 123700ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPy_ssize_t 123800ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPyNumber_AsSsize_t(PyObject *item, PyObject *err) 123900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters{ 124000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters Py_ssize_t result; 124100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters PyObject *runerr; 124200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters PyObject *value = PyNumber_Index(item); 124300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters if (value == NULL) 124400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters return -1; 124500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters 1246217cfd1c86c59ed8a55ce6d6b88bbe37309e7ba2Christian Heimes /* We're done if PyLong_AsSsize_t() returns without error. */ 1247217cfd1c86c59ed8a55ce6d6b88bbe37309e7ba2Christian Heimes result = PyLong_AsSsize_t(value); 124800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters if (result != -1 || !(runerr = PyErr_Occurred())) 124900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters goto finish; 125000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters 125100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters /* Error handling code -- only manage OverflowError differently */ 125298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) 125300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters goto finish; 125400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters 125500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters PyErr_Clear(); 125698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum /* If no error-handling desired then the default clipping 125700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters is sufficient. 125800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters */ 125900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters if (!err) { 126000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters assert(PyLong_Check(value)); 126198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum /* Whether or not it is less than or equal to 126200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters zero is determined by the sign of ob_size 126300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters */ 126498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum if (_PyLong_Sign(value) < 0) 126500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters result = PY_SSIZE_T_MIN; 126600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters else 126700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters result = PY_SSIZE_T_MAX; 126800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters } 126900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters else { 127000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters /* Otherwise replace the error with caller's error object. */ 127100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters PyErr_Format(err, 127298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum "cannot fit '%.200s' into an index-sized integer", 127398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum item->ob_type->tp_name); 127400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters } 127598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 127600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters finish: 127700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters Py_DECREF(value); 127800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters return result; 127938fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum} 128038fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum 128100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters 128215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian HeimesPyObject * 128315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format) 128415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes{ 128515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes static PyObject *int_name = NULL; 128615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes if (int_name == NULL) { 128715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes int_name = PyUnicode_InternFromString("__int__"); 128815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes if (int_name == NULL) 128915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes return NULL; 129015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes } 129115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes 129215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes if (integral && !PyLong_Check(integral)) { 129315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes /* Don't go through tp_as_number->nb_int to avoid 129415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes hitting the classic class fallback to __trunc__. */ 129515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes PyObject *int_func = PyObject_GetAttr(integral, int_name); 129615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes if (int_func == NULL) { 129715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes PyErr_Clear(); /* Raise a different error. */ 129815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes goto non_integral_error; 129915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes } 130015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes Py_DECREF(integral); 130115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes integral = PyEval_CallObject(int_func, NULL); 130215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes Py_DECREF(int_func); 130315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes if (integral && !PyLong_Check(integral)) { 130415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes goto non_integral_error; 130515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes } 130615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes } 130715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes return integral; 130815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes 130915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimesnon_integral_error: 131015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name); 131115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes Py_DECREF(integral); 131215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes return NULL; 131315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes} 131415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes 131515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes 13169e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum/* Add a check for embedded NULL-bytes in the argument. */ 1317226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsawstatic PyObject * 131818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwislong_from_string(const char *s, Py_ssize_t len) 1319226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw{ 13204c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum char *end; 1321226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw PyObject *x; 1322226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw 13234c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum x = PyLong_FromString((char*)s, &end, 10); 13249e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (x == NULL) 1325226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw return NULL; 13269e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (end != s + len) { 1327226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw PyErr_SetString(PyExc_ValueError, 1328ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum "null byte in argument for int()"); 13299e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum Py_DECREF(x); 1330226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw return NULL; 1331226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw } 1332226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw return x; 1333226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw} 1334226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw 1335e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1336799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Long(PyObject *o) 1337e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1338cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 133915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes static PyObject *trunc_name = NULL; 134015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes PyObject *trunc_func; 13414c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum const char *buffer; 134218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis Py_ssize_t buffer_len; 1343e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 134415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes if (trunc_name == NULL) { 134515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes trunc_name = PyUnicode_InternFromString("__trunc__"); 134615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes if (trunc_name == NULL) 134715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes return NULL; 134815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes } 134915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes 1350cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 1351cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1352ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum if (PyLong_CheckExact(o)) { 1353ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum Py_INCREF(o); 1354ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum return o; 1355ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum } 1356c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon m = o->ob_type->tp_as_number; 1357ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum if (m && m->nb_int) { /* This should include subclasses of int */ 1358ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum PyObject *res = m->nb_int(o); 1359ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum if (res && !PyLong_Check(res)) { 1360ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum PyErr_Format(PyExc_TypeError, 1361ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum "__int__ returned non-int (type %.200s)", 1362ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum res->ob_type->tp_name); 1363ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum Py_DECREF(res); 1364ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum return NULL; 1365ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum } 1366ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum return res; 1367ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum } 1368e5e298f8755c475e78f8cfc71ee0ea03c6674406Mark Dickinson if (PyLong_Check(o)) /* An int subclass without nb_int */ 1369db30ac41de4e9e8412429720445ea4852c3c241fTim Peters return _PyLong_Copy((PyLongObject *)o); 137015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes trunc_func = PyObject_GetAttr(o, trunc_name); 137115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes if (trunc_func) { 137215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes PyObject *truncated = PyEval_CallObject(trunc_func, NULL); 137315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes PyObject *int_instance; 137415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes Py_DECREF(trunc_func); 137515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes /* __trunc__ is specified to return an Integral type, 137615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes but long() needs to return a long. */ 137715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes int_instance = _PyNumber_ConvertIntegralToInt( 137815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes truncated, 137915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes "__trunc__ returned non-Integral (type %.200s)"); 138015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes return int_instance; 138115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes } 138215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */ 138315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes 138472b710a59617ebe6dd1c41613d2c7eb81702efd9Christian Heimes if (PyBytes_Check(o)) 138515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes /* need to do extra error checking that PyLong_FromString() 138615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes * doesn't do. In particular long('9.5') must raise an 138715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes * exception, not truncate the float. 138815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes */ 138972b710a59617ebe6dd1c41613d2c7eb81702efd9Christian Heimes return long_from_string(PyBytes_AS_STRING(o), 139072b710a59617ebe6dd1c41613d2c7eb81702efd9Christian Heimes PyBytes_GET_SIZE(o)); 13919e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (PyUnicode_Check(o)) 13929e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum /* The above check is done in PyLong_FromUnicode(). */ 13939e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o), 13949e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum PyUnicode_GET_SIZE(o), 13959e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum 10); 13964c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) 13974c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return long_from_string(buffer, buffer_len); 1398e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1399ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum return type_error("int() argument must be a string or a " 14000e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters "number, not '%.200s'", o); 1401e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1402e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1403e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1404799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Float(PyObject *o) 1405e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1406cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 1407e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1408cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 1409cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1410c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon m = o->ob_type->tp_as_number; 1411c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon if (m && m->nb_float) { /* This should include subclasses of float */ 1412c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon PyObject *res = m->nb_float(o); 1413c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon if (res && !PyFloat_Check(res)) { 1414c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon PyErr_Format(PyExc_TypeError, 1415fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant "__float__ returned non-float (type %.200s)", 1416fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant res->ob_type->tp_name); 1417c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon Py_DECREF(res); 1418c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon return NULL; 1419c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon } 1420c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon return res; 14219e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum } 1422c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */ 14237a50f2536e59762897a05b1d3996e51f3f1a9686Tim Peters PyFloatObject *po = (PyFloatObject *)o; 14247a50f2536e59762897a05b1d3996e51f3f1a9686Tim Peters return PyFloat_FromDouble(po->ob_fval); 14257a50f2536e59762897a05b1d3996e51f3f1a9686Tim Peters } 1426428f0641ec34902b0cce2cfdca833c79e6fdab7cGeorg Brandl return PyFloat_FromString(o); 1427e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1428e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1429cd16bf640405065e4702539632ce577536207d88Guido van Rossum 1430cd16bf640405065e4702539632ce577536207d88Guido van RossumPyObject * 1431cd16bf640405065e4702539632ce577536207d88Guido van RossumPyNumber_ToBase(PyObject *n, int base) 1432cd16bf640405065e4702539632ce577536207d88Guido van Rossum{ 1433a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes PyObject *res = NULL; 14345c960b8c6430684fd78290d087ce9aa1791672a4Raymond Hettinger PyObject *index = PyNumber_Index(n); 1435cd16bf640405065e4702539632ce577536207d88Guido van Rossum 1436cd16bf640405065e4702539632ce577536207d88Guido van Rossum if (!index) 1437cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NULL; 1438a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes if (PyLong_Check(index)) 1439a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes res = _PyLong_Format(index, base); 1440a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes else 1441a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes /* It should not be possible to get here, as 1442a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes PyNumber_Index already has a check for the same 1443a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes condition */ 1444a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not " 1445a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes "int or long"); 1446cd16bf640405065e4702539632ce577536207d88Guido van Rossum Py_DECREF(index); 1447cd16bf640405065e4702539632ce577536207d88Guido van Rossum return res; 1448cd16bf640405065e4702539632ce577536207d88Guido van Rossum} 1449cd16bf640405065e4702539632ce577536207d88Guido van Rossum 1450cd16bf640405065e4702539632ce577536207d88Guido van Rossum 1451cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on sequences */ 1452e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1453cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1454799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Check(PyObject *s) 1455e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 14568f326b23695dc4996327da8477e11aad42c61953Benjamin Peterson if (PyDict_Check(s)) 1457cf297e46b85257396560774e5492e9d71a40f32eThomas Wouters return 0; 14588700b4281af0561d9aafd3cc14c44d79c2a0934bGuido van Rossum return s != NULL && s->ob_type->tp_as_sequence && 14598700b4281af0561d9aafd3cc14c44d79c2a0934bGuido van Rossum s->ob_type->tp_as_sequence->sq_item != NULL; 1460e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1461e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 146218e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t 14636253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPySequence_Size(PyObject *s) 1464e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1465cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 1466e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1467cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 1468cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1469cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1470cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1471e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1472cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1473cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_length) 1474cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_length(s); 1475e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 14760e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("object of type '%.200s' has no len()", s); 1477cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1478e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1479e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1480cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PySequence_Length 148118e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t 1482cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPySequence_Length(PyObject *s) 1483cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{ 1484cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg return PySequence_Size(s); 1485cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg} 1486cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PySequence_Length PySequence_Size 1487cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg 1488e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1489799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Concat(PyObject *s, PyObject *o) 1490e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1491cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 1492cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1493cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL || o == NULL) 1494cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1495e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1496cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1497cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_concat) 1498cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_concat(s, o); 1499e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1500fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo /* Instances of user classes defining an __add__() method only 1501fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant have an nb_add slot, not an sq_concat slot. So we fall back 1502fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo to nb_add if both arguments appear to be sequences. */ 1503fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (PySequence_Check(s) && PySequence_Check(o)) { 1504fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo PyObject *result = binary_op1(s, o, NB_SLOT(nb_add)); 1505fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (result != Py_NotImplemented) 1506fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo return result; 1507fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo Py_DECREF(result); 1508fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo } 15090e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("'%.200s' object can't be concatenated", s); 1510e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1511e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1512e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 151318e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_Repeat(PyObject *o, Py_ssize_t count) 1514e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1515cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 1516e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1517cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 1518cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1519e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1520cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_sequence; 1521cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_repeat) 1522cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_repeat(o, count); 1523cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1524fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo /* Instances of user classes defining a __mul__() method only 1525fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo have an nb_multiply slot, not an sq_repeat slot. so we fall back 1526fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo to nb_multiply if o appears to be a sequence. */ 1527fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (PySequence_Check(o)) { 1528fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo PyObject *n, *result; 1529217cfd1c86c59ed8a55ce6d6b88bbe37309e7ba2Christian Heimes n = PyLong_FromSsize_t(count); 1530fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (n == NULL) 1531fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo return NULL; 1532fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo result = binary_op1(o, n, NB_SLOT(nb_multiply)); 1533fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo Py_DECREF(n); 1534fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (result != Py_NotImplemented) 1535fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo return result; 1536fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo Py_DECREF(result); 1537fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo } 15380e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("'%.200s' object can't be repeated", o); 1539e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1540e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1541e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1542e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPySequence_InPlaceConcat(PyObject *s, PyObject *o) 1543e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 1544e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters PySequenceMethods *m; 1545e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1546e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (s == NULL || o == NULL) 1547e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return null_error(); 1548e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1549e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters m = s->ob_type->tp_as_sequence; 15503cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum if (m && m->sq_inplace_concat) 1551e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return m->sq_inplace_concat(s, o); 1552e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (m && m->sq_concat) 1553e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return m->sq_concat(s, o); 1554e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1555fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (PySequence_Check(s) && PySequence_Check(o)) { 1556fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add), 1557fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo NB_SLOT(nb_add)); 1558fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (result != Py_NotImplemented) 1559fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo return result; 1560fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo Py_DECREF(result); 1561fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo } 15620e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("'%.200s' object can't be concatenated", s); 1563e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 1564e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1565e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 156618e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count) 1567e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 1568e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters PySequenceMethods *m; 1569e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1570e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (o == NULL) 1571e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return null_error(); 1572e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1573e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters m = o->ob_type->tp_as_sequence; 15743cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum if (m && m->sq_inplace_repeat) 1575e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return m->sq_inplace_repeat(o, count); 1576e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (m && m->sq_repeat) 1577e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return m->sq_repeat(o, count); 1578e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1579fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (PySequence_Check(o)) { 1580fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo PyObject *n, *result; 1581217cfd1c86c59ed8a55ce6d6b88bbe37309e7ba2Christian Heimes n = PyLong_FromSsize_t(count); 1582fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (n == NULL) 1583fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo return NULL; 1584fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply), 1585fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo NB_SLOT(nb_multiply)); 1586fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo Py_DECREF(n); 1587fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo if (result != Py_NotImplemented) 1588fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo return result; 1589fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo Py_DECREF(result); 1590fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo } 15910e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("'%.200s' object can't be repeated", o); 1592e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 1593e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1594e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 159518e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_GetItem(PyObject *s, Py_ssize_t i) 1596e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1597cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 1598cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1599cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) 1600cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1601cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1602cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1603cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_item) { 1604cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i < 0) { 1605cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m->sq_length) { 160618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis Py_ssize_t l = (*m->sq_length)(s); 1607cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1608cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1609cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i += l; 1610cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1611cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1612cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_item(s, i); 1613cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1614e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 161586b2fb9d77e483cc56e85bc4c96ac54f55427d39Georg Brandl return type_error("'%.200s' object does not support indexing", s); 1616e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1617e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1618e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 161918e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) 1620e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 16211d75a79c009e500923128716a02efbe86135e64eThomas Wouters PyMappingMethods *mp; 1622cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1623cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (!s) return null_error(); 1624cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1625d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters mp = s->ob_type->tp_as_mapping; 1626d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters if (mp->mp_subscript) { 16271d75a79c009e500923128716a02efbe86135e64eThomas Wouters PyObject *res; 162849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *slice = _PySlice_FromIndices(i1, i2); 16291d75a79c009e500923128716a02efbe86135e64eThomas Wouters if (!slice) 16301d75a79c009e500923128716a02efbe86135e64eThomas Wouters return NULL; 16311d75a79c009e500923128716a02efbe86135e64eThomas Wouters res = mp->mp_subscript(s, slice); 16321d75a79c009e500923128716a02efbe86135e64eThomas Wouters Py_DECREF(slice); 16331d75a79c009e500923128716a02efbe86135e64eThomas Wouters return res; 1634cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 16354669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum 16360e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("'%.200s' object is unsliceable", s); 1637e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1638e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1639e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint 164018e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) 1641e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1642cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 1643cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1644cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 1645cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1646cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1647cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1648cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1649cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1650cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_ass_item) { 1651cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i < 0) { 1652cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m->sq_length) { 165318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis Py_ssize_t l = (*m->sq_length)(s); 1654cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1655ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum return -1; 1656cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i += l; 1657cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1658cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1659cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_ass_item(s, i, o); 1660cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1661cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 16620e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("'%.200s' object does not support item assignment", s); 1663cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1664e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1665e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 16666cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint 166718e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_DelItem(PyObject *s, Py_ssize_t i) 16686cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{ 1669cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 1670cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1671cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 1672cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1673cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1674cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1675cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1676cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1677cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_ass_item) { 1678cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i < 0) { 1679cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m->sq_length) { 168018e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis Py_ssize_t l = (*m->sq_length)(s); 1681cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1682ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum return -1; 1683cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i += l; 1684cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1685cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1686cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_ass_item(s, i, (PyObject *)NULL); 1687cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1688cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 16890e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("'%.200s' object doesn't support item deletion", s); 1690cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 16916cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum} 16926cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 1693cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 169418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o) 1695e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 16961d75a79c009e500923128716a02efbe86135e64eThomas Wouters PyMappingMethods *mp; 1697e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1698cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 1699cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1700cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1701cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1702e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1703d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters mp = s->ob_type->tp_as_mapping; 1704d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters if (mp->mp_ass_subscript) { 17051d75a79c009e500923128716a02efbe86135e64eThomas Wouters int res; 170649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *slice = _PySlice_FromIndices(i1, i2); 17071d75a79c009e500923128716a02efbe86135e64eThomas Wouters if (!slice) 17081d75a79c009e500923128716a02efbe86135e64eThomas Wouters return -1; 17091d75a79c009e500923128716a02efbe86135e64eThomas Wouters res = mp->mp_ass_subscript(s, slice, o); 17101d75a79c009e500923128716a02efbe86135e64eThomas Wouters Py_DECREF(slice); 17111d75a79c009e500923128716a02efbe86135e64eThomas Wouters return res; 1712cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 17131d75a79c009e500923128716a02efbe86135e64eThomas Wouters 17140e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("'%.200s' object doesn't support slice assignment", s); 1715cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1716e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1717e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1718cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 171918e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) 17206cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{ 1721d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters PyMappingMethods *mp; 17226cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 1723cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 1724cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1725cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1726cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 17276cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 1728d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters mp = s->ob_type->tp_as_mapping; 1729d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters if (mp->mp_ass_subscript) { 1730d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters int res; 1731d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters PyObject *slice = _PySlice_FromIndices(i1, i2); 1732d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters if (!slice) 1733d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters return -1; 1734d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters res = mp->mp_ass_subscript(s, slice, NULL); 1735d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters Py_DECREF(slice); 1736d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters return res; 1737cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 17380e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("'%.200s' object doesn't support slice deletion", s); 1739cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 17406cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum} 17416cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 1742e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1743799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Tuple(PyObject *v) 1744e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 17456912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters PyObject *it; /* iter(v) */ 1746fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_ssize_t n; /* guess for result tuple size */ 1747e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger PyObject *result = NULL; 174818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis Py_ssize_t j; 1749e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1750cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (v == NULL) 1751cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1752e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 17536912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Special-case the common tuple and list cases, for efficiency. */ 17544c3a0a35cd80a0abb9628dc8d4ade911fe2d5015Tim Peters if (PyTuple_CheckExact(v)) { 17554c3a0a35cd80a0abb9628dc8d4ade911fe2d5015Tim Peters /* Note that we can't know whether it's safe to return 17564c3a0a35cd80a0abb9628dc8d4ade911fe2d5015Tim Peters a tuple *subclass* instance as-is, hence the restriction 17578ff70a9606aa2f51f8329fbf09dfbbbae6ab6c11Tim Peters to exact tuples here. In contrast, lists always make 17588ff70a9606aa2f51f8329fbf09dfbbbae6ab6c11Tim Peters a copy, so there's no need for exactness below. */ 1759cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_INCREF(v); 1760cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return v; 1761cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1762cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (PyList_Check(v)) 1763cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return PyList_AsTuple(v); 1764cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 17656912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Get iterator. */ 17666912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters it = PyObject_GetIter(v); 17676912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (it == NULL) 17681fc240e85150f5cb39502a87cc9a4a0a8cbe5ab0Tim Peters return NULL; 1769e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 17706912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Guess result size and allocate space. */ 1771255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes n = _PyObject_LengthHint(v, 10); 1772e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger if (n == -1) 1773e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger goto Fail; 17746912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters result = PyTuple_New(n); 17756912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (result == NULL) 17766912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters goto Fail; 17776912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters 17786912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Fill the tuple. */ 17796912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters for (j = 0; ; ++j) { 17806912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters PyObject *item = PyIter_Next(it); 17816912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (item == NULL) { 17826912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (PyErr_Occurred()) 17836912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters goto Fail; 17846912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters break; 17856912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters } 17866912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (j >= n) { 178718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis Py_ssize_t oldn = n; 17884d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger /* The over-allocation strategy can grow a bit faster 178998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum than for lists because unlike lists the 17904d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger over-allocation isn't permanent -- we reclaim 17914d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger the excess before the end of this routine. 17924d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger So, grow by ten and then add 25%. 17934d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger */ 17944d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger n += 10; 17954d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger n += n >> 2; 17964d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger if (n < oldn) { 17974d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger /* Check for overflow */ 17984d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger PyErr_NoMemory(); 1799e6bdb37e5bc7d250e17c3d4fef6961e178e02b64Raymond Hettinger Py_DECREF(item); 180098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum goto Fail; 18014d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger } 18024324aa3572f123883e67a807b633b3d0d452a267Tim Peters if (_PyTuple_Resize(&result, n) != 0) { 180312d0a6c78a376e8eddca3d3fa88ed3627aad795cTim Peters Py_DECREF(item); 18046912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters goto Fail; 180512d0a6c78a376e8eddca3d3fa88ed3627aad795cTim Peters } 1806cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 18076912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters PyTuple_SET_ITEM(result, j, item); 1808e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 1809cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 18106912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Cut tuple back if guess was too large. */ 18116912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (j < n && 18124324aa3572f123883e67a807b633b3d0d452a267Tim Peters _PyTuple_Resize(&result, j) != 0) 18136912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters goto Fail; 18146912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters 18156912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters Py_DECREF(it); 18166912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters return result; 18176912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters 18186912d4ddf0504a3d5611ddd12cbde3354bd48279Tim PetersFail: 18196912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters Py_XDECREF(result); 18206912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters Py_DECREF(it); 18216912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters return NULL; 1822e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1823e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 18243c5936afc5f067b3b591f554c31e1cfdce460fadGuido van RossumPyObject * 1825799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_List(PyObject *v) 18263c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum{ 1827f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters PyObject *result; /* result list */ 1828fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PyObject *rv; /* return value from PyList_Extend */ 1829cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 18305dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum if (v == NULL) 18315dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum return null_error(); 18325dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum 18338ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger result = PyList_New(0); 18348ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger if (result == NULL) 1835f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters return NULL; 1836f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters 18378ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger rv = _PyList_Extend((PyListObject *)result, v); 18388ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger if (rv == NULL) { 18398ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger Py_DECREF(result); 1840f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters return NULL; 1841f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters } 1842969d8c0c8cbef8f8b838c3032bb6beb60cb59f4fRaymond Hettinger Py_DECREF(rv); 1843f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters return result; 1844cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum} 18454669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum 184674042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. KuchlingPyObject * 1847799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Fast(PyObject *v, const char *m) 184874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling{ 18492fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger PyObject *it; 18502fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger 185174042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling if (v == NULL) 185274042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling return null_error(); 185374042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling 18542801fe1c8f7d629e396ed514c4df25b43547970aMichael W. Hudson if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) { 185574042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling Py_INCREF(v); 185674042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling return v; 185774042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling } 185874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling 1859fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant it = PyObject_GetIter(v); 18602fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger if (it == NULL) { 18612fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger if (PyErr_ExceptionMatches(PyExc_TypeError)) 18620e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters PyErr_SetString(PyExc_TypeError, m); 18632fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger return NULL; 18642fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger } 18652fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger 1866193814c3082f1b81772009f9b7545278f16c3428Raymond Hettinger v = PySequence_List(it); 18672fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger Py_DECREF(it); 186874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling 186974042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling return v; 187074042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling} 187174042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling 187216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters/* Iterate over seq. Result depends on the operation: 1873fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq. 1874934896dc0977ea25dc37c13117525f2394625ceeMark Dickinson PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq; 1875fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant set ValueError and return -1 if none found; also return -1 on error. 187616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error. 187716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters*/ 18781fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t 187916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation) 1880cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{ 18811fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz Py_ssize_t n; 188216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */ 188316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters PyObject *it; /* iter(seq) */ 18844669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum 188516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters if (seq == NULL || obj == NULL) { 1886cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1887cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1888cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 188975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters 189016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters it = PyObject_GetIter(seq); 189175f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (it == NULL) { 18920e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("argument of type '%.200s' is not iterable", seq); 1893cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 189475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters } 1895cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 189616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters n = wrapped = 0; 189775f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters for (;;) { 189875f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters int cmp; 189975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters PyObject *item = PyIter_Next(it); 190075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (item == NULL) { 190175f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (PyErr_Occurred()) 190275f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters goto Fail; 190375f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters break; 190475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters } 190516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters 190616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters cmp = PyObject_RichCompareBool(obj, item, Py_EQ); 1907cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(item); 190875f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (cmp < 0) 190975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters goto Fail; 191075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (cmp > 0) { 191116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters switch (operation) { 191216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters case PY_ITERSEARCH_COUNT: 191389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters if (n == PY_SSIZE_T_MAX) { 191416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters PyErr_SetString(PyExc_OverflowError, 191589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters "count exceeds C integer size"); 191616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters goto Fail; 191716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters } 191889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters ++n; 191916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters break; 192016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters 192116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters case PY_ITERSEARCH_INDEX: 192216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters if (wrapped) { 192316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters PyErr_SetString(PyExc_OverflowError, 192489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters "index exceeds C integer size"); 192516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters goto Fail; 192616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters } 192716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters goto Done; 192816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters 192916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters case PY_ITERSEARCH_CONTAINS: 193016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters n = 1; 193116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters goto Done; 193216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters 193316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters default: 193416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters assert(!"unknown operation"); 193575f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters } 193616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters } 193716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters 193816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters if (operation == PY_ITERSEARCH_INDEX) { 193989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters if (n == PY_SSIZE_T_MAX) 194016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters wrapped = 1; 194189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters ++n; 194275f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters } 19434669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum } 194475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters 194516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters if (operation != PY_ITERSEARCH_INDEX) 194616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters goto Done; 194716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters 194816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters PyErr_SetString(PyExc_ValueError, 1949fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant "sequence.index(x): x not in sequence"); 195016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters /* fall into failure code */ 195175f8e35ef41aa6e7c915d99de8bd40be2745955cTim PetersFail: 195216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters n = -1; 195316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters /* fall through */ 195416a77adfbd745c202878fabb0b921514fec7ca16Tim PetersDone: 195575f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters Py_DECREF(it); 195616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters return n; 195716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters 19583c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum} 19593c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum 196016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters/* Return # of times o appears in s. */ 19611fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t 196216a77adfbd745c202878fabb0b921514fec7ca16Tim PetersPySequence_Count(PyObject *s, PyObject *o) 1963e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 196416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT); 1965e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1966e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1967cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq. 196816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters * Use sq_contains if possible, else defer to _PySequence_IterSearch(). 1969cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters */ 1970cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Petersint 1971cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim PetersPySequence_Contains(PyObject *seq, PyObject *ob) 1972cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters{ 19731fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz Py_ssize_t result; 19743cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum PySequenceMethods *sqm = seq->ob_type->tp_as_sequence; 1975fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant if (sqm != NULL && sqm->sq_contains != NULL) 19763cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum return (*sqm->sq_contains)(seq, ob); 19771fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS); 19781fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz return Py_SAFE_DOWNCAST(result, Py_ssize_t, int); 1979cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters} 1980cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters 1981cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Backwards compatibility */ 1982cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum#undef PySequence_In 1983cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1984799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_In(PyObject *w, PyObject *v) 1985e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1986cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return PySequence_Contains(w, v); 1987e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1988e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 19891fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t 1990799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Index(PyObject *s, PyObject *o) 1991e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 199216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX); 1993e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1994e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1995cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on mappings */ 1996cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1997cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1998799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_Check(PyObject *o) 1999e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 2000fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant return o && o->ob_type->tp_as_mapping && 2001d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters o->ob_type->tp_as_mapping->mp_subscript; 2002e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 2003e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 200418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t 20056253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyMapping_Size(PyObject *o) 2006e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 2007cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyMappingMethods *m; 2008e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2009cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) { 2010cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 2011cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 2012cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 2013e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2014cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_mapping; 2015cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->mp_length) 2016cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->mp_length(o); 2017e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 20180e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters type_error("object of type '%.200s' has no len()", o); 2019cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 2020e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 2021e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2022cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyMapping_Length 202318e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t 2024cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyMapping_Length(PyObject *o) 2025cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{ 2026cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg return PyMapping_Size(o); 2027cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg} 2028cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyMapping_Length PyMapping_Size 2029cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg 2030cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van RossumPyObject * 2031799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_GetItemString(PyObject *o, char *key) 2032cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{ 2033cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *okey, *r; 2034cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2035cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (key == NULL) 2036cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 2037cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 20385b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis okey = PyUnicode_FromString(key); 2039cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (okey == NULL) 2040cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 2041cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum r = PyObject_GetItem(o, okey); 2042cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(okey); 2043cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return r; 2044cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum} 2045cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2046cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 2047799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_SetItemString(PyObject *o, char *key, PyObject *value) 2048cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{ 2049cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *okey; 2050cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int r; 2051cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2052cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (key == NULL) { 2053cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 2054cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 2055cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 2056cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 20575b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis okey = PyUnicode_FromString(key); 2058cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (okey == NULL) 2059ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum return -1; 2060cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum r = PyObject_SetItem(o, okey, value); 2061cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(okey); 2062cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return r; 2063cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum} 2064cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2065cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 2066799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_HasKeyString(PyObject *o, char *key) 2067e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 2068cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *v; 2069cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2070cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum v = PyMapping_GetItemString(o, key); 2071cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (v) { 2072cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(v); 2073cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 1; 2074cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 2075cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_Clear(); 2076cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 0; 2077e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 2078e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2079cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 2080799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_HasKey(PyObject *o, PyObject *key) 2081e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 2082cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *v; 2083cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2084cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum v = PyObject_GetItem(o, key); 2085cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (v) { 2086cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(v); 2087cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 1; 2088cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 2089cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_Clear(); 2090cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 0; 2091e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 2092e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2093cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject * 2094cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Keys(PyObject *o) 2095cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{ 2096cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum PyObject *keys; 2097cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum PyObject *fast; 2098cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum 2099cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum if (PyDict_CheckExact(o)) 2100cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum return PyDict_Keys(o); 2101cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum keys = PyObject_CallMethod(o, "keys", NULL); 2102cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum if (keys == NULL) 2103cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum return NULL; 2104cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum fast = PySequence_Fast(keys, "o.keys() are not iterable"); 2105cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum Py_DECREF(keys); 2106cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum return fast; 2107cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum} 2108cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum 2109cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject * 2110cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Items(PyObject *o) 2111cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{ 2112cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum PyObject *items; 2113cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum PyObject *fast; 2114cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum 2115cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum if (PyDict_CheckExact(o)) 2116cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum return PyDict_Items(o); 2117cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum items = PyObject_CallMethod(o, "items", NULL); 2118cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum if (items == NULL) 2119cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum return NULL; 2120cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum fast = PySequence_Fast(items, "o.items() are not iterable"); 2121cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum Py_DECREF(items); 2122cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum return fast; 2123cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum} 2124cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum 2125cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject * 2126cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Values(PyObject *o) 2127cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{ 2128cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum PyObject *values; 2129cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum PyObject *fast; 2130cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum 2131cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum if (PyDict_CheckExact(o)) 2132cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum return PyDict_Values(o); 2133cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum values = PyObject_CallMethod(o, "values", NULL); 2134cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum if (values == NULL) 2135cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum return NULL; 2136cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum fast = PySequence_Fast(values, "o.values() are not iterable"); 2137cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum Py_DECREF(values); 2138cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum return fast; 2139cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum} 2140cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum 2141cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on callable objects */ 2142cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2143cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* XXX PyCallable_Check() is in object.c */ 2144cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2145e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 2146799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_CallObject(PyObject *o, PyObject *a) 2147e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 21485560b7492c8dbe17a29362a66102662e5e22a9d2Guido van Rossum return PyEval_CallObjectWithKeywords(o, a, NULL); 2149cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum} 2150e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2151e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 21526d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim PetersPyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) 21536d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters{ 2154fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant ternaryfunc call; 21556d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 21566d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters if ((call = func->ob_type->tp_call) != NULL) { 215789d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters PyObject *result; 215889d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters if (Py_EnterRecursiveCall(" while calling a Python object")) 215989d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters return NULL; 216089d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters result = (*call)(func, arg, kw); 216189d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters Py_LeaveRecursiveCall(); 21626d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters if (result == NULL && !PyErr_Occurred()) 21636d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters PyErr_SetString( 21646d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters PyExc_SystemError, 21656d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters "NULL result without error in PyObject_Call"); 21666d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters return result; 21676d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters } 21680e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", 2169573395a7a8163c38630c5262ed3910c279e4a767Fred Drake func->ob_type->tp_name); 21706d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters return NULL; 21716d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters} 21726d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 217349fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersstatic PyObject* 217449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouterscall_function_tail(PyObject *callable, PyObject *args) 217549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 217649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *retval; 217749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 217849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters if (args == NULL) 217949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters return NULL; 218049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 218149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters if (!PyTuple_Check(args)) { 218249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *a; 218349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 218449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters a = PyTuple_New(1); 218549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters if (a == NULL) { 218649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters Py_DECREF(args); 218749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters return NULL; 218849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters } 218949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyTuple_SET_ITEM(a, 0, args); 219049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters args = a; 219149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters } 219249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters retval = PyObject_Call(callable, args, NULL); 219349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 219449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters Py_DECREF(args); 219549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 219649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters return retval; 219749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 219849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 21996d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim PetersPyObject * 2200cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van RossumPyObject_CallFunction(PyObject *callable, char *format, ...) 2201e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 2202cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_list va; 220349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *args; 2204e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2205b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake if (callable == NULL) 2206cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 2207cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2208b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake if (format && *format) { 2209b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake va_start(va, format); 2210cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = Py_VaBuildValue(format, va); 2211b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake va_end(va); 2212b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake } 2213cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum else 2214cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = PyTuple_New(0); 2215cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 221649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters return call_function_tail(callable, args); 221749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 2218cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 221949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyObject * 222049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...) 222149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 222249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters va_list va; 222349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *args; 2224cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 222549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters if (callable == NULL) 222649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters return null_error(); 2227cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 222849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters if (format && *format) { 222949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters va_start(va, format); 223049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters args = _Py_VaBuildValue_SizeT(format, va); 223149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters va_end(va); 223249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters } 223349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters else 223449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters args = PyTuple_New(0); 2235cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 223649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters return call_function_tail(callable, args); 2237e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 2238e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2239e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 2240e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject_CallMethod(PyObject *o, char *name, char *format, ...) 2241e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 2242cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_list va; 224349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *args; 22440edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson PyObject *func = NULL; 22450edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson PyObject *retval = NULL; 2246e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2247b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake if (o == NULL || name == NULL) 2248cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 2249e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2250cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum func = PyObject_GetAttrString(o, name); 2251cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (func == NULL) { 2252cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_SetString(PyExc_AttributeError, name); 2253cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 0; 2254cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 2255e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 22560edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson if (!PyCallable_Check(func)) { 225798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum type_error("attribute of type '%.200s' is not callable", func); 22580edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson goto exit; 22590edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson } 2260e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2261b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake if (format && *format) { 2262b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake va_start(va, format); 2263cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = Py_VaBuildValue(format, va); 2264b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake va_end(va); 2265b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake } 2266cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum else 2267cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = PyTuple_New(0); 2268cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 226949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters retval = call_function_tail(func, args); 2270cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 227149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters exit: 227249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters /* args gets consumed in call_function_tail */ 227349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters Py_XDECREF(func); 2274cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 227549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters return retval; 227649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 227749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 227849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyObject * 227949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...) 228049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 228149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters va_list va; 228249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *args; 228349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *func = NULL; 228449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyObject *retval = NULL; 228549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 228649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters if (o == NULL || name == NULL) 228749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters return null_error(); 228849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 228949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters func = PyObject_GetAttrString(o, name); 229049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters if (func == NULL) { 229149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters PyErr_SetString(PyExc_AttributeError, name); 229249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters return 0; 2293cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 2294cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 229549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters if (!PyCallable_Check(func)) { 229698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum type_error("attribute of type '%.200s' is not callable", func); 229749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters goto exit; 229849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters } 229949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 230049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters if (format && *format) { 230149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters va_start(va, format); 230249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters args = _Py_VaBuildValue_SizeT(format, va); 230349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters va_end(va); 230449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters } 230549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters else 230649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters args = PyTuple_New(0); 230749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 230849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters retval = call_function_tail(func, args); 2309cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 23100edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson exit: 231149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters /* args gets consumed in call_function_tail */ 23120edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson Py_XDECREF(func); 2313cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 2314cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return retval; 2315e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 2316823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 2317823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 2318b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drakestatic PyObject * 2319b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred Drakeobjargs_mktuple(va_list va) 2320b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{ 2321b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake int i, n = 0; 2322b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake va_list countva; 2323b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake PyObject *result, *tmp; 2324b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2325b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake#ifdef VA_LIST_IS_ARRAY 2326b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake memcpy(countva, va, sizeof(va_list)); 2327b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake#else 232875d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#ifdef __va_copy 232975d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis __va_copy(countva, va); 233075d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#else 2331b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake countva = va; 2332b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake#endif 233375d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#endif 2334b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2335b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake while (((PyObject *)va_arg(countva, PyObject *)) != NULL) 2336b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake ++n; 2337b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake result = PyTuple_New(n); 2338b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake if (result != NULL && n > 0) { 2339b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake for (i = 0; i < n; ++i) { 2340b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake tmp = (PyObject *)va_arg(va, PyObject *); 2341b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake PyTuple_SET_ITEM(result, i, tmp); 2342b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake Py_INCREF(tmp); 2343b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake } 2344b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake } 2345b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake return result; 2346b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake} 2347b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2348b421b8c19105d08b97122b7c84eec37ad83c6de4Fred DrakePyObject * 2349b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred DrakePyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...) 2350b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{ 2351b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake PyObject *args, *tmp; 2352b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake va_list vargs; 2353b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2354b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake if (callable == NULL || name == NULL) 2355b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake return null_error(); 2356b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2357b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake callable = PyObject_GetAttr(callable, name); 2358b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake if (callable == NULL) 2359b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake return NULL; 2360b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2361b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake /* count the args */ 2362b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake va_start(vargs, name); 2363b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred Drake args = objargs_mktuple(vargs); 2364b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake va_end(vargs); 2365b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake if (args == NULL) { 2366b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake Py_DECREF(callable); 2367b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake return NULL; 2368b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake } 2369b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake tmp = PyObject_Call(callable, args, NULL); 2370b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake Py_DECREF(args); 2371b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake Py_DECREF(callable); 2372b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2373b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake return tmp; 2374b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake} 2375b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2376b421b8c19105d08b97122b7c84eec37ad83c6de4Fred DrakePyObject * 2377b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred DrakePyObject_CallFunctionObjArgs(PyObject *callable, ...) 2378b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{ 2379b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake PyObject *args, *tmp; 2380b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake va_list vargs; 2381b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2382b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake if (callable == NULL) 2383b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake return null_error(); 2384b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2385b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake /* count the args */ 2386b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake va_start(vargs, callable); 2387b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred Drake args = objargs_mktuple(vargs); 2388b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake va_end(vargs); 2389b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake if (args == NULL) 2390b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake return NULL; 2391b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake tmp = PyObject_Call(callable, args, NULL); 2392b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake Py_DECREF(args); 2393b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2394b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake return tmp; 2395b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake} 2396b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2397b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake 2398823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum/* isinstance(), issubclass() */ 2399823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 2400f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw/* abstract_get_bases() has logically 4 return states, with a sort of 0th 2401f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * state that will almost never happen. 2402f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 2403f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 0. creating the __bases__ static string could get a MemoryError 2404f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 1. getattr(cls, '__bases__') could raise an AttributeError 2405f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 2. getattr(cls, '__bases__') could raise some other exception 2406f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 3. getattr(cls, '__bases__') could return a tuple 2407f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 4. getattr(cls, '__bases__') could return something other than a tuple 2408f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 2409f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Only state #3 is a non-error state and only it returns a non-NULL object 2410f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * (it returns the retrieved tuple). 2411f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 2412f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Any raised AttributeErrors are masked by clearing the exception and 2413f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * returning NULL. If an object other than a tuple comes out of __bases__, 2414f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * then again, the return value is NULL. So yes, these two situations 2415f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * produce exactly the same results: NULL is returned and no error is set. 2416f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 2417f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * If some exception other than AttributeError is raised, then NULL is also 2418fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant * returned, but the exception is not cleared. That's because we want the 2419f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * exception to be propagated along. 2420f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 2421f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Callers are expected to test for PyErr_Occurred() when the return value 2422f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * is NULL to decide whether a valid exception should be propagated or not. 2423f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * When there's no exception to propagate, it's customary for the caller to 2424f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * set a TypeError. 2425f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw */ 24266b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerstatic PyObject * 24276b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerabstract_get_bases(PyObject *cls) 2428823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{ 2429823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum static PyObject *__bases__ = NULL; 2430823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum PyObject *bases; 2431823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 2432823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (__bases__ == NULL) { 2433fe82e774ea203de277968216126e26d0d09b3a15Christian Heimes __bases__ = PyUnicode_InternFromString("__bases__"); 2434823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (__bases__ == NULL) 24356b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer return NULL; 2436823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 24375b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis Py_ALLOW_RECURSION 24386b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer bases = PyObject_GetAttr(cls, __bases__); 24395b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis Py_END_ALLOW_RECURSION 2440f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw if (bases == NULL) { 2441f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw if (PyErr_ExceptionMatches(PyExc_AttributeError)) 2442f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw PyErr_Clear(); 2443f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw return NULL; 2444f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw } 2445f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw if (!PyTuple_Check(bases)) { 2446fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant Py_DECREF(bases); 24476b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer return NULL; 2448823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 24496b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer return bases; 24506b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer} 24516b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer 24526b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer 24536b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerstatic int 24546b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerabstract_issubclass(PyObject *derived, PyObject *cls) 24556b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer{ 2456ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou PyObject *bases = NULL; 245718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis Py_ssize_t i, n; 24586b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer int r = 0; 24596b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer 2460ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou while (1) { 2461ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (derived == cls) 2462ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return 1; 2463ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou bases = abstract_get_bases(derived); 2464ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (bases == NULL) { 2465ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (PyErr_Occurred()) 2466ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return -1; 2467ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return 0; 2468ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou } 2469ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou n = PyTuple_GET_SIZE(bases); 2470ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (n == 0) { 2471ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_DECREF(bases); 2472ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return 0; 2473ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou } 2474ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou /* Avoid recursivity in the single inheritance case */ 2475ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (n == 1) { 2476ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou derived = PyTuple_GET_ITEM(bases, 0); 2477ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_DECREF(bases); 2478ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou continue; 2479ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou } 2480d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald for (i = 0; i < n; i++) { 2481ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls); 2482ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (r != 0) 2483ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou break; 2484d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald } 2485ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_DECREF(bases); 2486ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return r; 2487d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald } 2488823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum} 2489823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 2490d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwaldstatic int 2491d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwaldcheck_class(PyObject *cls, const char *error) 2492d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald{ 2493d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald PyObject *bases = abstract_get_bases(cls); 2494d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald if (bases == NULL) { 2495d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald /* Do not mask errors. */ 2496d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald if (!PyErr_Occurred()) 2497d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald PyErr_SetString(PyExc_TypeError, error); 2498d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald return 0; 2499d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald } 2500d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald Py_DECREF(bases); 2501d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald return -1; 2502d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald} 2503d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald 25044f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonstatic int 2505ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrourecursive_isinstance(PyObject *inst, PyObject *cls) 2506823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{ 2507823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum PyObject *icls; 2508823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum static PyObject *__class__ = NULL; 2509823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum int retval = 0; 2510823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 251103bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum if (__class__ == NULL) { 2512fe82e774ea203de277968216126e26d0d09b3a15Christian Heimes __class__ = PyUnicode_InternFromString("__class__"); 251303bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum if (__class__ == NULL) 251403bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum return -1; 251503bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum } 251603bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum 251745aecf451a64fb1ebe5e74d0b00965ac8d99dff6Guido van Rossum if (PyType_Check(cls)) { 25186d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls); 251903bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum if (retval == 0) { 252003bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum PyObject *c = PyObject_GetAttr(inst, __class__); 252103bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum if (c == NULL) { 252203bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum PyErr_Clear(); 252303bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum } 252403bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum else { 2525e5b130bcdb491b7d4af7cd4c9cf82ebf6ba5fc63Guido van Rossum if (c != (PyObject *)(inst->ob_type) && 2526e5b130bcdb491b7d4af7cd4c9cf82ebf6ba5fc63Guido van Rossum PyType_Check(c)) 252703bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum retval = PyType_IsSubtype( 252803bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum (PyTypeObject *)c, 252903bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum (PyTypeObject *)cls); 253003bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum Py_DECREF(c); 253103bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum } 253203bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum } 2533823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 25346b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer else { 2535d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald if (!check_class(cls, 2536d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald "isinstance() arg 2 must be a class, type," 2537d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald " or tuple of classes and types")) 25386b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer return -1; 2539823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum icls = PyObject_GetAttr(inst, __class__); 25406b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer if (icls == NULL) { 25416b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer PyErr_Clear(); 25426b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer retval = 0; 25436b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer } 25446b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer else { 25456b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer retval = abstract_issubclass(icls, cls); 2546823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum Py_DECREF(icls); 2547823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 2548823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 2549823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 2550823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return retval; 2551823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum} 2552823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 2553823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossumint 25544f65331483197a9909b19694688c55fdf9ca7a37Brett CannonPyObject_IsInstance(PyObject *inst, PyObject *cls) 25554f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon{ 2556a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes static PyObject *name = NULL; 2557e7ba4956272a7105ea90dd505f70e5947aa27161Guido van Rossum PyObject *checker; 2558d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes 2559d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes /* Quick test for an exact match */ 2560d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes if (Py_TYPE(inst) == (PyTypeObject *)cls) 2561d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes return 1; 2562d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes 2563ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (PyTuple_Check(cls)) { 2564ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_ssize_t i; 2565ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_ssize_t n; 2566ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou int r = 0; 2567ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou 2568ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (Py_EnterRecursiveCall(" in __instancecheck__")) 2569ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return -1; 2570ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou n = PyTuple_GET_SIZE(cls); 2571ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou for (i = 0; i < n; ++i) { 2572ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou PyObject *item = PyTuple_GET_ITEM(cls, i); 2573ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou r = PyObject_IsInstance(inst, item); 2574ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (r != 0) 2575ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou /* either found it, or got an error */ 2576ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou break; 2577ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou } 2578ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_LeaveRecursiveCall(); 2579ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return r; 2580ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou } 258188fe5f9776bca1dee330a76776f831e12ea8b36dBenjamin Peterson 258288fe5f9776bca1dee330a76776f831e12ea8b36dBenjamin Peterson checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name); 2583adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum if (checker != NULL) { 2584adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum PyObject *res; 2585adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum int ok = -1; 258629478ef990eadb04c9c1ff4a803b7c5172b31399Guido van Rossum if (Py_EnterRecursiveCall(" in __instancecheck__")) { 258729478ef990eadb04c9c1ff4a803b7c5172b31399Guido van Rossum Py_DECREF(checker); 2588adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum return ok; 258929478ef990eadb04c9c1ff4a803b7c5172b31399Guido van Rossum } 2590adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum res = PyObject_CallFunctionObjArgs(checker, inst, NULL); 2591adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum Py_LeaveRecursiveCall(); 2592adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum Py_DECREF(checker); 2593adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum if (res != NULL) { 2594adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum ok = PyObject_IsTrue(res); 2595adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum Py_DECREF(res); 2596adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum } 2597adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum return ok; 2598adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum } 259994c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson else if (PyErr_Occurred()) 260094c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson return -1; 2601ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return recursive_isinstance(inst, cls); 26024f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon} 26034f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon 2604fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphantstatic int 2605ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrourecursive_issubclass(PyObject *derived, PyObject *cls) 2606823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{ 2607ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (PyType_Check(cls) && PyType_Check(derived)) { 2608ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou /* Fast path (non-recursive) */ 2609ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls); 2610823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 2611ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (!check_class(derived, 2612ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou "issubclass() arg 1 must be a class")) 2613ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return -1; 2614ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (!check_class(cls, 2615ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou "issubclass() arg 2 must be a class" 2616ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou " or tuple of classes")) 2617ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return -1; 2618823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 2619ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return abstract_issubclass(derived, cls); 2620823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum} 262159d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum 26224f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonint 26234f65331483197a9909b19694688c55fdf9ca7a37Brett CannonPyObject_IsSubclass(PyObject *derived, PyObject *cls) 26244f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon{ 2625a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes static PyObject *name = NULL; 2626e7ba4956272a7105ea90dd505f70e5947aa27161Guido van Rossum PyObject *checker; 2627dcfe8e44c3f4bbfa0752fe1130c1561b94a62a94Georg Brandl 2628ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (PyTuple_Check(cls)) { 2629ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_ssize_t i; 2630ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_ssize_t n; 2631ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou int r = 0; 2632ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou 2633ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (Py_EnterRecursiveCall(" in __subclasscheck__")) 2634ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return -1; 2635ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou n = PyTuple_GET_SIZE(cls); 2636ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou for (i = 0; i < n; ++i) { 2637ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou PyObject *item = PyTuple_GET_ITEM(cls, i); 2638ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou r = PyObject_IsSubclass(derived, item); 2639ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (r != 0) 2640ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou /* either found it, or got an error */ 2641ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou break; 2642ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou } 2643ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_LeaveRecursiveCall(); 2644ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return r; 2645ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou } 264688fe5f9776bca1dee330a76776f831e12ea8b36dBenjamin Peterson 264788fe5f9776bca1dee330a76776f831e12ea8b36dBenjamin Peterson checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name); 2648adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum if (checker != NULL) { 2649adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum PyObject *res; 2650adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum int ok = -1; 2651ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou if (Py_EnterRecursiveCall(" in __subclasscheck__")) { 2652ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou Py_DECREF(checker); 2653adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum return ok; 2654ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou } 2655adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum res = PyObject_CallFunctionObjArgs(checker, derived, NULL); 2656adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum Py_LeaveRecursiveCall(); 2657adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum Py_DECREF(checker); 2658adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum if (res != NULL) { 2659adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum ok = PyObject_IsTrue(res); 2660adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum Py_DECREF(res); 2661adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum } 2662adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum return ok; 2663adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum } 266494c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson else if (PyErr_Occurred()) 266594c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson return -1; 2666ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return recursive_issubclass(derived, cls); 2667ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou} 2668ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou 2669ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrouint 2670ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou_PyObject_RealIsInstance(PyObject *inst, PyObject *cls) 2671ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou{ 2672ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return recursive_isinstance(inst, cls); 2673ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou} 2674ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou 2675ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrouint 2676ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls) 2677ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou{ 2678ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou return recursive_issubclass(derived, cls); 26794f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon} 26804f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon 26814f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon 268259d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject * 268359d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject_GetIter(PyObject *o) 268459d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum{ 268559d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum PyTypeObject *t = o->ob_type; 268659d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum getiterfunc f = NULL; 26873cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum f = t->tp_iter; 268859d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum if (f == NULL) { 268959d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum if (PySequence_Check(o)) 2690213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum return PySeqIter_New(o); 26910e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters return type_error("'%.200s' object is not iterable", o); 269259d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum } 2693213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum else { 2694213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum PyObject *res = (*f)(o); 2695213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum if (res != NULL && !PyIter_Check(res)) { 2696213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum PyErr_Format(PyExc_TypeError, 2697213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum "iter() returned non-iterator " 2698213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum "of type '%.100s'", 2699213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum res->ob_type->tp_name); 2700213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum Py_DECREF(res); 2701213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum res = NULL; 2702213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum } 2703213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum return res; 2704213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum } 2705213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum} 2706213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum 2707f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters/* Return next item. 2708f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If an error occurs, return NULL. PyErr_Occurred() will be true. 2709f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If the iteration terminates normally, return NULL and clear the 2710f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * PyExc_StopIteration exception (if it was set). PyErr_Occurred() 2711f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * will be false. 2712fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant * Else return the next object. PyErr_Occurred() will be false. 2713f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters */ 2714213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyObject * 2715213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyIter_Next(PyObject *iter) 2716213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum{ 2717f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters PyObject *result; 2718f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters result = (*iter->ob_type->tp_iternext)(iter); 2719f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters if (result == NULL && 2720f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters PyErr_Occurred() && 2721f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters PyErr_ExceptionMatches(PyExc_StopIteration)) 2722f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters PyErr_Clear(); 2723f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters return result; 272459d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum} 2725fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith 2726fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith 2727fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith/* 2728fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * Flatten a sequence of bytes() objects into a C array of 2729fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * NULL terminated string pointers with a NULL char* terminating the array. 2730fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * (ie: an argv or env list) 2731fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * 2732fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * Memory allocated for the returned list is allocated using malloc() and MUST 2733fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * be freed by the caller using a free() loop or _Py_FreeCharPArray(). 2734fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith */ 2735fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithchar *const * 2736fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith_PySequence_BytesToCharpArray(PyObject* self) 2737fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith{ 2738fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith char **array; 2739fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith Py_ssize_t i, argc; 2740fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith 2741fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith argc = PySequence_Size(self); 2742fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith if (argc == -1) 2743fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith return NULL; 2744fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith 2745fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith array = malloc((argc + 1) * sizeof(char *)); 2746fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith if (array == NULL) { 2747fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith PyErr_NoMemory(); 2748fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith return NULL; 2749fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith } 2750fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith for (i = 0; i < argc; ++i) { 2751fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith char *data; 2752fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith PyObject *item = PySequence_GetItem(self, i); 2753fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith data = PyBytes_AsString(item); 2754fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith if (data == NULL) { 2755fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith /* NULL terminate before freeing. */ 2756fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith array[i] = NULL; 2757fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith goto fail; 2758fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith } 2759fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith array[i] = strdup(data); 2760fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith if (!array[i]) { 2761fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith PyErr_NoMemory(); 2762fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith goto fail; 2763fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith } 2764fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith } 2765fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith array[argc] = NULL; 2766fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith 2767fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith return array; 2768fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith 2769fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithfail: 2770fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith _Py_FreeCharPArray(array); 2771fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith return NULL; 2772fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith} 2773fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith 2774fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith 2775fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith/* Free's a NULL terminated char** array of C strings. */ 2776fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithvoid 2777fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith_Py_FreeCharPArray(char *const array[]) 2778fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith{ 2779fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith Py_ssize_t i; 2780fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith for (i = 0; array[i] != NULL; ++i) { 2781fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith free(array[i]); 2782fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith } 2783fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith free((void*)array); 2784fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith} 2785