abstract.c revision cc2b0161257495f859200bce0aea3ed7e646feb3
1e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum/* Abstract Object Interface (many thanks to Jim Fulton) */
2cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
3e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum#include "Python.h"
4fa0b6ab01a962cbe624ad55fc5068a6d6b50bd0fGuido van Rossum#include <ctype.h>
55a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#include "structmember.h" /* we need the offsetof() macro from there */
664b5ce3a69569b203a39f74c5c03348ba0a67583Tim Peters#include "longintrepr.h"
75a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
10cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Shorthands to return certain errors */
11e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
12e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumstatic PyObject *
130e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouterstype_error(const char *msg, PyObject *obj)
14e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
150e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
16cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return NULL;
17e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
18e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
19052b7e1cfb241b6154d38fd10815011e820f7f69Guido van Rossumstatic PyObject *
20799124718ddfbb95440470037d8d7760b821646fFred Drakenull_error(void)
21e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
22cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (!PyErr_Occurred())
23cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		PyErr_SetString(PyExc_SystemError,
24cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				"null argument to internal routine");
25cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return NULL;
26e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
27e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
28cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on any object */
29cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
30e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint
31799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
32e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
33cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	int r;
34cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
35cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o1 == NULL || o2 == NULL) {
36cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
37cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
38e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	}
39cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	r = PyObject_Compare(o1, o2);
40cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (PyErr_Occurred())
41cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
42cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	*result = r;
43e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	return 0;
44e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
45e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
46e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
47799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_Type(PyObject *o)
48e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
49e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	PyObject *v;
50e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
51cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
52cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
53e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	v = (PyObject *)o->ob_type;
54e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	Py_INCREF(v);
55e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	return v;
56e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
57e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
5818e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
596253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyObject_Size(PyObject *o)
60e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
61cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
62e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
63cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL) {
64cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
65cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
66cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
67e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
68cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_sequence;
69cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_length)
70cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_length(o);
71e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
726253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy Hylton	return PyMapping_Size(o);
73e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
74e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
75cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyObject_Length
7618e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
77cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyObject_Length(PyObject *o)
78cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{
79cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg	return PyObject_Size(o);
80cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg}
81cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyObject_Length PyObject_Size
82cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg
8318e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
84f5b3e36493da275334e29afdbd238863697dca35Armin Rigo_PyObject_LengthHint(PyObject *o)
856b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger{
8618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t rv = PyObject_Size(o);
876b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger	if (rv != -1)
886b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger		return rv;
896b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger	if (PyErr_ExceptionMatches(PyExc_TypeError) ||
906b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger	    PyErr_ExceptionMatches(PyExc_AttributeError)) {
916b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger		PyObject *err_type, *err_value, *err_tb, *ro;
926b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger
936b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger		PyErr_Fetch(&err_type, &err_value, &err_tb);
94f5b3e36493da275334e29afdbd238863697dca35Armin Rigo		ro = PyObject_CallMethod(o, "__length_hint__", NULL);
956b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger		if (ro != NULL) {
9618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			rv = PyInt_AsLong(ro);
976b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger			Py_DECREF(ro);
986b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger			Py_XDECREF(err_type);
996b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger			Py_XDECREF(err_value);
1006b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger			Py_XDECREF(err_tb);
1016b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger			return rv;
1026b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger		}
1036b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger		PyErr_Restore(err_type, err_value, err_tb);
1046b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger	}
1056b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger	return -1;
1066b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger}
1076b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger
108e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
109799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_GetItem(PyObject *o, PyObject *key)
110e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
111cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyMappingMethods *m;
112e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
113cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL || key == NULL)
114cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
115e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
116cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_mapping;
117cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->mp_subscript)
118cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->mp_subscript(o, key);
119e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
12021308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	if (o->ob_type->tp_as_sequence) {
12100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		if (PyIndex_Check(key)) {
12200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			Py_ssize_t key_value;
12300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
1240f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			if (key_value == -1 && PyErr_Occurred())
1250f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling				return NULL;
1260f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			return PySequence_GetItem(o, key_value);
1270f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling		}
12864585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		else if (o->ob_type->tp_as_sequence->sq_item)
1290e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			return type_error("sequence index must "
1300e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters					  "be integer, not '%.200s'", key);
13121308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	}
132cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1330e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object is unsubscriptable", o);
134e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
135e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
136e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint
137799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
138e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
139cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyMappingMethods *m;
140e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
141cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL || key == NULL || value == NULL) {
142cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
143cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
144cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
145cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_mapping;
146cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->mp_ass_subscript)
147cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->mp_ass_subscript(o, key, value);
148cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
14921308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	if (o->ob_type->tp_as_sequence) {
15000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		if (PyIndex_Check(key)) {
15100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			Py_ssize_t key_value;
15200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
1530f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			if (key_value == -1 && PyErr_Occurred())
1540f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling				return -1;
1550f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			return PySequence_SetItem(o, key_value, value);
1560f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling		}
15764585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		else if (o->ob_type->tp_as_sequence->sq_ass_item) {
1580e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			type_error("sequence index must be "
1590e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters				   "integer, not '%.200s'", key);
16064585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum			return -1;
16164585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		}
16221308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	}
163e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1640e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object does not support item assignment", o);
165cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
166e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
167e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1686cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint
169799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_DelItem(PyObject *o, PyObject *key)
1706cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{
171cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyMappingMethods *m;
172cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
173cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL || key == NULL) {
174cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
175cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
176cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
177cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_mapping;
178cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->mp_ass_subscript)
179cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->mp_ass_subscript(o, key, (PyObject*)NULL);
1806cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
18121308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	if (o->ob_type->tp_as_sequence) {
18200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		if (PyIndex_Check(key)) {
18300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			Py_ssize_t key_value;
18400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
1850f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			if (key_value == -1 && PyErr_Occurred())
1860f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling				return -1;
1870f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			return PySequence_DelItem(o, key_value);
1880f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling		}
18964585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		else if (o->ob_type->tp_as_sequence->sq_ass_item) {
1900e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			type_error("sequence index must be "
1910e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters				   "integer, not '%.200s'", key);
19264585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum			return -1;
19364585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		}
19421308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	}
1956cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1960e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object does not support item deletion", o);
197cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
1986cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum}
1996cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
200b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwisint
201b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. LöwisPyObject_DelItemString(PyObject *o, char *key)
202b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis{
203b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	PyObject *okey;
204b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	int ret;
205b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis
206b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	if (o == NULL || key == NULL) {
207b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis		null_error();
208b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis		return -1;
209b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	}
210b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	okey = PyString_FromString(key);
211b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	if (okey == NULL)
212b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis		return -1;
213b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	ret = PyObject_DelItem(o, okey);
214b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	Py_DECREF(okey);
215b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	return ret;
216b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis}
217b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis
21873e5a5b65d66f4fba9c4f626bcd6400f4a7215e6Thomas Woutersint
21973e5a5b65d66f4fba9c4f626bcd6400f4a7215e6Thomas WoutersPyObject_AsCharBuffer(PyObject *obj,
2204c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum			  const char **buffer,
22118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			  Py_ssize_t *buffer_len)
2224c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{
2234c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	PyBufferProcs *pb;
22415e62742fad688b026ba80bf17d1345c4cbd423bMartin v. Löwis	char *pp;
22518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t len;
2264c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2274c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (obj == NULL || buffer == NULL || buffer_len == NULL) {
2284c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		null_error();
2294c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		return -1;
2304c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
2314c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	pb = obj->ob_type->tp_as_buffer;
23289c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	if (pb == NULL ||
2334c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	     pb->bf_getcharbuffer == NULL ||
23489c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	     pb->bf_getsegcount == NULL) {
2354c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		PyErr_SetString(PyExc_TypeError,
2364c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum				"expected a character buffer object");
23789c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
2384c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
23989c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
2404c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		PyErr_SetString(PyExc_TypeError,
2414c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum				"expected a single-segment buffer object");
24289c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
2434c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
24489c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
2454c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (len < 0)
24689c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
2474c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	*buffer = pp;
2484c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	*buffer_len = len;
2494c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	return 0;
25089c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton}
2514c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
25289c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hyltonint
25389c3a22a2788cb85b89990543e33236cd60ba307Jeremy HyltonPyObject_CheckReadBuffer(PyObject *obj)
25489c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton{
25589c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
25689c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton
25789c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	if (pb == NULL ||
25889c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	    pb->bf_getreadbuffer == NULL ||
25989c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	    pb->bf_getsegcount == NULL ||
26089c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	    (*pb->bf_getsegcount)(obj, NULL) != 1)
26189c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return 0;
26289c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	return 1;
2634c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum}
2644c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2654c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsReadBuffer(PyObject *obj,
2664c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum			  const void **buffer,
26718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			  Py_ssize_t *buffer_len)
2684c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{
2694c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	PyBufferProcs *pb;
2704c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	void *pp;
27118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t len;
2724c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2734c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (obj == NULL || buffer == NULL || buffer_len == NULL) {
2744c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		null_error();
2754c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		return -1;
2764c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
2774c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	pb = obj->ob_type->tp_as_buffer;
27889c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	if (pb == NULL ||
2794c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	     pb->bf_getreadbuffer == NULL ||
28089c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	     pb->bf_getsegcount == NULL) {
2814c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		PyErr_SetString(PyExc_TypeError,
2824c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum				"expected a readable buffer object");
28389c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
2844c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
28589c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
2864c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		PyErr_SetString(PyExc_TypeError,
2874c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum				"expected a single-segment buffer object");
28889c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
2894c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
29089c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
2914c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (len < 0)
29289c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
2934c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	*buffer = pp;
2944c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	*buffer_len = len;
2954c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	return 0;
2964c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum}
2974c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2984c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsWriteBuffer(PyObject *obj,
2994c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum			   void **buffer,
30018e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			   Py_ssize_t *buffer_len)
3014c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{
3024c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	PyBufferProcs *pb;
3034c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	void*pp;
30418e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t len;
3054c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
3064c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (obj == NULL || buffer == NULL || buffer_len == NULL) {
3074c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		null_error();
3084c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		return -1;
3094c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
3104c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	pb = obj->ob_type->tp_as_buffer;
31189c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	if (pb == NULL ||
3124c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	     pb->bf_getwritebuffer == NULL ||
31389c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	     pb->bf_getsegcount == NULL) {
3144c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		PyErr_SetString(PyExc_TypeError,
3154c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum				"expected a writeable buffer object");
31689c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
3174c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
31889c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
3194c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		PyErr_SetString(PyExc_TypeError,
3204c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum				"expected a single-segment buffer object");
32189c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
3224c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
3234c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	len = (*pb->bf_getwritebuffer)(obj,0,&pp);
3244c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (len < 0)
32589c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
3264c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	*buffer = pp;
3274c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	*buffer_len = len;
3284c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	return 0;
3294c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum}
3304c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
331cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on numbers */
332cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
333cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
334799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Check(PyObject *o)
335e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
3366921eca227ac2283ebcdf98e10aebea57bd5daf3Guido van Rossum	return o && o->ob_type->tp_as_number &&
3376921eca227ac2283ebcdf98e10aebea57bd5daf3Guido van Rossum	       (o->ob_type->tp_as_number->nb_int ||
3386921eca227ac2283ebcdf98e10aebea57bd5daf3Guido van Rossum		o->ob_type->tp_as_number->nb_float);
339e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
340e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
341cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Binary operators */
342e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
3435a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_SLOT(x) offsetof(PyNumberMethods, x)
3445a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_BINOP(nb_methods, slot) \
345b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		(*(binaryfunc*)(& ((char*)nb_methods)[slot]))
3465a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_TERNOP(nb_methods, slot) \
347b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		(*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
348e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
3495a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/*
3505a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer  Calling scheme used for binary operations:
351e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
3524886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz  Order operations are tried until either a valid result or error:
3534886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz	w.op(v,w)[*], v.op(v,w), w.op(v,w)
354e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
3554bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum  [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
3564bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum      v->ob_type
3575a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */
3585a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
3595a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
3605a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op1(PyObject *v, PyObject *w, const int op_slot)
3615a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{
3625a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyObject *x;
3634bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	binaryfunc slotv = NULL;
3644bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	binaryfunc slotw = NULL;
3654bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum
3663cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (v->ob_type->tp_as_number != NULL)
367b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
3684bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	if (w->ob_type != v->ob_type &&
3693cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	    w->ob_type->tp_as_number != NULL) {
370b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
3714bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		if (slotw == slotv)
3724bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum			slotw = NULL;
3735a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	}
3744bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	if (slotv) {
37589c4264792da06293b197e14f581763f46138935Guido van Rossum		if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
37689c4264792da06293b197e14f581763f46138935Guido van Rossum			x = slotw(v, w);
37789c4264792da06293b197e14f581763f46138935Guido van Rossum			if (x != Py_NotImplemented)
37889c4264792da06293b197e14f581763f46138935Guido van Rossum				return x;
37989c4264792da06293b197e14f581763f46138935Guido van Rossum			Py_DECREF(x); /* can't do it */
38089c4264792da06293b197e14f581763f46138935Guido van Rossum			slotw = NULL;
38189c4264792da06293b197e14f581763f46138935Guido van Rossum		}
3824bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		x = slotv(v, w);
3834bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		if (x != Py_NotImplemented)
3844bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum			return x;
3854bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		Py_DECREF(x); /* can't do it */
3864bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	}
3874bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	if (slotw) {
3884bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		x = slotw(v, w);
3894bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		if (x != Py_NotImplemented)
3904bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum			return x;
3914bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		Py_DECREF(x); /* can't do it */
3925a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	}
3935a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	Py_INCREF(Py_NotImplemented);
3945a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return Py_NotImplemented;
395e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
3967766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum
3975a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
398d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinop_type_error(PyObject *v, PyObject *w, const char *op_name)
399d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
400d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyErr_Format(PyExc_TypeError,
4010e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		     "unsupported operand type(s) for %.100s: "
4020e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		     "'%.100s' and '%.100s'",
403d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		     op_name,
404d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		     v->ob_type->tp_name,
405d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		     w->ob_type->tp_name);
406d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return NULL;
407d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
408d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
409d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject *
4105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
411e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
4125a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyObject *result = binary_op1(v, w, op_slot);
4135a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	if (result == Py_NotImplemented) {
414d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		Py_DECREF(result);
415d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		return binop_type_error(v, w, op_name);
416e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	}
4175a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return result;
418e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
419e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
420cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
4215a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/*
4225a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer  Calling scheme used for ternary operations:
423e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
4244886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz  Order operations are tried until either a valid result or error:
4254886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz	v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
4265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */
427cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
4285a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
4295a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerternary_op(PyObject *v,
4305a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	   PyObject *w,
4315a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	   PyObject *z,
4325a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	   const int op_slot,
4335a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	   const char *op_name)
4345a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{
4355a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyNumberMethods *mv, *mw, *mz;
43684675acb49071977741a97d56c21967fbc520948Guido van Rossum	PyObject *x = NULL;
43784675acb49071977741a97d56c21967fbc520948Guido van Rossum	ternaryfunc slotv = NULL;
43884675acb49071977741a97d56c21967fbc520948Guido van Rossum	ternaryfunc slotw = NULL;
43984675acb49071977741a97d56c21967fbc520948Guido van Rossum	ternaryfunc slotz = NULL;
4407766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum
4415a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	mv = v->ob_type->tp_as_number;
4424bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	mw = w->ob_type->tp_as_number;
4433cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (mv != NULL)
444b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotv = NB_TERNOP(mv, op_slot);
44584675acb49071977741a97d56c21967fbc520948Guido van Rossum	if (w->ob_type != v->ob_type &&
4463cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	    mw != NULL) {
447b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotw = NB_TERNOP(mw, op_slot);
44884675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (slotw == slotv)
44984675acb49071977741a97d56c21967fbc520948Guido van Rossum			slotw = NULL;
4504bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	}
45184675acb49071977741a97d56c21967fbc520948Guido van Rossum	if (slotv) {
45289c4264792da06293b197e14f581763f46138935Guido van Rossum		if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
45389c4264792da06293b197e14f581763f46138935Guido van Rossum			x = slotw(v, w, z);
45489c4264792da06293b197e14f581763f46138935Guido van Rossum			if (x != Py_NotImplemented)
45589c4264792da06293b197e14f581763f46138935Guido van Rossum				return x;
45689c4264792da06293b197e14f581763f46138935Guido van Rossum			Py_DECREF(x); /* can't do it */
45789c4264792da06293b197e14f581763f46138935Guido van Rossum			slotw = NULL;
45889c4264792da06293b197e14f581763f46138935Guido van Rossum		}
45984675acb49071977741a97d56c21967fbc520948Guido van Rossum		x = slotv(v, w, z);
46084675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (x != Py_NotImplemented)
46184675acb49071977741a97d56c21967fbc520948Guido van Rossum			return x;
46284675acb49071977741a97d56c21967fbc520948Guido van Rossum		Py_DECREF(x); /* can't do it */
46384675acb49071977741a97d56c21967fbc520948Guido van Rossum	}
46484675acb49071977741a97d56c21967fbc520948Guido van Rossum	if (slotw) {
46584675acb49071977741a97d56c21967fbc520948Guido van Rossum		x = slotw(v, w, z);
46684675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (x != Py_NotImplemented)
46784675acb49071977741a97d56c21967fbc520948Guido van Rossum			return x;
46884675acb49071977741a97d56c21967fbc520948Guido van Rossum		Py_DECREF(x); /* can't do it */
469e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	}
4705a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	mz = z->ob_type->tp_as_number;
4713cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (mz != NULL) {
472b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotz = NB_TERNOP(mz, op_slot);
47384675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (slotz == slotv || slotz == slotw)
47484675acb49071977741a97d56c21967fbc520948Guido van Rossum			slotz = NULL;
47584675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (slotz) {
47684675acb49071977741a97d56c21967fbc520948Guido van Rossum			x = slotz(v, w, z);
4775a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer			if (x != Py_NotImplemented)
4785a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer				return x;
47984675acb49071977741a97d56c21967fbc520948Guido van Rossum			Py_DECREF(x); /* can't do it */
4801991ddc3e134e89e6c15d60e180fc67ad4c1ca01Andrew M. Kuchling		}
4815a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	}
4825a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
4835c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum	if (z == Py_None)
4845c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum		PyErr_Format(
4855c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			PyExc_TypeError,
4865c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			"unsupported operand type(s) for ** or pow(): "
4870e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			"'%.100s' and '%.100s'",
4885c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			v->ob_type->tp_name,
4895c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			w->ob_type->tp_name);
4905c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum	else
4915c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum		PyErr_Format(
4925c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			PyExc_TypeError,
4935c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			"unsupported operand type(s) for pow(): "
4940e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			"'%.100s', '%.100s', '%.100s'",
4955c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			v->ob_type->tp_name,
4965c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			w->ob_type->tp_name,
4975c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			z->ob_type->tp_name);
4985a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return NULL;
499e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
500e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
5015a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define BINARY_FUNC(func, op, op_name) \
5025a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer    PyObject * \
5035a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer    func(PyObject *v, PyObject *w) { \
5045a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	    return binary_op(v, w, NB_SLOT(op), op_name); \
5055a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer    }
5065a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
5075a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Or, nb_or, "|")
5085a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Xor, nb_xor, "^")
5095a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_And, nb_and, "&")
5105a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
5115a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
5125a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
5135a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
5145a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
515e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
5165a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerPyNumber_Add(PyObject *v, PyObject *w)
517e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
5185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
5195a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	if (result == Py_NotImplemented) {
5205a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		PySequenceMethods *m = v->ob_type->tp_as_sequence;
521fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
5220522d9891aec9b7d49049a8a47b687c81929e02dJeremy Hylton		if (m && m->sq_concat) {
523fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return (*m->sq_concat)(v, w);
5240522d9891aec9b7d49049a8a47b687c81929e02dJeremy Hylton		}
525fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		result = binop_type_error(v, w, "+");
526e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	}
5275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return result;
528e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
529e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
530d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject *
53118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwissequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
532d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
53338fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum	Py_ssize_t count;
53400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (PyIndex_Check(n)) {
53500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
536d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		if (count == -1 && PyErr_Occurred())
537d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			return NULL;
538d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	}
539d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	else {
5400e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		return type_error("can't multiply sequence by "
5410e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters				  "non-int of type '%.200s'", n);
542d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	}
54338fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum	return (*repeatfunc)(seq, count);
544d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
545d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
546d4b0fea43a8655d15562fa42d56def93fe2348efNeil SchemenauerPyObject *
547d4b0fea43a8655d15562fa42d56def93fe2348efNeil SchemenauerPyNumber_Multiply(PyObject *v, PyObject *w)
548d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
549d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
550d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	if (result == Py_NotImplemented) {
551d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *mv = v->ob_type->tp_as_sequence;
552d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *mw = w->ob_type->tp_as_sequence;
553a3a243e9779b671efe59d407ca77edff01a32a57Guido van Rossum		Py_DECREF(result);
554d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		if  (mv && mv->sq_repeat) {
555d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			return sequence_repeat(mv->sq_repeat, v, w);
556d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		}
557d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		else if (mw && mw->sq_repeat) {
558d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			return sequence_repeat(mw->sq_repeat, w, v);
559d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		}
560d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		result = binop_type_error(v, w, "*");
561d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	}
562d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return result;
563d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
564d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
565e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
5664668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_FloorDivide(PyObject *v, PyObject *w)
5674668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
5684668b000a1d9113394941ad39875c827634feb49Guido van Rossum	/* XXX tp_flags test */
5694668b000a1d9113394941ad39875c827634feb49Guido van Rossum	return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
5704668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
5714668b000a1d9113394941ad39875c827634feb49Guido van Rossum
5724668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
5734668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_TrueDivide(PyObject *v, PyObject *w)
5744668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
5754668b000a1d9113394941ad39875c827634feb49Guido van Rossum	/* XXX tp_flags test */
5764668b000a1d9113394941ad39875c827634feb49Guido van Rossum	return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
5774668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
5784668b000a1d9113394941ad39875c827634feb49Guido van Rossum
5794668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
580799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Remainder(PyObject *v, PyObject *w)
581e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
5825a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return binary_op(v, w, NB_SLOT(nb_remainder), "%");
583e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
584e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
585e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
586799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
587e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
5885a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
589e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
590e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
591e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* Binary in-place operators */
592e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
593e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* The in-place operators are defined to fall back to the 'normal',
5945a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer   non in-place operations, if the in-place methods are not in place.
595e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
5965a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer   - If the left hand object has the appropriate struct members, and
5975a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     they are filled, call the appropriate function and return the
5985a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     result.  No coercion is done on the arguments; the left-hand object
5995a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     is the one the operation is performed on, and it's up to the
6005a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     function to deal with the right-hand object.
6017766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum
6025a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer   - Otherwise, in-place modification is not supported. Handle it exactly as
6035a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     a non in-place operation of the same kind.
604e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
605e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters   */
606e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
6075a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
608d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
6095a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{
6105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyNumberMethods *mv = v->ob_type->tp_as_number;
6113cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (mv != NULL) {
612b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		binaryfunc slot = NB_BINOP(mv, iop_slot);
613b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		if (slot) {
614b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer			PyObject *x = (slot)(v, w);
6155a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer			if (x != Py_NotImplemented) {
6165a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer				return x;
6175a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer			}
6185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer			Py_DECREF(x);
6195a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		}
620e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	}
621d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return binary_op1(v, w, op_slot);
622d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
623d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
624d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject *
625d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
626d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		const char *op_name)
627d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
628d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
629d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	if (result == Py_NotImplemented) {
630d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		Py_DECREF(result);
631d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		return binop_type_error(v, w, op_name);
632d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	}
633d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return result;
634e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
635e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
6365a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define INPLACE_BINOP(func, iop, op, op_name) \
6375a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyObject * \
6385a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	func(PyObject *v, PyObject *w) { \
6395a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
640e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	}
641e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
6425a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
6435a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
6445a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
6455a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
6465a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
6475a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
648e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
649e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
6504668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
6514668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
6524668b000a1d9113394941ad39875c827634feb49Guido van Rossum	/* XXX tp_flags test */
6534668b000a1d9113394941ad39875c827634feb49Guido van Rossum	return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
6544668b000a1d9113394941ad39875c827634feb49Guido van Rossum			  NB_SLOT(nb_floor_divide), "//=");
6554668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
6564668b000a1d9113394941ad39875c827634feb49Guido van Rossum
6574668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
6584668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
6594668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
6604668b000a1d9113394941ad39875c827634feb49Guido van Rossum	/* XXX tp_flags test */
6614668b000a1d9113394941ad39875c827634feb49Guido van Rossum	return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
6624668b000a1d9113394941ad39875c827634feb49Guido van Rossum			  NB_SLOT(nb_true_divide), "/=");
6634668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
6644668b000a1d9113394941ad39875c827634feb49Guido van Rossum
6654668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
666e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceAdd(PyObject *v, PyObject *w)
667e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
668d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
669d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				       NB_SLOT(nb_add));
670d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	if (result == Py_NotImplemented) {
671d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *m = v->ob_type->tp_as_sequence;
672d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		Py_DECREF(result);
673d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		if (m != NULL) {
674d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			binaryfunc f = NULL;
6753cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum                        f = m->sq_inplace_concat;
676d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (f == NULL)
677d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				f = m->sq_concat;
678d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (f != NULL)
679d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				return (*f)(v, w);
680d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		}
681d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		result = binop_type_error(v, w, "+=");
682bb8be93a50b0293b812634575a493c4eaf676773Guido van Rossum	}
683d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return result;
684e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
685e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
686e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
687e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
688e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
689d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
690d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				       NB_SLOT(nb_multiply));
691d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	if (result == Py_NotImplemented) {
69218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis		ssizeargfunc f = NULL;
693d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *mv = v->ob_type->tp_as_sequence;
694d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *mw = w->ob_type->tp_as_sequence;
695d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		Py_DECREF(result);
696d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		if (mv != NULL) {
6973cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum			f = mv->sq_inplace_repeat;
698d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (f == NULL)
699d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				f = mv->sq_repeat;
700d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (f != NULL)
701d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				return sequence_repeat(f, v, w);
702e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		}
703d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		else if (mw != NULL) {
704d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			/* Note that the right hand operand should not be
705d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			 * mutated in this case so sq_inplace_repeat is not
706d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			 * used. */
707d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (mw->sq_repeat)
708d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				return sequence_repeat(mw->sq_repeat, w, v);
709e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		}
710d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		result = binop_type_error(v, w, "*=");
711e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	}
712d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return result;
713e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
714e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
715e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
716e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
717e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
718d46fbc322d0a057c3c4f0af801d28ea65074c4c7Neil Schemenauer	return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
719d46fbc322d0a057c3c4f0af801d28ea65074c4c7Neil Schemenauer				NB_SLOT(nb_remainder), "%=");
720e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
721e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
722e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
723e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
724e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
7253cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (v->ob_type->tp_as_number &&
7265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	    v->ob_type->tp_as_number->nb_inplace_power != NULL) {
7275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
7285a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	}
7295a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	else {
7305a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
731e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	}
732e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
733e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
734e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
735cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Unary operators and functions */
736e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
737e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
738799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Negative(PyObject *o)
739e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
740cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
741cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
742cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
743cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
744cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_number;
745cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->nb_negative)
746cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return (*m->nb_negative)(o);
747cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
7480e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("bad operand type for unary -: '%.200s'", o);
749e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
750e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
751e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
752799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Positive(PyObject *o)
753e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
754cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
755cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
756cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
757cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
758cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_number;
759cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->nb_positive)
760cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return (*m->nb_positive)(o);
761cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
7620e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("bad operand type for unary +: '%.200s'", o);
763e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
764e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
765e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
766799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Invert(PyObject *o)
767e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
768cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
769cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
770cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
771cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
772cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_number;
773cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->nb_invert)
774cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return (*m->nb_invert)(o);
775cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
7760e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("bad operand type for unary ~: '%.200s'", o);
777e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
778e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
779e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
780799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Absolute(PyObject *o)
781e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
782cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
783e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
784cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
785cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
786cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_number;
787cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->nb_absolute)
788cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->nb_absolute(o);
789e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
7900e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("bad operand type for abs(): '%.200s'", o);
791e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
792e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
79300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters/* Return a Python Int or Long from the object item
79400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters   Raise TypeError if the result is not an int-or-long
79500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters   or if the object cannot be interpreted as an index.
79600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters*/
79700ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPyObject *
79838fff8c4e4276e4e57660a78f305e68bfa87874bGuido van RossumPyNumber_Index(PyObject *item)
79938fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum{
80000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	PyObject *result = NULL;
80100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (item == NULL)
80200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		return null_error();
80300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (PyInt_Check(item) || PyLong_Check(item)) {
80400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		Py_INCREF(item);
80500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		return item;
80600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	}
80700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (PyIndex_Check(item)) {
80800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		result = item->ob_type->tp_as_number->nb_index(item);
80900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		if (result &&
81000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		    !PyInt_Check(result) && !PyLong_Check(result)) {
81100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			PyErr_Format(PyExc_TypeError,
812ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum				     "__index__ returned non-int " \
81300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters				     "(type %.200s)",
81400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters				     result->ob_type->tp_name);
81500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			Py_DECREF(result);
81600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			return NULL;
81700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		}
81838fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum	}
81938fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum	else {
82049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyErr_Format(PyExc_TypeError,
82149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			     "'%.200s' object cannot be interpreted "
82249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			     "as an index", item->ob_type->tp_name);
82338fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum	}
82400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	return result;
82500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters}
82600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
82700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters/* Return an error on Overflow only if err is not NULL*/
82800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
82900ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPy_ssize_t
83000ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPyNumber_AsSsize_t(PyObject *item, PyObject *err)
83100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters{
83200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	Py_ssize_t result;
83300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	PyObject *runerr;
83400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	PyObject *value = PyNumber_Index(item);
83500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (value == NULL)
83600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		return -1;
83700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
83800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	/* We're done if PyInt_AsSsize_t() returns without error. */
83900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	result = PyInt_AsSsize_t(value);
84000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (result != -1 || !(runerr = PyErr_Occurred()))
84100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		goto finish;
84200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
84300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	/* Error handling code -- only manage OverflowError differently */
84400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
84500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		goto finish;
84600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
84700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	PyErr_Clear();
84800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	/* If no error-handling desired then the default clipping
84900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	   is sufficient.
85000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	 */
85100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (!err) {
85200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		assert(PyLong_Check(value));
85300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		/* Whether or not it is less than or equal to
85400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		   zero is determined by the sign of ob_size
85500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		*/
85600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		if (_PyLong_Sign(value) < 0)
85700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			result = PY_SSIZE_T_MIN;
85800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		else
85900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			result = PY_SSIZE_T_MAX;
86000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	}
86100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	else {
86200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		/* Otherwise replace the error with caller's error object. */
86300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		PyErr_Format(err,
86400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			     "cannot fit '%.200s' into an index-sized integer",
86500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			     item->ob_type->tp_name);
86600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	}
86700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
86800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters finish:
86900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	Py_DECREF(value);
87000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	return result;
87138fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum}
87238fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum
87300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
8749e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum/* Add a check for embedded NULL-bytes in the argument. */
875226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsawstatic PyObject *
87618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwislong_from_string(const char *s, Py_ssize_t len)
877226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw{
8784c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	char *end;
879226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw	PyObject *x;
880226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw
8814c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	x = PyLong_FromString((char*)s, &end, 10);
8829e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum	if (x == NULL)
883226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw		return NULL;
8849e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum	if (end != s + len) {
885226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw		PyErr_SetString(PyExc_ValueError,
886ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum				"null byte in argument for int()");
8879e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum		Py_DECREF(x);
888226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw		return NULL;
889226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw	}
890226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw	return x;
891226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw}
892226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw
893e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
894799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Long(PyObject *o)
895e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
896cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
8974c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	const char *buffer;
89818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t buffer_len;
899e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
900cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
901cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
902ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	if (PyLong_CheckExact(o)) {
903ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		Py_INCREF(o);
904ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		return o;
905ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	}
906c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	m = o->ob_type->tp_as_number;
907ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	if (m && m->nb_int) { /* This should include subclasses of int */
908ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		PyObject *res = m->nb_int(o);
909ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		if (res && !PyLong_Check(res)) {
910ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum			PyErr_Format(PyExc_TypeError,
911ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum				     "__int__ returned non-int (type %.200s)",
912ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum				     res->ob_type->tp_name);
913ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum			Py_DECREF(res);
914ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum			return NULL;
915ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		}
916ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		return res;
917ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	}
918c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	if (m && m->nb_long) { /* This should include subclasses of long */
919c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		PyObject *res = m->nb_long(o);
920c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
921c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon			PyErr_Format(PyExc_TypeError,
922c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon				     "__long__ returned non-long (type %.200s)",
923c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon				     res->ob_type->tp_name);
924c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon			Py_DECREF(res);
925c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon			return NULL;
926c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		}
927c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		return res;
9289e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum	}
929c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	if (PyLong_Check(o)) /* A long subclass without nb_long */
930db30ac41de4e9e8412429720445ea4852c3c241fTim Peters		return _PyLong_Copy((PyLongObject *)o);
931cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (PyString_Check(o))
9327766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum		/* need to do extra error checking that PyLong_FromString()
933226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw		 * doesn't do.  In particular long('9.5') must raise an
934226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw		 * exception, not truncate the float.
935226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw		 */
9364c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		return long_from_string(PyString_AS_STRING(o),
9374c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum					PyString_GET_SIZE(o));
938339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#ifdef Py_USING_UNICODE
9399e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum	if (PyUnicode_Check(o))
9409e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum		/* The above check is done in PyLong_FromUnicode(). */
9419e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum		return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
9429e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum					  PyUnicode_GET_SIZE(o),
9439e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum					  10);
944339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#endif
9454c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
9464c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		return long_from_string(buffer, buffer_len);
947e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
948ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	return type_error("int() argument must be a string or a "
9490e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			  "number, not '%.200s'", o);
950e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
951e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
952e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
953799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Float(PyObject *o)
954e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
955cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
956e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
957cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
958cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
959c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	m = o->ob_type->tp_as_number;
960c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	if (m && m->nb_float) { /* This should include subclasses of float */
961c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		PyObject *res = m->nb_float(o);
962c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		if (res && !PyFloat_Check(res)) {
963c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon			PyErr_Format(PyExc_TypeError,
964c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		          "__float__ returned non-float (type %.200s)",
965c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		          res->ob_type->tp_name);
966c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon			Py_DECREF(res);
967c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon			return NULL;
968c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		}
969c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		return res;
9709e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum	}
971c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
9727a50f2536e59762897a05b1d3996e51f3f1a9686Tim Peters		PyFloatObject *po = (PyFloatObject *)o;
9737a50f2536e59762897a05b1d3996e51f3f1a9686Tim Peters		return PyFloat_FromDouble(po->ob_fval);
9747a50f2536e59762897a05b1d3996e51f3f1a9686Tim Peters	}
9754c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	return PyFloat_FromString(o, NULL);
976e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
977e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
978cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on sequences */
979e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
980cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
981799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Check(PyObject *s)
982e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
9838700b4281af0561d9aafd3cc14c44d79c2a0934bGuido van Rossum	return s != NULL && s->ob_type->tp_as_sequence &&
9848700b4281af0561d9aafd3cc14c44d79c2a0934bGuido van Rossum		s->ob_type->tp_as_sequence->sq_item != NULL;
985e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
986e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
98718e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
9886253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPySequence_Size(PyObject *s)
989e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
990cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
991e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
992cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
993cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
994cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
995cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
996e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
997cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
998cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_length)
999cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_length(s);
1000e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
10010e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("object of type '%.200s' has no len()", s);
1002cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
1003e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1004e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1005cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PySequence_Length
100618e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
1007cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPySequence_Length(PyObject *s)
1008cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{
1009cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg	return PySequence_Size(s);
1010cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg}
1011cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PySequence_Length PySequence_Size
1012cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg
1013e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1014799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Concat(PyObject *s, PyObject *o)
1015e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1016cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1017cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1018cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL || o == NULL)
1019cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1020e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1021cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1022cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_concat)
1023cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_concat(s, o);
1024e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1025fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	/* Instances of user classes defining an __add__() method only
1026fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	   have an nb_add slot, not an sq_concat slot.  So we fall back
1027fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	   to nb_add if both arguments appear to be sequences. */
1028fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	if (PySequence_Check(s) && PySequence_Check(o)) {
1029fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1030fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (result != Py_NotImplemented)
1031fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return result;
1032fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
1033fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	}
10340e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object can't be concatenated", s);
1035e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1036e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1037e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
103818e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_Repeat(PyObject *o, Py_ssize_t count)
1039e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1040cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1041e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1042cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
1043cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1044e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1045cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_sequence;
1046cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_repeat)
1047cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_repeat(o, count);
1048cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1049fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	/* Instances of user classes defining a __mul__() method only
1050fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	   have an nb_multiply slot, not an sq_repeat slot. so we fall back
1051fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	   to nb_multiply if o appears to be a sequence. */
1052fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	if (PySequence_Check(o)) {
1053fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		PyObject *n, *result;
1054eb079f1c2533bcefcab3ef4c07b800e5bd37239fMartin v. Löwis		n = PyInt_FromSsize_t(count);
1055fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (n == NULL)
1056fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return NULL;
1057fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		result = binary_op1(o, n, NB_SLOT(nb_multiply));
1058fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(n);
1059fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (result != Py_NotImplemented)
1060fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return result;
1061fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
1062fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	}
10630e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object can't be repeated", o);
1064e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1065e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1066e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1067e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPySequence_InPlaceConcat(PyObject *s, PyObject *o)
1068e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1069e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	PySequenceMethods *m;
1070e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1071e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	if (s == NULL || o == NULL)
1072e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return null_error();
1073e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1074e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	m = s->ob_type->tp_as_sequence;
10753cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (m && m->sq_inplace_concat)
1076e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return m->sq_inplace_concat(s, o);
1077e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	if (m && m->sq_concat)
1078e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return m->sq_concat(s, o);
1079e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1080fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	if (PySequence_Check(s) && PySequence_Check(o)) {
1081fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1082fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo					       NB_SLOT(nb_add));
1083fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (result != Py_NotImplemented)
1084fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return result;
1085fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
1086fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	}
10870e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object can't be concatenated", s);
1088e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1089e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1090e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
109118e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
1092e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1093e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	PySequenceMethods *m;
1094e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1095e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	if (o == NULL)
1096e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return null_error();
1097e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1098e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	m = o->ob_type->tp_as_sequence;
10993cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (m && m->sq_inplace_repeat)
1100e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return m->sq_inplace_repeat(o, count);
1101e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	if (m && m->sq_repeat)
1102e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return m->sq_repeat(o, count);
1103e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1104fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	if (PySequence_Check(o)) {
1105fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		PyObject *n, *result;
1106eb079f1c2533bcefcab3ef4c07b800e5bd37239fMartin v. Löwis		n = PyInt_FromSsize_t(count);
1107fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (n == NULL)
1108fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return NULL;
1109fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1110fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo				     NB_SLOT(nb_multiply));
1111fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(n);
1112fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (result != Py_NotImplemented)
1113fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return result;
1114fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
1115fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	}
11160e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object can't be repeated", o);
1117e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1118e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1119e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
112018e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_GetItem(PyObject *s, Py_ssize_t i)
1121e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1122cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1123cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1124cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL)
1125cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1126cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1127cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1128cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_item) {
1129cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		if (i < 0) {
1130cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			if (m->sq_length) {
113118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis				Py_ssize_t l = (*m->sq_length)(s);
1132cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (l < 0)
1133cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum					return NULL;
1134cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				i += l;
1135cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			}
1136cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
1137cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_item(s, i);
1138cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1139e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
11400e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object is unindexable", s);
1141e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1142e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1143e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
114418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
1145e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1146cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
11471d75a79c009e500923128716a02efbe86135e64eThomas Wouters	PyMappingMethods *mp;
1148cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1149cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (!s) return null_error();
1150cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1151cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1152cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_slice) {
1153cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		if (i1 < 0 || i2 < 0) {
1154cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			if (m->sq_length) {
115518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis				Py_ssize_t l = (*m->sq_length)(s);
1156cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (l < 0)
1157cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum					return NULL;
1158cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (i1 < 0)
1159cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum					i1 += l;
1160cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (i2 < 0)
1161cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum					i2 += l;
1162cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			}
1163cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
1164cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_slice(s, i1, i2);
11651d75a79c009e500923128716a02efbe86135e64eThomas Wouters	} else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
11661d75a79c009e500923128716a02efbe86135e64eThomas Wouters		PyObject *res;
116749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyObject *slice = _PySlice_FromIndices(i1, i2);
11681d75a79c009e500923128716a02efbe86135e64eThomas Wouters		if (!slice)
11691d75a79c009e500923128716a02efbe86135e64eThomas Wouters			return NULL;
11701d75a79c009e500923128716a02efbe86135e64eThomas Wouters		res = mp->mp_subscript(s, slice);
11711d75a79c009e500923128716a02efbe86135e64eThomas Wouters		Py_DECREF(slice);
11721d75a79c009e500923128716a02efbe86135e64eThomas Wouters		return res;
1173cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
11744669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum
11750e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object is unsliceable", s);
1176e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1177e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1178e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint
117918e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
1180e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1181cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1182cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1183cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
1184cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1185cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1186cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1187cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1188cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1189cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_ass_item) {
1190cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		if (i < 0) {
1191cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			if (m->sq_length) {
119218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis				Py_ssize_t l = (*m->sq_length)(s);
1193cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (l < 0)
1194ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum					return -1;
1195cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				i += l;
1196cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			}
1197cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
1198cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_ass_item(s, i, o);
1199cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1200cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
12010e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object does not support item assignment", s);
1202cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
1203e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1204e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
12056cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint
120618e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_DelItem(PyObject *s, Py_ssize_t i)
12076cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{
1208cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1209cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1210cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
1211cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1212cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1213cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1214cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1215cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1216cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_ass_item) {
1217cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		if (i < 0) {
1218cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			if (m->sq_length) {
121918e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis				Py_ssize_t l = (*m->sq_length)(s);
1220cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (l < 0)
1221ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum					return -1;
1222cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				i += l;
1223cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			}
1224cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
1225cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_ass_item(s, i, (PyObject *)NULL);
1226cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1227cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
12280e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object doesn't support item deletion", s);
1229cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
12306cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum}
12316cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1232cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
123318e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
1234e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1235cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
12361d75a79c009e500923128716a02efbe86135e64eThomas Wouters	PyMappingMethods *mp;
1237e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1238cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
1239cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1240cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1241cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1242e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1243cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1244cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_ass_slice) {
1245cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		if (i1 < 0 || i2 < 0) {
1246cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			if (m->sq_length) {
124718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis				Py_ssize_t l = (*m->sq_length)(s);
1248cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (l < 0)
1249ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum					return -1;
1250cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (i1 < 0)
1251cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum					i1 += l;
1252cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (i2 < 0)
1253cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum					i2 += l;
1254cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			}
1255cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
1256cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_ass_slice(s, i1, i2, o);
12571d75a79c009e500923128716a02efbe86135e64eThomas Wouters	} else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
12581d75a79c009e500923128716a02efbe86135e64eThomas Wouters		int res;
125949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyObject *slice = _PySlice_FromIndices(i1, i2);
12601d75a79c009e500923128716a02efbe86135e64eThomas Wouters		if (!slice)
12611d75a79c009e500923128716a02efbe86135e64eThomas Wouters			return -1;
12621d75a79c009e500923128716a02efbe86135e64eThomas Wouters		res = mp->mp_ass_subscript(s, slice, o);
12631d75a79c009e500923128716a02efbe86135e64eThomas Wouters		Py_DECREF(slice);
12641d75a79c009e500923128716a02efbe86135e64eThomas Wouters		return res;
1265cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
12661d75a79c009e500923128716a02efbe86135e64eThomas Wouters
12670e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object doesn't support slice assignment", s);
1268cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
1269e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1270e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1271cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
127218e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
12736cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{
1274cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
12756cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1276cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
1277cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1278cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1279cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
12806cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1281cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1282cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_ass_slice) {
1283cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		if (i1 < 0 || i2 < 0) {
1284cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			if (m->sq_length) {
128518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis				Py_ssize_t l = (*m->sq_length)(s);
1286cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (l < 0)
1287ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum					return -1;
1288cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (i1 < 0)
1289cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum					i1 += l;
1290cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (i2 < 0)
1291cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum					i2 += l;
1292cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			}
1293cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
1294cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1295cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
12960e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object doesn't support slice deletion", s);
1297cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
12986cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum}
12996cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1300e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1301799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Tuple(PyObject *v)
1302e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
13036912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	PyObject *it;  /* iter(v) */
130418e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t n;         /* guess for result tuple size */
13056912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	PyObject *result;
130618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t j;
1307e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1308cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (v == NULL)
1309cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1310e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
13116912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Special-case the common tuple and list cases, for efficiency. */
13124c3a0a35cd80a0abb9628dc8d4ade911fe2d5015Tim Peters	if (PyTuple_CheckExact(v)) {
13134c3a0a35cd80a0abb9628dc8d4ade911fe2d5015Tim Peters		/* Note that we can't know whether it's safe to return
13144c3a0a35cd80a0abb9628dc8d4ade911fe2d5015Tim Peters		   a tuple *subclass* instance as-is, hence the restriction
13158ff70a9606aa2f51f8329fbf09dfbbbae6ab6c11Tim Peters		   to exact tuples here.  In contrast, lists always make
13168ff70a9606aa2f51f8329fbf09dfbbbae6ab6c11Tim Peters		   a copy, so there's no need for exactness below. */
1317cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		Py_INCREF(v);
1318cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return v;
1319cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1320cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (PyList_Check(v))
1321cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return PyList_AsTuple(v);
1322cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
13236912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Get iterator. */
13246912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	it = PyObject_GetIter(v);
13256912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	if (it == NULL)
13261fc240e85150f5cb39502a87cc9a4a0a8cbe5ab0Tim Peters		return NULL;
1327e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
13286912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Guess result size and allocate space. */
1329f5b3e36493da275334e29afdbd238863697dca35Armin Rigo	n = _PyObject_LengthHint(v);
13306912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	if (n < 0) {
1331a710b331daee9e79ca90395feb6ce8c552e00568Raymond Hettinger		if (!PyErr_ExceptionMatches(PyExc_TypeError)  &&
1332a710b331daee9e79ca90395feb6ce8c552e00568Raymond Hettinger		    !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1333a710b331daee9e79ca90395feb6ce8c552e00568Raymond Hettinger			Py_DECREF(it);
1334a710b331daee9e79ca90395feb6ce8c552e00568Raymond Hettinger			return NULL;
1335a710b331daee9e79ca90395feb6ce8c552e00568Raymond Hettinger		}
13366912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		PyErr_Clear();
13376912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		n = 10;  /* arbitrary */
13386912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	}
13396912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	result = PyTuple_New(n);
13406912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	if (result == NULL)
13416912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		goto Fail;
13426912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters
13436912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Fill the tuple. */
13446912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	for (j = 0; ; ++j) {
13456912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		PyObject *item = PyIter_Next(it);
13466912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		if (item == NULL) {
13476912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters			if (PyErr_Occurred())
13486912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters				goto Fail;
13496912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters			break;
13506912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		}
13516912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		if (j >= n) {
135218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			Py_ssize_t oldn = n;
13534d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			/* The over-allocation strategy can grow a bit faster
13544d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			   than for lists because unlike lists the
13554d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			   over-allocation isn't permanent -- we reclaim
13564d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			   the excess before the end of this routine.
13574d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			   So, grow by ten and then add 25%.
13584d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			*/
13594d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			n += 10;
13604d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			n += n >> 2;
13614d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			if (n < oldn) {
13624d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger				/* Check for overflow */
13634d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger				PyErr_NoMemory();
1364e6bdb37e5bc7d250e17c3d4fef6961e178e02b64Raymond Hettinger				Py_DECREF(item);
13654d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger				goto Fail;
13664d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			}
13674324aa3572f123883e67a807b633b3d0d452a267Tim Peters			if (_PyTuple_Resize(&result, n) != 0) {
136812d0a6c78a376e8eddca3d3fa88ed3627aad795cTim Peters				Py_DECREF(item);
13696912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters				goto Fail;
137012d0a6c78a376e8eddca3d3fa88ed3627aad795cTim Peters			}
1371cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
13726912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		PyTuple_SET_ITEM(result, j, item);
1373e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	}
1374cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
13756912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Cut tuple back if guess was too large. */
13766912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	if (j < n &&
13774324aa3572f123883e67a807b633b3d0d452a267Tim Peters	    _PyTuple_Resize(&result, j) != 0)
13786912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		goto Fail;
13796912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters
13806912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	Py_DECREF(it);
13816912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	return result;
13826912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters
13836912d4ddf0504a3d5611ddd12cbde3354bd48279Tim PetersFail:
13846912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	Py_XDECREF(result);
13856912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	Py_DECREF(it);
13866912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	return NULL;
1387e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1388e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
13893c5936afc5f067b3b591f554c31e1cfdce460fadGuido van RossumPyObject *
1390799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_List(PyObject *v)
13913c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum{
1392f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters	PyObject *result;  /* result list */
13938ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger	PyObject *rv;      /* return value from PyList_Extend */
1394cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
13955dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum	if (v == NULL)
13965dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum		return null_error();
13975dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum
13988ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger	result = PyList_New(0);
13998ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger	if (result == NULL)
1400f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters		return NULL;
1401f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters
14028ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger	rv = _PyList_Extend((PyListObject *)result, v);
14038ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger	if (rv == NULL) {
14048ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger		Py_DECREF(result);
1405f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters		return NULL;
1406f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters	}
1407969d8c0c8cbef8f8b838c3032bb6beb60cb59f4fRaymond Hettinger	Py_DECREF(rv);
1408f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters	return result;
1409cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
14104669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum
141174042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. KuchlingPyObject *
1412799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Fast(PyObject *v, const char *m)
141374042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling{
14142fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger	PyObject *it;
14152fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger
141674042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling	if (v == NULL)
141774042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling		return null_error();
141874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
14192801fe1c8f7d629e396ed514c4df25b43547970aMichael W. Hudson	if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
142074042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling		Py_INCREF(v);
142174042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling		return v;
142274042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling	}
142374042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
14242fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger 	it = PyObject_GetIter(v);
14252fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger	if (it == NULL) {
14262fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger		if (PyErr_ExceptionMatches(PyExc_TypeError))
14270e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			PyErr_SetString(PyExc_TypeError, m);
14282fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger		return NULL;
14292fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger	}
14302fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger
1431193814c3082f1b81772009f9b7545278f16c3428Raymond Hettinger	v = PySequence_List(it);
14322fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger	Py_DECREF(it);
143374042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
143474042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling	return v;
143574042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling}
143674042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
143716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters/* Iterate over seq.  Result depends on the operation:
143816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters   PY_ITERSEARCH_COUNT:  -1 if error, else # of times obj appears in seq.
143916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters   PY_ITERSEARCH_INDEX:  0-based index of first occurence of obj in seq;
144016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters   	set ValueError and return -1 if none found; also return -1 on error.
144116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters   Py_ITERSEARCH_CONTAINS:  return 1 if obj in seq, else 0; -1 on error.
144216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters*/
14431fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t
144416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
1445cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{
14461fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz	Py_ssize_t n;
144716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	int wrapped;  /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
144816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	PyObject *it;  /* iter(seq) */
14494669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum
145016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	if (seq == NULL || obj == NULL) {
1451cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1452cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1453cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
145475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters
145516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	it = PyObject_GetIter(seq);
145675f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters	if (it == NULL) {
14570e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		type_error("argument of type '%.200s' is not iterable", seq);
1458cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
145975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters	}
1460cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
146116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	n = wrapped = 0;
146275f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters	for (;;) {
146375f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		int cmp;
146475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		PyObject *item = PyIter_Next(it);
146575f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		if (item == NULL) {
146675f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters			if (PyErr_Occurred())
146775f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters				goto Fail;
146875f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters			break;
146975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		}
147016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
147116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters		cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
1472cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		Py_DECREF(item);
147375f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		if (cmp < 0)
147475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters			goto Fail;
147575f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		if (cmp > 0) {
147616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			switch (operation) {
147716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			case PY_ITERSEARCH_COUNT:
147889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters				if (n == PY_SSIZE_T_MAX) {
147916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters					PyErr_SetString(PyExc_OverflowError,
148089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters					       "count exceeds C integer size");
148116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters					goto Fail;
148216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				}
148389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters				++n;
148416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				break;
148516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
148616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			case PY_ITERSEARCH_INDEX:
148716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				if (wrapped) {
148816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters					PyErr_SetString(PyExc_OverflowError,
148989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters					       "index exceeds C integer size");
149016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters					goto Fail;
149116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				}
149216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				goto Done;
149316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
149416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			case PY_ITERSEARCH_CONTAINS:
149516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				n = 1;
149616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				goto Done;
149716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
149816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			default:
149916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				assert(!"unknown operation");
150075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters			}
150116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters		}
150216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
150316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters		if (operation == PY_ITERSEARCH_INDEX) {
150489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters			if (n == PY_SSIZE_T_MAX)
150516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				wrapped = 1;
150689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters			++n;
150775f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		}
15084669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum	}
150975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters
151016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	if (operation != PY_ITERSEARCH_INDEX)
151116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters		goto Done;
151216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
151316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	PyErr_SetString(PyExc_ValueError,
151416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters		        "sequence.index(x): x not in sequence");
151516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	/* fall into failure code */
151675f8e35ef41aa6e7c915d99de8bd40be2745955cTim PetersFail:
151716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	n = -1;
151816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	/* fall through */
151916a77adfbd745c202878fabb0b921514fec7ca16Tim PetersDone:
152075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters	Py_DECREF(it);
152116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	return n;
152216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
15233c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum}
15243c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum
152516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters/* Return # of times o appears in s. */
15261fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t
152716a77adfbd745c202878fabb0b921514fec7ca16Tim PetersPySequence_Count(PyObject *s, PyObject *o)
1528e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
152916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
1530e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1531e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1532cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
153316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters * Use sq_contains if possible, else defer to _PySequence_IterSearch().
1534cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters */
1535cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Petersint
1536cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim PetersPySequence_Contains(PyObject *seq, PyObject *ob)
1537cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters{
15381fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz	Py_ssize_t result;
15393cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
15403cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum        if (sqm != NULL && sqm->sq_contains != NULL)
15413cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum		return (*sqm->sq_contains)(seq, ob);
15421fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz	result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
15431fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz	return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
1544cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters}
1545cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters
1546cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Backwards compatibility */
1547cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum#undef PySequence_In
1548cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
1549799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_In(PyObject *w, PyObject *v)
1550e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1551cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return PySequence_Contains(w, v);
1552e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1553e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
15541fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t
1555799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Index(PyObject *s, PyObject *o)
1556e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
155716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
1558e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1559e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1560cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on mappings */
1561cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1562cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
1563799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_Check(PyObject *o)
1564e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1565e2eda606a83cbe68846faf44b478053e250fb025Raymond Hettinger	return  o && o->ob_type->tp_as_mapping &&
1566e2eda606a83cbe68846faf44b478053e250fb025Raymond Hettinger		o->ob_type->tp_as_mapping->mp_subscript &&
1567ed9192e2ae144706f6ecb9bdfb903220e2d33845Raymond Hettinger		!(o->ob_type->tp_as_sequence &&
1568ed9192e2ae144706f6ecb9bdfb903220e2d33845Raymond Hettinger		  o->ob_type->tp_as_sequence->sq_slice);
1569e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1570e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
157118e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
15726253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyMapping_Size(PyObject *o)
1573e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1574cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyMappingMethods *m;
1575e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1576cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL) {
1577cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1578cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1579cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1580e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1581cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_mapping;
1582cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->mp_length)
1583cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->mp_length(o);
1584e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
15850e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("object of type '%.200s' has no len()", o);
1586cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
1587e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1588e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1589cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyMapping_Length
159018e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
1591cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyMapping_Length(PyObject *o)
1592cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{
1593cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg	return PyMapping_Size(o);
1594cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg}
1595cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyMapping_Length PyMapping_Size
1596cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg
1597cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van RossumPyObject *
1598799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_GetItemString(PyObject *o, char *key)
1599cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{
1600cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyObject *okey, *r;
1601cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1602cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (key == NULL)
1603cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1604cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1605cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	okey = PyString_FromString(key);
1606cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (okey == NULL)
1607cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return NULL;
1608cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	r = PyObject_GetItem(o, okey);
1609cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	Py_DECREF(okey);
1610cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return r;
1611cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
1612cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1613cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
1614799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
1615cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{
1616cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyObject *okey;
1617cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	int r;
1618cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1619cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (key == NULL) {
1620cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1621cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1622cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1623cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1624cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	okey = PyString_FromString(key);
1625cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (okey == NULL)
1626ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum		return -1;
1627cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	r = PyObject_SetItem(o, okey, value);
1628cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	Py_DECREF(okey);
1629cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return r;
1630cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
1631cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1632cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
1633799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_HasKeyString(PyObject *o, char *key)
1634e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1635cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyObject *v;
1636cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1637cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	v = PyMapping_GetItemString(o, key);
1638cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (v) {
1639cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		Py_DECREF(v);
1640cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return 1;
1641cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1642cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyErr_Clear();
1643cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return 0;
1644e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1645e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1646cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
1647799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_HasKey(PyObject *o, PyObject *key)
1648e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1649cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyObject *v;
1650cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1651cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	v = PyObject_GetItem(o, key);
1652cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (v) {
1653cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		Py_DECREF(v);
1654cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return 1;
1655cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1656cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyErr_Clear();
1657cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return 0;
1658e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1659e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1660cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject *
1661cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Keys(PyObject *o)
1662cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{
1663cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *keys;
1664cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *fast;
1665cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
1666cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (PyDict_CheckExact(o))
1667cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return PyDict_Keys(o);
1668cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	keys = PyObject_CallMethod(o, "keys", NULL);
1669cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (keys == NULL)
1670cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return NULL;
1671cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	fast = PySequence_Fast(keys, "o.keys() are not iterable");
1672cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	Py_DECREF(keys);
1673cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	return fast;
1674cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum}
1675cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
1676cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject *
1677cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Items(PyObject *o)
1678cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{
1679cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *items;
1680cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *fast;
1681cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
1682cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (PyDict_CheckExact(o))
1683cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return PyDict_Items(o);
1684cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	items = PyObject_CallMethod(o, "items", NULL);
1685cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (items == NULL)
1686cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return NULL;
1687cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	fast = PySequence_Fast(items, "o.items() are not iterable");
1688cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	Py_DECREF(items);
1689cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	return fast;
1690cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum}
1691cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
1692cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject *
1693cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Values(PyObject *o)
1694cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{
1695cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *values;
1696cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *fast;
1697cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
1698cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (PyDict_CheckExact(o))
1699cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return PyDict_Values(o);
1700cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	values = PyObject_CallMethod(o, "values", NULL);
1701cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (values == NULL)
1702cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return NULL;
1703cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	fast = PySequence_Fast(values, "o.values() are not iterable");
1704cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	Py_DECREF(values);
1705cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	return fast;
1706cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum}
1707cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
1708cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on callable objects */
1709cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1710cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* XXX PyCallable_Check() is in object.c */
1711cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1712e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1713799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_CallObject(PyObject *o, PyObject *a)
1714e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
17155560b7492c8dbe17a29362a66102662e5e22a9d2Guido van Rossum	return PyEval_CallObjectWithKeywords(o, a, NULL);
1716cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
1717e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1718e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
17196d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim PetersPyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
17206d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters{
17216d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters        ternaryfunc call;
17226d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters
17236d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	if ((call = func->ob_type->tp_call) != NULL) {
17246d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters		PyObject *result = (*call)(func, arg, kw);
17256d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters		if (result == NULL && !PyErr_Occurred())
17266d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters			PyErr_SetString(
17276d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters				PyExc_SystemError,
17286d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters				"NULL result without error in PyObject_Call");
17296d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters		return result;
17306d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	}
17310e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
1732573395a7a8163c38630c5262ed3910c279e4a767Fred Drake		     func->ob_type->tp_name);
17336d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	return NULL;
17346d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters}
17356d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters
173649fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersstatic PyObject*
173749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouterscall_function_tail(PyObject *callable, PyObject *args)
173849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
173949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *retval;
174049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
174149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (args == NULL)
174249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		return NULL;
174349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
174449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (!PyTuple_Check(args)) {
174549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyObject *a;
174649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
174749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		a = PyTuple_New(1);
174849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		if (a == NULL) {
174949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			Py_DECREF(args);
175049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			return NULL;
175149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		}
175249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyTuple_SET_ITEM(a, 0, args);
175349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = a;
175449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	}
175549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	retval = PyObject_Call(callable, args, NULL);
175649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
175749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	Py_DECREF(args);
175849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
175949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	return retval;
176049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
176149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
17626d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim PetersPyObject *
1763cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van RossumPyObject_CallFunction(PyObject *callable, char *format, ...)
1764e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1765cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	va_list va;
176649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *args;
1767e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1768b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	if (callable == NULL)
1769cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1770cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1771b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	if (format && *format) {
1772b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake		va_start(va, format);
1773cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		args = Py_VaBuildValue(format, va);
1774b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake		va_end(va);
1775b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	}
1776cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	else
1777cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		args = PyTuple_New(0);
1778cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
177949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	return call_function_tail(callable, args);
178049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
1781cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
178249fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyObject *
178349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
178449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
178549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	va_list va;
178649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *args;
1787cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
178849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (callable == NULL)
178949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		return null_error();
1790cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
179149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (format && *format) {
179249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		va_start(va, format);
179349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = _Py_VaBuildValue_SizeT(format, va);
179449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		va_end(va);
179549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	}
179649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	else
179749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = PyTuple_New(0);
1798cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
179949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	return call_function_tail(callable, args);
1800e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1801e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1802e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1803e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1804e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1805cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	va_list va;
180649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *args;
18070edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	PyObject *func = NULL;
18080edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	PyObject *retval = NULL;
1809e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1810b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	if (o == NULL || name == NULL)
1811cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1812e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1813cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	func = PyObject_GetAttrString(o, name);
1814cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (func == NULL) {
1815cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		PyErr_SetString(PyExc_AttributeError, name);
1816cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return 0;
1817cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1818e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
18190edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	if (!PyCallable_Check(func)) {
18200e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		type_error("attribute of type '%.200s' is not callable", func);
18210edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson		goto exit;
18220edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	}
1823e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1824b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	if (format && *format) {
1825b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake		va_start(va, format);
1826cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		args = Py_VaBuildValue(format, va);
1827b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake		va_end(va);
1828b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	}
1829cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	else
1830cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		args = PyTuple_New(0);
1831cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
183249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	retval = call_function_tail(func, args);
1833cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
183449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters  exit:
183549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	/* args gets consumed in call_function_tail */
183649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	Py_XDECREF(func);
1837cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
183849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	return retval;
183949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
184049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
184149fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyObject *
184249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
184349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
184449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	va_list va;
184549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *args;
184649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *func = NULL;
184749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *retval = NULL;
184849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
184949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (o == NULL || name == NULL)
185049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		return null_error();
185149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
185249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	func = PyObject_GetAttrString(o, name);
185349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (func == NULL) {
185449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyErr_SetString(PyExc_AttributeError, name);
185549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		return 0;
1856cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1857cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
185849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (!PyCallable_Check(func)) {
18590e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		type_error("attribute of type '%.200s' is not callable", func);
186049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		goto exit;
186149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	}
186249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
186349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (format && *format) {
186449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		va_start(va, format);
186549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = _Py_VaBuildValue_SizeT(format, va);
186649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		va_end(va);
186749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	}
186849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	else
186949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = PyTuple_New(0);
187049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
187149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	retval = call_function_tail(func, args);
1872cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
18730edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson  exit:
187449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	/* args gets consumed in call_function_tail */
18750edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	Py_XDECREF(func);
1876cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1877cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return retval;
1878e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1879823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
1880823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
1881b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drakestatic PyObject *
1882b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred Drakeobjargs_mktuple(va_list va)
1883b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{
1884b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	int i, n = 0;
1885b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_list countva;
1886b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	PyObject *result, *tmp;
1887b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1888b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake#ifdef VA_LIST_IS_ARRAY
1889b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	memcpy(countva, va, sizeof(va_list));
1890b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake#else
189175d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#ifdef __va_copy
189275d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis	__va_copy(countva, va);
189375d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#else
1894b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	countva = va;
1895b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake#endif
189675d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#endif
1897b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1898b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1899b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		++n;
1900b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	result = PyTuple_New(n);
1901b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (result != NULL && n > 0) {
1902b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		for (i = 0; i < n; ++i) {
1903b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake			tmp = (PyObject *)va_arg(va, PyObject *);
1904b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake			PyTuple_SET_ITEM(result, i, tmp);
1905b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake			Py_INCREF(tmp);
1906b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		}
1907b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	}
1908b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	return result;
1909b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake}
1910b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1911b421b8c19105d08b97122b7c84eec37ad83c6de4Fred DrakePyObject *
1912b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred DrakePyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
1913b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{
1914b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	PyObject *args, *tmp;
1915b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_list vargs;
1916b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1917b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (callable == NULL || name == NULL)
1918b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return null_error();
1919b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1920b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	callable = PyObject_GetAttr(callable, name);
1921b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (callable == NULL)
1922b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return NULL;
1923b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1924b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	/* count the args */
1925b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_start(vargs, name);
1926b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred Drake	args = objargs_mktuple(vargs);
1927b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_end(vargs);
1928b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (args == NULL) {
1929b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		Py_DECREF(callable);
1930b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return NULL;
1931b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	}
1932b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	tmp = PyObject_Call(callable, args, NULL);
1933b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	Py_DECREF(args);
1934b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	Py_DECREF(callable);
1935b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1936b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	return tmp;
1937b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake}
1938b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1939b421b8c19105d08b97122b7c84eec37ad83c6de4Fred DrakePyObject *
1940b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred DrakePyObject_CallFunctionObjArgs(PyObject *callable, ...)
1941b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{
1942b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	PyObject *args, *tmp;
1943b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_list vargs;
1944b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1945b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (callable == NULL)
1946b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return null_error();
1947b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1948b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	/* count the args */
1949b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_start(vargs, callable);
1950b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred Drake	args = objargs_mktuple(vargs);
1951b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_end(vargs);
1952b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (args == NULL)
1953b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return NULL;
1954b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	tmp = PyObject_Call(callable, args, NULL);
1955b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	Py_DECREF(args);
1956b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1957b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	return tmp;
1958b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake}
1959b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1960b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
1961823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum/* isinstance(), issubclass() */
1962823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
1963f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1964f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * state that will almost never happen.
1965f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
1966f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 0. creating the __bases__ static string could get a MemoryError
1967f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 1. getattr(cls, '__bases__') could raise an AttributeError
1968f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 2. getattr(cls, '__bases__') could raise some other exception
1969f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 3. getattr(cls, '__bases__') could return a tuple
1970f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 4. getattr(cls, '__bases__') could return something other than a tuple
1971f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
1972f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Only state #3 is a non-error state and only it returns a non-NULL object
1973f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * (it returns the retrieved tuple).
1974f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
1975f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Any raised AttributeErrors are masked by clearing the exception and
1976f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * returning NULL.  If an object other than a tuple comes out of __bases__,
1977f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * then again, the return value is NULL.  So yes, these two situations
1978f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * produce exactly the same results: NULL is returned and no error is set.
1979f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
1980f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * If some exception other than AttributeError is raised, then NULL is also
1981f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * returned, but the exception is not cleared.  That's because we want the
1982f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * exception to be propagated along.
1983f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
1984f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Callers are expected to test for PyErr_Occurred() when the return value
1985f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * is NULL to decide whether a valid exception should be propagated or not.
1986f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * When there's no exception to propagate, it's customary for the caller to
1987f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * set a TypeError.
1988f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw */
19896b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerstatic PyObject *
19906b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerabstract_get_bases(PyObject *cls)
1991823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{
1992823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	static PyObject *__bases__ = NULL;
1993823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	PyObject *bases;
1994823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
1995823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	if (__bases__ == NULL) {
1996823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum		__bases__ = PyString_FromString("__bases__");
1997823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum		if (__bases__ == NULL)
19986b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			return NULL;
1999823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
20006b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	bases = PyObject_GetAttr(cls, __bases__);
2001f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw	if (bases == NULL) {
2002f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw		if (PyErr_ExceptionMatches(PyExc_AttributeError))
2003f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw			PyErr_Clear();
2004f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw		return NULL;
2005f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw	}
2006f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw	if (!PyTuple_Check(bases)) {
2007f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw	        Py_DECREF(bases);
20086b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		return NULL;
2009823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
20106b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	return bases;
20116b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer}
20126b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
20136b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
20146b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerstatic int
20156b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerabstract_issubclass(PyObject *derived, PyObject *cls)
20166b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer{
20176b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	PyObject *bases;
201818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t i, n;
20196b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	int r = 0;
20206b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
20216b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
2022823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	if (derived == cls)
2023823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum		return 1;
2024823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2025d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	if (PyTuple_Check(cls)) {
2026d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		/* Not a general sequence -- that opens up the road to
2027d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		   recursion and stack overflow. */
2028d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		n = PyTuple_GET_SIZE(cls);
2029d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		for (i = 0; i < n; i++) {
2030d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			if (derived == PyTuple_GET_ITEM(cls, i))
2031d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald				return 1;
2032d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		}
2033d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	}
20346b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	bases = abstract_get_bases(derived);
2035f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw	if (bases == NULL) {
2036f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw		if (PyErr_Occurred())
2037f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw			return -1;
20386b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		return 0;
2039f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw	}
2040823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	n = PyTuple_GET_SIZE(bases);
2041823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	for (i = 0; i < n; i++) {
20426b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2043823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum		if (r != 0)
2044823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum			break;
2045823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
2046823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2047823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	Py_DECREF(bases);
2048823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2049823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	return r;
2050823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum}
2051823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2052d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwaldstatic int
2053d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwaldcheck_class(PyObject *cls, const char *error)
2054d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald{
2055d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	PyObject *bases = abstract_get_bases(cls);
2056d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	if (bases == NULL) {
2057d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		/* Do not mask errors. */
2058d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		if (!PyErr_Occurred())
2059d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			PyErr_SetString(PyExc_TypeError, error);
2060d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		return 0;
2061d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	}
2062d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	Py_DECREF(bases);
2063d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	return -1;
2064d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald}
2065d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald
20664f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonstatic int
20674f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonrecursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
2068823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{
2069823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	PyObject *icls;
2070823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	static PyObject *__class__ = NULL;
2071823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	int retval = 0;
2072823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
207303bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum	if (__class__ == NULL) {
207403bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum		__class__ = PyString_FromString("__class__");
207503bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum		if (__class__ == NULL)
207603bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			return -1;
207703bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum	}
207803bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum
207945aecf451a64fb1ebe5e74d0b00965ac8d99dff6Guido van Rossum	if (PyType_Check(cls)) {
20806d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters		retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
208103bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum		if (retval == 0) {
208203bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			PyObject *c = PyObject_GetAttr(inst, __class__);
208303bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			if (c == NULL) {
208403bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum				PyErr_Clear();
208503bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			}
208603bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			else {
2087e5b130bcdb491b7d4af7cd4c9cf82ebf6ba5fc63Guido van Rossum				if (c != (PyObject *)(inst->ob_type) &&
2088e5b130bcdb491b7d4af7cd4c9cf82ebf6ba5fc63Guido van Rossum				    PyType_Check(c))
208903bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum					retval = PyType_IsSubtype(
209003bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum						(PyTypeObject *)c,
209103bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum						(PyTypeObject *)cls);
209203bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum				Py_DECREF(c);
209303bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			}
209403bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum		}
2095823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
209603290ecbf1661c0192e6abdbe00ae163af461d77Guido van Rossum	else if (PyTuple_Check(cls)) {
209718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis		Py_ssize_t i, n;
209803290ecbf1661c0192e6abdbe00ae163af461d77Guido van Rossum
20994f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                if (!recursion_depth) {
21004f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                    PyErr_SetString(PyExc_RuntimeError,
21014f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                                    "nest level of tuple too deep");
21025f112eb43b85dcb78795d2bd56fedac43e6a40c0Tim Peters                    return -1;
21034f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                }
21044f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
210503290ecbf1661c0192e6abdbe00ae163af461d77Guido van Rossum		n = PyTuple_GET_SIZE(cls);
210603290ecbf1661c0192e6abdbe00ae163af461d77Guido van Rossum		for (i = 0; i < n; i++) {
21074f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon			retval = recursive_isinstance(
21084f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                                    inst,
21094f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                                    PyTuple_GET_ITEM(cls, i),
21104f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                                    recursion_depth-1);
211103290ecbf1661c0192e6abdbe00ae163af461d77Guido van Rossum			if (retval != 0)
211203290ecbf1661c0192e6abdbe00ae163af461d77Guido van Rossum				break;
211303290ecbf1661c0192e6abdbe00ae163af461d77Guido van Rossum		}
211403290ecbf1661c0192e6abdbe00ae163af461d77Guido van Rossum	}
21156b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	else {
2116d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		if (!check_class(cls,
2117d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			"isinstance() arg 2 must be a class, type,"
2118d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			" or tuple of classes and types"))
21196b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			return -1;
2120823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum		icls = PyObject_GetAttr(inst, __class__);
21216b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		if (icls == NULL) {
21226b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			PyErr_Clear();
21236b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			retval = 0;
21246b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		}
21256b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		else {
21266b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			retval = abstract_issubclass(icls, cls);
2127823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum			Py_DECREF(icls);
2128823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum		}
2129823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
2130823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2131823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	return retval;
2132823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum}
2133823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2134823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossumint
21354f65331483197a9909b19694688c55fdf9ca7a37Brett CannonPyObject_IsInstance(PyObject *inst, PyObject *cls)
21364f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon{
21374f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon    return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
21384f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon}
21394f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
21404f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonstatic  int
21414f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonrecursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
2142823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{
2143823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	int retval;
2144823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
214545aecf451a64fb1ebe5e74d0b00965ac8d99dff6Guido van Rossum        {
2146f6c9ba845730edc187cdcfcd84abb889adf8386fGuido van Rossum		if (!check_class(derived,
2147f6c9ba845730edc187cdcfcd84abb889adf8386fGuido van Rossum				 "issubclass() arg 1 must be a class"))
21486b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			return -1;
2149d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald
2150d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		if (PyTuple_Check(cls)) {
215118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			Py_ssize_t i;
215218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			Py_ssize_t n = PyTuple_GET_SIZE(cls);
21534f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
21544f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                        if (!recursion_depth) {
21554f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                            PyErr_SetString(PyExc_RuntimeError,
21564f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                                            "nest level of tuple too deep");
21575f112eb43b85dcb78795d2bd56fedac43e6a40c0Tim Peters                            return -1;
21584f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                        }
2159d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			for (i = 0; i < n; ++i) {
21604f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon				retval = recursive_issubclass(
21614f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                                            derived,
21624f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                                            PyTuple_GET_ITEM(cls, i),
21634f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon                                            recursion_depth-1);
2164f6c9ba845730edc187cdcfcd84abb889adf8386fGuido van Rossum				if (retval != 0) {
2165f6c9ba845730edc187cdcfcd84abb889adf8386fGuido van Rossum					/* either found it, or got an error */
21667e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9Walter Dörwald					return retval;
2167f6c9ba845730edc187cdcfcd84abb889adf8386fGuido van Rossum				}
2168d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			}
21697e5c6a02eba1a6f5e93bfa1241ceff39bec9f3c9Walter Dörwald			return 0;
21706b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		}
2171d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		else {
2172d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			if (!check_class(cls,
2173d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald					"issubclass() arg 2 must be a class"
2174d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald					" or tuple of classes"))
2175d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald				return -1;
21766b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		}
21776b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
21786b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		retval = abstract_issubclass(derived, cls);
2179823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
2180823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2181823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	return retval;
2182823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum}
218359d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum
21844f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonint
21854f65331483197a9909b19694688c55fdf9ca7a37Brett CannonPyObject_IsSubclass(PyObject *derived, PyObject *cls)
21864f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon{
21874f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon    return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
21884f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon}
21894f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
21904f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
219159d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject *
219259d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject_GetIter(PyObject *o)
219359d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum{
219459d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum	PyTypeObject *t = o->ob_type;
219559d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum	getiterfunc f = NULL;
21963cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	f = t->tp_iter;
219759d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum	if (f == NULL) {
219859d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum		if (PySequence_Check(o))
2199213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum			return PySeqIter_New(o);
22000e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		return type_error("'%.200s' object is not iterable", o);
220159d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum	}
2202213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum	else {
2203213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum		PyObject *res = (*f)(o);
2204213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum		if (res != NULL && !PyIter_Check(res)) {
2205213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum			PyErr_Format(PyExc_TypeError,
2206213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum				     "iter() returned non-iterator "
2207213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum				     "of type '%.100s'",
2208213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum				     res->ob_type->tp_name);
2209213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum			Py_DECREF(res);
2210213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum			res = NULL;
2211213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum		}
2212213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum		return res;
2213213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum	}
2214213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum}
2215213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum
2216f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters/* Return next item.
2217f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If an error occurs, return NULL.  PyErr_Occurred() will be true.
2218f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If the iteration terminates normally, return NULL and clear the
2219f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * PyExc_StopIteration exception (if it was set).  PyErr_Occurred()
2220f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * will be false.
2221f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * Else return the next object.  PyErr_Occurred() will be false.
2222f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters */
2223213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyObject *
2224213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyIter_Next(PyObject *iter)
2225213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum{
2226f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	PyObject *result;
22278049dde8d769d261a50bb7dd5706c46a37573a6cRaymond Hettinger	assert(PyIter_Check(iter));
2228f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	result = (*iter->ob_type->tp_iternext)(iter);
2229f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	if (result == NULL &&
2230f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	    PyErr_Occurred() &&
2231f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	    PyErr_ExceptionMatches(PyExc_StopIteration))
2232f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters		PyErr_Clear();
2233f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	return result;
223459d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum}
2235