abstract.c revision 4668b000a1d9113394941ad39875c827634feb49
1e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum/* Abstract Object Interface (many thanks to Jim Fulton) */ 2cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 35a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 4e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum#include "Python.h" 5fa0b6ab01a962cbe624ad55fc5068a6d6b50bd0fGuido van Rossum#include <ctype.h> 65a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#include "structmember.h" /* we need the offsetof() macro from there */ 75a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 85a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \ 9c31896960a24202bd972e8c79d288cd3a80fac94Guido van Rossum Py_TPFLAGS_CHECKTYPES) 10e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 11cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Shorthands to return certain errors */ 12e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 13e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumstatic PyObject * 144201b9e42038c24a5d5f0ae856eba1c5afab90c3Fred Draketype_error(const char *msg) 15e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 16cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_SetString(PyExc_TypeError, msg); 17cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 18e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 19e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 20052b7e1cfb241b6154d38fd10815011e820f7f69Guido van Rossumstatic PyObject * 21799124718ddfbb95440470037d8d7760b821646fFred Drakenull_error(void) 22e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 23cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (!PyErr_Occurred()) 24cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_SetString(PyExc_SystemError, 25cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum "null argument to internal routine"); 26cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 27e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 28e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 29cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on any object */ 30cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 31e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint 32799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_Cmp(PyObject *o1, PyObject *o2, int *result) 33e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 34cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int r; 35cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 36cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o1 == NULL || o2 == NULL) { 37cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 38cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 39e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 40cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum r = PyObject_Compare(o1, o2); 41cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (PyErr_Occurred()) 42cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 43cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum *result = r; 44e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum return 0; 45e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 46e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 47e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 48799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_Type(PyObject *o) 49e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 50e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum PyObject *v; 51e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 52cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 53cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 54e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum v = (PyObject *)o->ob_type; 55e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum Py_INCREF(v); 56e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum return v; 57e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 58e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 59e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint 606253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyObject_Size(PyObject *o) 61e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 62cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 63e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 64cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) { 65cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 66cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 67cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 68e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 69cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_sequence; 70cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_length) 71cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_length(o); 72e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 736253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy Hylton return PyMapping_Size(o); 74e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 75e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 76cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyObject_Length 77cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburgint 78cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyObject_Length(PyObject *o) 79cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{ 80cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg return PyObject_Size(o); 81cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg} 82cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyObject_Length PyObject_Size 83cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg 84e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 85799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_GetItem(PyObject *o, PyObject *key) 86e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 87cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyMappingMethods *m; 88e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 89cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL || key == NULL) 90cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 91e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 92cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_mapping; 93cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->mp_subscript) 94cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->mp_subscript(o, key); 95e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 9621308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum if (o->ob_type->tp_as_sequence) { 9721308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum if (PyInt_Check(key)) 9821308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum return PySequence_GetItem(o, PyInt_AsLong(key)); 990f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling else if (PyLong_Check(key)) { 1000f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling long key_value = PyLong_AsLong(key); 1010f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling if (key_value == -1 && PyErr_Occurred()) 1020f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return NULL; 1030f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return PySequence_GetItem(o, key_value); 1040f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling } 10521308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum return type_error("sequence index must be integer"); 10621308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum } 107cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 108cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("unsubscriptable object"); 109e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 110e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 111e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint 112799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_SetItem(PyObject *o, PyObject *key, PyObject *value) 113e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 114cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyMappingMethods *m; 115e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 116cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL || key == NULL || value == NULL) { 117cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 118cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 119cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 120cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_mapping; 121cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->mp_ass_subscript) 122cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->mp_ass_subscript(o, key, value); 123cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 12421308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum if (o->ob_type->tp_as_sequence) { 12521308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum if (PyInt_Check(key)) 12621308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum return PySequence_SetItem(o, PyInt_AsLong(key), value); 1270f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling else if (PyLong_Check(key)) { 1280f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling long key_value = PyLong_AsLong(key); 1290f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling if (key_value == -1 && PyErr_Occurred()) 1300f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return -1; 1310f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return PySequence_SetItem(o, key_value, value); 1320f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling } 13321308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum type_error("sequence index must be integer"); 13421308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum return -1; 13521308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum } 136e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 137cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum type_error("object does not support item assignment"); 138cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 139e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 140e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1416cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint 142799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_DelItem(PyObject *o, PyObject *key) 1436cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{ 144cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyMappingMethods *m; 145cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 146cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL || key == NULL) { 147cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 148cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 149cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 150cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_mapping; 151cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->mp_ass_subscript) 152cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->mp_ass_subscript(o, key, (PyObject*)NULL); 1536cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 15421308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum if (o->ob_type->tp_as_sequence) { 15521308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum if (PyInt_Check(key)) 15621308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum return PySequence_DelItem(o, PyInt_AsLong(key)); 1570f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling else if (PyLong_Check(key)) { 1580f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling long key_value = PyLong_AsLong(key); 1590f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling if (key_value == -1 && PyErr_Occurred()) 1600f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return -1; 1610f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling return PySequence_DelItem(o, key_value); 1620f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling } 16321308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum type_error("sequence index must be integer"); 16421308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum return -1; 16521308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum } 1666cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 167cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum type_error("object does not support item deletion"); 168cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1696cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum} 1706cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 1714c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsCharBuffer(PyObject *obj, 1724c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum const char **buffer, 1734c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum int *buffer_len) 1744c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{ 1754c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyBufferProcs *pb; 1764c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum const char *pp; 1774c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum int len; 1784c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 1794c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (obj == NULL || buffer == NULL || buffer_len == NULL) { 1804c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum null_error(); 1814c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return -1; 1824c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 1834c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb = obj->ob_type->tp_as_buffer; 1844c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if ( pb == NULL || 1854c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb->bf_getcharbuffer == NULL || 1864c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb->bf_getsegcount == NULL ) { 1874c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyErr_SetString(PyExc_TypeError, 1884c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum "expected a character buffer object"); 1894c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum goto onError; 1904c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 1914c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) { 1924c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyErr_SetString(PyExc_TypeError, 1934c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum "expected a single-segment buffer object"); 1944c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum goto onError; 1954c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 1964c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum len = (*pb->bf_getcharbuffer)(obj,0,&pp); 1974c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (len < 0) 1984c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum goto onError; 1994c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum *buffer = pp; 2004c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum *buffer_len = len; 2014c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return 0; 2024c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2034c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum onError: 2044c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return -1; 2054c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum} 2064c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2074c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsReadBuffer(PyObject *obj, 2084c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum const void **buffer, 2094c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum int *buffer_len) 2104c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{ 2114c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyBufferProcs *pb; 2124c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum void *pp; 2134c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum int len; 2144c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2154c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (obj == NULL || buffer == NULL || buffer_len == NULL) { 2164c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum null_error(); 2174c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return -1; 2184c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 2194c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb = obj->ob_type->tp_as_buffer; 2204c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if ( pb == NULL || 2214c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb->bf_getreadbuffer == NULL || 2224c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb->bf_getsegcount == NULL ) { 2234c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyErr_SetString(PyExc_TypeError, 2244c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum "expected a readable buffer object"); 2254c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum goto onError; 2264c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 2274c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) { 2284c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyErr_SetString(PyExc_TypeError, 2294c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum "expected a single-segment buffer object"); 2304c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum goto onError; 2314c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 2324c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum len = (*pb->bf_getreadbuffer)(obj,0,&pp); 2334c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (len < 0) 2344c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum goto onError; 2354c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum *buffer = pp; 2364c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum *buffer_len = len; 2374c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return 0; 2384c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2394c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum onError: 2404c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return -1; 2414c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum} 2424c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2434c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsWriteBuffer(PyObject *obj, 2444c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum void **buffer, 2454c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum int *buffer_len) 2464c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{ 2474c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyBufferProcs *pb; 2484c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum void*pp; 2494c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum int len; 2504c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2514c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (obj == NULL || buffer == NULL || buffer_len == NULL) { 2524c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum null_error(); 2534c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return -1; 2544c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 2554c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb = obj->ob_type->tp_as_buffer; 2564c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if ( pb == NULL || 2574c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb->bf_getwritebuffer == NULL || 2584c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum pb->bf_getsegcount == NULL ) { 2594c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyErr_SetString(PyExc_TypeError, 2604c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum "expected a writeable buffer object"); 2614c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum goto onError; 2624c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 2634c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) { 2644c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyErr_SetString(PyExc_TypeError, 2654c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum "expected a single-segment buffer object"); 2664c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum goto onError; 2674c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 2684c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum len = (*pb->bf_getwritebuffer)(obj,0,&pp); 2694c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (len < 0) 2704c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum goto onError; 2714c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum *buffer = pp; 2724c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum *buffer_len = len; 2734c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return 0; 2744c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 2754c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum onError: 2764c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return -1; 2774c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum} 2784c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum 279cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on numbers */ 280cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 281cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 282799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Check(PyObject *o) 283e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 284cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return o && o->ob_type->tp_as_number; 285e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 286e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 287cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Binary operators */ 288e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2895a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/* New style number protocol support */ 290e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2915a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_SLOT(x) offsetof(PyNumberMethods, x) 2925a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_BINOP(nb_methods, slot) \ 2935a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer ((binaryfunc*)(& ((char*)nb_methods)[slot] )) 2945a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_TERNOP(nb_methods, slot) \ 2955a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer ((ternaryfunc*)(& ((char*)nb_methods)[slot] )) 296e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 2975a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/* 2985a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Calling scheme used for binary operations: 299e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 3005a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer v w Action 3015a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer ------------------------------------------------------------------- 3025a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer new new v.op(v,w), w.op(v,w) 3035a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer new old v.op(v,w), coerce(v,w), v.op(v,w) 3045a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer old new w.op(v,w), coerce(v,w), v.op(v,w) 3055a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer old old coerce(v,w), v.op(v,w) 306e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 3075a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Legend: 3085a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer ------- 3095a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer * new == new style number 3105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer * old == old style number 3115a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer * Action indicates the order in which operations are tried until either 3125a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer a valid result is produced or an error occurs. 3135a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 3145a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */ 3155a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 3165a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject * 3175a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op1(PyObject *v, PyObject *w, const int op_slot) 3185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{ 3195a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *x; 3205a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer binaryfunc *slot; 3215a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v)) { 3225a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer slot = NB_BINOP(v->ob_type->tp_as_number, op_slot); 3235a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (*slot) { 3245a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer x = (*slot)(v, w); 3255a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (x != Py_NotImplemented) { 3265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 3275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3285a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(x); /* can't do it */ 3295a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3305a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (v->ob_type == w->ob_type) { 3315a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer goto binop_error; 3325a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3335a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3345a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) { 3355a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer slot = NB_BINOP(w->ob_type->tp_as_number, op_slot); 3365a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (*slot) { 3375a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer x = (*slot)(v, w); 3385a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (x != Py_NotImplemented) { 3395a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 3405a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3415a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(x); /* can't do it */ 3425a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3435a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3445a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) { 3455a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer int err = PyNumber_CoerceEx(&v, &w); 3465a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (err < 0) { 347e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum return NULL; 3485a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3495a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (err == 0) { 3505a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyNumberMethods *mv = v->ob_type->tp_as_number; 3515a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (mv) { 3525a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer slot = NB_BINOP(mv, op_slot); 3535a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (*slot) { 3545a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *x = (*slot)(v, w); 3555a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(v); 3565a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(w); 3575a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 3585a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3595a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 3605a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer /* CoerceEx incremented the reference counts */ 3615a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(v); 3625a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(w); 3635a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 364e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 3655a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinop_error: 3665a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_INCREF(Py_NotImplemented); 3675a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return Py_NotImplemented; 368e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 3695a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 3705a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject * 3715a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) 372e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 3735a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *result = binary_op1(v, w, op_slot); 3745a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (result == Py_NotImplemented) { 3755a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(Py_NotImplemented); 3765a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyErr_Format(PyExc_TypeError, 3775a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer "unsupported operand type(s) for %s", op_name); 3785a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return NULL; 379e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 3805a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return result; 381e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 382e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 383cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 3845a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/* 3855a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Calling scheme used for ternary operations: 386e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 3875a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer v w z Action 3885a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer ------------------------------------------------------------------- 3895a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z) 3905a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 3915a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 3925a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 3935a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 3945a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 3955a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 3965a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer old old old coerce(v,w,z), v.op(v,w,z) 397e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 3985a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Legend: 3995a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer ------- 4005a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer * new == new style number 4015a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer * old == old style number 4025a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer * Action indicates the order in which operations are tried until either 4035a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer a valid result is produced or an error occurs. 4045a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and 4055a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer only if z != Py_None; if z == Py_None, then it is treated as absent 4065a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer variable and only coerce(v,w) is tried. 4075a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 4085a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */ 409cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 4105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject * 4115a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerternary_op(PyObject *v, 4125a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *w, 4135a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *z, 4145a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer const int op_slot, 4155a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer const char *op_name) 4165a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{ 4175a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyNumberMethods *mv, *mw, *mz; 4185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer register PyObject *x = NULL; 4195a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer register ternaryfunc *slot; 4205a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 4215a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer mv = v->ob_type->tp_as_number; 4225a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (mv != NULL && NEW_STYLE_NUMBER(v)) { 4235a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer /* try v.op(v,w,z) */ 4245a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer slot = NB_TERNOP(mv, op_slot); 4255a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (*slot) { 4265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer x = (*slot)(v, w, z); 4275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (x != Py_NotImplemented) 4285a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 4295a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer /* Can't do it... fall through */ 4305a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(x); 4315a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 4325a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (v->ob_type == w->ob_type && 4335a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer (z == Py_None || z->ob_type == v->ob_type)) { 4345a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer goto ternary_error; 4355a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 436e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 4375a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer mw = w->ob_type->tp_as_number; 4385a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (mw != NULL && NEW_STYLE_NUMBER(w)) { 4395a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer /* try w.op(v,w,z) */ 4405a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer slot = NB_TERNOP(mw,op_slot); 4415a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (*slot) { 4425a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer x = (*slot)(v, w, z); 4435a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (x != Py_NotImplemented) 4445a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 4455a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer /* Can't do it... fall through */ 4465a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(x); 4475a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 4485a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (NEW_STYLE_NUMBER(v) && 4495a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer (z == Py_None || z->ob_type == v->ob_type)) { 4505a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer goto ternary_error; 4515a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 452e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 4535a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer mz = z->ob_type->tp_as_number; 4545a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (mz != NULL && NEW_STYLE_NUMBER(z)) { 4555a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer /* try: z.op(v,w,z) */ 4565a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer slot = NB_TERNOP(mz, op_slot); 4575a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (*slot) { 4585a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer x = (*slot)(v, w, z); 4595a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (x != Py_NotImplemented) 4605a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 4615a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer /* Can't do it... fall through */ 4625a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(x); 4631991ddc3e134e89e6c15d60e180fc67ad4c1ca01Andrew M. Kuchling } 4645a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 4655a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 4665a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) || 4675a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer (z != Py_None && !NEW_STYLE_NUMBER(z))) { 4685a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer /* we have an old style operand, coerce */ 4695a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *v1, *z1, *w2, *z2; 4705a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer int c; 4715a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 4725a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer c = PyNumber_Coerce(&v, &w); 4735a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (c != 0) 4745a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer goto error3; 4755a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 4765a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer /* Special case: if the third argument is None, it is 4775a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer treated as absent argument and not coerced. */ 4785a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (z == Py_None) { 4795a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (v->ob_type->tp_as_number) { 4805a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer slot = NB_TERNOP(v->ob_type->tp_as_number, 4815a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer op_slot); 4825a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (*slot) 4835a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer x = (*slot)(v, w, z); 4845a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer else 4855a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer c = -1; 4865a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 4875a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer else 4885a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer c = -1; 4895a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer goto error2; 4901991ddc3e134e89e6c15d60e180fc67ad4c1ca01Andrew M. Kuchling } 4915a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer v1 = v; 4925a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer z1 = z; 4935a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer c = PyNumber_Coerce(&v1, &z1); 4945a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (c != 0) 4955a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer goto error2; 4965a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer w2 = w; 4975a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer z2 = z1; 4985a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer c = PyNumber_Coerce(&w2, &z2); 4995a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (c != 0) 5005a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer goto error1; 5015a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 5025a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (v1->ob_type->tp_as_number != NULL) { 5035a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer slot = NB_TERNOP(v1->ob_type->tp_as_number, 5045a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer op_slot); 5055a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (*slot) 5065a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer x = (*slot)(v1, w2, z2); 5075a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer else 5085a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer c = -1; 5091991ddc3e134e89e6c15d60e180fc67ad4c1ca01Andrew M. Kuchling } 5105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer else 5115a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer c = -1; 5125a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 5135a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(w2); 5145a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(z2); 5155a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer error1: 5165a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(v1); 5175a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(z1); 5185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer error2: 5195a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(v); 5205a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(w); 5215a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer error3: 5225a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (c >= 0) 5235a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 524e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 5255a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 5265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerternary_error: 5275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for %s", 5285a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer op_name); 5295a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return NULL; 530e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 531e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 5325a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define BINARY_FUNC(func, op, op_name) \ 5335a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject * \ 5345a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer func(PyObject *v, PyObject *w) { \ 5355a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_op(v, w, NB_SLOT(op), op_name); \ 5365a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 5375a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 5385a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Or, nb_or, "|") 5395a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Xor, nb_xor, "^") 5405a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_And, nb_and, "&") 5415a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<") 5425a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>") 5435a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Subtract, nb_subtract, "-") 5445a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Multiply, nb_multiply, "*") 5455a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Divide, nb_divide, "/") 5465a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()") 5475a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 548e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 5495a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerPyNumber_Add(PyObject *v, PyObject *w) 550e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 5515a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *result = binary_op1(v, w, NB_SLOT(nb_add)); 5525a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (result == Py_NotImplemented) { 5535a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PySequenceMethods *m = v->ob_type->tp_as_sequence; 5545a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(Py_NotImplemented); 5555a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (m && m->sq_concat) { 5565a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer result = (*m->sq_concat)(v, w); 5575a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 5585a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer else { 5595a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyErr_SetString(PyExc_TypeError, 5605a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer "unsupported operand types for +"); 5615a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer result = NULL; 5625a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 563e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 5645a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return result; 565e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 566e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 567e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 5684668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_FloorDivide(PyObject *v, PyObject *w) 5694668b000a1d9113394941ad39875c827634feb49Guido van Rossum{ 5704668b000a1d9113394941ad39875c827634feb49Guido van Rossum /* XXX tp_flags test */ 5714668b000a1d9113394941ad39875c827634feb49Guido van Rossum return binary_op(v, w, NB_SLOT(nb_floor_divide), "//"); 5724668b000a1d9113394941ad39875c827634feb49Guido van Rossum} 5734668b000a1d9113394941ad39875c827634feb49Guido van Rossum 5744668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject * 5754668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_TrueDivide(PyObject *v, PyObject *w) 5764668b000a1d9113394941ad39875c827634feb49Guido van Rossum{ 5774668b000a1d9113394941ad39875c827634feb49Guido van Rossum /* XXX tp_flags test */ 5784668b000a1d9113394941ad39875c827634feb49Guido van Rossum return binary_op(v, w, NB_SLOT(nb_true_divide), "/"); 5794668b000a1d9113394941ad39875c827634feb49Guido van Rossum} 5804668b000a1d9113394941ad39875c827634feb49Guido van Rossum 5814668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject * 582799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Remainder(PyObject *v, PyObject *w) 583e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 584fa0b6ab01a962cbe624ad55fc5068a6d6b50bd0fGuido van Rossum if (PyString_Check(v)) 585e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum return PyString_Format(v, w); 5864c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum else if (PyUnicode_Check(v)) 5874c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return PyUnicode_Format(v, w); 5885a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_op(v, w, NB_SLOT(nb_remainder), "%"); 589e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 590e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 591e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 592799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Power(PyObject *v, PyObject *w, PyObject *z) 593e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 5945a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()"); 595e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 596e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 597e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* Binary in-place operators */ 598e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 599e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* The in-place operators are defined to fall back to the 'normal', 6005a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer non in-place operations, if the in-place methods are not in place. 601e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 6025a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer - If the left hand object has the appropriate struct members, and 6035a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer they are filled, call the appropriate function and return the 6045a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer result. No coercion is done on the arguments; the left-hand object 6055a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer is the one the operation is performed on, and it's up to the 6065a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer function to deal with the right-hand object. 607e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 6085a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer - Otherwise, in-place modification is not supported. Handle it exactly as 6095a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer a non in-place operation of the same kind. 610e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 611e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters */ 612e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 613e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS) 614e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 6155a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject * 6165a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot, 6175a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer const char *op_name) 6185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{ 6195a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyNumberMethods *mv = v->ob_type->tp_as_number; 6205a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (mv != NULL && HASINPLACE(v)) { 6215a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer binaryfunc *slot = NB_BINOP(mv, iop_slot); 6225a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (*slot) { 6235a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject *x = (*slot)(v, w); 6245a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (x != Py_NotImplemented) { 6255a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return x; 6265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 6275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer Py_DECREF(x); 6285a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 629e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 6305a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_op(v, w, op_slot, op_name); 631e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 632e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 6335a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define INPLACE_BINOP(func, iop, op, op_name) \ 6345a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer PyObject * \ 6355a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer func(PyObject *v, PyObject *w) { \ 6365a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \ 637e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 638e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 6395a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=") 6405a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=") 6415a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=") 6425a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=") 6435a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=") 6445a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=") 6455a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=") 646e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 647e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 6484668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w) 6494668b000a1d9113394941ad39875c827634feb49Guido van Rossum{ 6504668b000a1d9113394941ad39875c827634feb49Guido van Rossum /* XXX tp_flags test */ 6514668b000a1d9113394941ad39875c827634feb49Guido van Rossum return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide), 6524668b000a1d9113394941ad39875c827634feb49Guido van Rossum NB_SLOT(nb_floor_divide), "//="); 6534668b000a1d9113394941ad39875c827634feb49Guido van Rossum} 6544668b000a1d9113394941ad39875c827634feb49Guido van Rossum 6554668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject * 6564668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w) 6574668b000a1d9113394941ad39875c827634feb49Guido van Rossum{ 6584668b000a1d9113394941ad39875c827634feb49Guido van Rossum /* XXX tp_flags test */ 6594668b000a1d9113394941ad39875c827634feb49Guido van Rossum return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide), 6604668b000a1d9113394941ad39875c827634feb49Guido van Rossum NB_SLOT(nb_true_divide), "/="); 6614668b000a1d9113394941ad39875c827634feb49Guido van Rossum} 6624668b000a1d9113394941ad39875c827634feb49Guido van Rossum 6634668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject * 664e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceAdd(PyObject *v, PyObject *w) 665e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 6665a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer binaryfunc f = NULL; 667e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 668bb8be93a50b0293b812634575a493c4eaf676773Guido van Rossum if (v->ob_type->tp_as_sequence != NULL) { 6695a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (HASINPLACE(v)) 6705a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer f = v->ob_type->tp_as_sequence->sq_inplace_concat; 6715a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (f == NULL) 6725a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer f = v->ob_type->tp_as_sequence->sq_concat; 673bb8be93a50b0293b812634575a493c4eaf676773Guido van Rossum if (f != NULL) 674bb8be93a50b0293b812634575a493c4eaf676773Guido van Rossum return (*f)(v, w); 675bb8be93a50b0293b812634575a493c4eaf676773Guido van Rossum } 6765a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+="); 677e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 678e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 679e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 680e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceMultiply(PyObject *v, PyObject *w) 681e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 682f2b332dc7e94f5df1965913c6be443980e8727feThomas Wouters PyObject * (*g)(PyObject *, int) = NULL; 6835a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (HASINPLACE(v) && v->ob_type->tp_as_sequence && 6845a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) { 6855a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer long n; 686e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (PyInt_Check(w)) { 6875a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer n = PyInt_AsLong(w); 688e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 689e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters else if (PyLong_Check(w)) { 6905a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer n = PyLong_AsLong(w); 6915a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (n == -1 && PyErr_Occurred()) 6925a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return NULL; 693e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 694e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters else { 6955a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return type_error("can't multiply sequence to non-int"); 696e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 6975a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return (*g)(v, (int)n); 698e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 6995a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_iop(v, w, NB_SLOT(nb_inplace_multiply), 7005a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer NB_SLOT(nb_multiply), "*="); 701e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 702e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 703e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 704e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 705e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 706e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceRemainder(PyObject *v, PyObject *w) 707e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 708e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (PyString_Check(v)) 709e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return PyString_Format(v, w); 710e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters else if (PyUnicode_Check(v)) 711e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return PyUnicode_Format(v, w); 712e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters else 7135a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return binary_iop(v, w, NB_SLOT(nb_inplace_remainder), 7145a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer NB_SLOT(nb_remainder), "%="); 715e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 716e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 7175a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer 718e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 719e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z) 720e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 7215a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer if (HASINPLACE(v) && v->ob_type->tp_as_number && 7225a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer v->ob_type->tp_as_number->nb_inplace_power != NULL) { 7235a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**="); 7245a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer } 7255a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer else { 7265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer return ternary_op(v, w, z, NB_SLOT(nb_power), "**="); 727e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters } 728e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 729e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 730e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 731cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Unary operators and functions */ 732e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 733e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 734799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Negative(PyObject *o) 735e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 736cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 737cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 738cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 739cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 740cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 741cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_negative) 742cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return (*m->nb_negative)(o); 743cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 744cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("bad operand type for unary -"); 745e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 746e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 747e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 748799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Positive(PyObject *o) 749e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 750cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 751cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 752cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 753cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 754cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 755cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_positive) 756cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return (*m->nb_positive)(o); 757cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 758cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("bad operand type for unary +"); 759e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 760e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 761e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 762799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Invert(PyObject *o) 763e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 764cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 765cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 766cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 767cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 768cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 769cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_invert) 770cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return (*m->nb_invert)(o); 771cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 772cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("bad operand type for unary ~"); 773e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 774e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 775e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 776799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Absolute(PyObject *o) 777e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 778cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 779e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 780cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 781cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 782cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 783cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_absolute) 784cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->nb_absolute(o); 785e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 786cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("bad operand type for abs()"); 787e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 788e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 7899e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum/* Add a check for embedded NULL-bytes in the argument. */ 7909e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossumstatic PyObject * 791799124718ddfbb95440470037d8d7760b821646fFred Drakeint_from_string(const char *s, int len) 7929e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum{ 7939e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum char *end; 7949e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum PyObject *x; 7959e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum 7969e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum x = PyInt_FromString((char*)s, &end, 10); 7979e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (x == NULL) 7989e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return NULL; 7999e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (end != s + len) { 8009e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum PyErr_SetString(PyExc_ValueError, 8019e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum "null byte in argument for int()"); 8029e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum Py_DECREF(x); 8039e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return NULL; 8049e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum } 8059e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return x; 8069e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum} 8079e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum 808e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 809799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Int(PyObject *o) 810e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 811cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 8124c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum const char *buffer; 8134c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum int buffer_len; 814e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 815cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 816cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 8179e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (PyInt_Check(o)) { 8189e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum Py_INCREF(o); 8199e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return o; 8209e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum } 821cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (PyString_Check(o)) 8229e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return int_from_string(PyString_AS_STRING(o), 8239e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum PyString_GET_SIZE(o)); 8249e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (PyUnicode_Check(o)) 8259e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o), 8269e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum PyUnicode_GET_SIZE(o), 8279e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum 10); 828cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 829cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_int) 830cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->nb_int(o); 8314c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) 8329e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return int_from_string((char*)buffer, buffer_len); 833e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 834cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("object can't be converted to int"); 835e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 836e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 8379e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum/* Add a check for embedded NULL-bytes in the argument. */ 838226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsawstatic PyObject * 839799124718ddfbb95440470037d8d7760b821646fFred Drakelong_from_string(const char *s, int len) 840226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw{ 8414c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum char *end; 842226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw PyObject *x; 843226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw 8444c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum x = PyLong_FromString((char*)s, &end, 10); 8459e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (x == NULL) 846226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw return NULL; 8479e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (end != s + len) { 848226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw PyErr_SetString(PyExc_ValueError, 849226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw "null byte in argument for long()"); 8509e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum Py_DECREF(x); 851226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw return NULL; 852226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw } 853226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw return x; 854226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw} 855226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw 856e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 857799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Long(PyObject *o) 858e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 859cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 8604c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum const char *buffer; 8614c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum int buffer_len; 862e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 863cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 864cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 8659e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (PyLong_Check(o)) { 8669e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum Py_INCREF(o); 8679e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return o; 8689e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum } 869cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (PyString_Check(o)) 870226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw /* need to do extra error checking that PyLong_FromString() 871226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw * doesn't do. In particular long('9.5') must raise an 872226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw * exception, not truncate the float. 873226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw */ 8744c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return long_from_string(PyString_AS_STRING(o), 8754c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum PyString_GET_SIZE(o)); 8769e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (PyUnicode_Check(o)) 8779e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum /* The above check is done in PyLong_FromUnicode(). */ 8789e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o), 8799e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum PyUnicode_GET_SIZE(o), 8809e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum 10); 881cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_number; 882cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->nb_long) 883cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->nb_long(o); 8844c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) 8854c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return long_from_string(buffer, buffer_len); 886e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 887cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("object can't be converted to long"); 888e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 889e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 890e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 891799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Float(PyObject *o) 892e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 893cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyNumberMethods *m; 894e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 895cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 896cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 8979e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum if (PyFloat_Check(o)) { 8989e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum Py_INCREF(o); 8999e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum return o; 9009e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum } 9014c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (!PyString_Check(o)) { 9024c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum m = o->ob_type->tp_as_number; 9034c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum if (m && m->nb_float) 9044c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return m->nb_float(o); 9054c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum } 9064c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum return PyFloat_FromString(o, NULL); 907e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 908e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 909cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on sequences */ 910e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 911cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 912799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Check(PyObject *s) 913e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 914cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return s != NULL && s->ob_type->tp_as_sequence; 915e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 916e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 917cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 9186253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPySequence_Size(PyObject *s) 919e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 920cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 921e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 922cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 923cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 924cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 925cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 926e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 927cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 928cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_length) 929cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_length(s); 930e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 931cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum type_error("len() of unsized object"); 932cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 933e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 934e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 935cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PySequence_Length 936cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburgint 937cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPySequence_Length(PyObject *s) 938cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{ 939cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg return PySequence_Size(s); 940cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg} 941cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PySequence_Length PySequence_Size 942cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg 943e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 944799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Concat(PyObject *s, PyObject *o) 945e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 946cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 947cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 948cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL || o == NULL) 949cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 950e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 951cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 952cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_concat) 953cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_concat(s, o); 954e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 955cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("object can't be concatenated"); 956e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 957e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 958e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 959799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Repeat(PyObject *o, int count) 960e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 961cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 962e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 963cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) 964cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 965e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 966cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_sequence; 967cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_repeat) 968cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_repeat(o, count); 969cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 970cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("object can't be repeated"); 971e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 972e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 973e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 974e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPySequence_InPlaceConcat(PyObject *s, PyObject *o) 975e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 976e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters PySequenceMethods *m; 977e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 978e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (s == NULL || o == NULL) 979e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return null_error(); 980e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 981e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters m = s->ob_type->tp_as_sequence; 982e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (m && HASINPLACE(s) && m->sq_inplace_concat) 983e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return m->sq_inplace_concat(s, o); 984e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (m && m->sq_concat) 985e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return m->sq_concat(s, o); 986e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 987e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return type_error("object can't be concatenated"); 988e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 989e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 990e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 991e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPySequence_InPlaceRepeat(PyObject *o, int count) 992e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{ 993e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters PySequenceMethods *m; 994e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 995e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (o == NULL) 996e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return null_error(); 997e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 998e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters m = o->ob_type->tp_as_sequence; 999e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (m && HASINPLACE(o) && m->sq_inplace_repeat) 1000e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return m->sq_inplace_repeat(o, count); 1001e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters if (m && m->sq_repeat) 1002e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return m->sq_repeat(o, count); 1003e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1004e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters return type_error("object can't be repeated"); 1005e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters} 1006e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters 1007e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject * 1008799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_GetItem(PyObject *s, int i) 1009e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1010cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 1011cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1012cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) 1013cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1014cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1015cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1016cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_item) { 1017cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i < 0) { 1018cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m->sq_length) { 1019cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int l = (*m->sq_length)(s); 1020cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1021cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1022cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i += l; 1023cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1024cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1025cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_item(s, i); 1026cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1027e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1028cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("unindexable object"); 1029e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1030e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 10311d75a79c009e500923128716a02efbe86135e64eThomas Woutersstatic PyObject * 10321d75a79c009e500923128716a02efbe86135e64eThomas Wouterssliceobj_from_intint(int i, int j) 10331d75a79c009e500923128716a02efbe86135e64eThomas Wouters{ 10341d75a79c009e500923128716a02efbe86135e64eThomas Wouters PyObject *start, *end, *slice; 10351d75a79c009e500923128716a02efbe86135e64eThomas Wouters start = PyInt_FromLong((long)i); 10361d75a79c009e500923128716a02efbe86135e64eThomas Wouters if (!start) 10371d75a79c009e500923128716a02efbe86135e64eThomas Wouters return NULL; 10381d75a79c009e500923128716a02efbe86135e64eThomas Wouters end = PyInt_FromLong((long)j); 10391d75a79c009e500923128716a02efbe86135e64eThomas Wouters if (!end) { 10401d75a79c009e500923128716a02efbe86135e64eThomas Wouters Py_DECREF(start); 10411d75a79c009e500923128716a02efbe86135e64eThomas Wouters return NULL; 10421d75a79c009e500923128716a02efbe86135e64eThomas Wouters } 10431d75a79c009e500923128716a02efbe86135e64eThomas Wouters slice = PySlice_New(start, end, NULL); 10441d75a79c009e500923128716a02efbe86135e64eThomas Wouters Py_DECREF(start); 10451d75a79c009e500923128716a02efbe86135e64eThomas Wouters Py_DECREF(end); 10461d75a79c009e500923128716a02efbe86135e64eThomas Wouters return slice; 10471d75a79c009e500923128716a02efbe86135e64eThomas Wouters} 10481d75a79c009e500923128716a02efbe86135e64eThomas Wouters 1049e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1050799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_GetSlice(PyObject *s, int i1, int i2) 1051e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1052cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 10531d75a79c009e500923128716a02efbe86135e64eThomas Wouters PyMappingMethods *mp; 1054cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1055cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (!s) return null_error(); 1056cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1057cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1058cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_slice) { 1059cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i1 < 0 || i2 < 0) { 1060cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m->sq_length) { 1061cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int l = (*m->sq_length)(s); 1062cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1063cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1064cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i1 < 0) 1065cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i1 += l; 1066cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i2 < 0) 1067cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i2 += l; 1068cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1069cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1070cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_slice(s, i1, i2); 10711d75a79c009e500923128716a02efbe86135e64eThomas Wouters } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) { 10721d75a79c009e500923128716a02efbe86135e64eThomas Wouters PyObject *res; 10731d75a79c009e500923128716a02efbe86135e64eThomas Wouters PyObject *slice = sliceobj_from_intint(i1, i2); 10741d75a79c009e500923128716a02efbe86135e64eThomas Wouters if (!slice) 10751d75a79c009e500923128716a02efbe86135e64eThomas Wouters return NULL; 10761d75a79c009e500923128716a02efbe86135e64eThomas Wouters res = mp->mp_subscript(s, slice); 10771d75a79c009e500923128716a02efbe86135e64eThomas Wouters Py_DECREF(slice); 10781d75a79c009e500923128716a02efbe86135e64eThomas Wouters return res; 1079cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 10804669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum 1081cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("unsliceable object"); 1082e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1083e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1084e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint 1085799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_SetItem(PyObject *s, int i, PyObject *o) 1086e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1087cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 1088cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1089cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 1090cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1091cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1092cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1093cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1094cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1095cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_ass_item) { 1096cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i < 0) { 1097cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m->sq_length) { 1098cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int l = (*m->sq_length)(s); 1099cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1100ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum return -1; 1101cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i += l; 1102cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1103cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1104cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_ass_item(s, i, o); 1105cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1106cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1107cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum type_error("object doesn't support item assignment"); 1108cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1109e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1110e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 11116cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint 1112799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_DelItem(PyObject *s, int i) 11136cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{ 1114cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 1115cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1116cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 1117cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1118cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1119cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1120cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1121cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1122cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_ass_item) { 1123cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i < 0) { 1124cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m->sq_length) { 1125cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int l = (*m->sq_length)(s); 1126cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1127ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum return -1; 1128cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i += l; 1129cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1130cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1131cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_ass_item(s, i, (PyObject *)NULL); 1132cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1133cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1134cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum type_error("object doesn't support item deletion"); 1135cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 11366cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum} 11376cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 1138cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1139799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o) 1140e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1141cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 11421d75a79c009e500923128716a02efbe86135e64eThomas Wouters PyMappingMethods *mp; 1143e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1144cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 1145cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1146cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1147cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1148e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1149cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1150cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_ass_slice) { 1151cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i1 < 0 || i2 < 0) { 1152cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m->sq_length) { 1153cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int l = (*m->sq_length)(s); 1154cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1155ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum return -1; 1156cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i1 < 0) 1157cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i1 += l; 1158cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i2 < 0) 1159cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i2 += l; 1160cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1161cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1162cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_ass_slice(s, i1, i2, o); 11631d75a79c009e500923128716a02efbe86135e64eThomas Wouters } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) { 11641d75a79c009e500923128716a02efbe86135e64eThomas Wouters int res; 11651d75a79c009e500923128716a02efbe86135e64eThomas Wouters PyObject *slice = sliceobj_from_intint(i1, i2); 11661d75a79c009e500923128716a02efbe86135e64eThomas Wouters if (!slice) 11671d75a79c009e500923128716a02efbe86135e64eThomas Wouters return -1; 11681d75a79c009e500923128716a02efbe86135e64eThomas Wouters res = mp->mp_ass_subscript(s, slice, o); 11691d75a79c009e500923128716a02efbe86135e64eThomas Wouters Py_DECREF(slice); 11701d75a79c009e500923128716a02efbe86135e64eThomas Wouters return res; 1171cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 11721d75a79c009e500923128716a02efbe86135e64eThomas Wouters 1173cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum type_error("object doesn't support slice assignment"); 1174cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1175e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1176e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1177cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1178799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_DelSlice(PyObject *s, int i1, int i2) 11796cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{ 1180cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PySequenceMethods *m; 11816cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 1182cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL) { 1183cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1184cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1185cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 11866cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 1187cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = s->ob_type->tp_as_sequence; 1188cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->sq_ass_slice) { 1189cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i1 < 0 || i2 < 0) { 1190cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m->sq_length) { 1191cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int l = (*m->sq_length)(s); 1192cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1193ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum return -1; 1194cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i1 < 0) 1195cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i1 += l; 1196cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (i2 < 0) 1197cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum i2 += l; 1198cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1199cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1200cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL); 1201cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1202cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum type_error("object doesn't support slice deletion"); 1203cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 12046cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum} 12056cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum 1206e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1207799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Tuple(PyObject *v) 1208e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 12096912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters PyObject *it; /* iter(v) */ 12106912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters int n; /* guess for result tuple size */ 12116912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters PyObject *result; 12126912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters int j; 1213e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1214cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (v == NULL) 1215cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1216e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 12176912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Special-case the common tuple and list cases, for efficiency. */ 1218cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (PyTuple_Check(v)) { 1219cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_INCREF(v); 1220cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return v; 1221cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1222cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (PyList_Check(v)) 1223cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return PyList_AsTuple(v); 1224cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 12256912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Get iterator. */ 12266912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters it = PyObject_GetIter(v); 12276912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (it == NULL) 12286912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters return type_error("tuple() argument must support iteration"); 1229e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 12306912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Guess result size and allocate space. */ 12316912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters n = PySequence_Size(v); 12326912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (n < 0) { 12336912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters PyErr_Clear(); 12346912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters n = 10; /* arbitrary */ 12356912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters } 12366912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters result = PyTuple_New(n); 12376912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (result == NULL) 12386912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters goto Fail; 12396912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters 12406912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Fill the tuple. */ 12416912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters for (j = 0; ; ++j) { 12426912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters PyObject *item = PyIter_Next(it); 12436912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (item == NULL) { 12446912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (PyErr_Occurred()) 12456912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters goto Fail; 12466912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters break; 12476912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters } 12486912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (j >= n) { 12496912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (n < 500) 12506912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters n += 10; 12516912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters else 12526912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters n += 100; 12534324aa3572f123883e67a807b633b3d0d452a267Tim Peters if (_PyTuple_Resize(&result, n) != 0) { 125412d0a6c78a376e8eddca3d3fa88ed3627aad795cTim Peters Py_DECREF(item); 12556912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters goto Fail; 125612d0a6c78a376e8eddca3d3fa88ed3627aad795cTim Peters } 1257cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 12586912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters PyTuple_SET_ITEM(result, j, item); 1259e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum } 1260cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 12616912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters /* Cut tuple back if guess was too large. */ 12626912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters if (j < n && 12634324aa3572f123883e67a807b633b3d0d452a267Tim Peters _PyTuple_Resize(&result, j) != 0) 12646912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters goto Fail; 12656912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters 12666912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters Py_DECREF(it); 12676912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters return result; 12686912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters 12696912d4ddf0504a3d5611ddd12cbde3354bd48279Tim PetersFail: 12706912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters Py_XDECREF(result); 12716912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters Py_DECREF(it); 12726912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters return NULL; 1273e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1274e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 12753c5936afc5f067b3b591f554c31e1cfdce460fadGuido van RossumPyObject * 1276799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_List(PyObject *v) 12773c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum{ 1278f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters PyObject *it; /* iter(v) */ 1279f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters PyObject *result; /* result list */ 1280f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters int n; /* guess for result list size */ 1281f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters int i; 1282cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 12835dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum if (v == NULL) 12845dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum return null_error(); 12855dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum 1286f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters /* Special-case list(a_list), for speed. */ 12875dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum if (PyList_Check(v)) 12885dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum return PyList_GetSlice(v, 0, PyList_GET_SIZE(v)); 12895dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum 1290f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters /* Get iterator. There may be some low-level efficiency to be gained 1291f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters * by caching the tp_iternext slot instead of using PyIter_Next() 1292f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters * later, but premature optimization is the root etc. 1293f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters */ 1294f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters it = PyObject_GetIter(v); 1295f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters if (it == NULL) 1296f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters return NULL; 1297f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters 1298f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters /* Guess a result list size. */ 1299f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters n = -1; /* unknown */ 1300f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters if (PySequence_Check(v) && 1301f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters v->ob_type->tp_as_sequence->sq_length) { 1302f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters n = PySequence_Size(v); 1303cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (n < 0) 1304f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters PyErr_Clear(); 1305f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters } 1306f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters if (n < 0) 1307f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters n = 8; /* arbitrary */ 1308f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters result = PyList_New(n); 1309f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters if (result == NULL) { 1310f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters Py_DECREF(it); 1311f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters return NULL; 1312f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters } 1313f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters 1314f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters /* Run iterator to exhaustion. */ 1315f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters for (i = 0; ; i++) { 1316f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters PyObject *item = PyIter_Next(it); 1317f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters if (item == NULL) { 1318f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters if (PyErr_Occurred()) { 1319f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters Py_DECREF(result); 1320f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters result = NULL; 1321cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1322f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters break; 1323bfc725bf64c1da301fe29b9722efc56e34799cf4Guido van Rossum } 1324f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters if (i < n) 13256ad22c41c2f1adb39d023d8dcc779d96d73695f6Tim Peters PyList_SET_ITEM(result, i, item); /* steals ref */ 13266ad22c41c2f1adb39d023d8dcc779d96d73695f6Tim Peters else { 13276ad22c41c2f1adb39d023d8dcc779d96d73695f6Tim Peters int status = PyList_Append(result, item); 13286ad22c41c2f1adb39d023d8dcc779d96d73695f6Tim Peters Py_DECREF(item); /* append creates a new ref */ 13296ad22c41c2f1adb39d023d8dcc779d96d73695f6Tim Peters if (status < 0) { 13306ad22c41c2f1adb39d023d8dcc779d96d73695f6Tim Peters Py_DECREF(result); 13316ad22c41c2f1adb39d023d8dcc779d96d73695f6Tim Peters result = NULL; 13326ad22c41c2f1adb39d023d8dcc779d96d73695f6Tim Peters break; 13336ad22c41c2f1adb39d023d8dcc779d96d73695f6Tim Peters } 1334f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters } 1335f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters } 1336f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters 1337f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters /* Cut back result list if initial guess was too large. */ 1338f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters if (i < n && result != NULL) { 1339f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) { 1340f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters Py_DECREF(result); 1341f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters result = NULL; 1342cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1343cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1344f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters Py_DECREF(it); 1345f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters return result; 1346cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum} 13474669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum 134874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. KuchlingPyObject * 1349799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Fast(PyObject *v, const char *m) 135074042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling{ 135174042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling if (v == NULL) 135274042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling return null_error(); 135374042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling 135474042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling if (PyList_Check(v) || PyTuple_Check(v)) { 135574042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling Py_INCREF(v); 135674042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling return v; 135774042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling } 135874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling 135974042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling v = PySequence_Tuple(v); 136074042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError)) 136174042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling return type_error(m); 136274042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling 136374042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling return v; 136474042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling} 136574042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling 136675f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters/* Return # of times o appears in s. */ 1367cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1368799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Count(PyObject *s, PyObject *o) 1369cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{ 137075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters int n; /* running count of o hits */ 137175f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters PyObject *it; /* iter(s) */ 13724669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum 1373cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL || o == NULL) { 1374cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1375cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1376cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 137775f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters 137875f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters it = PyObject_GetIter(s); 137975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (it == NULL) { 138075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters type_error(".count() requires iterable argument"); 1381cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 138275f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters } 1383cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1384cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum n = 0; 138575f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters for (;;) { 138675f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters int cmp; 138775f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters PyObject *item = PyIter_Next(it); 138875f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (item == NULL) { 138975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (PyErr_Occurred()) 139075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters goto Fail; 139175f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters break; 139275f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters } 139375f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters cmp = PyObject_RichCompareBool(o, item, Py_EQ); 1394cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(item); 139575f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (cmp < 0) 139675f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters goto Fail; 139775f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (cmp > 0) { 139875f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters if (n == INT_MAX) { 139975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters PyErr_SetString(PyExc_OverflowError, 140075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters "count exceeds C int size"); 140175f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters goto Fail; 140275f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters } 1403cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum n++; 140475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters } 14054669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum } 140675f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters Py_DECREF(it); 1407cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return n; 140875f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters 140975f8e35ef41aa6e7c915d99de8bd40be2745955cTim PetersFail: 141075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters Py_DECREF(it); 141175f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters return -1; 14123c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum} 14133c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum 1414cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq. 1415cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters * Always uses the iteration protocol, and only Py_EQ comparison. 1416cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters */ 1417cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1418cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters_PySequence_IterContains(PyObject *seq, PyObject *ob) 1419e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1420de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters int result; 1421cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters PyObject *it = PyObject_GetIter(seq); 1422de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters if (it == NULL) { 1423cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_SetString(PyExc_TypeError, 1424de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters "'in' or 'not in' needs iterable right argument"); 1425cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1426cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1427cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1428de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters for (;;) { 1429de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters int cmp; 1430de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters PyObject *item = PyIter_Next(it); 1431de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters if (item == NULL) { 1432de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters result = PyErr_Occurred() ? -1 : 0; 1433de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters break; 1434cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1435cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters cmp = PyObject_RichCompareBool(ob, item, Py_EQ); 1436de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters Py_DECREF(item); 1437de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters if (cmp == 0) 1438de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters continue; 1439de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters result = cmp > 0 ? 1 : -1; 1440de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters break; 1441cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1442de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters Py_DECREF(it); 1443de9725f1352856b7d6de1bb29383a7be5f181740Tim Peters return result; 1444e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1445e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1446cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq. 1447cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters * Use sq_contains if possible, else defer to _PySequence_IterContains(). 1448cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters */ 1449cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Petersint 1450cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim PetersPySequence_Contains(PyObject *seq, PyObject *ob) 1451cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters{ 1452cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) { 1453cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters PySequenceMethods *sqm = seq->ob_type->tp_as_sequence; 1454cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters if (sqm != NULL && sqm->sq_contains != NULL) 1455cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters return (*sqm->sq_contains)(seq, ob); 1456cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters } 1457cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters return _PySequence_IterContains(seq, ob); 1458cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters} 1459cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters 1460cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Backwards compatibility */ 1461cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum#undef PySequence_In 1462cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1463799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_In(PyObject *w, PyObject *v) 1464e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1465cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return PySequence_Contains(w, v); 1466e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1467e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1468cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1469799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Index(PyObject *s, PyObject *o) 1470e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1471cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int l, i, cmp, err; 1472cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *item; 1473cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1474cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (s == NULL || o == NULL) { 1475cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1476cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1477cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1478cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 14796253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy Hylton l = PySequence_Size(s); 1480cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (l < 0) 1481cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1482cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1483cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum for (i = 0; i < l; i++) { 1484cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum item = PySequence_GetItem(s, i); 1485cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (item == NULL) 1486cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1487cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum err = PyObject_Cmp(item, o, &cmp); 1488cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(item); 1489cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (err < 0) 1490cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return err; 1491cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (cmp == 0) 1492cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return i; 1493cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1494cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1495cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list"); 1496cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1497e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1498e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1499cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on mappings */ 1500cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1501cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1502799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_Check(PyObject *o) 1503e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1504cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return o && o->ob_type->tp_as_mapping; 1505e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1506e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1507cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 15086253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyMapping_Size(PyObject *o) 1509e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1510cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyMappingMethods *m; 1511e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1512cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL) { 1513cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1514cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1515cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1516e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1517cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum m = o->ob_type->tp_as_mapping; 1518cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (m && m->mp_length) 1519cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return m->mp_length(o); 1520e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1521cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum type_error("len() of unsized object"); 1522cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1523e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1524e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1525cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyMapping_Length 1526cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburgint 1527cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyMapping_Length(PyObject *o) 1528cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{ 1529cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg return PyMapping_Size(o); 1530cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg} 1531cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyMapping_Length PyMapping_Size 1532cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg 1533cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van RossumPyObject * 1534799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_GetItemString(PyObject *o, char *key) 1535cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{ 1536cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *okey, *r; 1537cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1538cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (key == NULL) 1539cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1540cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1541cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum okey = PyString_FromString(key); 1542cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (okey == NULL) 1543cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1544cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum r = PyObject_GetItem(o, okey); 1545cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(okey); 1546cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return r; 1547cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum} 1548cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1549cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1550799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_SetItemString(PyObject *o, char *key, PyObject *value) 1551cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{ 1552cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *okey; 1553cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum int r; 1554cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1555cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (key == NULL) { 1556cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum null_error(); 1557cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return -1; 1558cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1559cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1560cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum okey = PyString_FromString(key); 1561cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (okey == NULL) 1562ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum return -1; 1563cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum r = PyObject_SetItem(o, okey, value); 1564cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(okey); 1565cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return r; 1566cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum} 1567cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1568cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1569799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_HasKeyString(PyObject *o, char *key) 1570e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1571cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *v; 1572cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1573cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum v = PyMapping_GetItemString(o, key); 1574cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (v) { 1575cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(v); 1576cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 1; 1577cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1578cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_Clear(); 1579cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 0; 1580e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1581e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1582cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint 1583799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_HasKey(PyObject *o, PyObject *key) 1584e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1585cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *v; 1586cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1587cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum v = PyObject_GetItem(o, key); 1588cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (v) { 1589cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(v); 1590cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 1; 1591cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1592cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_Clear(); 1593cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 0; 1594e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1595e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1596cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on callable objects */ 1597cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1598cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* XXX PyCallable_Check() is in object.c */ 1599cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1600e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1601799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_CallObject(PyObject *o, PyObject *a) 1602e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1603cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *r; 1604cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *args = a; 1605e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1606cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (args == NULL) { 1607cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = PyTuple_New(0); 1608cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (args == NULL) 1609cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1610cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1611cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1612cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum r = PyEval_CallObject(o, args); 1613e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1614fa0b6ab01a962cbe624ad55fc5068a6d6b50bd0fGuido van Rossum if (args != a) { 1615cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(args); 1616fa0b6ab01a962cbe624ad55fc5068a6d6b50bd0fGuido van Rossum } 1617cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1618cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return r; 1619cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum} 1620e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1621e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 16226d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim PetersPyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) 16236d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters{ 16246d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters ternaryfunc call; 16256d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 16266d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters if ((call = func->ob_type->tp_call) != NULL) { 16276d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters PyObject *result = (*call)(func, arg, kw); 16286d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters if (result == NULL && !PyErr_Occurred()) 16296d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters PyErr_SetString( 16306d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters PyExc_SystemError, 16316d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters "NULL result without error in PyObject_Call"); 16326d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters return result; 16336d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters } 16346d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters PyErr_Format(PyExc_TypeError, "object is not callable: %s", 16356d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters PyString_AS_STRING(PyObject_Repr(func))); 16366d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters return NULL; 16376d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters} 16386d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 16396d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim PetersPyObject * 1640cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van RossumPyObject_CallFunction(PyObject *callable, char *format, ...) 1641e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1642cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_list va; 1643cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *args, *retval; 1644cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_start(va, format); 1645e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1646cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (callable == NULL) { 1647cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_end(va); 1648cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1649cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1650cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1651cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (format) 1652cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = Py_VaBuildValue(format, va); 1653cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum else 1654cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = PyTuple_New(0); 1655cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1656cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_end(va); 1657cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1658cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (args == NULL) 1659cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1660cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1661cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (!PyTuple_Check(args)) { 1662cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *a; 1663cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1664cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum a = PyTuple_New(1); 1665cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (a == NULL) 1666cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1667cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (PyTuple_SetItem(a, 0, args) < 0) 1668cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1669cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = a; 1670cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1671cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum retval = PyObject_CallObject(callable, args); 1672cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1673cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(args); 1674cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1675cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return retval; 1676e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1677e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1678e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject * 1679e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject_CallMethod(PyObject *o, char *name, char *format, ...) 1680e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{ 1681cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_list va; 1682cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *args, *func = 0, *retval; 1683cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_start(va, format); 1684e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1685cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (o == NULL || name == NULL) { 1686cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_end(va); 1687cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return null_error(); 1688cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1689e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1690cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum func = PyObject_GetAttrString(o, name); 1691cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (func == NULL) { 1692cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_end(va); 1693cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyErr_SetString(PyExc_AttributeError, name); 1694cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return 0; 1695cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1696e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1697cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (!PyCallable_Check(func)) { 1698cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_end(va); 1699cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return type_error("call of non-callable attribute"); 1700cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1701e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum 1702cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (format && *format) 1703cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = Py_VaBuildValue(format, va); 1704cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum else 1705cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = PyTuple_New(0); 1706cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1707cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum va_end(va); 1708cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1709cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (!args) 1710cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1711cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1712cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (!PyTuple_Check(args)) { 1713cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum PyObject *a; 1714cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1715cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum a = PyTuple_New(1); 1716cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (a == NULL) 1717cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1718cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum if (PyTuple_SetItem(a, 0, args) < 0) 1719cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return NULL; 1720cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum args = a; 1721cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum } 1722cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1723cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum retval = PyObject_CallObject(func, args); 1724cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1725cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(args); 1726cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum Py_DECREF(func); 1727cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum 1728cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum return retval; 1729e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum} 1730823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1731823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1732823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum/* isinstance(), issubclass() */ 1733823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1734823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossumstatic int 1735823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossumabstract_issubclass(PyObject *derived, PyObject *cls, int first) 1736823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{ 1737823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum static PyObject *__bases__ = NULL; 1738823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum PyObject *bases; 1739823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum int i, n; 1740823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum int r = 0; 1741823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1742823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (__bases__ == NULL) { 1743823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum __bases__ = PyString_FromString("__bases__"); 1744823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (__bases__ == NULL) 1745823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return -1; 1746823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1747823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1748823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (first) { 1749823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum bases = PyObject_GetAttr(cls, __bases__); 1750823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (bases == NULL || !PyTuple_Check(bases)) { 1751823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum Py_XDECREF(bases); 1752823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum PyErr_SetString(PyExc_TypeError, 1753823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum "issubclass() arg 2 must be a class"); 1754823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return -1; 1755823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1756823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum Py_DECREF(bases); 1757823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1758823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1759823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (derived == cls) 1760823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return 1; 1761823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1762823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum bases = PyObject_GetAttr(derived, __bases__); 1763823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (bases == NULL || !PyTuple_Check(bases)) { 1764823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum Py_XDECREF(bases); 1765823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum PyErr_SetString(PyExc_TypeError, 1766823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum "issubclass() arg 1 must be a class"); 1767823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return -1; 1768823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1769823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1770823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum n = PyTuple_GET_SIZE(bases); 1771823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum for (i = 0; i < n; i++) { 1772823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls, 0); 1773823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (r != 0) 1774823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum break; 1775823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1776823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1777823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum Py_DECREF(bases); 1778823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1779823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return r; 1780823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum} 1781823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1782823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossumint 1783823649d544eec66a61176dbb76b51a9408c7f4edGuido van RossumPyObject_IsInstance(PyObject *inst, PyObject *cls) 1784823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{ 1785823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum PyObject *icls; 1786823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum static PyObject *__class__ = NULL; 1787823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum int retval = 0; 1788823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1789823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (PyClass_Check(cls)) { 1790823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (PyInstance_Check(inst)) { 1791823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum PyObject *inclass = 1792823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum (PyObject*)((PyInstanceObject*)inst)->in_class; 1793823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum retval = PyClass_IsSubclass(inclass, cls); 1794823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1795823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1796823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum else if (PyType_Check(cls)) { 17976d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls); 1798823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1799823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum else if (!PyInstance_Check(inst)) { 1800823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (__class__ == NULL) { 1801823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum __class__ = PyString_FromString("__class__"); 1802823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (__class__ == NULL) 1803823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return -1; 1804823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1805823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum icls = PyObject_GetAttr(inst, __class__); 1806823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (icls != NULL) { 1807823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum retval = abstract_issubclass(icls, cls, 1); 1808823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum Py_DECREF(icls); 1809823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (retval < 0 && 1810823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum !PyErr_ExceptionMatches(PyExc_TypeError)) 1811823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return -1; 1812823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1813823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum else 1814823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum retval = -1; 1815823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1816823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum else 1817823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum retval = -1; 1818823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1819823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (retval < 0) { 1820823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum PyErr_SetString(PyExc_TypeError, 1821823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum "isinstance() arg 2 must be a class or type"); 1822823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1823823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return retval; 1824823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum} 1825823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1826823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossumint 1827823649d544eec66a61176dbb76b51a9408c7f4edGuido van RossumPyObject_IsSubclass(PyObject *derived, PyObject *cls) 1828823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{ 1829823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum int retval; 1830823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1831823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (!PyClass_Check(derived) || !PyClass_Check(cls)) { 1832823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum retval = abstract_issubclass(derived, cls, 1); 1833823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1834823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum else { 1835823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum /* shortcut */ 1836823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum if (!(retval = (derived == cls))) 1837823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum retval = PyClass_IsSubclass(derived, cls); 1838823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum } 1839823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum 1840823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum return retval; 1841823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum} 184259d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum 184359d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject * 184459d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject_GetIter(PyObject *o) 184559d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum{ 184659d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum PyTypeObject *t = o->ob_type; 184759d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum getiterfunc f = NULL; 184859d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER)) 184959d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum f = t->tp_iter; 185059d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum if (f == NULL) { 185159d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum if (PySequence_Check(o)) 1852213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum return PySeqIter_New(o); 185359d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum PyErr_SetString(PyExc_TypeError, "iter() of non-sequence"); 185459d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum return NULL; 185559d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum } 1856213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum else { 1857213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum PyObject *res = (*f)(o); 1858213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum if (res != NULL && !PyIter_Check(res)) { 1859213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum PyErr_Format(PyExc_TypeError, 1860213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum "iter() returned non-iterator " 1861213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum "of type '%.100s'", 1862213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum res->ob_type->tp_name); 1863213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum Py_DECREF(res); 1864213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum res = NULL; 1865213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum } 1866213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum return res; 1867213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum } 1868213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum} 1869213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum 1870f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters/* Return next item. 1871f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If an error occurs, return NULL. PyErr_Occurred() will be true. 1872f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If the iteration terminates normally, return NULL and clear the 1873f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * PyExc_StopIteration exception (if it was set). PyErr_Occurred() 1874f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * will be false. 1875f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * Else return the next object. PyErr_Occurred() will be false. 1876f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters */ 1877213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyObject * 1878213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyIter_Next(PyObject *iter) 1879213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum{ 1880f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters PyObject *result; 1881213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum if (!PyIter_Check(iter)) { 1882213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum PyErr_Format(PyExc_TypeError, 1883213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum "'%.100s' object is not an iterator", 1884213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum iter->ob_type->tp_name); 1885213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum return NULL; 1886213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum } 1887f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters result = (*iter->ob_type->tp_iternext)(iter); 1888f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters if (result == NULL && 1889f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters PyErr_Occurred() && 1890f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters PyErr_ExceptionMatches(PyExc_StopIteration)) 1891f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters PyErr_Clear(); 1892f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters return result; 189359d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum} 1894