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