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 *
type_error(const char * msg,PyObject * obj)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 *
null_error(void)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
PyObject_Cmp(PyObject * o1,PyObject * o2,int * result)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 *
PyObject_Type(PyObject * o)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
PyObject_Size(PyObject * o)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
PyObject_Length(PyObject * o)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
_PyObject_LengthHint(PyObject * o,Py_ssize_t defaultvalue)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 = PyNumber_Check(ro) ? PyInt_AsSsize_t(ro) : defaultvalue;
130     Py_DECREF(ro);
131     return rv;
132 }
133 
134 PyObject *
PyObject_GetItem(PyObject * o,PyObject * key)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 has no attribute '__getitem__'", o);
160 }
161 
162 int
PyObject_SetItem(PyObject * o,PyObject * key,PyObject * value)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
PyObject_DelItem(PyObject * o,PyObject * key)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
PyObject_DelItemString(PyObject * o,char * key)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
PyObject_AsCharBuffer(PyObject * obj,const char ** buffer,Py_ssize_t * buffer_len)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
PyObject_CheckReadBuffer(PyObject * obj)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 
PyObject_AsReadBuffer(PyObject * obj,const void ** buffer,Py_ssize_t * buffer_len)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 
PyObject_AsWriteBuffer(PyObject * obj,void ** buffer,Py_ssize_t * buffer_len)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
PyObject_GetBuffer(PyObject * obj,Py_buffer * view,int flags)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
_IsFortranContiguous(Py_buffer * view)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
_IsCContiguous(Py_buffer * view)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
PyBuffer_IsContiguous(Py_buffer * view,char fort)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*
PyBuffer_GetPointer(Py_buffer * view,Py_ssize_t * indices)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
_Py_add_one_to_index_F(int nd,Py_ssize_t * index,const Py_ssize_t * shape)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
_Py_add_one_to_index_C(int nd,Py_ssize_t * index,const Py_ssize_t * shape)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
PyBuffer_ToContiguous(void * buf,Py_buffer * view,Py_ssize_t len,char fort)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     /* view->ndim <= 64 */
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         ptr = PyBuffer_GetPointer(view, indices);
525         memcpy(dest, ptr, view->itemsize);
526         dest += view->itemsize;
527         addone(view->ndim, indices, view->shape);
528     }
529     PyMem_Free(indices);
530     return 0;
531 }
532 
533 int
PyBuffer_FromContiguous(Py_buffer * view,void * buf,Py_ssize_t len,char fort)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     /* view->ndim <= 64 */
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         ptr = PyBuffer_GetPointer(view, indices);
576         memcpy(ptr, src, view->itemsize);
577         src += view->itemsize;
578         addone(view->ndim, indices, view->shape);
579     }
580 
581     PyMem_Free(indices);
582     return 0;
583 }
584 
PyObject_CopyData(PyObject * dest,PyObject * src)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
PyBuffer_FillContiguousStrides(int nd,Py_ssize_t * shape,Py_ssize_t * strides,int itemsize,char fort)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
PyBuffer_FillInfo(Py_buffer * view,PyObject * obj,void * buf,Py_ssize_t len,int readonly,int flags)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
PyBuffer_Release(Py_buffer * view)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 *
PyObject_Format(PyObject * obj,PyObject * format_spec)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         return NULL;
2622 
2623     if (!PyCallable_Check(func)) {
2624         type_error("attribute of type '%.200s' is not callable", func);
2625         goto exit;
2626     }
2627 
2628     if (format && *format) {
2629         va_start(va, format);
2630         args = Py_VaBuildValue(format, va);
2631         va_end(va);
2632     }
2633     else
2634         args = PyTuple_New(0);
2635 
2636     retval = call_function_tail(func, args);
2637 
2638   exit:
2639     /* args gets consumed in call_function_tail */
2640     Py_XDECREF(func);
2641 
2642     return retval;
2643 }
2644 
2645 PyObject *
2646 _PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2647 {
2648     va_list va;
2649     PyObject *args;
2650     PyObject *func = NULL;
2651     PyObject *retval = NULL;
2652 
2653     if (o == NULL || name == NULL)
2654         return null_error();
2655 
2656     func = PyObject_GetAttrString(o, name);
2657     if (func == NULL)
2658         return NULL;
2659 
2660     if (!PyCallable_Check(func)) {
2661         type_error("attribute of type '%.200s' is not callable", func);
2662         goto exit;
2663     }
2664 
2665     if (format && *format) {
2666         va_start(va, format);
2667         args = _Py_VaBuildValue_SizeT(format, va);
2668         va_end(va);
2669     }
2670     else
2671         args = PyTuple_New(0);
2672 
2673     retval = call_function_tail(func, args);
2674 
2675   exit:
2676     /* args gets consumed in call_function_tail */
2677     Py_XDECREF(func);
2678 
2679     return retval;
2680 }
2681 
2682 
2683 static PyObject *
2684 objargs_mktuple(va_list va)
2685 {
2686     int i, n = 0;
2687     va_list countva;
2688     PyObject *result, *tmp;
2689 
2690 #ifdef VA_LIST_IS_ARRAY
2691     memcpy(countva, va, sizeof(va_list));
2692 #else
2693 #ifdef __va_copy
2694     __va_copy(countva, va);
2695 #else
2696     countva = va;
2697 #endif
2698 #endif
2699 
2700     while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2701         ++n;
2702     result = PyTuple_New(n);
2703     if (result != NULL && n > 0) {
2704         for (i = 0; i < n; ++i) {
2705             tmp = (PyObject *)va_arg(va, PyObject *);
2706             PyTuple_SET_ITEM(result, i, tmp);
2707             Py_INCREF(tmp);
2708         }
2709     }
2710     return result;
2711 }
2712 
2713 PyObject *
2714 PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
2715 {
2716     PyObject *args, *tmp;
2717     va_list vargs;
2718 
2719     if (callable == NULL || name == NULL)
2720         return null_error();
2721 
2722     callable = PyObject_GetAttr(callable, name);
2723     if (callable == NULL)
2724         return NULL;
2725 
2726     /* count the args */
2727     va_start(vargs, name);
2728     args = objargs_mktuple(vargs);
2729     va_end(vargs);
2730     if (args == NULL) {
2731         Py_DECREF(callable);
2732         return NULL;
2733     }
2734     tmp = PyObject_Call(callable, args, NULL);
2735     Py_DECREF(args);
2736     Py_DECREF(callable);
2737 
2738     return tmp;
2739 }
2740 
2741 PyObject *
2742 PyObject_CallFunctionObjArgs(PyObject *callable, ...)
2743 {
2744     PyObject *args, *tmp;
2745     va_list vargs;
2746 
2747     if (callable == NULL)
2748         return null_error();
2749 
2750     /* count the args */
2751     va_start(vargs, callable);
2752     args = objargs_mktuple(vargs);
2753     va_end(vargs);
2754     if (args == NULL)
2755         return NULL;
2756     tmp = PyObject_Call(callable, args, NULL);
2757     Py_DECREF(args);
2758 
2759     return tmp;
2760 }
2761 
2762 
2763 /* isinstance(), issubclass() */
2764 
2765 /* abstract_get_bases() has logically 4 return states, with a sort of 0th
2766  * state that will almost never happen.
2767  *
2768  * 0. creating the __bases__ static string could get a MemoryError
2769  * 1. getattr(cls, '__bases__') could raise an AttributeError
2770  * 2. getattr(cls, '__bases__') could raise some other exception
2771  * 3. getattr(cls, '__bases__') could return a tuple
2772  * 4. getattr(cls, '__bases__') could return something other than a tuple
2773  *
2774  * Only state #3 is a non-error state and only it returns a non-NULL object
2775  * (it returns the retrieved tuple).
2776  *
2777  * Any raised AttributeErrors are masked by clearing the exception and
2778  * returning NULL.  If an object other than a tuple comes out of __bases__,
2779  * then again, the return value is NULL.  So yes, these two situations
2780  * produce exactly the same results: NULL is returned and no error is set.
2781  *
2782  * If some exception other than AttributeError is raised, then NULL is also
2783  * returned, but the exception is not cleared.  That's because we want the
2784  * exception to be propagated along.
2785  *
2786  * Callers are expected to test for PyErr_Occurred() when the return value
2787  * is NULL to decide whether a valid exception should be propagated or not.
2788  * When there's no exception to propagate, it's customary for the caller to
2789  * set a TypeError.
2790  */
2791 static PyObject *
2792 abstract_get_bases(PyObject *cls)
2793 {
2794     static PyObject *__bases__ = NULL;
2795     PyObject *bases;
2796 
2797     if (__bases__ == NULL) {
2798         __bases__ = PyString_InternFromString("__bases__");
2799         if (__bases__ == NULL)
2800             return NULL;
2801     }
2802     bases = PyObject_GetAttr(cls, __bases__);
2803     if (bases == NULL) {
2804         if (PyErr_ExceptionMatches(PyExc_AttributeError))
2805             PyErr_Clear();
2806         return NULL;
2807     }
2808     if (!PyTuple_Check(bases)) {
2809         Py_DECREF(bases);
2810         return NULL;
2811     }
2812     return bases;
2813 }
2814 
2815 
2816 static int
2817 abstract_issubclass(PyObject *derived, PyObject *cls)
2818 {
2819     PyObject *bases = NULL;
2820     Py_ssize_t i, n;
2821     int r = 0;
2822 
2823     while (1) {
2824         if (derived == cls)
2825             return 1;
2826         bases = abstract_get_bases(derived);
2827         if (bases == NULL) {
2828             if (PyErr_Occurred())
2829                 return -1;
2830             return 0;
2831         }
2832         n = PyTuple_GET_SIZE(bases);
2833         if (n == 0) {
2834             Py_DECREF(bases);
2835             return 0;
2836         }
2837         /* Avoid recursivity in the single inheritance case */
2838         if (n == 1) {
2839             derived = PyTuple_GET_ITEM(bases, 0);
2840             Py_DECREF(bases);
2841             continue;
2842         }
2843         for (i = 0; i < n; i++) {
2844             r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2845             if (r != 0)
2846                 break;
2847         }
2848         Py_DECREF(bases);
2849         return r;
2850     }
2851 }
2852 
2853 static int
2854 check_class(PyObject *cls, const char *error)
2855 {
2856     PyObject *bases = abstract_get_bases(cls);
2857     if (bases == NULL) {
2858         /* Do not mask errors. */
2859         if (!PyErr_Occurred())
2860             PyErr_SetString(PyExc_TypeError, error);
2861         return 0;
2862     }
2863     Py_DECREF(bases);
2864     return -1;
2865 }
2866 
2867 static int
2868 recursive_isinstance(PyObject *inst, PyObject *cls)
2869 {
2870     PyObject *icls;
2871     static PyObject *__class__ = NULL;
2872     int retval = 0;
2873 
2874     if (__class__ == NULL) {
2875         __class__ = PyString_InternFromString("__class__");
2876         if (__class__ == NULL)
2877             return -1;
2878     }
2879 
2880     if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2881         PyObject *inclass =
2882             (PyObject*)((PyInstanceObject*)inst)->in_class;
2883         retval = PyClass_IsSubclass(inclass, cls);
2884     }
2885     else if (PyType_Check(cls)) {
2886         retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2887         if (retval == 0) {
2888             PyObject *c = PyObject_GetAttr(inst, __class__);
2889             if (c == NULL) {
2890                 PyErr_Clear();
2891             }
2892             else {
2893                 if (c != (PyObject *)(inst->ob_type) &&
2894                     PyType_Check(c))
2895                     retval = PyType_IsSubtype(
2896                         (PyTypeObject *)c,
2897                         (PyTypeObject *)cls);
2898                 Py_DECREF(c);
2899             }
2900         }
2901     }
2902     else {
2903         if (!check_class(cls,
2904             "isinstance() arg 2 must be a class, type,"
2905             " or tuple of classes and types"))
2906             return -1;
2907         icls = PyObject_GetAttr(inst, __class__);
2908         if (icls == NULL) {
2909             PyErr_Clear();
2910             retval = 0;
2911         }
2912         else {
2913             retval = abstract_issubclass(icls, cls);
2914             Py_DECREF(icls);
2915         }
2916     }
2917 
2918     return retval;
2919 }
2920 
2921 int
2922 PyObject_IsInstance(PyObject *inst, PyObject *cls)
2923 {
2924     static PyObject *name = NULL;
2925 
2926     /* Quick test for an exact match */
2927     if (Py_TYPE(inst) == (PyTypeObject *)cls)
2928         return 1;
2929 
2930     if (PyTuple_Check(cls)) {
2931         Py_ssize_t i;
2932         Py_ssize_t n;
2933         int r = 0;
2934 
2935         if (Py_EnterRecursiveCall(" in __instancecheck__"))
2936             return -1;
2937         n = PyTuple_GET_SIZE(cls);
2938         for (i = 0; i < n; ++i) {
2939             PyObject *item = PyTuple_GET_ITEM(cls, i);
2940             r = PyObject_IsInstance(inst, item);
2941             if (r != 0)
2942                 /* either found it, or got an error */
2943                 break;
2944         }
2945         Py_LeaveRecursiveCall();
2946         return r;
2947     }
2948 
2949     if (!(PyClass_Check(cls) || PyInstance_Check(cls))) {
2950         PyObject *checker;
2951         checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name);
2952         if (checker != NULL) {
2953             PyObject *res;
2954             int ok = -1;
2955             if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2956                 Py_DECREF(checker);
2957                 return ok;
2958             }
2959             res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2960             Py_LeaveRecursiveCall();
2961             Py_DECREF(checker);
2962             if (res != NULL) {
2963                 ok = PyObject_IsTrue(res);
2964                 Py_DECREF(res);
2965             }
2966             return ok;
2967         }
2968         else if (PyErr_Occurred())
2969             return -1;
2970     }
2971     return recursive_isinstance(inst, cls);
2972 }
2973 
2974 static  int
2975 recursive_issubclass(PyObject *derived, PyObject *cls)
2976 {
2977     int retval;
2978 
2979     if (PyType_Check(cls) && PyType_Check(derived)) {
2980         /* Fast path (non-recursive) */
2981         return PyType_IsSubtype(
2982             (PyTypeObject *)derived, (PyTypeObject *)cls);
2983     }
2984     if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
2985         if (!check_class(derived,
2986                          "issubclass() arg 1 must be a class"))
2987             return -1;
2988 
2989         if (!check_class(cls,
2990                         "issubclass() arg 2 must be a class"
2991                         " or tuple of classes"))
2992             return -1;
2993         retval = abstract_issubclass(derived, cls);
2994     }
2995     else {
2996         /* shortcut */
2997         if (!(retval = (derived == cls)))
2998             retval = PyClass_IsSubclass(derived, cls);
2999     }
3000 
3001     return retval;
3002 }
3003 
3004 int
3005 PyObject_IsSubclass(PyObject *derived, PyObject *cls)
3006 {
3007     static PyObject *name = NULL;
3008 
3009     if (PyTuple_Check(cls)) {
3010         Py_ssize_t i;
3011         Py_ssize_t n;
3012         int r = 0;
3013 
3014         if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3015             return -1;
3016         n = PyTuple_GET_SIZE(cls);
3017         for (i = 0; i < n; ++i) {
3018             PyObject *item = PyTuple_GET_ITEM(cls, i);
3019             r = PyObject_IsSubclass(derived, item);
3020             if (r != 0)
3021                 /* either found it, or got an error */
3022                 break;
3023         }
3024         Py_LeaveRecursiveCall();
3025         return r;
3026     }
3027     if (!(PyClass_Check(cls) || PyInstance_Check(cls))) {
3028         PyObject *checker;
3029         checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name);
3030         if (checker != NULL) {
3031             PyObject *res;
3032             int ok = -1;
3033             if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
3034                 Py_DECREF(checker);
3035                 return ok;
3036             }
3037             res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3038             Py_LeaveRecursiveCall();
3039             Py_DECREF(checker);
3040             if (res != NULL) {
3041                 ok = PyObject_IsTrue(res);
3042                 Py_DECREF(res);
3043             }
3044             return ok;
3045         }
3046         else if (PyErr_Occurred()) {
3047             return -1;
3048         }
3049     }
3050     return recursive_issubclass(derived, cls);
3051 }
3052 
3053 int
3054 _PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
3055 {
3056     return recursive_isinstance(inst, cls);
3057 }
3058 
3059 int
3060 _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
3061 {
3062     return recursive_issubclass(derived, cls);
3063 }
3064 
3065 
3066 PyObject *
3067 PyObject_GetIter(PyObject *o)
3068 {
3069     PyTypeObject *t = o->ob_type;
3070     getiterfunc f = NULL;
3071     if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3072         f = t->tp_iter;
3073     if (f == NULL) {
3074         if (PySequence_Check(o))
3075             return PySeqIter_New(o);
3076         return type_error("'%.200s' object is not iterable", o);
3077     }
3078     else {
3079         PyObject *res = (*f)(o);
3080         if (res != NULL && !PyIter_Check(res)) {
3081             PyErr_Format(PyExc_TypeError,
3082                          "iter() returned non-iterator "
3083                          "of type '%.100s'",
3084                          res->ob_type->tp_name);
3085             Py_DECREF(res);
3086             res = NULL;
3087         }
3088         return res;
3089     }
3090 }
3091 
3092 /* Return next item.
3093  * If an error occurs, return NULL.  PyErr_Occurred() will be true.
3094  * If the iteration terminates normally, return NULL and clear the
3095  * PyExc_StopIteration exception (if it was set).  PyErr_Occurred()
3096  * will be false.
3097  * Else return the next object.  PyErr_Occurred() will be false.
3098  */
3099 PyObject *
3100 PyIter_Next(PyObject *iter)
3101 {
3102     PyObject *result;
3103     result = (*iter->ob_type->tp_iternext)(iter);
3104     if (result == NULL &&
3105         PyErr_Occurred() &&
3106         PyErr_ExceptionMatches(PyExc_StopIteration))
3107         PyErr_Clear();
3108     return result;
3109 }
3110