Home | History | Annotate | Download | only in Objects
      1 /* Abstract Object Interface (many thanks to Jim Fulton) */
      2 
      3 #include "Python.h"
      4 #include <ctype.h>
      5 #include "structmember.h" /* we need the offsetof() macro from there */
      6 #include "longintrepr.h"
      7 
      8 #define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
      9                 Py_TPFLAGS_CHECKTYPES)
     10 
     11 
     12 /* Shorthands to return certain errors */
     13 
     14 static PyObject *
     15 type_error(const char *msg, PyObject *obj)
     16 {
     17     PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
     18     return NULL;
     19 }
     20 
     21 static PyObject *
     22 null_error(void)
     23 {
     24     if (!PyErr_Occurred())
     25         PyErr_SetString(PyExc_SystemError,
     26                         "null argument to internal routine");
     27     return NULL;
     28 }
     29 
     30 /* Operations on any object */
     31 
     32 int
     33 PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
     34 {
     35     int r;
     36 
     37     if (o1 == NULL || o2 == NULL) {
     38         null_error();
     39         return -1;
     40     }
     41     r = PyObject_Compare(o1, o2);
     42     if (PyErr_Occurred())
     43         return -1;
     44     *result = r;
     45     return 0;
     46 }
     47 
     48 PyObject *
     49 PyObject_Type(PyObject *o)
     50 {
     51     PyObject *v;
     52 
     53     if (o == NULL)
     54         return null_error();
     55     v = (PyObject *)o->ob_type;
     56     Py_INCREF(v);
     57     return v;
     58 }
     59 
     60 Py_ssize_t
     61 PyObject_Size(PyObject *o)
     62 {
     63     PySequenceMethods *m;
     64 
     65     if (o == NULL) {
     66         null_error();
     67         return -1;
     68     }
     69 
     70     m = o->ob_type->tp_as_sequence;
     71     if (m && m->sq_length)
     72         return m->sq_length(o);
     73 
     74     return PyMapping_Size(o);
     75 }
     76 
     77 #undef PyObject_Length
     78 Py_ssize_t
     79 PyObject_Length(PyObject *o)
     80 {
     81     return PyObject_Size(o);
     82 }
     83 #define PyObject_Length PyObject_Size
     84 
     85 
     86 /* The length hint function returns a non-negative value from o.__len__()
     87    or o.__length_hint__().  If those methods aren't found or return a negative
     88    value, then the defaultvalue is returned.  If one of the calls fails,
     89    this function returns -1.
     90 */
     91 
     92 Py_ssize_t
     93 _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
     94 {
     95     static PyObject *hintstrobj = NULL;
     96     PyObject *ro, *hintmeth;
     97     Py_ssize_t rv;
     98 
     99     /* try o.__len__() */
    100     rv = PyObject_Size(o);
    101     if (rv >= 0)
    102         return rv;
    103     if (PyErr_Occurred()) {
    104         if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
    105             !PyErr_ExceptionMatches(PyExc_AttributeError))
    106                 return -1;
    107         PyErr_Clear();
    108     }
    109 
    110     if (PyInstance_Check(o))
    111         return defaultvalue;
    112     /* try o.__length_hint__() */
    113     hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
    114     if (hintmeth == NULL) {
    115         if (PyErr_Occurred())
    116             return -1;
    117         else
    118             return defaultvalue;
    119     }
    120     ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
    121     Py_DECREF(hintmeth);
    122     if (ro == NULL) {
    123         if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
    124             !PyErr_ExceptionMatches(PyExc_AttributeError))
    125             return -1;
    126         PyErr_Clear();
    127         return defaultvalue;
    128     }
    129     rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
    130     Py_DECREF(ro);
    131     return rv;
    132 }
    133 
    134 PyObject *
    135 PyObject_GetItem(PyObject *o, PyObject *key)
    136 {
    137     PyMappingMethods *m;
    138 
    139     if (o == NULL || key == NULL)
    140         return null_error();
    141 
    142     m = o->ob_type->tp_as_mapping;
    143     if (m && m->mp_subscript)
    144         return m->mp_subscript(o, key);
    145 
    146     if (o->ob_type->tp_as_sequence) {
    147         if (PyIndex_Check(key)) {
    148             Py_ssize_t key_value;
    149             key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
    150             if (key_value == -1 && PyErr_Occurred())
    151                 return NULL;
    152             return PySequence_GetItem(o, key_value);
    153         }
    154         else if (o->ob_type->tp_as_sequence->sq_item)
    155             return type_error("sequence index must "
    156                               "be integer, not '%.200s'", key);
    157     }
    158 
    159     return type_error("'%.200s' object is not subscriptable", o);
    160 }
    161 
    162 int
    163 PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
    164 {
    165     PyMappingMethods *m;
    166 
    167     if (o == NULL || key == NULL || value == NULL) {
    168         null_error();
    169         return -1;
    170     }
    171     m = o->ob_type->tp_as_mapping;
    172     if (m && m->mp_ass_subscript)
    173         return m->mp_ass_subscript(o, key, value);
    174 
    175     if (o->ob_type->tp_as_sequence) {
    176         if (PyIndex_Check(key)) {
    177             Py_ssize_t key_value;
    178             key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
    179             if (key_value == -1 && PyErr_Occurred())
    180                 return -1;
    181             return PySequence_SetItem(o, key_value, value);
    182         }
    183         else if (o->ob_type->tp_as_sequence->sq_ass_item) {
    184             type_error("sequence index must be "
    185                        "integer, not '%.200s'", key);
    186             return -1;
    187         }
    188     }
    189 
    190     type_error("'%.200s' object does not support item assignment", o);
    191     return -1;
    192 }
    193 
    194 int
    195 PyObject_DelItem(PyObject *o, PyObject *key)
    196 {
    197     PyMappingMethods *m;
    198 
    199     if (o == NULL || key == NULL) {
    200         null_error();
    201         return -1;
    202     }
    203     m = o->ob_type->tp_as_mapping;
    204     if (m && m->mp_ass_subscript)
    205         return m->mp_ass_subscript(o, key, (PyObject*)NULL);
    206 
    207     if (o->ob_type->tp_as_sequence) {
    208         if (PyIndex_Check(key)) {
    209             Py_ssize_t key_value;
    210             key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
    211             if (key_value == -1 && PyErr_Occurred())
    212                 return -1;
    213             return PySequence_DelItem(o, key_value);
    214         }
    215         else if (o->ob_type->tp_as_sequence->sq_ass_item) {
    216             type_error("sequence index must be "
    217                        "integer, not '%.200s'", key);
    218             return -1;
    219         }
    220     }
    221 
    222     type_error("'%.200s' object does not support item deletion", o);
    223     return -1;
    224 }
    225 
    226 int
    227 PyObject_DelItemString(PyObject *o, char *key)
    228 {
    229     PyObject *okey;
    230     int ret;
    231 
    232     if (o == NULL || key == NULL) {
    233         null_error();
    234         return -1;
    235     }
    236     okey = PyString_FromString(key);
    237     if (okey == NULL)
    238         return -1;
    239     ret = PyObject_DelItem(o, okey);
    240     Py_DECREF(okey);
    241     return ret;
    242 }
    243 
    244 int
    245 PyObject_AsCharBuffer(PyObject *obj,
    246                           const char **buffer,
    247                           Py_ssize_t *buffer_len)
    248 {
    249     PyBufferProcs *pb;
    250     char *pp;
    251     Py_ssize_t len;
    252 
    253     if (obj == NULL || buffer == NULL || buffer_len == NULL) {
    254         null_error();
    255         return -1;
    256     }
    257     pb = obj->ob_type->tp_as_buffer;
    258     if (pb == NULL ||
    259          pb->bf_getcharbuffer == NULL ||
    260          pb->bf_getsegcount == NULL) {
    261         PyErr_SetString(PyExc_TypeError,
    262                         "expected a character buffer object");
    263         return -1;
    264     }
    265     if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
    266         PyErr_SetString(PyExc_TypeError,
    267                         "expected a single-segment buffer object");
    268         return -1;
    269     }
    270     len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
    271     if (len < 0)
    272         return -1;
    273     *buffer = pp;
    274     *buffer_len = len;
    275     return 0;
    276 }
    277 
    278 int
    279 PyObject_CheckReadBuffer(PyObject *obj)
    280 {
    281     PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
    282 
    283     if (pb == NULL ||
    284         pb->bf_getreadbuffer == NULL ||
    285         pb->bf_getsegcount == NULL ||
    286         (*pb->bf_getsegcount)(obj, NULL) != 1)
    287         return 0;
    288     return 1;
    289 }
    290 
    291 int PyObject_AsReadBuffer(PyObject *obj,
    292                           const void **buffer,
    293                           Py_ssize_t *buffer_len)
    294 {
    295     PyBufferProcs *pb;
    296     void *pp;
    297     Py_ssize_t len;
    298 
    299     if (obj == NULL || buffer == NULL || buffer_len == NULL) {
    300         null_error();
    301         return -1;
    302     }
    303     pb = obj->ob_type->tp_as_buffer;
    304     if (pb == NULL ||
    305          pb->bf_getreadbuffer == NULL ||
    306          pb->bf_getsegcount == NULL) {
    307         PyErr_SetString(PyExc_TypeError,
    308                         "expected a readable buffer object");
    309         return -1;
    310     }
    311     if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
    312         PyErr_SetString(PyExc_TypeError,
    313                         "expected a single-segment buffer object");
    314         return -1;
    315     }
    316     len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
    317     if (len < 0)
    318         return -1;
    319     *buffer = pp;
    320     *buffer_len = len;
    321     return 0;
    322 }
    323 
    324 int PyObject_AsWriteBuffer(PyObject *obj,
    325                            void **buffer,
    326                            Py_ssize_t *buffer_len)
    327 {
    328     PyBufferProcs *pb;
    329     void*pp;
    330     Py_ssize_t len;
    331 
    332     if (obj == NULL || buffer == NULL || buffer_len == NULL) {
    333         null_error();
    334         return -1;
    335     }
    336     pb = obj->ob_type->tp_as_buffer;
    337     if (pb == NULL ||
    338          pb->bf_getwritebuffer == NULL ||
    339          pb->bf_getsegcount == NULL) {
    340         PyErr_SetString(PyExc_TypeError,
    341                         "expected a writeable buffer object");
    342         return -1;
    343     }
    344     if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
    345         PyErr_SetString(PyExc_TypeError,
    346                         "expected a single-segment buffer object");
    347         return -1;
    348     }
    349     len = (*pb->bf_getwritebuffer)(obj,0,&pp);
    350     if (len < 0)
    351         return -1;
    352     *buffer = pp;
    353     *buffer_len = len;
    354     return 0;
    355 }
    356 
    357 /* Buffer C-API for Python 3.0 */
    358 
    359 int
    360 PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
    361 {
    362     if (!PyObject_CheckBuffer(obj)) {
    363         PyErr_Format(PyExc_TypeError,
    364                      "'%100s' does not have the buffer interface",
    365                      Py_TYPE(obj)->tp_name);
    366         return -1;
    367     }
    368     return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
    369 }
    370 
    371 static int
    372 _IsFortranContiguous(Py_buffer *view)
    373 {
    374     Py_ssize_t sd, dim;
    375     int i;
    376 
    377     if (view->ndim == 0) return 1;
    378     if (view->strides == NULL) return (view->ndim == 1);
    379 
    380     sd = view->itemsize;
    381     if (view->ndim == 1) return (view->shape[0] == 1 ||
    382                                sd == view->strides[0]);
    383     for (i=0; i<view->ndim; i++) {
    384         dim = view->shape[i];
    385         if (dim == 0) return 1;
    386         if (view->strides[i] != sd) return 0;
    387         sd *= dim;
    388     }
    389     return 1;
    390 }
    391 
    392 static int
    393 _IsCContiguous(Py_buffer *view)
    394 {
    395     Py_ssize_t sd, dim;
    396     int i;
    397 
    398     if (view->ndim == 0) return 1;
    399     if (view->strides == NULL) return 1;
    400 
    401     sd = view->itemsize;
    402     if (view->ndim == 1) return (view->shape[0] == 1 ||
    403                                sd == view->strides[0]);
    404     for (i=view->ndim-1; i>=0; i--) {
    405         dim = view->shape[i];
    406         if (dim == 0) return 1;
    407         if (view->strides[i] != sd) return 0;
    408         sd *= dim;
    409     }
    410     return 1;
    411 }
    412 
    413 int
    414 PyBuffer_IsContiguous(Py_buffer *view, char fort)
    415 {
    416 
    417     if (view->suboffsets != NULL) return 0;
    418 
    419     if (fort == 'C')
    420         return _IsCContiguous(view);
    421     else if (fort == 'F')
    422         return _IsFortranContiguous(view);
    423     else if (fort == 'A')
    424         return (_IsCContiguous(view) || _IsFortranContiguous(view));
    425     return 0;
    426 }
    427 
    428 
    429 void*
    430 PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
    431 {
    432     char* pointer;
    433     int i;
    434     pointer = (char *)view->buf;
    435     for (i = 0; i < view->ndim; i++) {
    436         pointer += view->strides[i]*indices[i];
    437         if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
    438             pointer = *((char**)pointer) + view->suboffsets[i];
    439         }
    440     }
    441     return (void*)pointer;
    442 }
    443 
    444 
    445 void
    446 _Py_add_one_to_index_F(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
    447 {
    448     int k;
    449 
    450     for (k=0; k<nd; k++) {
    451         if (index[k] < shape[k]-1) {
    452             index[k]++;
    453             break;
    454         }
    455         else {
    456             index[k] = 0;
    457         }
    458     }
    459 }
    460 
    461 void
    462 _Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
    463 {
    464     int k;
    465 
    466     for (k=nd-1; k>=0; k--) {
    467         if (index[k] < shape[k]-1) {
    468             index[k]++;
    469             break;
    470         }
    471         else {
    472             index[k] = 0;
    473         }
    474     }
    475 }
    476 
    477   /* view is not checked for consistency in either of these.  It is
    478      assumed that the size of the buffer is view->len in
    479      view->len / view->itemsize elements.
    480   */
    481 
    482 int
    483 PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
    484 {
    485     int k;
    486     void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
    487     Py_ssize_t *indices, elements;
    488     char *dest, *ptr;
    489 
    490     if (len > view->len) {
    491         len = view->len;
    492     }
    493 
    494     if (PyBuffer_IsContiguous(view, fort)) {
    495         /* simplest copy is all that is needed */
    496         memcpy(buf, view->buf, len);
    497         return 0;
    498     }
    499 
    500     /* Otherwise a more elaborate scheme is needed */
    501 
    502     /* XXX(nnorwitz): need to check for overflow! */
    503     indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
    504     if (indices == NULL) {
    505         PyErr_NoMemory();
    506         return -1;
    507     }
    508     for (k=0; k<view->ndim;k++) {
    509         indices[k] = 0;
    510     }
    511 
    512     if (fort == 'F') {
    513         addone = _Py_add_one_to_index_F;
    514     }
    515     else {
    516         addone = _Py_add_one_to_index_C;
    517     }
    518     dest = buf;
    519     /* XXX : This is not going to be the fastest code in the world
    520              several optimizations are possible.
    521      */
    522     elements = len / view->itemsize;
    523     while (elements--) {
    524         addone(view->ndim, indices, view->shape);
    525         ptr = PyBuffer_GetPointer(view, indices);
    526         memcpy(dest, ptr, view->itemsize);
    527         dest += view->itemsize;
    528     }
    529     PyMem_Free(indices);
    530     return 0;
    531 }
    532 
    533 int
    534 PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
    535 {
    536     int k;
    537     void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
    538     Py_ssize_t *indices, elements;
    539     char *src, *ptr;
    540 
    541     if (len > view->len) {
    542         len = view->len;
    543     }
    544 
    545     if (PyBuffer_IsContiguous(view, fort)) {
    546         /* simplest copy is all that is needed */
    547         memcpy(view->buf, buf, len);
    548         return 0;
    549     }
    550 
    551     /* Otherwise a more elaborate scheme is needed */
    552 
    553     /* XXX(nnorwitz): need to check for overflow! */
    554     indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
    555     if (indices == NULL) {
    556         PyErr_NoMemory();
    557         return -1;
    558     }
    559     for (k=0; k<view->ndim;k++) {
    560         indices[k] = 0;
    561     }
    562 
    563     if (fort == 'F') {
    564         addone = _Py_add_one_to_index_F;
    565     }
    566     else {
    567         addone = _Py_add_one_to_index_C;
    568     }
    569     src = buf;
    570     /* XXX : This is not going to be the fastest code in the world
    571              several optimizations are possible.
    572      */
    573     elements = len / view->itemsize;
    574     while (elements--) {
    575         addone(view->ndim, indices, view->shape);
    576         ptr = PyBuffer_GetPointer(view, indices);
    577         memcpy(ptr, src, view->itemsize);
    578         src += view->itemsize;
    579     }
    580 
    581     PyMem_Free(indices);
    582     return 0;
    583 }
    584 
    585 int PyObject_CopyData(PyObject *dest, PyObject *src)
    586 {
    587     Py_buffer view_dest, view_src;
    588     int k;
    589     Py_ssize_t *indices, elements;
    590     char *dptr, *sptr;
    591 
    592     if (!PyObject_CheckBuffer(dest) ||
    593         !PyObject_CheckBuffer(src)) {
    594         PyErr_SetString(PyExc_TypeError,
    595                         "both destination and source must have the "\
    596                         "buffer interface");
    597         return -1;
    598     }
    599 
    600     if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
    601     if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
    602         PyBuffer_Release(&view_dest);
    603         return -1;
    604     }
    605 
    606     if (view_dest.len < view_src.len) {
    607         PyErr_SetString(PyExc_BufferError,
    608                         "destination is too small to receive data from source");
    609         PyBuffer_Release(&view_dest);
    610         PyBuffer_Release(&view_src);
    611         return -1;
    612     }
    613 
    614     if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
    615          PyBuffer_IsContiguous(&view_src, 'C')) ||
    616         (PyBuffer_IsContiguous(&view_dest, 'F') &&
    617          PyBuffer_IsContiguous(&view_src, 'F'))) {
    618         /* simplest copy is all that is needed */
    619         memcpy(view_dest.buf, view_src.buf, view_src.len);
    620         PyBuffer_Release(&view_dest);
    621         PyBuffer_Release(&view_src);
    622         return 0;
    623     }
    624 
    625     /* Otherwise a more elaborate copy scheme is needed */
    626 
    627     /* XXX(nnorwitz): need to check for overflow! */
    628     indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
    629     if (indices == NULL) {
    630         PyErr_NoMemory();
    631         PyBuffer_Release(&view_dest);
    632         PyBuffer_Release(&view_src);
    633         return -1;
    634     }
    635     for (k=0; k<view_src.ndim;k++) {
    636         indices[k] = 0;
    637     }
    638     elements = 1;
    639     for (k=0; k<view_src.ndim; k++) {
    640         /* XXX(nnorwitz): can this overflow? */
    641         elements *= view_src.shape[k];
    642     }
    643     while (elements--) {
    644         _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
    645         dptr = PyBuffer_GetPointer(&view_dest, indices);
    646         sptr = PyBuffer_GetPointer(&view_src, indices);
    647         memcpy(dptr, sptr, view_src.itemsize);
    648     }
    649     PyMem_Free(indices);
    650     PyBuffer_Release(&view_dest);
    651     PyBuffer_Release(&view_src);
    652     return 0;
    653 }
    654 
    655 void
    656 PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
    657                                Py_ssize_t *strides, int itemsize,
    658                                char fort)
    659 {
    660     int k;
    661     Py_ssize_t sd;
    662 
    663     sd = itemsize;
    664     if (fort == 'F') {
    665         for (k=0; k<nd; k++) {
    666             strides[k] = sd;
    667             sd *= shape[k];
    668         }
    669     }
    670     else {
    671         for (k=nd-1; k>=0; k--) {
    672             strides[k] = sd;
    673             sd *= shape[k];
    674         }
    675     }
    676     return;
    677 }
    678 
    679 int
    680 PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
    681               int readonly, int flags)
    682 {
    683     if (view == NULL) return 0;
    684     if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
    685         (readonly == 1)) {
    686         PyErr_SetString(PyExc_BufferError,
    687                         "Object is not writable.");
    688         return -1;
    689     }
    690 
    691     view->obj = obj;
    692     if (obj)
    693         Py_INCREF(obj);
    694     view->buf = buf;
    695     view->len = len;
    696     view->readonly = readonly;
    697     view->itemsize = 1;
    698     view->format = NULL;
    699     if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
    700         view->format = "B";
    701     view->ndim = 1;
    702     view->shape = NULL;
    703     if ((flags & PyBUF_ND) == PyBUF_ND)
    704         view->shape = &(view->len);
    705     view->strides = NULL;
    706     if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
    707         view->strides = &(view->itemsize);
    708     view->suboffsets = NULL;
    709     view->internal = NULL;
    710     return 0;
    711 }
    712 
    713 void
    714 PyBuffer_Release(Py_buffer *view)
    715 {
    716     PyObject *obj = view->obj;
    717     if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
    718         Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
    719     Py_XDECREF(obj);
    720     view->obj = NULL;
    721 }
    722 
    723 PyObject *
    724 PyObject_Format(PyObject* obj, PyObject *format_spec)
    725 {
    726     PyObject *empty = NULL;
    727     PyObject *result = NULL;
    728 #ifdef Py_USING_UNICODE
    729     int spec_is_unicode;
    730     int result_is_unicode;
    731 #endif
    732 
    733     /* If no format_spec is provided, use an empty string */
    734     if (format_spec == NULL) {
    735         empty = PyString_FromStringAndSize(NULL, 0);
    736         format_spec = empty;
    737     }
    738 
    739     /* Check the format_spec type, and make sure it's str or unicode */
    740 #ifdef Py_USING_UNICODE
    741     if (PyUnicode_Check(format_spec))
    742         spec_is_unicode = 1;
    743     else if (PyString_Check(format_spec))
    744         spec_is_unicode = 0;
    745     else {
    746 #else
    747     if (!PyString_Check(format_spec)) {
    748 #endif
    749         PyErr_Format(PyExc_TypeError,
    750                      "format expects arg 2 to be string "
    751                      "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
    752         goto done;
    753     }
    754 
    755     /* Check for a __format__ method and call it. */
    756     if (PyInstance_Check(obj)) {
    757         /* We're an instance of a classic class */
    758         PyObject *bound_method = PyObject_GetAttrString(obj, "__format__");
    759         if (bound_method != NULL) {
    760             result = PyObject_CallFunctionObjArgs(bound_method,
    761                                                   format_spec,
    762                                                   NULL);
    763             Py_DECREF(bound_method);
    764         } else {
    765             PyObject *self_as_str = NULL;
    766             PyObject *format_method = NULL;
    767             Py_ssize_t format_len;
    768 
    769             PyErr_Clear();
    770             /* Per the PEP, convert to str (or unicode,
    771                depending on the type of the format
    772                specifier).  For new-style classes, this
    773                logic is done by object.__format__(). */
    774 #ifdef Py_USING_UNICODE
    775             if (spec_is_unicode) {
    776                 format_len = PyUnicode_GET_SIZE(format_spec);
    777                 self_as_str = PyObject_Unicode(obj);
    778             } else
    779 #endif
    780             {
    781                 format_len = PyString_GET_SIZE(format_spec);
    782                 self_as_str = PyObject_Str(obj);
    783             }
    784             if (self_as_str == NULL)
    785                 goto done1;
    786 
    787             if (format_len > 0) {
    788                 /* See the almost identical code in
    789                    typeobject.c for new-style
    790                    classes. */
    791                 if (PyErr_WarnEx(
    792                     PyExc_PendingDeprecationWarning,
    793                     "object.__format__ with a non-empty "
    794                     "format string is deprecated", 1)
    795                      < 0) {
    796                     goto done1;
    797                 }
    798                 /* Eventually this will become an
    799                    error:
    800                 PyErr_Format(PyExc_TypeError,
    801                    "non-empty format string passed to "
    802                    "object.__format__");
    803                 goto done1;
    804                 */
    805             }
    806 
    807             /* Then call str.__format__ on that result */
    808             format_method = PyObject_GetAttrString(self_as_str, "__format__");
    809             if (format_method == NULL) {
    810                 goto done1;
    811             }
    812             result = PyObject_CallFunctionObjArgs(format_method,
    813                                                   format_spec,
    814                                                   NULL);
    815 done1:
    816             Py_XDECREF(self_as_str);
    817             Py_XDECREF(format_method);
    818             if (result == NULL)
    819                 goto done;
    820         }
    821     } else {
    822         /* Not an instance of a classic class, use the code
    823            from py3k */
    824         static PyObject *format_cache = NULL;
    825 
    826         /* Find the (unbound!) __format__ method (a borrowed
    827            reference) */
    828         PyObject *method = _PyObject_LookupSpecial(obj, "__format__",
    829                                                    &format_cache);
    830         if (method == NULL) {
    831             if (!PyErr_Occurred())
    832                 PyErr_Format(PyExc_TypeError,
    833                              "Type %.100s doesn't define __format__",
    834                              Py_TYPE(obj)->tp_name);
    835             goto done;
    836         }
    837         /* And call it. */
    838         result = PyObject_CallFunctionObjArgs(method, format_spec, NULL);
    839         Py_DECREF(method);
    840     }
    841 
    842     if (result == NULL)
    843         goto done;
    844 
    845     /* Check the result type, and make sure it's str or unicode */
    846 #ifdef Py_USING_UNICODE
    847     if (PyUnicode_Check(result))
    848         result_is_unicode = 1;
    849     else if (PyString_Check(result))
    850         result_is_unicode = 0;
    851     else {
    852 #else
    853     if (!PyString_Check(result)) {
    854 #endif
    855         PyErr_Format(PyExc_TypeError,
    856                      "%.100s.__format__ must return string or "
    857                      "unicode, not %.100s", Py_TYPE(obj)->tp_name,
    858                      Py_TYPE(result)->tp_name);
    859         Py_DECREF(result);
    860         result = NULL;
    861         goto done;
    862     }
    863 
    864     /* Convert to unicode, if needed.  Required if spec is unicode
    865        and result is str */
    866 #ifdef Py_USING_UNICODE
    867     if (spec_is_unicode && !result_is_unicode) {
    868         PyObject *tmp = PyObject_Unicode(result);
    869         /* This logic works whether or not tmp is NULL */
    870         Py_DECREF(result);
    871         result = tmp;
    872     }
    873 #endif
    874 
    875 done:
    876     Py_XDECREF(empty);
    877     return result;
    878 }
    879 
    880 /* Operations on numbers */
    881 
    882 int
    883 PyNumber_Check(PyObject *o)
    884 {
    885     return o && o->ob_type->tp_as_number &&
    886            (o->ob_type->tp_as_number->nb_int ||
    887         o->ob_type->tp_as_number->nb_float);
    888 }
    889 
    890 /* Binary operators */
    891 
    892 /* New style number protocol support */
    893 
    894 #define NB_SLOT(x) offsetof(PyNumberMethods, x)
    895 #define NB_BINOP(nb_methods, slot) \
    896         (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
    897 #define NB_TERNOP(nb_methods, slot) \
    898         (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
    899 
    900 /*
    901   Calling scheme used for binary operations:
    902 
    903   v     w       Action
    904   -------------------------------------------------------------------
    905   new   new     w.op(v,w)[*], v.op(v,w), w.op(v,w)
    906   new   old     v.op(v,w), coerce(v,w), v.op(v,w)
    907   old   new     w.op(v,w), coerce(v,w), v.op(v,w)
    908   old   old     coerce(v,w), v.op(v,w)
    909 
    910   [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
    911       v->ob_type
    912 
    913   Legend:
    914   -------
    915   * new == new style number
    916   * old == old style number
    917   * Action indicates the order in which operations are tried until either
    918     a valid result is produced or an error occurs.
    919 
    920  */
    921 
    922 static PyObject *
    923 binary_op1(PyObject *v, PyObject *w, const int op_slot)
    924 {
    925     PyObject *x;
    926     binaryfunc slotv = NULL;
    927     binaryfunc slotw = NULL;
    928 
    929     if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
    930         slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
    931     if (w->ob_type != v->ob_type &&
    932         w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
    933         slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
    934         if (slotw == slotv)
    935             slotw = NULL;
    936     }
    937     if (slotv) {
    938         if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
    939             x = slotw(v, w);
    940             if (x != Py_NotImplemented)
    941                 return x;
    942             Py_DECREF(x); /* can't do it */
    943             slotw = NULL;
    944         }
    945         x = slotv(v, w);
    946         if (x != Py_NotImplemented)
    947             return x;
    948         Py_DECREF(x); /* can't do it */
    949     }
    950     if (slotw) {
    951         x = slotw(v, w);
    952         if (x != Py_NotImplemented)
    953             return x;
    954         Py_DECREF(x); /* can't do it */
    955     }
    956     if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
    957         int err = PyNumber_CoerceEx(&v, &w);
    958         if (err < 0) {
    959             return NULL;
    960         }
    961         if (err == 0) {
    962             PyNumberMethods *mv = v->ob_type->tp_as_number;
    963             if (mv) {
    964                 binaryfunc slot;
    965                 slot = NB_BINOP(mv, op_slot);
    966                 if (slot) {
    967                     x = slot(v, w);
    968                     Py_DECREF(v);
    969                     Py_DECREF(w);
    970                     return x;
    971                 }
    972             }
    973             /* CoerceEx incremented the reference counts */
    974             Py_DECREF(v);
    975             Py_DECREF(w);
    976         }
    977     }
    978     Py_INCREF(Py_NotImplemented);
    979     return Py_NotImplemented;
    980 }
    981 
    982 static PyObject *
    983 binop_type_error(PyObject *v, PyObject *w, const char *op_name)
    984 {
    985     PyErr_Format(PyExc_TypeError,
    986                  "unsupported operand type(s) for %.100s: "
    987                  "'%.100s' and '%.100s'",
    988                  op_name,
    989                  v->ob_type->tp_name,
    990                  w->ob_type->tp_name);
    991     return NULL;
    992 }
    993 
    994 static PyObject *
    995 binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
    996 {
    997     PyObject *result = binary_op1(v, w, op_slot);
    998     if (result == Py_NotImplemented) {
    999         Py_DECREF(result);
   1000         return binop_type_error(v, w, op_name);
   1001     }
   1002     return result;
   1003 }
   1004 
   1005 
   1006 /*
   1007   Calling scheme used for ternary operations:
   1008 
   1009   *** In some cases, w.op is called before v.op; see binary_op1. ***
   1010 
   1011   v     w       z       Action
   1012   -------------------------------------------------------------------
   1013   new   new     new     v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
   1014   new   old     new     v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
   1015   old   new     new     w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
   1016   old   old     new     z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
   1017   new   new     old     v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
   1018   new   old     old     v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
   1019   old   new     old     w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
   1020   old   old     old     coerce(v,w,z), v.op(v,w,z)
   1021 
   1022   Legend:
   1023   -------
   1024   * new == new style number
   1025   * old == old style number
   1026   * Action indicates the order in which operations are tried until either
   1027     a valid result is produced or an error occurs.
   1028   * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
   1029     only if z != Py_None; if z == Py_None, then it is treated as absent
   1030     variable and only coerce(v,w) is tried.
   1031 
   1032  */
   1033 
   1034 static PyObject *
   1035 ternary_op(PyObject *v,
   1036            PyObject *w,
   1037            PyObject *z,
   1038            const int op_slot,
   1039            const char *op_name)
   1040 {
   1041     PyNumberMethods *mv, *mw, *mz;
   1042     PyObject *x = NULL;
   1043     ternaryfunc slotv = NULL;
   1044     ternaryfunc slotw = NULL;
   1045     ternaryfunc slotz = NULL;
   1046 
   1047     mv = v->ob_type->tp_as_number;
   1048     mw = w->ob_type->tp_as_number;
   1049     if (mv != NULL && NEW_STYLE_NUMBER(v))
   1050         slotv = NB_TERNOP(mv, op_slot);
   1051     if (w->ob_type != v->ob_type &&
   1052         mw != NULL && NEW_STYLE_NUMBER(w)) {
   1053         slotw = NB_TERNOP(mw, op_slot);
   1054         if (slotw == slotv)
   1055             slotw = NULL;
   1056     }
   1057     if (slotv) {
   1058         if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
   1059             x = slotw(v, w, z);
   1060             if (x != Py_NotImplemented)
   1061                 return x;
   1062             Py_DECREF(x); /* can't do it */
   1063             slotw = NULL;
   1064         }
   1065         x = slotv(v, w, z);
   1066         if (x != Py_NotImplemented)
   1067             return x;
   1068         Py_DECREF(x); /* can't do it */
   1069     }
   1070     if (slotw) {
   1071         x = slotw(v, w, z);
   1072         if (x != Py_NotImplemented)
   1073             return x;
   1074         Py_DECREF(x); /* can't do it */
   1075     }
   1076     mz = z->ob_type->tp_as_number;
   1077     if (mz != NULL && NEW_STYLE_NUMBER(z)) {
   1078         slotz = NB_TERNOP(mz, op_slot);
   1079         if (slotz == slotv || slotz == slotw)
   1080             slotz = NULL;
   1081         if (slotz) {
   1082             x = slotz(v, w, z);
   1083             if (x != Py_NotImplemented)
   1084                 return x;
   1085             Py_DECREF(x); /* can't do it */
   1086         }
   1087     }
   1088 
   1089     if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
   1090                     (z != Py_None && !NEW_STYLE_NUMBER(z))) {
   1091         /* we have an old style operand, coerce */
   1092         PyObject *v1, *z1, *w2, *z2;
   1093         int c;
   1094 
   1095         c = PyNumber_Coerce(&v, &w);
   1096         if (c != 0)
   1097             goto error3;
   1098 
   1099         /* Special case: if the third argument is None, it is
   1100            treated as absent argument and not coerced. */
   1101         if (z == Py_None) {
   1102             if (v->ob_type->tp_as_number) {
   1103                 slotz = NB_TERNOP(v->ob_type->tp_as_number,
   1104                                   op_slot);
   1105                 if (slotz)
   1106                     x = slotz(v, w, z);
   1107                 else
   1108                     c = -1;
   1109             }
   1110             else
   1111                 c = -1;
   1112             goto error2;
   1113         }
   1114         v1 = v;
   1115         z1 = z;
   1116         c = PyNumber_Coerce(&v1, &z1);
   1117         if (c != 0)
   1118             goto error2;
   1119         w2 = w;
   1120         z2 = z1;
   1121         c = PyNumber_Coerce(&w2, &z2);
   1122         if (c != 0)
   1123             goto error1;
   1124 
   1125         if (v1->ob_type->tp_as_number != NULL) {
   1126             slotv = NB_TERNOP(v1->ob_type->tp_as_number,
   1127                               op_slot);
   1128             if (slotv)
   1129                 x = slotv(v1, w2, z2);
   1130             else
   1131                 c = -1;
   1132         }
   1133         else
   1134             c = -1;
   1135 
   1136         Py_DECREF(w2);
   1137         Py_DECREF(z2);
   1138     error1:
   1139         Py_DECREF(v1);
   1140         Py_DECREF(z1);
   1141     error2:
   1142         Py_DECREF(v);
   1143         Py_DECREF(w);
   1144     error3:
   1145         if (c >= 0)
   1146             return x;
   1147     }
   1148 
   1149     if (z == Py_None)
   1150         PyErr_Format(
   1151             PyExc_TypeError,
   1152             "unsupported operand type(s) for ** or pow(): "
   1153             "'%.100s' and '%.100s'",
   1154             v->ob_type->tp_name,
   1155             w->ob_type->tp_name);
   1156     else
   1157         PyErr_Format(
   1158             PyExc_TypeError,
   1159             "unsupported operand type(s) for pow(): "
   1160             "'%.100s', '%.100s', '%.100s'",
   1161             v->ob_type->tp_name,
   1162             w->ob_type->tp_name,
   1163             z->ob_type->tp_name);
   1164     return NULL;
   1165 }
   1166 
   1167 #define BINARY_FUNC(func, op, op_name) \
   1168     PyObject * \
   1169     func(PyObject *v, PyObject *w) { \
   1170         return binary_op(v, w, NB_SLOT(op), op_name); \
   1171     }
   1172 
   1173 BINARY_FUNC(PyNumber_Or, nb_or, "|")
   1174 BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
   1175 BINARY_FUNC(PyNumber_And, nb_and, "&")
   1176 BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
   1177 BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
   1178 BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
   1179 BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
   1180 BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
   1181 
   1182 PyObject *
   1183 PyNumber_Add(PyObject *v, PyObject *w)
   1184 {
   1185     PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
   1186     if (result == Py_NotImplemented) {
   1187         PySequenceMethods *m = v->ob_type->tp_as_sequence;
   1188         Py_DECREF(result);
   1189         if (m && m->sq_concat) {
   1190             return (*m->sq_concat)(v, w);
   1191         }
   1192         result = binop_type_error(v, w, "+");
   1193     }
   1194     return result;
   1195 }
   1196 
   1197 static PyObject *
   1198 sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
   1199 {
   1200     Py_ssize_t count;
   1201     if (PyIndex_Check(n)) {
   1202         count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
   1203         if (count == -1 && PyErr_Occurred())
   1204             return NULL;
   1205     }
   1206     else {
   1207         return type_error("can't multiply sequence by "
   1208                           "non-int of type '%.200s'", n);
   1209     }
   1210     return (*repeatfunc)(seq, count);
   1211 }
   1212 
   1213 PyObject *
   1214 PyNumber_Multiply(PyObject *v, PyObject *w)
   1215 {
   1216     PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
   1217     if (result == Py_NotImplemented) {
   1218         PySequenceMethods *mv = v->ob_type->tp_as_sequence;
   1219         PySequenceMethods *mw = w->ob_type->tp_as_sequence;
   1220         Py_DECREF(result);
   1221         if  (mv && mv->sq_repeat) {
   1222             return sequence_repeat(mv->sq_repeat, v, w);
   1223         }
   1224         else if (mw && mw->sq_repeat) {
   1225             return sequence_repeat(mw->sq_repeat, w, v);
   1226         }
   1227         result = binop_type_error(v, w, "*");
   1228     }
   1229     return result;
   1230 }
   1231 
   1232 PyObject *
   1233 PyNumber_FloorDivide(PyObject *v, PyObject *w)
   1234 {
   1235     /* XXX tp_flags test */
   1236     return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
   1237 }
   1238 
   1239 PyObject *
   1240 PyNumber_TrueDivide(PyObject *v, PyObject *w)
   1241 {
   1242     /* XXX tp_flags test */
   1243     return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
   1244 }
   1245 
   1246 PyObject *
   1247 PyNumber_Remainder(PyObject *v, PyObject *w)
   1248 {
   1249     return binary_op(v, w, NB_SLOT(nb_remainder), "%");
   1250 }
   1251 
   1252 PyObject *
   1253 PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
   1254 {
   1255     return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
   1256 }
   1257 
   1258 /* Binary in-place operators */
   1259 
   1260 /* The in-place operators are defined to fall back to the 'normal',
   1261    non in-place operations, if the in-place methods are not in place.
   1262 
   1263    - If the left hand object has the appropriate struct members, and
   1264      they are filled, call the appropriate function and return the
   1265      result.  No coercion is done on the arguments; the left-hand object
   1266      is the one the operation is performed on, and it's up to the
   1267      function to deal with the right-hand object.
   1268 
   1269    - Otherwise, in-place modification is not supported. Handle it exactly as
   1270      a non in-place operation of the same kind.
   1271 
   1272    */
   1273 
   1274 #define HASINPLACE(t) \
   1275     PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
   1276 
   1277 static PyObject *
   1278 binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
   1279 {
   1280     PyNumberMethods *mv = v->ob_type->tp_as_number;
   1281     if (mv != NULL && HASINPLACE(v)) {
   1282         binaryfunc slot = NB_BINOP(mv, iop_slot);
   1283         if (slot) {
   1284             PyObject *x = (slot)(v, w);
   1285             if (x != Py_NotImplemented) {
   1286                 return x;
   1287             }
   1288             Py_DECREF(x);
   1289         }
   1290     }
   1291     return binary_op1(v, w, op_slot);
   1292 }
   1293 
   1294 static PyObject *
   1295 binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
   1296                 const char *op_name)
   1297 {
   1298     PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
   1299     if (result == Py_NotImplemented) {
   1300         Py_DECREF(result);
   1301         return binop_type_error(v, w, op_name);
   1302     }
   1303     return result;
   1304 }
   1305 
   1306 #define INPLACE_BINOP(func, iop, op, op_name) \
   1307     PyObject * \
   1308     func(PyObject *v, PyObject *w) { \
   1309         return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
   1310     }
   1311 
   1312 INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
   1313 INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
   1314 INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
   1315 INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
   1316 INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
   1317 INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
   1318 INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
   1319 
   1320 PyObject *
   1321 PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
   1322 {
   1323     /* XXX tp_flags test */
   1324     return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
   1325                       NB_SLOT(nb_floor_divide), "//=");
   1326 }
   1327 
   1328 PyObject *
   1329 PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
   1330 {
   1331     /* XXX tp_flags test */
   1332     return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
   1333                       NB_SLOT(nb_true_divide), "/=");
   1334 }
   1335 
   1336 PyObject *
   1337 PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
   1338 {
   1339     PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
   1340                                    NB_SLOT(nb_add));
   1341     if (result == Py_NotImplemented) {
   1342         PySequenceMethods *m = v->ob_type->tp_as_sequence;
   1343         Py_DECREF(result);
   1344         if (m != NULL) {
   1345             binaryfunc f = NULL;
   1346             if (HASINPLACE(v))
   1347                 f = m->sq_inplace_concat;
   1348             if (f == NULL)
   1349                 f = m->sq_concat;
   1350             if (f != NULL)
   1351                 return (*f)(v, w);
   1352         }
   1353         result = binop_type_error(v, w, "+=");
   1354     }
   1355     return result;
   1356 }
   1357 
   1358 PyObject *
   1359 PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
   1360 {
   1361     PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
   1362                                    NB_SLOT(nb_multiply));
   1363     if (result == Py_NotImplemented) {
   1364         ssizeargfunc f = NULL;
   1365         PySequenceMethods *mv = v->ob_type->tp_as_sequence;
   1366         PySequenceMethods *mw = w->ob_type->tp_as_sequence;
   1367         Py_DECREF(result);
   1368         if (mv != NULL) {
   1369             if (HASINPLACE(v))
   1370                 f = mv->sq_inplace_repeat;
   1371             if (f == NULL)
   1372                 f = mv->sq_repeat;
   1373             if (f != NULL)
   1374                 return sequence_repeat(f, v, w);
   1375         }
   1376         else if (mw != NULL) {
   1377             /* Note that the right hand operand should not be
   1378              * mutated in this case so sq_inplace_repeat is not
   1379              * used. */
   1380             if (mw->sq_repeat)
   1381                 return sequence_repeat(mw->sq_repeat, w, v);
   1382         }
   1383         result = binop_type_error(v, w, "*=");
   1384     }
   1385     return result;
   1386 }
   1387 
   1388 PyObject *
   1389 PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
   1390 {
   1391     return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
   1392                             NB_SLOT(nb_remainder), "%=");
   1393 }
   1394 
   1395 PyObject *
   1396 PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
   1397 {
   1398     if (HASINPLACE(v) && v->ob_type->tp_as_number &&
   1399         v->ob_type->tp_as_number->nb_inplace_power != NULL) {
   1400         return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
   1401     }
   1402     else {
   1403         return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
   1404     }
   1405 }
   1406 
   1407 
   1408 /* Unary operators and functions */
   1409 
   1410 PyObject *
   1411 PyNumber_Negative(PyObject *o)
   1412 {
   1413     PyNumberMethods *m;
   1414 
   1415     if (o == NULL)
   1416         return null_error();
   1417     m = o->ob_type->tp_as_number;
   1418     if (m && m->nb_negative)
   1419         return (*m->nb_negative)(o);
   1420 
   1421     return type_error("bad operand type for unary -: '%.200s'", o);
   1422 }
   1423 
   1424 PyObject *
   1425 PyNumber_Positive(PyObject *o)
   1426 {
   1427     PyNumberMethods *m;
   1428 
   1429     if (o == NULL)
   1430         return null_error();
   1431     m = o->ob_type->tp_as_number;
   1432     if (m && m->nb_positive)
   1433         return (*m->nb_positive)(o);
   1434 
   1435     return type_error("bad operand type for unary +: '%.200s'", o);
   1436 }
   1437 
   1438 PyObject *
   1439 PyNumber_Invert(PyObject *o)
   1440 {
   1441     PyNumberMethods *m;
   1442 
   1443     if (o == NULL)
   1444         return null_error();
   1445     m = o->ob_type->tp_as_number;
   1446     if (m && m->nb_invert)
   1447         return (*m->nb_invert)(o);
   1448 
   1449     return type_error("bad operand type for unary ~: '%.200s'", o);
   1450 }
   1451 
   1452 PyObject *
   1453 PyNumber_Absolute(PyObject *o)
   1454 {
   1455     PyNumberMethods *m;
   1456 
   1457     if (o == NULL)
   1458         return null_error();
   1459     m = o->ob_type->tp_as_number;
   1460     if (m && m->nb_absolute)
   1461         return m->nb_absolute(o);
   1462 
   1463     return type_error("bad operand type for abs(): '%.200s'", o);
   1464 }
   1465 
   1466 /* Add a check for embedded NULL-bytes in the argument. */
   1467 static PyObject *
   1468 int_from_string(const char *s, Py_ssize_t len)
   1469 {
   1470     char *end;
   1471     PyObject *x;
   1472 
   1473     x = PyInt_FromString((char*)s, &end, 10);
   1474     if (x == NULL)
   1475         return NULL;
   1476     if (end != s + len) {
   1477         PyErr_SetString(PyExc_ValueError,
   1478                         "null byte in argument for int()");
   1479         Py_DECREF(x);
   1480         return NULL;
   1481     }
   1482     return x;
   1483 }
   1484 
   1485 /* Return a Python Int or Long from the object item
   1486    Raise TypeError if the result is not an int-or-long
   1487    or if the object cannot be interpreted as an index.
   1488 */
   1489 PyObject *
   1490 PyNumber_Index(PyObject *item)
   1491 {
   1492     PyObject *result = NULL;
   1493     if (item == NULL)
   1494         return null_error();
   1495     if (PyInt_Check(item) || PyLong_Check(item)) {
   1496         Py_INCREF(item);
   1497         return item;
   1498     }
   1499     if (PyIndex_Check(item)) {
   1500         result = item->ob_type->tp_as_number->nb_index(item);
   1501         if (result &&
   1502             !PyInt_Check(result) && !PyLong_Check(result)) {
   1503             PyErr_Format(PyExc_TypeError,
   1504                          "__index__ returned non-(int,long) " \
   1505                          "(type %.200s)",
   1506                          result->ob_type->tp_name);
   1507             Py_DECREF(result);
   1508             return NULL;
   1509         }
   1510     }
   1511     else {
   1512         PyErr_Format(PyExc_TypeError,
   1513                      "'%.200s' object cannot be interpreted "
   1514                      "as an index", item->ob_type->tp_name);
   1515     }
   1516     return result;
   1517 }
   1518 
   1519 /* Return an error on Overflow only if err is not NULL*/
   1520 
   1521 Py_ssize_t
   1522 PyNumber_AsSsize_t(PyObject *item, PyObject *err)
   1523 {
   1524     Py_ssize_t result;
   1525     PyObject *runerr;
   1526     PyObject *value = PyNumber_Index(item);
   1527     if (value == NULL)
   1528         return -1;
   1529 
   1530     /* We're done if PyInt_AsSsize_t() returns without error. */
   1531     result = PyInt_AsSsize_t(value);
   1532     if (result != -1 || !(runerr = PyErr_Occurred()))
   1533         goto finish;
   1534 
   1535     /* Error handling code -- only manage OverflowError differently */
   1536     if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
   1537         goto finish;
   1538 
   1539     PyErr_Clear();
   1540     /* If no error-handling desired then the default clipping
   1541        is sufficient.
   1542      */
   1543     if (!err) {
   1544         assert(PyLong_Check(value));
   1545         /* Whether or not it is less than or equal to
   1546            zero is determined by the sign of ob_size
   1547         */
   1548         if (_PyLong_Sign(value) < 0)
   1549             result = PY_SSIZE_T_MIN;
   1550         else
   1551             result = PY_SSIZE_T_MAX;
   1552     }
   1553     else {
   1554         /* Otherwise replace the error with caller's error object. */
   1555         PyErr_Format(err,
   1556                      "cannot fit '%.200s' into an index-sized integer",
   1557                      item->ob_type->tp_name);
   1558     }
   1559 
   1560  finish:
   1561     Py_DECREF(value);
   1562     return result;
   1563 }
   1564 
   1565 
   1566 PyObject *
   1567 _PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
   1568 {
   1569     const char *type_name;
   1570     static PyObject *int_name = NULL;
   1571     if (int_name == NULL) {
   1572         int_name = PyString_InternFromString("__int__");
   1573         if (int_name == NULL)
   1574             return NULL;
   1575     }
   1576 
   1577     if (integral && (!PyInt_Check(integral) &&
   1578                      !PyLong_Check(integral))) {
   1579         /* Don't go through tp_as_number->nb_int to avoid
   1580            hitting the classic class fallback to __trunc__. */
   1581         PyObject *int_func = PyObject_GetAttr(integral, int_name);
   1582         if (int_func == NULL) {
   1583             PyErr_Clear(); /* Raise a different error. */
   1584             goto non_integral_error;
   1585         }
   1586         Py_DECREF(integral);
   1587         integral = PyEval_CallObject(int_func, NULL);
   1588         Py_DECREF(int_func);
   1589         if (integral && (!PyInt_Check(integral) &&
   1590                           !PyLong_Check(integral))) {
   1591             goto non_integral_error;
   1592         }
   1593     }
   1594     return integral;
   1595 
   1596 non_integral_error:
   1597     if (PyInstance_Check(integral)) {
   1598         type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
   1599                                        ->in_class->cl_name);
   1600     }
   1601     else {
   1602         type_name = integral->ob_type->tp_name;
   1603     }
   1604     PyErr_Format(PyExc_TypeError, error_format, type_name);
   1605     Py_DECREF(integral);
   1606     return NULL;
   1607 }
   1608 
   1609 
   1610 PyObject *
   1611 PyNumber_Int(PyObject *o)
   1612 {
   1613     PyNumberMethods *m;
   1614     static PyObject *trunc_name = NULL;
   1615     PyObject *trunc_func;
   1616     const char *buffer;
   1617     Py_ssize_t buffer_len;
   1618 
   1619     if (trunc_name == NULL) {
   1620         trunc_name = PyString_InternFromString("__trunc__");
   1621         if (trunc_name == NULL)
   1622             return NULL;
   1623     }
   1624 
   1625     if (o == NULL)
   1626         return null_error();
   1627     if (PyInt_CheckExact(o)) {
   1628         Py_INCREF(o);
   1629         return o;
   1630     }
   1631     m = o->ob_type->tp_as_number;
   1632     if (m && m->nb_int) { /* This should include subclasses of int */
   1633         /* Classic classes always take this branch. */
   1634         PyObject *res = m->nb_int(o);
   1635         if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
   1636             PyErr_Format(PyExc_TypeError,
   1637                          "__int__ returned non-int (type %.200s)",
   1638                          res->ob_type->tp_name);
   1639             Py_DECREF(res);
   1640             return NULL;
   1641         }
   1642         return res;
   1643     }
   1644     if (PyInt_Check(o)) { /* A int subclass without nb_int */
   1645         PyIntObject *io = (PyIntObject*)o;
   1646         return PyInt_FromLong(io->ob_ival);
   1647     }
   1648     trunc_func = PyObject_GetAttr(o, trunc_name);
   1649     if (trunc_func) {
   1650         PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
   1651         Py_DECREF(trunc_func);
   1652         /* __trunc__ is specified to return an Integral type, but
   1653            int() needs to return an int. */
   1654         return _PyNumber_ConvertIntegralToInt(
   1655             truncated,
   1656             "__trunc__ returned non-Integral (type %.200s)");
   1657     }
   1658     PyErr_Clear();  /* It's not an error if  o.__trunc__ doesn't exist. */
   1659 
   1660     if (PyString_Check(o))
   1661         return int_from_string(PyString_AS_STRING(o),
   1662                                PyString_GET_SIZE(o));
   1663 #ifdef Py_USING_UNICODE
   1664     if (PyUnicode_Check(o))
   1665         return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
   1666                                  PyUnicode_GET_SIZE(o),
   1667                                  10);
   1668 #endif
   1669     if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
   1670         return int_from_string((char*)buffer, buffer_len);
   1671 
   1672     return type_error("int() argument must be a string or a "
   1673                       "number, not '%.200s'", o);
   1674 }
   1675 
   1676 /* Add a check for embedded NULL-bytes in the argument. */
   1677 static PyObject *
   1678 long_from_string(const char *s, Py_ssize_t len)
   1679 {
   1680     char *end;
   1681     PyObject *x;
   1682 
   1683     x = PyLong_FromString((char*)s, &end, 10);
   1684     if (x == NULL)
   1685         return NULL;
   1686     if (end != s + len) {
   1687         PyErr_SetString(PyExc_ValueError,
   1688                         "null byte in argument for long()");
   1689         Py_DECREF(x);
   1690         return NULL;
   1691     }
   1692     return x;
   1693 }
   1694 
   1695 PyObject *
   1696 PyNumber_Long(PyObject *o)
   1697 {
   1698     PyNumberMethods *m;
   1699     static PyObject *trunc_name = NULL;
   1700     PyObject *trunc_func;
   1701     const char *buffer;
   1702     Py_ssize_t buffer_len;
   1703 
   1704     if (trunc_name == NULL) {
   1705         trunc_name = PyString_InternFromString("__trunc__");
   1706         if (trunc_name == NULL)
   1707             return NULL;
   1708     }
   1709 
   1710     if (o == NULL)
   1711         return null_error();
   1712     m = o->ob_type->tp_as_number;
   1713     if (m && m->nb_long) { /* This should include subclasses of long */
   1714         /* Classic classes always take this branch. */
   1715         PyObject *res = m->nb_long(o);
   1716         if (res == NULL)
   1717             return NULL;
   1718         if (PyInt_Check(res)) {
   1719             long value = PyInt_AS_LONG(res);
   1720             Py_DECREF(res);
   1721             return PyLong_FromLong(value);
   1722         }
   1723         else if (!PyLong_Check(res)) {
   1724             PyErr_Format(PyExc_TypeError,
   1725                          "__long__ returned non-long (type %.200s)",
   1726                          res->ob_type->tp_name);
   1727             Py_DECREF(res);
   1728             return NULL;
   1729         }
   1730         return res;
   1731     }
   1732     if (PyLong_Check(o)) /* A long subclass without nb_long */
   1733         return _PyLong_Copy((PyLongObject *)o);
   1734     trunc_func = PyObject_GetAttr(o, trunc_name);
   1735     if (trunc_func) {
   1736         PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
   1737         PyObject *int_instance;
   1738         Py_DECREF(trunc_func);
   1739         /* __trunc__ is specified to return an Integral type,
   1740            but long() needs to return a long. */
   1741         int_instance = _PyNumber_ConvertIntegralToInt(
   1742             truncated,
   1743             "__trunc__ returned non-Integral (type %.200s)");
   1744         if (int_instance && PyInt_Check(int_instance)) {
   1745             /* Make sure that long() returns a long instance. */
   1746             long value = PyInt_AS_LONG(int_instance);
   1747             Py_DECREF(int_instance);
   1748             return PyLong_FromLong(value);
   1749         }
   1750         return int_instance;
   1751     }
   1752     PyErr_Clear();  /* It's not an error if  o.__trunc__ doesn't exist. */
   1753 
   1754     if (PyString_Check(o))
   1755         /* need to do extra error checking that PyLong_FromString()
   1756          * doesn't do.  In particular long('9.5') must raise an
   1757          * exception, not truncate the float.
   1758          */
   1759         return long_from_string(PyString_AS_STRING(o),
   1760                                 PyString_GET_SIZE(o));
   1761 #ifdef Py_USING_UNICODE
   1762     if (PyUnicode_Check(o))
   1763         /* The above check is done in PyLong_FromUnicode(). */
   1764         return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
   1765                                   PyUnicode_GET_SIZE(o),
   1766                                   10);
   1767 #endif
   1768     if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
   1769         return long_from_string(buffer, buffer_len);
   1770 
   1771     return type_error("long() argument must be a string or a "
   1772                       "number, not '%.200s'", o);
   1773 }
   1774 
   1775 PyObject *
   1776 PyNumber_Float(PyObject *o)
   1777 {
   1778     PyNumberMethods *m;
   1779 
   1780     if (o == NULL)
   1781         return null_error();
   1782     m = o->ob_type->tp_as_number;
   1783     if (m && m->nb_float) { /* This should include subclasses of float */
   1784         PyObject *res = m->nb_float(o);
   1785         if (res && !PyFloat_Check(res)) {
   1786             PyErr_Format(PyExc_TypeError,
   1787               "__float__ returned non-float (type %.200s)",
   1788               res->ob_type->tp_name);
   1789             Py_DECREF(res);
   1790             return NULL;
   1791         }
   1792         return res;
   1793     }
   1794     if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
   1795         PyFloatObject *po = (PyFloatObject *)o;
   1796         return PyFloat_FromDouble(po->ob_fval);
   1797     }
   1798     return PyFloat_FromString(o, NULL);
   1799 }
   1800 
   1801 PyObject *
   1802 PyNumber_ToBase(PyObject *n, int base)
   1803 {
   1804     PyObject *res = NULL;
   1805     PyObject *index = PyNumber_Index(n);
   1806 
   1807     if (!index)
   1808         return NULL;
   1809     if (PyLong_Check(index))
   1810         res = _PyLong_Format(index, base, 0, 1);
   1811     else if (PyInt_Check(index))
   1812         res = _PyInt_Format((PyIntObject*)index, base, 1);
   1813     else
   1814         /* It should not be possible to get here, as
   1815            PyNumber_Index already has a check for the same
   1816            condition */
   1817         PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
   1818                         "int or long");
   1819     Py_DECREF(index);
   1820     return res;
   1821 }
   1822 
   1823 
   1824 /* Operations on sequences */
   1825 
   1826 int
   1827 PySequence_Check(PyObject *s)
   1828 {
   1829     if (s == NULL)
   1830         return 0;
   1831     if (PyInstance_Check(s))
   1832         return PyObject_HasAttrString(s, "__getitem__");
   1833     if (PyDict_Check(s))
   1834         return 0;
   1835     return  s->ob_type->tp_as_sequence &&
   1836         s->ob_type->tp_as_sequence->sq_item != NULL;
   1837 }
   1838 
   1839 Py_ssize_t
   1840 PySequence_Size(PyObject *s)
   1841 {
   1842     PySequenceMethods *m;
   1843 
   1844     if (s == NULL) {
   1845         null_error();
   1846         return -1;
   1847     }
   1848 
   1849     m = s->ob_type->tp_as_sequence;
   1850     if (m && m->sq_length)
   1851         return m->sq_length(s);
   1852 
   1853     type_error("object of type '%.200s' has no len()", s);
   1854     return -1;
   1855 }
   1856 
   1857 #undef PySequence_Length
   1858 Py_ssize_t
   1859 PySequence_Length(PyObject *s)
   1860 {
   1861     return PySequence_Size(s);
   1862 }
   1863 #define PySequence_Length PySequence_Size
   1864 
   1865 PyObject *
   1866 PySequence_Concat(PyObject *s, PyObject *o)
   1867 {
   1868     PySequenceMethods *m;
   1869 
   1870     if (s == NULL || o == NULL)
   1871         return null_error();
   1872 
   1873     m = s->ob_type->tp_as_sequence;
   1874     if (m && m->sq_concat)
   1875         return m->sq_concat(s, o);
   1876 
   1877     /* Instances of user classes defining an __add__() method only
   1878        have an nb_add slot, not an sq_concat slot.  So we fall back
   1879        to nb_add if both arguments appear to be sequences. */
   1880     if (PySequence_Check(s) && PySequence_Check(o)) {
   1881         PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
   1882         if (result != Py_NotImplemented)
   1883             return result;
   1884         Py_DECREF(result);
   1885     }
   1886     return type_error("'%.200s' object can't be concatenated", s);
   1887 }
   1888 
   1889 PyObject *
   1890 PySequence_Repeat(PyObject *o, Py_ssize_t count)
   1891 {
   1892     PySequenceMethods *m;
   1893 
   1894     if (o == NULL)
   1895         return null_error();
   1896 
   1897     m = o->ob_type->tp_as_sequence;
   1898     if (m && m->sq_repeat)
   1899         return m->sq_repeat(o, count);
   1900 
   1901     /* Instances of user classes defining a __mul__() method only
   1902        have an nb_multiply slot, not an sq_repeat slot. so we fall back
   1903        to nb_multiply if o appears to be a sequence. */
   1904     if (PySequence_Check(o)) {
   1905         PyObject *n, *result;
   1906         n = PyInt_FromSsize_t(count);
   1907         if (n == NULL)
   1908             return NULL;
   1909         result = binary_op1(o, n, NB_SLOT(nb_multiply));
   1910         Py_DECREF(n);
   1911         if (result != Py_NotImplemented)
   1912             return result;
   1913         Py_DECREF(result);
   1914     }
   1915     return type_error("'%.200s' object can't be repeated", o);
   1916 }
   1917 
   1918 PyObject *
   1919 PySequence_InPlaceConcat(PyObject *s, PyObject *o)
   1920 {
   1921     PySequenceMethods *m;
   1922 
   1923     if (s == NULL || o == NULL)
   1924         return null_error();
   1925 
   1926     m = s->ob_type->tp_as_sequence;
   1927     if (m && HASINPLACE(s) && m->sq_inplace_concat)
   1928         return m->sq_inplace_concat(s, o);
   1929     if (m && m->sq_concat)
   1930         return m->sq_concat(s, o);
   1931 
   1932     if (PySequence_Check(s) && PySequence_Check(o)) {
   1933         PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
   1934                                        NB_SLOT(nb_add));
   1935         if (result != Py_NotImplemented)
   1936             return result;
   1937         Py_DECREF(result);
   1938     }
   1939     return type_error("'%.200s' object can't be concatenated", s);
   1940 }
   1941 
   1942 PyObject *
   1943 PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
   1944 {
   1945     PySequenceMethods *m;
   1946 
   1947     if (o == NULL)
   1948         return null_error();
   1949 
   1950     m = o->ob_type->tp_as_sequence;
   1951     if (m && HASINPLACE(o) && m->sq_inplace_repeat)
   1952         return m->sq_inplace_repeat(o, count);
   1953     if (m && m->sq_repeat)
   1954         return m->sq_repeat(o, count);
   1955 
   1956     if (PySequence_Check(o)) {
   1957         PyObject *n, *result;
   1958         n = PyInt_FromSsize_t(count);
   1959         if (n == NULL)
   1960             return NULL;
   1961         result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
   1962                              NB_SLOT(nb_multiply));
   1963         Py_DECREF(n);
   1964         if (result != Py_NotImplemented)
   1965             return result;
   1966         Py_DECREF(result);
   1967     }
   1968     return type_error("'%.200s' object can't be repeated", o);
   1969 }
   1970 
   1971 PyObject *
   1972 PySequence_GetItem(PyObject *s, Py_ssize_t i)
   1973 {
   1974     PySequenceMethods *m;
   1975 
   1976     if (s == NULL)
   1977         return null_error();
   1978 
   1979     m = s->ob_type->tp_as_sequence;
   1980     if (m && m->sq_item) {
   1981         if (i < 0) {
   1982             if (m->sq_length) {
   1983                 Py_ssize_t l = (*m->sq_length)(s);
   1984                 if (l < 0)
   1985                     return NULL;
   1986                 i += l;
   1987             }
   1988         }
   1989         return m->sq_item(s, i);
   1990     }
   1991 
   1992     return type_error("'%.200s' object does not support indexing", s);
   1993 }
   1994 
   1995 PyObject *
   1996 PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
   1997 {
   1998     PySequenceMethods *m;
   1999     PyMappingMethods *mp;
   2000 
   2001     if (!s) return null_error();
   2002 
   2003     m = s->ob_type->tp_as_sequence;
   2004     if (m && m->sq_slice) {
   2005         if (i1 < 0 || i2 < 0) {
   2006             if (m->sq_length) {
   2007                 Py_ssize_t l = (*m->sq_length)(s);
   2008                 if (l < 0)
   2009                     return NULL;
   2010                 if (i1 < 0)
   2011                     i1 += l;
   2012                 if (i2 < 0)
   2013                     i2 += l;
   2014             }
   2015         }
   2016         return m->sq_slice(s, i1, i2);
   2017     } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
   2018         PyObject *res;
   2019         PyObject *slice = _PySlice_FromIndices(i1, i2);
   2020         if (!slice)
   2021             return NULL;
   2022         res = mp->mp_subscript(s, slice);
   2023         Py_DECREF(slice);
   2024         return res;
   2025     }
   2026 
   2027     return type_error("'%.200s' object is unsliceable", s);
   2028 }
   2029 
   2030 int
   2031 PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
   2032 {
   2033     PySequenceMethods *m;
   2034 
   2035     if (s == NULL) {
   2036         null_error();
   2037         return -1;
   2038     }
   2039 
   2040     m = s->ob_type->tp_as_sequence;
   2041     if (m && m->sq_ass_item) {
   2042         if (i < 0) {
   2043             if (m->sq_length) {
   2044                 Py_ssize_t l = (*m->sq_length)(s);
   2045                 if (l < 0)
   2046                     return -1;
   2047                 i += l;
   2048             }
   2049         }
   2050         return m->sq_ass_item(s, i, o);
   2051     }
   2052 
   2053     type_error("'%.200s' object does not support item assignment", s);
   2054     return -1;
   2055 }
   2056 
   2057 int
   2058 PySequence_DelItem(PyObject *s, Py_ssize_t i)
   2059 {
   2060     PySequenceMethods *m;
   2061 
   2062     if (s == NULL) {
   2063         null_error();
   2064         return -1;
   2065     }
   2066 
   2067     m = s->ob_type->tp_as_sequence;
   2068     if (m && m->sq_ass_item) {
   2069         if (i < 0) {
   2070             if (m->sq_length) {
   2071                 Py_ssize_t l = (*m->sq_length)(s);
   2072                 if (l < 0)
   2073                     return -1;
   2074                 i += l;
   2075             }
   2076         }
   2077         return m->sq_ass_item(s, i, (PyObject *)NULL);
   2078     }
   2079 
   2080     type_error("'%.200s' object doesn't support item deletion", s);
   2081     return -1;
   2082 }
   2083 
   2084 int
   2085 PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
   2086 {
   2087     PySequenceMethods *m;
   2088     PyMappingMethods *mp;
   2089 
   2090     if (s == NULL) {
   2091         null_error();
   2092         return -1;
   2093     }
   2094 
   2095     m = s->ob_type->tp_as_sequence;
   2096     if (m && m->sq_ass_slice) {
   2097         if (i1 < 0 || i2 < 0) {
   2098             if (m->sq_length) {
   2099                 Py_ssize_t l = (*m->sq_length)(s);
   2100                 if (l < 0)
   2101                     return -1;
   2102                 if (i1 < 0)
   2103                     i1 += l;
   2104                 if (i2 < 0)
   2105                     i2 += l;
   2106             }
   2107         }
   2108         return m->sq_ass_slice(s, i1, i2, o);
   2109     } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
   2110         int res;
   2111         PyObject *slice = _PySlice_FromIndices(i1, i2);
   2112         if (!slice)
   2113             return -1;
   2114         res = mp->mp_ass_subscript(s, slice, o);
   2115         Py_DECREF(slice);
   2116         return res;
   2117     }
   2118 
   2119     type_error("'%.200s' object doesn't support slice assignment", s);
   2120     return -1;
   2121 }
   2122 
   2123 int
   2124 PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
   2125 {
   2126     PySequenceMethods *m;
   2127 
   2128     if (s == NULL) {
   2129         null_error();
   2130         return -1;
   2131     }
   2132 
   2133     m = s->ob_type->tp_as_sequence;
   2134     if (m && m->sq_ass_slice) {
   2135         if (i1 < 0 || i2 < 0) {
   2136             if (m->sq_length) {
   2137                 Py_ssize_t l = (*m->sq_length)(s);
   2138                 if (l < 0)
   2139                     return -1;
   2140                 if (i1 < 0)
   2141                     i1 += l;
   2142                 if (i2 < 0)
   2143                     i2 += l;
   2144             }
   2145         }
   2146         return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
   2147     }
   2148     type_error("'%.200s' object doesn't support slice deletion", s);
   2149     return -1;
   2150 }
   2151 
   2152 PyObject *
   2153 PySequence_Tuple(PyObject *v)
   2154 {
   2155     PyObject *it;  /* iter(v) */
   2156     Py_ssize_t n;         /* guess for result tuple size */
   2157     PyObject *result = NULL;
   2158     Py_ssize_t j;
   2159 
   2160     if (v == NULL)
   2161         return null_error();
   2162 
   2163     /* Special-case the common tuple and list cases, for efficiency. */
   2164     if (PyTuple_CheckExact(v)) {
   2165         /* Note that we can't know whether it's safe to return
   2166            a tuple *subclass* instance as-is, hence the restriction
   2167            to exact tuples here.  In contrast, lists always make
   2168            a copy, so there's no need for exactness below. */
   2169         Py_INCREF(v);
   2170         return v;
   2171     }
   2172     if (PyList_Check(v))
   2173         return PyList_AsTuple(v);
   2174 
   2175     /* Get iterator. */
   2176     it = PyObject_GetIter(v);
   2177     if (it == NULL)
   2178         return NULL;
   2179 
   2180     /* Guess result size and allocate space. */
   2181     n = _PyObject_LengthHint(v, 10);
   2182     if (n == -1)
   2183         goto Fail;
   2184     result = PyTuple_New(n);
   2185     if (result == NULL)
   2186         goto Fail;
   2187 
   2188     /* Fill the tuple. */
   2189     for (j = 0; ; ++j) {
   2190         PyObject *item = PyIter_Next(it);
   2191         if (item == NULL) {
   2192             if (PyErr_Occurred())
   2193                 goto Fail;
   2194             break;
   2195         }
   2196         if (j >= n) {
   2197             Py_ssize_t oldn = n;
   2198             /* The over-allocation strategy can grow a bit faster
   2199                than for lists because unlike lists the
   2200                over-allocation isn't permanent -- we reclaim
   2201                the excess before the end of this routine.
   2202                So, grow by ten and then add 25%.
   2203             */
   2204             n += 10;
   2205             n += n >> 2;
   2206             if (n < oldn) {
   2207                 /* Check for overflow */
   2208                 PyErr_NoMemory();
   2209                 Py_DECREF(item);
   2210                 goto Fail;
   2211             }
   2212             if (_PyTuple_Resize(&result, n) != 0) {
   2213                 Py_DECREF(item);
   2214                 goto Fail;
   2215             }
   2216         }
   2217         PyTuple_SET_ITEM(result, j, item);
   2218     }
   2219 
   2220     /* Cut tuple back if guess was too large. */
   2221     if (j < n &&
   2222         _PyTuple_Resize(&result, j) != 0)
   2223         goto Fail;
   2224 
   2225     Py_DECREF(it);
   2226     return result;
   2227 
   2228 Fail:
   2229     Py_XDECREF(result);
   2230     Py_DECREF(it);
   2231     return NULL;
   2232 }
   2233 
   2234 PyObject *
   2235 PySequence_List(PyObject *v)
   2236 {
   2237     PyObject *result;  /* result list */
   2238     PyObject *rv;      /* return value from PyList_Extend */
   2239 
   2240     if (v == NULL)
   2241         return null_error();
   2242 
   2243     result = PyList_New(0);
   2244     if (result == NULL)
   2245         return NULL;
   2246 
   2247     rv = _PyList_Extend((PyListObject *)result, v);
   2248     if (rv == NULL) {
   2249         Py_DECREF(result);
   2250         return NULL;
   2251     }
   2252     Py_DECREF(rv);
   2253     return result;
   2254 }
   2255 
   2256 PyObject *
   2257 PySequence_Fast(PyObject *v, const char *m)
   2258 {
   2259     PyObject *it;
   2260 
   2261     if (v == NULL)
   2262         return null_error();
   2263 
   2264     if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
   2265         Py_INCREF(v);
   2266         return v;
   2267     }
   2268 
   2269     it = PyObject_GetIter(v);
   2270     if (it == NULL) {
   2271         if (PyErr_ExceptionMatches(PyExc_TypeError))
   2272             PyErr_SetString(PyExc_TypeError, m);
   2273         return NULL;
   2274     }
   2275 
   2276     v = PySequence_List(it);
   2277     Py_DECREF(it);
   2278 
   2279     return v;
   2280 }
   2281 
   2282 /* Iterate over seq.  Result depends on the operation:
   2283    PY_ITERSEARCH_COUNT:  -1 if error, else # of times obj appears in seq.
   2284    PY_ITERSEARCH_INDEX:  0-based index of first occurrence of obj in seq;
   2285     set ValueError and return -1 if none found; also return -1 on error.
   2286    Py_ITERSEARCH_CONTAINS:  return 1 if obj in seq, else 0; -1 on error.
   2287 */
   2288 Py_ssize_t
   2289 _PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
   2290 {
   2291     Py_ssize_t n;
   2292     int wrapped;  /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
   2293     PyObject *it;  /* iter(seq) */
   2294 
   2295     if (seq == NULL || obj == NULL) {
   2296         null_error();
   2297         return -1;
   2298     }
   2299 
   2300     it = PyObject_GetIter(seq);
   2301     if (it == NULL) {
   2302         type_error("argument of type '%.200s' is not iterable", seq);
   2303         return -1;
   2304     }
   2305 
   2306     n = wrapped = 0;
   2307     for (;;) {
   2308         int cmp;
   2309         PyObject *item = PyIter_Next(it);
   2310         if (item == NULL) {
   2311             if (PyErr_Occurred())
   2312                 goto Fail;
   2313             break;
   2314         }
   2315 
   2316         cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
   2317         Py_DECREF(item);
   2318         if (cmp < 0)
   2319             goto Fail;
   2320         if (cmp > 0) {
   2321             switch (operation) {
   2322             case PY_ITERSEARCH_COUNT:
   2323                 if (n == PY_SSIZE_T_MAX) {
   2324                     PyErr_SetString(PyExc_OverflowError,
   2325                            "count exceeds C integer size");
   2326                     goto Fail;
   2327                 }
   2328                 ++n;
   2329                 break;
   2330 
   2331             case PY_ITERSEARCH_INDEX:
   2332                 if (wrapped) {
   2333                     PyErr_SetString(PyExc_OverflowError,
   2334                            "index exceeds C integer size");
   2335                     goto Fail;
   2336                 }
   2337                 goto Done;
   2338 
   2339             case PY_ITERSEARCH_CONTAINS:
   2340                 n = 1;
   2341                 goto Done;
   2342 
   2343             default:
   2344                 assert(!"unknown operation");
   2345             }
   2346         }
   2347 
   2348         if (operation == PY_ITERSEARCH_INDEX) {
   2349             if (n == PY_SSIZE_T_MAX)
   2350                 wrapped = 1;
   2351             ++n;
   2352         }
   2353     }
   2354 
   2355     if (operation != PY_ITERSEARCH_INDEX)
   2356         goto Done;
   2357 
   2358     PyErr_SetString(PyExc_ValueError,
   2359                     "sequence.index(x): x not in sequence");
   2360     /* fall into failure code */
   2361 Fail:
   2362     n = -1;
   2363     /* fall through */
   2364 Done:
   2365     Py_DECREF(it);
   2366     return n;
   2367 
   2368 }
   2369 
   2370 /* Return # of times o appears in s. */
   2371 Py_ssize_t
   2372 PySequence_Count(PyObject *s, PyObject *o)
   2373 {
   2374     return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
   2375 }
   2376 
   2377 /* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
   2378  * Use sq_contains if possible, else defer to _PySequence_IterSearch().
   2379  */
   2380 int
   2381 PySequence_Contains(PyObject *seq, PyObject *ob)
   2382 {
   2383     Py_ssize_t result;
   2384     if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
   2385         PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
   2386         if (sqm != NULL && sqm->sq_contains != NULL)
   2387             return (*sqm->sq_contains)(seq, ob);
   2388     }
   2389     result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
   2390     return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
   2391 }
   2392 
   2393 /* Backwards compatibility */
   2394 #undef PySequence_In
   2395 int
   2396 PySequence_In(PyObject *w, PyObject *v)
   2397 {
   2398     return PySequence_Contains(w, v);
   2399 }
   2400 
   2401 Py_ssize_t
   2402 PySequence_Index(PyObject *s, PyObject *o)
   2403 {
   2404     return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
   2405 }
   2406 
   2407 /* Operations on mappings */
   2408 
   2409 int
   2410 PyMapping_Check(PyObject *o)
   2411 {
   2412     if (o && PyInstance_Check(o))
   2413         return PyObject_HasAttrString(o, "__getitem__");
   2414 
   2415     return  o && o->ob_type->tp_as_mapping &&
   2416         o->ob_type->tp_as_mapping->mp_subscript &&
   2417         !(o->ob_type->tp_as_sequence &&
   2418           o->ob_type->tp_as_sequence->sq_slice);
   2419 }
   2420 
   2421 Py_ssize_t
   2422 PyMapping_Size(PyObject *o)
   2423 {
   2424     PyMappingMethods *m;
   2425 
   2426     if (o == NULL) {
   2427         null_error();
   2428         return -1;
   2429     }
   2430 
   2431     m = o->ob_type->tp_as_mapping;
   2432     if (m && m->mp_length)
   2433         return m->mp_length(o);
   2434 
   2435     type_error("object of type '%.200s' has no len()", o);
   2436     return -1;
   2437 }
   2438 
   2439 #undef PyMapping_Length
   2440 Py_ssize_t
   2441 PyMapping_Length(PyObject *o)
   2442 {
   2443     return PyMapping_Size(o);
   2444 }
   2445 #define PyMapping_Length PyMapping_Size
   2446 
   2447 PyObject *
   2448 PyMapping_GetItemString(PyObject *o, char *key)
   2449 {
   2450     PyObject *okey, *r;
   2451 
   2452     if (key == NULL)
   2453         return null_error();
   2454 
   2455     okey = PyString_FromString(key);
   2456     if (okey == NULL)
   2457         return NULL;
   2458     r = PyObject_GetItem(o, okey);
   2459     Py_DECREF(okey);
   2460     return r;
   2461 }
   2462 
   2463 int
   2464 PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
   2465 {
   2466     PyObject *okey;
   2467     int r;
   2468 
   2469     if (key == NULL) {
   2470         null_error();
   2471         return -1;
   2472     }
   2473 
   2474     okey = PyString_FromString(key);
   2475     if (okey == NULL)
   2476         return -1;
   2477     r = PyObject_SetItem(o, okey, value);
   2478     Py_DECREF(okey);
   2479     return r;
   2480 }
   2481 
   2482 int
   2483 PyMapping_HasKeyString(PyObject *o, char *key)
   2484 {
   2485     PyObject *v;
   2486 
   2487     v = PyMapping_GetItemString(o, key);
   2488     if (v) {
   2489         Py_DECREF(v);
   2490         return 1;
   2491     }
   2492     PyErr_Clear();
   2493     return 0;
   2494 }
   2495 
   2496 int
   2497 PyMapping_HasKey(PyObject *o, PyObject *key)
   2498 {
   2499     PyObject *v;
   2500 
   2501     v = PyObject_GetItem(o, key);
   2502     if (v) {
   2503         Py_DECREF(v);
   2504         return 1;
   2505     }
   2506     PyErr_Clear();
   2507     return 0;
   2508 }
   2509 
   2510 /* Operations on callable objects */
   2511 
   2512 /* XXX PyCallable_Check() is in object.c */
   2513 
   2514 PyObject *
   2515 PyObject_CallObject(PyObject *o, PyObject *a)
   2516 {
   2517     return PyEval_CallObjectWithKeywords(o, a, NULL);
   2518 }
   2519 
   2520 PyObject *
   2521 PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
   2522 {
   2523     ternaryfunc call;
   2524 
   2525     if ((call = func->ob_type->tp_call) != NULL) {
   2526         PyObject *result;
   2527         if (Py_EnterRecursiveCall(" while calling a Python object"))
   2528             return NULL;
   2529         result = (*call)(func, arg, kw);
   2530         Py_LeaveRecursiveCall();
   2531         if (result == NULL && !PyErr_Occurred())
   2532             PyErr_SetString(
   2533                 PyExc_SystemError,
   2534                 "NULL result without error in PyObject_Call");
   2535         return result;
   2536     }
   2537     PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
   2538                  func->ob_type->tp_name);
   2539     return NULL;
   2540 }
   2541 
   2542 static PyObject*
   2543 call_function_tail(PyObject *callable, PyObject *args)
   2544 {
   2545     PyObject *retval;
   2546 
   2547     if (args == NULL)
   2548         return NULL;
   2549 
   2550     if (!PyTuple_Check(args)) {
   2551         PyObject *a;
   2552 
   2553         a = PyTuple_New(1);
   2554         if (a == NULL) {
   2555             Py_DECREF(args);
   2556             return NULL;
   2557         }
   2558         PyTuple_SET_ITEM(a, 0, args);
   2559         args = a;
   2560     }
   2561     retval = PyObject_Call(callable, args, NULL);
   2562 
   2563     Py_DECREF(args);
   2564 
   2565     return retval;
   2566 }
   2567 
   2568 PyObject *
   2569 PyObject_CallFunction(PyObject *callable, char *format, ...)
   2570 {
   2571     va_list va;
   2572     PyObject *args;
   2573 
   2574     if (callable == NULL)
   2575         return null_error();
   2576 
   2577     if (format && *format) {
   2578         va_start(va, format);
   2579         args = Py_VaBuildValue(format, va);
   2580         va_end(va);
   2581     }
   2582     else
   2583         args = PyTuple_New(0);
   2584 
   2585     return call_function_tail(callable, args);
   2586 }
   2587 
   2588 PyObject *
   2589 _PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
   2590 {
   2591     va_list va;
   2592     PyObject *args;
   2593 
   2594     if (callable == NULL)
   2595         return null_error();
   2596 
   2597     if (format && *format) {
   2598         va_start(va, format);
   2599         args = _Py_VaBuildValue_SizeT(format, va);
   2600         va_end(va);
   2601     }
   2602     else
   2603         args = PyTuple_New(0);
   2604 
   2605     return call_function_tail(callable, args);
   2606 }
   2607 
   2608 PyObject *
   2609 PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
   2610 {
   2611     va_list va;
   2612     PyObject *args;
   2613     PyObject *func = NULL;
   2614     PyObject *retval = NULL;
   2615 
   2616     if (o == NULL || name == NULL)
   2617         return null_error();
   2618 
   2619     func = PyObject_GetAttrString(o, name);
   2620     if (func == NULL) {
   2621         PyErr_SetString(PyExc_AttributeError, name);
   2622         return 0;
   2623     }
   2624 
   2625     if (!PyCallable_Check(func)) {
   2626         type_error("attribute of type '%.200s' is not callable", func);
   2627         goto exit;
   2628     }
   2629 
   2630     if (format && *format) {
   2631         va_start(va, format);
   2632         args = Py_VaBuildValue(format, va);
   2633         va_end(va);
   2634     }
   2635     else
   2636         args = PyTuple_New(0);
   2637 
   2638     retval = call_function_tail(func, args);
   2639 
   2640   exit:
   2641     /* args gets consumed in call_function_tail */
   2642     Py_XDECREF(func);
   2643 
   2644     return retval;
   2645 }
   2646 
   2647 PyObject *
   2648 _PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
   2649 {
   2650     va_list va;
   2651     PyObject *args;
   2652     PyObject *func = NULL;
   2653     PyObject *retval = NULL;
   2654 
   2655     if (o == NULL || name == NULL)
   2656         return null_error();
   2657 
   2658     func = PyObject_GetAttrString(o, name);
   2659     if (func == NULL) {
   2660         PyErr_SetString(PyExc_AttributeError, name);
   2661         return 0;
   2662     }
   2663 
   2664     if (!PyCallable_Check(func)) {
   2665         type_error("attribute of type '%.200s' is not callable", func);
   2666         goto exit;
   2667     }
   2668 
   2669     if (format && *format) {
   2670         va_start(va, format);
   2671         args = _Py_VaBuildValue_SizeT(format, va);
   2672         va_end(va);
   2673     }
   2674     else
   2675         args = PyTuple_New(0);
   2676 
   2677     retval = call_function_tail(func, args);
   2678 
   2679   exit:
   2680     /* args gets consumed in call_function_tail */
   2681     Py_XDECREF(func);
   2682 
   2683     return retval;
   2684 }
   2685 
   2686 
   2687 static PyObject *
   2688 objargs_mktuple(va_list va)
   2689 {
   2690     int i, n = 0;
   2691     va_list countva;
   2692     PyObject *result, *tmp;
   2693 
   2694 #ifdef VA_LIST_IS_ARRAY
   2695     memcpy(countva, va, sizeof(va_list));
   2696 #else
   2697 #ifdef __va_copy
   2698     __va_copy(countva, va);
   2699 #else
   2700     countva = va;
   2701 #endif
   2702 #endif
   2703 
   2704     while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
   2705         ++n;
   2706     result = PyTuple_New(n);
   2707     if (result != NULL && n > 0) {
   2708         for (i = 0; i < n; ++i) {
   2709             tmp = (PyObject *)va_arg(va, PyObject *);
   2710             PyTuple_SET_ITEM(result, i, tmp);
   2711             Py_INCREF(tmp);
   2712         }
   2713     }
   2714     return result;
   2715 }
   2716 
   2717 PyObject *
   2718 PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
   2719 {
   2720     PyObject *args, *tmp;
   2721     va_list vargs;
   2722 
   2723     if (callable == NULL || name == NULL)
   2724         return null_error();
   2725 
   2726     callable = PyObject_GetAttr(callable, name);
   2727     if (callable == NULL)
   2728         return NULL;
   2729 
   2730     /* count the args */
   2731     va_start(vargs, name);
   2732     args = objargs_mktuple(vargs);
   2733     va_end(vargs);
   2734     if (args == NULL) {
   2735         Py_DECREF(callable);
   2736         return NULL;
   2737     }
   2738     tmp = PyObject_Call(callable, args, NULL);
   2739     Py_DECREF(args);
   2740     Py_DECREF(callable);
   2741 
   2742     return tmp;
   2743 }
   2744 
   2745 PyObject *
   2746 PyObject_CallFunctionObjArgs(PyObject *callable, ...)
   2747 {
   2748     PyObject *args, *tmp;
   2749     va_list vargs;
   2750 
   2751     if (callable == NULL)
   2752         return null_error();
   2753 
   2754     /* count the args */
   2755     va_start(vargs, callable);
   2756     args = objargs_mktuple(vargs);
   2757     va_end(vargs);
   2758     if (args == NULL)
   2759         return NULL;
   2760     tmp = PyObject_Call(callable, args, NULL);
   2761     Py_DECREF(args);
   2762 
   2763     return tmp;
   2764 }
   2765 
   2766 
   2767 /* isinstance(), issubclass() */
   2768 
   2769 /* abstract_get_bases() has logically 4 return states, with a sort of 0th
   2770  * state that will almost never happen.
   2771  *
   2772  * 0. creating the __bases__ static string could get a MemoryError
   2773  * 1. getattr(cls, '__bases__') could raise an AttributeError
   2774  * 2. getattr(cls, '__bases__') could raise some other exception
   2775  * 3. getattr(cls, '__bases__') could return a tuple
   2776  * 4. getattr(cls, '__bases__') could return something other than a tuple
   2777  *
   2778  * Only state #3 is a non-error state and only it returns a non-NULL object
   2779  * (it returns the retrieved tuple).
   2780  *
   2781  * Any raised AttributeErrors are masked by clearing the exception and
   2782  * returning NULL.  If an object other than a tuple comes out of __bases__,
   2783  * then again, the return value is NULL.  So yes, these two situations
   2784  * produce exactly the same results: NULL is returned and no error is set.
   2785  *
   2786  * If some exception other than AttributeError is raised, then NULL is also
   2787  * returned, but the exception is not cleared.  That's because we want the
   2788  * exception to be propagated along.
   2789  *
   2790  * Callers are expected to test for PyErr_Occurred() when the return value
   2791  * is NULL to decide whether a valid exception should be propagated or not.
   2792  * When there's no exception to propagate, it's customary for the caller to
   2793  * set a TypeError.
   2794  */
   2795 static PyObject *
   2796 abstract_get_bases(PyObject *cls)
   2797 {
   2798     static PyObject *__bases__ = NULL;
   2799     PyObject *bases;
   2800 
   2801     if (__bases__ == NULL) {
   2802         __bases__ = PyString_InternFromString("__bases__");
   2803         if (__bases__ == NULL)
   2804             return NULL;
   2805     }
   2806     bases = PyObject_GetAttr(cls, __bases__);
   2807     if (bases == NULL) {
   2808         if (PyErr_ExceptionMatches(PyExc_AttributeError))
   2809             PyErr_Clear();
   2810         return NULL;
   2811     }
   2812     if (!PyTuple_Check(bases)) {
   2813         Py_DECREF(bases);
   2814         return NULL;
   2815     }
   2816     return bases;
   2817 }
   2818 
   2819 
   2820 static int
   2821 abstract_issubclass(PyObject *derived, PyObject *cls)
   2822 {
   2823     PyObject *bases = NULL;
   2824     Py_ssize_t i, n;
   2825     int r = 0;
   2826 
   2827     while (1) {
   2828         if (derived == cls)
   2829             return 1;
   2830         bases = abstract_get_bases(derived);
   2831         if (bases == NULL) {
   2832             if (PyErr_Occurred())
   2833                 return -1;
   2834             return 0;
   2835         }
   2836         n = PyTuple_GET_SIZE(bases);
   2837         if (n == 0) {
   2838             Py_DECREF(bases);
   2839             return 0;
   2840         }
   2841         /* Avoid recursivity in the single inheritance case */
   2842         if (n == 1) {
   2843             derived = PyTuple_GET_ITEM(bases, 0);
   2844             Py_DECREF(bases);
   2845             continue;
   2846         }
   2847         for (i = 0; i < n; i++) {
   2848             r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
   2849             if (r != 0)
   2850                 break;
   2851         }
   2852         Py_DECREF(bases);
   2853         return r;
   2854     }
   2855 }
   2856 
   2857 static int
   2858 check_class(PyObject *cls, const char *error)
   2859 {
   2860     PyObject *bases = abstract_get_bases(cls);
   2861     if (bases == NULL) {
   2862         /* Do not mask errors. */
   2863         if (!PyErr_Occurred())
   2864             PyErr_SetString(PyExc_TypeError, error);
   2865         return 0;
   2866     }
   2867     Py_DECREF(bases);
   2868     return -1;
   2869 }
   2870 
   2871 static int
   2872 recursive_isinstance(PyObject *inst, PyObject *cls)
   2873 {
   2874     PyObject *icls;
   2875     static PyObject *__class__ = NULL;
   2876     int retval = 0;
   2877 
   2878     if (__class__ == NULL) {
   2879         __class__ = PyString_InternFromString("__class__");
   2880         if (__class__ == NULL)
   2881             return -1;
   2882     }
   2883 
   2884     if (PyClass_Check(cls) && PyInstance_Check(inst)) {
   2885         PyObject *inclass =
   2886             (PyObject*)((PyInstanceObject*)inst)->in_class;
   2887         retval = PyClass_IsSubclass(inclass, cls);
   2888     }
   2889     else if (PyType_Check(cls)) {
   2890         retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
   2891         if (retval == 0) {
   2892             PyObject *c = PyObject_GetAttr(inst, __class__);
   2893             if (c == NULL) {
   2894                 PyErr_Clear();
   2895             }
   2896             else {
   2897                 if (c != (PyObject *)(inst->ob_type) &&
   2898                     PyType_Check(c))
   2899                     retval = PyType_IsSubtype(
   2900                         (PyTypeObject *)c,
   2901                         (PyTypeObject *)cls);
   2902                 Py_DECREF(c);
   2903             }
   2904         }
   2905     }
   2906     else {
   2907         if (!check_class(cls,
   2908             "isinstance() arg 2 must be a class, type,"
   2909             " or tuple of classes and types"))
   2910             return -1;
   2911         icls = PyObject_GetAttr(inst, __class__);
   2912         if (icls == NULL) {
   2913             PyErr_Clear();
   2914             retval = 0;
   2915         }
   2916         else {
   2917             retval = abstract_issubclass(icls, cls);
   2918             Py_DECREF(icls);
   2919         }
   2920     }
   2921 
   2922     return retval;
   2923 }
   2924 
   2925 int
   2926 PyObject_IsInstance(PyObject *inst, PyObject *cls)
   2927 {
   2928     static PyObject *name = NULL;
   2929 
   2930     /* Quick test for an exact match */
   2931     if (Py_TYPE(inst) == (PyTypeObject *)cls)
   2932         return 1;
   2933 
   2934     if (PyTuple_Check(cls)) {
   2935         Py_ssize_t i;
   2936         Py_ssize_t n;
   2937         int r = 0;
   2938 
   2939         if (Py_EnterRecursiveCall(" in __instancecheck__"))
   2940             return -1;
   2941         n = PyTuple_GET_SIZE(cls);
   2942         for (i = 0; i < n; ++i) {
   2943             PyObject *item = PyTuple_GET_ITEM(cls, i);
   2944             r = PyObject_IsInstance(inst, item);
   2945             if (r != 0)
   2946                 /* either found it, or got an error */
   2947                 break;
   2948         }
   2949         Py_LeaveRecursiveCall();
   2950         return r;
   2951     }
   2952 
   2953     if (!(PyClass_Check(cls) || PyInstance_Check(cls))) {
   2954         PyObject *checker;
   2955         checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name);
   2956         if (checker != NULL) {
   2957             PyObject *res;
   2958             int ok = -1;
   2959             if (Py_EnterRecursiveCall(" in __instancecheck__")) {
   2960                 Py_DECREF(checker);
   2961                 return ok;
   2962             }
   2963             res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
   2964             Py_LeaveRecursiveCall();
   2965             Py_DECREF(checker);
   2966             if (res != NULL) {
   2967                 ok = PyObject_IsTrue(res);
   2968                 Py_DECREF(res);
   2969             }
   2970             return ok;
   2971         }
   2972         else if (PyErr_Occurred())
   2973             return -1;
   2974     }
   2975     return recursive_isinstance(inst, cls);
   2976 }
   2977 
   2978 static  int
   2979 recursive_issubclass(PyObject *derived, PyObject *cls)
   2980 {
   2981     int retval;
   2982 
   2983     if (PyType_Check(cls) && PyType_Check(derived)) {
   2984         /* Fast path (non-recursive) */
   2985         return PyType_IsSubtype(
   2986             (PyTypeObject *)derived, (PyTypeObject *)cls);
   2987     }
   2988     if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
   2989         if (!check_class(derived,
   2990                          "issubclass() arg 1 must be a class"))
   2991             return -1;
   2992 
   2993         if (!check_class(cls,
   2994                         "issubclass() arg 2 must be a class"
   2995                         " or tuple of classes"))
   2996             return -1;
   2997         retval = abstract_issubclass(derived, cls);
   2998     }
   2999     else {
   3000         /* shortcut */
   3001         if (!(retval = (derived == cls)))
   3002             retval = PyClass_IsSubclass(derived, cls);
   3003     }
   3004 
   3005     return retval;
   3006 }
   3007 
   3008 int
   3009 PyObject_IsSubclass(PyObject *derived, PyObject *cls)
   3010 {
   3011     static PyObject *name = NULL;
   3012 
   3013     if (PyTuple_Check(cls)) {
   3014         Py_ssize_t i;
   3015         Py_ssize_t n;
   3016         int r = 0;
   3017 
   3018         if (Py_EnterRecursiveCall(" in __subclasscheck__"))
   3019             return -1;
   3020         n = PyTuple_GET_SIZE(cls);
   3021         for (i = 0; i < n; ++i) {
   3022             PyObject *item = PyTuple_GET_ITEM(cls, i);
   3023             r = PyObject_IsSubclass(derived, item);
   3024             if (r != 0)
   3025                 /* either found it, or got an error */
   3026                 break;
   3027         }
   3028         Py_LeaveRecursiveCall();
   3029         return r;
   3030     }
   3031     if (!(PyClass_Check(cls) || PyInstance_Check(cls))) {
   3032         PyObject *checker;
   3033         checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name);
   3034         if (checker != NULL) {
   3035             PyObject *res;
   3036             int ok = -1;
   3037             if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
   3038                 Py_DECREF(checker);
   3039                 return ok;
   3040             }
   3041             res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
   3042             Py_LeaveRecursiveCall();
   3043             Py_DECREF(checker);
   3044             if (res != NULL) {
   3045                 ok = PyObject_IsTrue(res);
   3046                 Py_DECREF(res);
   3047             }
   3048             return ok;
   3049         }
   3050         else if (PyErr_Occurred()) {
   3051             return -1;
   3052         }
   3053     }
   3054     return recursive_issubclass(derived, cls);
   3055 }
   3056 
   3057 int
   3058 _PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
   3059 {
   3060     return recursive_isinstance(inst, cls);
   3061 }
   3062 
   3063 int
   3064 _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
   3065 {
   3066     return recursive_issubclass(derived, cls);
   3067 }
   3068 
   3069 
   3070 PyObject *
   3071 PyObject_GetIter(PyObject *o)
   3072 {
   3073     PyTypeObject *t = o->ob_type;
   3074     getiterfunc f = NULL;
   3075     if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
   3076         f = t->tp_iter;
   3077     if (f == NULL) {
   3078         if (PySequence_Check(o))
   3079             return PySeqIter_New(o);
   3080         return type_error("'%.200s' object is not iterable", o);
   3081     }
   3082     else {
   3083         PyObject *res = (*f)(o);
   3084         if (res != NULL && !PyIter_Check(res)) {
   3085             PyErr_Format(PyExc_TypeError,
   3086                          "iter() returned non-iterator "
   3087                          "of type '%.100s'",
   3088                          res->ob_type->tp_name);
   3089             Py_DECREF(res);
   3090             res = NULL;
   3091         }
   3092         return res;
   3093     }
   3094 }
   3095 
   3096 /* Return next item.
   3097  * If an error occurs, return NULL.  PyErr_Occurred() will be true.
   3098  * If the iteration terminates normally, return NULL and clear the
   3099  * PyExc_StopIteration exception (if it was set).  PyErr_Occurred()
   3100  * will be false.
   3101  * Else return the next object.  PyErr_Occurred() will be false.
   3102  */
   3103 PyObject *
   3104 PyIter_Next(PyObject *iter)
   3105 {
   3106     PyObject *result;
   3107     result = (*iter->ob_type->tp_iternext)(iter);
   3108     if (result == NULL &&
   3109         PyErr_Occurred() &&
   3110         PyErr_ExceptionMatches(PyExc_StopIteration))
   3111         PyErr_Clear();
   3112     return result;
   3113 }
   3114