abstract.c revision fb94c5f1e5bb9ccd28bcd311f388db7bea35c865
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 RossumPyObject *
31799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_Type(PyObject *o)
32e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
33e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	PyObject *v;
34e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
35cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
36cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
37e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	v = (PyObject *)o->ob_type;
38e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	Py_INCREF(v);
39e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	return v;
40e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
41e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
4218e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
436253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyObject_Size(PyObject *o)
44e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
45cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
46e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
47cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL) {
48cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
49cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
50cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
51e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
52cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_sequence;
53cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_length)
54cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_length(o);
55e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
566253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy Hylton	return PyMapping_Size(o);
57e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
58e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
59cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyObject_Length
6018e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
61cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyObject_Length(PyObject *o)
62cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{
63cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg	return PyObject_Size(o);
64cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg}
65cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyObject_Length PyObject_Size
66cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg
67255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes
68255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes/* The length hint function returns a non-negative value from o.__len__()
69255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes   or o.__length_hint__().  If those methods aren't found or return a negative
70e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger   value, then the defaultvalue is returned.  If one of the calls fails,
71e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger   this function returns -1.
72255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes*/
73255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes
7418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
75255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
766b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger{
77255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes	static PyObject *hintstrobj = NULL;
78a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson	PyObject *ro, *hintmeth;
79255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes	Py_ssize_t rv;
80255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes
81255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes	/* try o.__len__() */
82255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes	rv = PyObject_Size(o);
83255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes	if (rv >= 0)
846b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger		return rv;
85e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger	if (PyErr_Occurred()) {
86b0ba27dff1442fe6dc7b00ce7d8488afb159d9b8Benjamin Peterson		if (!PyErr_ExceptionMatches(PyExc_TypeError))
87b0ba27dff1442fe6dc7b00ce7d8488afb159d9b8Benjamin Peterson			return -1;
88255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes		PyErr_Clear();
89e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger	}
90255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes
91255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes	/* try o.__length_hint__() */
92a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson        hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
9394c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson	if (hintmeth == NULL) {
9494c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson		if (PyErr_Occurred())
9594c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson			return -1;
9694c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson		else
9794c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson			return defaultvalue;
9894c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson	}
99a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson	ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
100a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson	Py_DECREF(hintmeth);
101e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger	if (ro == NULL) {
102a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson		if (!PyErr_ExceptionMatches(PyExc_TypeError))
103a5758c012001b1044d4a109b736c0406cdf8c9ecBenjamin Peterson			return -1;
104e18df23d5d76e931f5163872bbdf7943f6ef7c5bBenjamin Peterson		PyErr_Clear();
105e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger		return defaultvalue;
106e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger	}
1075d65412d35231ffab837478f575fcd326bbcac80Raymond Hettinger	rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
108255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes	Py_DECREF(ro);
109e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger	return rv;
1106b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger}
1116b27cda64386195cd07dfb686e9486f1c4bc3159Raymond Hettinger
112e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
113799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_GetItem(PyObject *o, PyObject *key)
114e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
115cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyMappingMethods *m;
116e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
117cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL || key == NULL)
118cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
119e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
120cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_mapping;
121cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->mp_subscript)
122cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->mp_subscript(o, key);
123e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
12421308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	if (o->ob_type->tp_as_sequence) {
12500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		if (PyIndex_Check(key)) {
12600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			Py_ssize_t key_value;
12700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
1280f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			if (key_value == -1 && PyErr_Occurred())
1290f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling				return NULL;
1300f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			return PySequence_GetItem(o, key_value);
1310f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling		}
13264585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		else if (o->ob_type->tp_as_sequence->sq_item)
1330e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			return type_error("sequence index must "
1340e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters					  "be integer, not '%.200s'", key);
13521308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	}
136cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1370192bffe9002e5878fcbeb1604739286ee0d138fGeorg Brandl	return type_error("'%.200s' object is not subscriptable", o);
138e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
139e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
140e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint
141799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
142e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
143cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyMappingMethods *m;
144e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
145cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL || key == NULL || value == NULL) {
146cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
147cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
148cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
149cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_mapping;
150cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->mp_ass_subscript)
151cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->mp_ass_subscript(o, key, value);
152cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
15321308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	if (o->ob_type->tp_as_sequence) {
15400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		if (PyIndex_Check(key)) {
15500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			Py_ssize_t key_value;
15600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
1570f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			if (key_value == -1 && PyErr_Occurred())
1580f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling				return -1;
1590f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			return PySequence_SetItem(o, key_value, value);
1600f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling		}
16164585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		else if (o->ob_type->tp_as_sequence->sq_ass_item) {
1620e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			type_error("sequence index must be "
1630e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters				   "integer, not '%.200s'", key);
16464585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum			return -1;
16564585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		}
16621308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	}
167e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1680e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object does not support item assignment", o);
169cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
170e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
171e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1726cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint
173799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_DelItem(PyObject *o, PyObject *key)
1746cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{
175cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyMappingMethods *m;
176cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
177cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL || key == NULL) {
178cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
179cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
180cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
181cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_mapping;
182cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->mp_ass_subscript)
183cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->mp_ass_subscript(o, key, (PyObject*)NULL);
1846cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
18521308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	if (o->ob_type->tp_as_sequence) {
18600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		if (PyIndex_Check(key)) {
18700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			Py_ssize_t key_value;
18800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
1890f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			if (key_value == -1 && PyErr_Occurred())
1900f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling				return -1;
1910f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling			return PySequence_DelItem(o, key_value);
1920f223d241854934cb0631e578381db59f6059af7Andrew M. Kuchling		}
19364585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		else if (o->ob_type->tp_as_sequence->sq_ass_item) {
1940e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			type_error("sequence index must be "
1950e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters				   "integer, not '%.200s'", key);
19664585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum			return -1;
19764585f6afb33ea907a22a365b4fdbec155e3da55Guido van Rossum		}
19821308243ca028e06f03336f9d84edbeebcfb1da2Guido van Rossum	}
1996cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
2000e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object does not support item deletion", o);
201cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
2026cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum}
2036cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
204b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwisint
205b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. LöwisPyObject_DelItemString(PyObject *o, char *key)
206b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis{
207b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	PyObject *okey;
208b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	int ret;
209b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis
210b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	if (o == NULL || key == NULL) {
211b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis		null_error();
212b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis		return -1;
213b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	}
2145b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis	okey = PyUnicode_FromString(key);
215b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	if (okey == NULL)
216b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis		return -1;
217b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	ret = PyObject_DelItem(o, okey);
218b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	Py_DECREF(okey);
219b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis	return ret;
220b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis}
221b0d71d0ec6e575b7c379d55cb8366b26509ece53Martin v. Löwis
222b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant/* We release the buffer right after use of this function which could
22398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum   cause issues later on.  Don't use these functions in new code.
224b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant */
22573e5a5b65d66f4fba9c4f626bcd6400f4a7215e6Thomas Woutersint
22673e5a5b65d66f4fba9c4f626bcd6400f4a7215e6Thomas WoutersPyObject_AsCharBuffer(PyObject *obj,
227fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		      const char **buffer,
228fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		      Py_ssize_t *buffer_len)
2294c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{
2304c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	PyBufferProcs *pb;
231fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_buffer view;
2324c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2334c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (obj == NULL || buffer == NULL || buffer_len == NULL) {
2344c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		null_error();
2354c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		return -1;
2364c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
2374c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	pb = obj->ob_type->tp_as_buffer;
238b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant	if (pb == NULL || pb->bf_getbuffer == NULL) {
2394c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		PyErr_SetString(PyExc_TypeError,
240b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant				"expected an object with the buffer interface");
24189c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
242fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
243ddacf968682818a34a90ec6702fbb44098914a9dTravis E. Oliphant	if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1;
244b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
245b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant	*buffer = view.buf;
246b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant	*buffer_len = view.len;
247fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (pb->bf_releasebuffer != NULL)
248fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		(*pb->bf_releasebuffer)(obj, &view);
2499edd2bd35cfc5f33b53c5def02cac23e7bb6e84bBenjamin Peterson	Py_XDECREF(view.obj);
2504c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	return 0;
25189c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton}
2524c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
25389c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hyltonint
25489c3a22a2788cb85b89990543e33236cd60ba307Jeremy HyltonPyObject_CheckReadBuffer(PyObject *obj)
25589c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton{
25698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
25760320cb3e4fa0d77ae5f8634d83de497bba003f6Benjamin Peterson	Py_buffer view;
25889c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton
25989c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	if (pb == NULL ||
260b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant	    pb->bf_getbuffer == NULL)
261fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return 0;
26260320cb3e4fa0d77ae5f8634d83de497bba003f6Benjamin Peterson	if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
263fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		PyErr_Clear();
264fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return 0;
265fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
26660320cb3e4fa0d77ae5f8634d83de497bba003f6Benjamin Peterson	PyBuffer_Release(&view);
26789c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	return 1;
2684c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum}
2694c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2704c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsReadBuffer(PyObject *obj,
2714c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum			  const void **buffer,
27218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			  Py_ssize_t *buffer_len)
2734c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{
2744c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	PyBufferProcs *pb;
275fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_buffer view;
2764c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2774c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (obj == NULL || buffer == NULL || buffer_len == NULL) {
2784c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		null_error();
2794c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		return -1;
2804c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
2814c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	pb = obj->ob_type->tp_as_buffer;
28289c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton	if (pb == NULL ||
283fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	    pb->bf_getbuffer == NULL) {
2844c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		PyErr_SetString(PyExc_TypeError,
285b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant				"expected an object with a buffer interface");
28689c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
2874c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
288b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
289fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1;
290b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
291b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant	*buffer = view.buf;
292b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant	*buffer_len = view.len;
293fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (pb->bf_releasebuffer != NULL)
294fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		(*pb->bf_releasebuffer)(obj, &view);
2959edd2bd35cfc5f33b53c5def02cac23e7bb6e84bBenjamin Peterson	Py_XDECREF(view.obj);
2964c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	return 0;
2974c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum}
2984c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
2994c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossumint PyObject_AsWriteBuffer(PyObject *obj,
3004c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum			   void **buffer,
30118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			   Py_ssize_t *buffer_len)
3024c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum{
3034c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	PyBufferProcs *pb;
304fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_buffer view;
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 ||
312fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	    pb->bf_getbuffer == NULL ||
313fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	    ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
31498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		PyErr_SetString(PyExc_TypeError,
315fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant				"expected an object with a writable buffer interface");
31689c3a22a2788cb85b89990543e33236cd60ba307Jeremy Hylton		return -1;
3174c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	}
318b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
319b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant	*buffer = view.buf;
320b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant	*buffer_len = view.len;
321fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (pb->bf_releasebuffer != NULL)
322fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		(*pb->bf_releasebuffer)(obj, &view);
3239edd2bd35cfc5f33b53c5def02cac23e7bb6e84bBenjamin Peterson	Py_XDECREF(view.obj);
3244c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	return 0;
3254c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum}
3264c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum
327b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant/* Buffer C-API for Python 3.0 */
328b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
329b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint
3308ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
331b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
332fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (!PyObject_CheckBuffer(obj)) {
33398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		PyErr_Format(PyExc_TypeError,
33461b96dc2fe814595651b6e1af394b34cb41fb485Georg Brandl                             "'%100s' does not support the buffer interface",
33590aa7646affbaee9628ca6ea6a702aec17b3b550Christian Heimes                             Py_TYPE(obj)->tp_name);
336fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return -1;
337fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
338fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
339b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
340b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
341b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantstatic int
3428ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. Oliphant_IsFortranContiguous(Py_buffer *view)
343b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
344fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_ssize_t sd, dim;
345fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	int i;
34698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
347fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (view->ndim == 0) return 1;
348fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (view->strides == NULL) return (view->ndim == 1);
349fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant
350fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	sd = view->itemsize;
351fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (view->ndim == 1) return (view->shape[0] == 1 ||
352fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant				   sd == view->strides[0]);
353fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	for (i=0; i<view->ndim; i++) {
354fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		dim = view->shape[i];
355fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		if (dim == 0) return 1;
356fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		if (view->strides[i] != sd) return 0;
357fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		sd *= dim;
358fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
359fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return 1;
360b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
361b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
362b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantstatic int
3638ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. Oliphant_IsCContiguous(Py_buffer *view)
364b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
365fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_ssize_t sd, dim;
366fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	int i;
36798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
368fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (view->ndim == 0) return 1;
369fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (view->strides == NULL) return 1;
370b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
371fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	sd = view->itemsize;
372fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (view->ndim == 1) return (view->shape[0] == 1 ||
373fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant				   sd == view->strides[0]);
374fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	for (i=view->ndim-1; i>=0; i--) {
375fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		dim = view->shape[i];
376fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		if (dim == 0) return 1;
377fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		if (view->strides[i] != sd) return 0;
378fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		sd *= dim;
379fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
38098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	return 1;
381b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
382b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
383b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint
3848ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_IsContiguous(Py_buffer *view, char fort)
385b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
386b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
387fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (view->suboffsets != NULL) return 0;
388b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
389fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (fort == 'C')
390fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return _IsCContiguous(view);
39198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	else if (fort == 'F')
392fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return _IsFortranContiguous(view);
393fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	else if (fort == 'A')
394fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return (_IsCContiguous(view) || _IsFortranContiguous(view));
395fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return 0;
396b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
397b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
398b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
39998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumvoid*
4008ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
401b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
402fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	char* pointer;
403fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	int i;
404fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	pointer = (char *)view->buf;
405fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	for (i = 0; i < view->ndim; i++) {
406fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		pointer += view->strides[i]*indices[i];
407fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
408fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			pointer = *((char**)pointer) + view->suboffsets[i];
409fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		}
410fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
411fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return (void*)pointer;
412b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
413b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
414b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
41598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumvoid
416b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape)
417b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
418fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	int k;
41998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
420fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	for (k=0; k<nd; k++) {
421fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		if (index[k] < shape[k]-1) {
422fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			index[k]++;
423fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			break;
424fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		}
425fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		else {
426fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			index[k] = 0;
427fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		}
428fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
429b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
430b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
43198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumvoid
432b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape)
433b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
434fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	int k;
435b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
436fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	for (k=nd-1; k>=0; k--) {
437fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		if (index[k] < shape[k]-1) {
438fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			index[k]++;
439fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			break;
440fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		}
441fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		else {
442fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			index[k] = 0;
443fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		}
444fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
445b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
446b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
447b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant  /* view is not checked for consistency in either of these.  It is
44898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum     assumed that the size of the buffer is view->len in
449b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant     view->len / view->itemsize elements.
450b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant  */
451b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
45298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumint
4538ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
454b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
455fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	int k;
456fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
457fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_ssize_t *indices, elements;
458fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	char *dest, *ptr;
459fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant
460fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (len > view->len) {
461fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		len = view->len;
462fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
46398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
464fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (PyBuffer_IsContiguous(view, fort)) {
465fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		/* simplest copy is all that is needed */
466fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		memcpy(buf, view->buf, len);
467fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return 0;
468fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
469fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant
470fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	/* Otherwise a more elaborate scheme is needed */
47198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
472faa54a392951468090f0095ffa927b16fcb20ca4Neal Norwitz	/* XXX(nnorwitz): need to check for overflow! */
473fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
474fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (indices == NULL) {
475fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		PyErr_NoMemory();
476fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return -1;
477fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
478fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	for (k=0; k<view->ndim;k++) {
479fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		indices[k] = 0;
480fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
48198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
482fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (fort == 'F') {
483fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		addone = _add_one_to_index_F;
484fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
485fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	else {
486fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		addone = _add_one_to_index_C;
487fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
488fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	dest = buf;
489fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	/* XXX : This is not going to be the fastest code in the world
49098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		 several optimizations are possible.
491fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	 */
492fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	elements = len / view->itemsize;
493fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	while (elements--) {
494fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		addone(view->ndim, indices, view->shape);
495fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		ptr = PyBuffer_GetPointer(view, indices);
496fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		memcpy(dest, ptr, view->itemsize);
497fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		dest += view->itemsize;
49898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	}
499fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	PyMem_Free(indices);
500fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return 0;
501b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
502b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
503b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint
5048ae62b60940ae0f33b1792703f3255e9c6a6a88aTravis E. OliphantPyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
505b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
506fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	int k;
507fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
508fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_ssize_t *indices, elements;
509fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	char *src, *ptr;
510b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
511fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (len > view->len) {
512fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		len = view->len;
513fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
514b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
515fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (PyBuffer_IsContiguous(view, fort)) {
516fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		/* simplest copy is all that is needed */
517fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		memcpy(view->buf, buf, len);
518fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return 0;
519fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
520b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
521fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	/* Otherwise a more elaborate scheme is needed */
52298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
523faa54a392951468090f0095ffa927b16fcb20ca4Neal Norwitz	/* XXX(nnorwitz): need to check for overflow! */
524fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
525fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (indices == NULL) {
526fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		PyErr_NoMemory();
527fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return -1;
528fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
529fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	for (k=0; k<view->ndim;k++) {
530fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		indices[k] = 0;
531fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
53298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
533fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (fort == 'F') {
534fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		addone = _add_one_to_index_F;
535fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
536fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	else {
537fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		addone = _add_one_to_index_C;
538fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
539fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	src = buf;
540fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	/* XXX : This is not going to be the fastest code in the world
54198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		 several optimizations are possible.
542fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	 */
543fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	elements = len / view->itemsize;
544fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	while (elements--) {
545fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		addone(view->ndim, indices, view->shape);
546fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		ptr = PyBuffer_GetPointer(view, indices);
547fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		memcpy(ptr, src, view->itemsize);
548fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		src += view->itemsize;
549fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
55098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
551fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	PyMem_Free(indices);
552fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return 0;
553b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
554b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
55598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumint PyObject_CopyData(PyObject *dest, PyObject *src)
556b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant{
557fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_buffer view_dest, view_src;
558fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	int k;
559fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_ssize_t *indices, elements;
560fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	char *dptr, *sptr;
561fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant
562fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (!PyObject_CheckBuffer(dest) ||
563fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	    !PyObject_CheckBuffer(src)) {
564fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		PyErr_SetString(PyExc_TypeError,
565fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant				"both destination and source must have the "\
566fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant				"buffer interface");
567fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return -1;
568fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
569fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant
570fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
571fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
572423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis		PyBuffer_Release(&view_dest);
573fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return -1;
574fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
575fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant
576fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (view_dest.len < view_src.len) {
57798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		PyErr_SetString(PyExc_BufferError,
578fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant				"destination is too small to receive data from source");
579423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis		PyBuffer_Release(&view_dest);
580423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis		PyBuffer_Release(&view_src);
581fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return -1;
582fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
583fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant
58498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
585fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	     PyBuffer_IsContiguous(&view_src, 'C')) ||
58698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	    (PyBuffer_IsContiguous(&view_dest, 'F') &&
587fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	     PyBuffer_IsContiguous(&view_src, 'F'))) {
588fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		/* simplest copy is all that is needed */
589fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		memcpy(view_dest.buf, view_src.buf, view_src.len);
590423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis		PyBuffer_Release(&view_dest);
591423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis		PyBuffer_Release(&view_src);
592fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return 0;
593fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
594fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant
595fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	/* Otherwise a more elaborate copy scheme is needed */
59698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
597faa54a392951468090f0095ffa927b16fcb20ca4Neal Norwitz	/* XXX(nnorwitz): need to check for overflow! */
598fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
599fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (indices == NULL) {
600fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		PyErr_NoMemory();
601423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis		PyBuffer_Release(&view_dest);
602423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis		PyBuffer_Release(&view_src);
603fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return -1;
604fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
605fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	for (k=0; k<view_src.ndim;k++) {
606fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		indices[k] = 0;
60798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	}
608fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	elements = 1;
609fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	for (k=0; k<view_src.ndim; k++) {
610faa54a392951468090f0095ffa927b16fcb20ca4Neal Norwitz		/* XXX(nnorwitz): can this overflow? */
611fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		elements *= view_src.shape[k];
612fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
613fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	while (elements--) {
614fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
615fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		dptr = PyBuffer_GetPointer(&view_dest, indices);
616fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		sptr = PyBuffer_GetPointer(&view_src, indices);
617fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		memcpy(dptr, sptr, view_src.itemsize);
61898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	}
619fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	PyMem_Free(indices);
620423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis	PyBuffer_Release(&view_dest);
621423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis	PyBuffer_Release(&view_src);
622fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return 0;
623b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
624b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
625b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantvoid
626b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. OliphantPyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
627fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			       Py_ssize_t *strides, int itemsize,
628fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			       char fort)
629fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant{
630fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	int k;
631fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_ssize_t sd;
63298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
633fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	sd = itemsize;
634fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (fort == 'F') {
635fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		for (k=0; k<nd; k++) {
636fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			strides[k] = sd;
637fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			sd *= shape[k];
63898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		}
639fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
640fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	else {
641fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		for (k=nd-1; k>=0; k--) {
642fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			strides[k] = sd;
643fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			sd *= shape[k];
644fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		}
645fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
646fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return;
647b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
648b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
649b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphantint
650423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. LöwisPyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
651fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	      int readonly, int flags)
65298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum{
653fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (view == NULL) return 0;
654fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
655fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	    (readonly == 1)) {
656fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		PyErr_SetString(PyExc_BufferError,
657fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant				"Object is not writable.");
658fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		return -1;
659fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	}
66098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
661423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis	view->obj = obj;
66274bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis	if (obj)
66374bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis		Py_INCREF(obj);
664fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->buf = buf;
665fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->len = len;
666fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->readonly = readonly;
667fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->itemsize = 1;
668fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->format = NULL;
66998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
670fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		view->format = "B";
671fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->ndim = 1;
672fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->shape = NULL;
673fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if ((flags & PyBUF_ND) == PyBUF_ND)
674fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		view->shape = &(view->len);
675fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->strides = NULL;
676fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
677fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		view->strides = &(view->itemsize);
678fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->suboffsets = NULL;
679fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	view->internal = NULL;
680fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return 0;
681b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant}
682b99f762f10edb2646a634c2290ecb064bd52e5c7Travis E. Oliphant
683423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwisvoid
684423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. LöwisPyBuffer_Release(Py_buffer *view)
685423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis{
686423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis	PyObject *obj = view->obj;
68774bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis	if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
68874bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis		Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
68974bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis	Py_XDECREF(obj);
69074bbea7ed7a75a180d02846e93b53e24ef6ca651Martin v. Löwis	view->obj = NULL;
691423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis}
692423be95dcf55b0b8737207beb7b30eb549430dbaMartin v. Löwis
6938fd3eba0501a77eec463179f529f56025ff4b40bEric SmithPyObject *
6948fd3eba0501a77eec463179f529f56025ff4b40bEric SmithPyObject_Format(PyObject *obj, PyObject *format_spec)
6958fd3eba0501a77eec463179f529f56025ff4b40bEric Smith{
6968fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    static PyObject * str__format__ = NULL;
6978fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    PyObject *meth;
6988fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    PyObject *empty = NULL;
6998fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    PyObject *result = NULL;
7008fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
7018fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    /* Initialize cached value */
7028fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    if (str__format__ == NULL) {
7038fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        /* Initialize static variable needed by _PyType_Lookup */
7048fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        str__format__ = PyUnicode_FromString("__format__");
7058fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        if (str__format__ == NULL)
7068fd3eba0501a77eec463179f529f56025ff4b40bEric Smith            goto done;
7078fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    }
7088fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
7098fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    /* If no format_spec is provided, use an empty string */
7108fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    if (format_spec == NULL) {
7118fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        empty = PyUnicode_FromUnicode(NULL, 0);
7128fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        format_spec = empty;
7138fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    }
7148fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
7158fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    /* Make sure the type is initialized.  float gets initialized late */
7168fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    if (Py_TYPE(obj)->tp_dict == NULL)
7178fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        if (PyType_Ready(Py_TYPE(obj)) < 0)
7188fd3eba0501a77eec463179f529f56025ff4b40bEric Smith            goto done;
7198fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
7208fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    /* Find the (unbound!) __format__ method (a borrowed reference) */
7218fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    meth = _PyType_Lookup(Py_TYPE(obj), str__format__);
7228fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    if (meth == NULL) {
7238fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        PyErr_Format(PyExc_TypeError,
7248fd3eba0501a77eec463179f529f56025ff4b40bEric Smith                "Type %.100s doesn't define __format__",
7258fd3eba0501a77eec463179f529f56025ff4b40bEric Smith                Py_TYPE(obj)->tp_name);
7268fd3eba0501a77eec463179f529f56025ff4b40bEric Smith            goto done;
7278fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    }
7288fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
7298fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    /* And call it, binding it to the value */
7308fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    result = PyObject_CallFunctionObjArgs(meth, obj, format_spec, NULL);
7318fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
7328fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    if (result && !PyUnicode_Check(result)) {
7338fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        PyErr_SetString(PyExc_TypeError,
7348fd3eba0501a77eec463179f529f56025ff4b40bEric Smith            "__format__ method did not return string");
7358fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        Py_DECREF(result);
7368fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        result = NULL;
7378fd3eba0501a77eec463179f529f56025ff4b40bEric Smith        goto done;
7388fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    }
7398fd3eba0501a77eec463179f529f56025ff4b40bEric Smith
7408fd3eba0501a77eec463179f529f56025ff4b40bEric Smithdone:
7418fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    Py_XDECREF(empty);
7428fd3eba0501a77eec463179f529f56025ff4b40bEric Smith    return result;
7438fd3eba0501a77eec463179f529f56025ff4b40bEric Smith}
744cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on numbers */
745cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
746cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
747799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Check(PyObject *o)
748e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
7496921eca227ac2283ebcdf98e10aebea57bd5daf3Guido van Rossum	return o && o->ob_type->tp_as_number &&
7506921eca227ac2283ebcdf98e10aebea57bd5daf3Guido van Rossum	       (o->ob_type->tp_as_number->nb_int ||
7516921eca227ac2283ebcdf98e10aebea57bd5daf3Guido van Rossum		o->ob_type->tp_as_number->nb_float);
752e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
753e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
754cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Binary operators */
755e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
7565a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_SLOT(x) offsetof(PyNumberMethods, x)
7575a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_BINOP(nb_methods, slot) \
758b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		(*(binaryfunc*)(& ((char*)nb_methods)[slot]))
7595a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define NB_TERNOP(nb_methods, slot) \
760b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		(*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
761e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
7625a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/*
7635a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer  Calling scheme used for binary operations:
764e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
7654886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz  Order operations are tried until either a valid result or error:
7664886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz	w.op(v,w)[*], v.op(v,w), w.op(v,w)
767e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
7684bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum  [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
7694bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum      v->ob_type
7705a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */
7715a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
7725a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
7735a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op1(PyObject *v, PyObject *w, const int op_slot)
7745a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{
7755a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyObject *x;
7764bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	binaryfunc slotv = NULL;
7774bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	binaryfunc slotw = NULL;
7784bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum
7793cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (v->ob_type->tp_as_number != NULL)
780b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
7814bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	if (w->ob_type != v->ob_type &&
7823cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	    w->ob_type->tp_as_number != NULL) {
783b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
7844bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		if (slotw == slotv)
7854bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum			slotw = NULL;
7865a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	}
7874bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	if (slotv) {
78889c4264792da06293b197e14f581763f46138935Guido van Rossum		if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
78989c4264792da06293b197e14f581763f46138935Guido van Rossum			x = slotw(v, w);
79089c4264792da06293b197e14f581763f46138935Guido van Rossum			if (x != Py_NotImplemented)
79189c4264792da06293b197e14f581763f46138935Guido van Rossum				return x;
79289c4264792da06293b197e14f581763f46138935Guido van Rossum			Py_DECREF(x); /* can't do it */
79389c4264792da06293b197e14f581763f46138935Guido van Rossum			slotw = NULL;
79489c4264792da06293b197e14f581763f46138935Guido van Rossum		}
7954bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		x = slotv(v, w);
7964bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		if (x != Py_NotImplemented)
7974bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum			return x;
7984bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		Py_DECREF(x); /* can't do it */
7994bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	}
8004bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	if (slotw) {
8014bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		x = slotw(v, w);
8024bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		if (x != Py_NotImplemented)
8034bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum			return x;
8044bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum		Py_DECREF(x); /* can't do it */
8055a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	}
8065a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	Py_INCREF(Py_NotImplemented);
8075a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return Py_NotImplemented;
808e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
8097766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum
8105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
811d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinop_type_error(PyObject *v, PyObject *w, const char *op_name)
812d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
813d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyErr_Format(PyExc_TypeError,
8140e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		     "unsupported operand type(s) for %.100s: "
8150e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		     "'%.100s' and '%.100s'",
816d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		     op_name,
817d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		     v->ob_type->tp_name,
818d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		     w->ob_type->tp_name);
819d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return NULL;
820d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
821d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
822d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject *
8235a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerbinary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
824e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
8255a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyObject *result = binary_op1(v, w, op_slot);
8265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	if (result == Py_NotImplemented) {
827d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		Py_DECREF(result);
828d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		return binop_type_error(v, w, op_name);
829e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	}
8305a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return result;
831e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
832e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
833cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
8345a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer/*
8355a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer  Calling scheme used for ternary operations:
836e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
8374886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz  Order operations are tried until either a valid result or error:
8384886cc331ff158f8ede74878a436adfad205bd2dNeal Norwitz	v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
8395a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer */
840cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
8415a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
8425a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerternary_op(PyObject *v,
8435a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	   PyObject *w,
8445a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	   PyObject *z,
8455a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	   const int op_slot,
8465a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	   const char *op_name)
8475a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{
8485a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyNumberMethods *mv, *mw, *mz;
84984675acb49071977741a97d56c21967fbc520948Guido van Rossum	PyObject *x = NULL;
85084675acb49071977741a97d56c21967fbc520948Guido van Rossum	ternaryfunc slotv = NULL;
85184675acb49071977741a97d56c21967fbc520948Guido van Rossum	ternaryfunc slotw = NULL;
85284675acb49071977741a97d56c21967fbc520948Guido van Rossum	ternaryfunc slotz = NULL;
8537766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum
8545a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	mv = v->ob_type->tp_as_number;
8554bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	mw = w->ob_type->tp_as_number;
8563cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (mv != NULL)
857b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotv = NB_TERNOP(mv, op_slot);
85884675acb49071977741a97d56c21967fbc520948Guido van Rossum	if (w->ob_type != v->ob_type &&
8593cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	    mw != NULL) {
860b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotw = NB_TERNOP(mw, op_slot);
86184675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (slotw == slotv)
86284675acb49071977741a97d56c21967fbc520948Guido van Rossum			slotw = NULL;
8634bb1e36eec19b30f2e582fceffa250e1598262e1Guido van Rossum	}
86484675acb49071977741a97d56c21967fbc520948Guido van Rossum	if (slotv) {
86589c4264792da06293b197e14f581763f46138935Guido van Rossum		if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
86689c4264792da06293b197e14f581763f46138935Guido van Rossum			x = slotw(v, w, z);
86789c4264792da06293b197e14f581763f46138935Guido van Rossum			if (x != Py_NotImplemented)
86889c4264792da06293b197e14f581763f46138935Guido van Rossum				return x;
86989c4264792da06293b197e14f581763f46138935Guido van Rossum			Py_DECREF(x); /* can't do it */
87089c4264792da06293b197e14f581763f46138935Guido van Rossum			slotw = NULL;
87189c4264792da06293b197e14f581763f46138935Guido van Rossum		}
87284675acb49071977741a97d56c21967fbc520948Guido van Rossum		x = slotv(v, w, z);
87384675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (x != Py_NotImplemented)
87484675acb49071977741a97d56c21967fbc520948Guido van Rossum			return x;
87584675acb49071977741a97d56c21967fbc520948Guido van Rossum		Py_DECREF(x); /* can't do it */
87684675acb49071977741a97d56c21967fbc520948Guido van Rossum	}
87784675acb49071977741a97d56c21967fbc520948Guido van Rossum	if (slotw) {
87884675acb49071977741a97d56c21967fbc520948Guido van Rossum		x = slotw(v, w, z);
87984675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (x != Py_NotImplemented)
88084675acb49071977741a97d56c21967fbc520948Guido van Rossum			return x;
88184675acb49071977741a97d56c21967fbc520948Guido van Rossum		Py_DECREF(x); /* can't do it */
882e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	}
8835a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	mz = z->ob_type->tp_as_number;
8843cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (mz != NULL) {
885b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		slotz = NB_TERNOP(mz, op_slot);
88684675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (slotz == slotv || slotz == slotw)
88784675acb49071977741a97d56c21967fbc520948Guido van Rossum			slotz = NULL;
88884675acb49071977741a97d56c21967fbc520948Guido van Rossum		if (slotz) {
88984675acb49071977741a97d56c21967fbc520948Guido van Rossum			x = slotz(v, w, z);
8905a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer			if (x != Py_NotImplemented)
8915a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer				return x;
89284675acb49071977741a97d56c21967fbc520948Guido van Rossum			Py_DECREF(x); /* can't do it */
8931991ddc3e134e89e6c15d60e180fc67ad4c1ca01Andrew M. Kuchling		}
8945a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	}
8955a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
8965c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum	if (z == Py_None)
8975c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum		PyErr_Format(
8985c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			PyExc_TypeError,
8995c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			"unsupported operand type(s) for ** or pow(): "
9000e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			"'%.100s' and '%.100s'",
9015c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			v->ob_type->tp_name,
9025c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			w->ob_type->tp_name);
9035c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum	else
9045c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum		PyErr_Format(
9055c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			PyExc_TypeError,
9065c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			"unsupported operand type(s) for pow(): "
9070e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			"'%.100s', '%.100s', '%.100s'",
9085c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			v->ob_type->tp_name,
9095c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			w->ob_type->tp_name,
9105c66a26dee41853a9ce43b75965cc16b8e34aef0Guido van Rossum			z->ob_type->tp_name);
9115a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return NULL;
912e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
913e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
9145a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define BINARY_FUNC(func, op, op_name) \
9155a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer    PyObject * \
9165a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer    func(PyObject *v, PyObject *w) { \
9175a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	    return binary_op(v, w, NB_SLOT(op), op_name); \
9185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer    }
9195a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
9205a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Or, nb_or, "|")
9215a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Xor, nb_xor, "^")
9225a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_And, nb_and, "&")
9235a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
9245a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
9255a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
9265a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerBINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
9275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer
928e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
9295a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerPyNumber_Add(PyObject *v, PyObject *w)
930e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
9315a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
9325a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	if (result == Py_NotImplemented) {
9335a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		PySequenceMethods *m = v->ob_type->tp_as_sequence;
934fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
9350522d9891aec9b7d49049a8a47b687c81929e02dJeremy Hylton		if (m && m->sq_concat) {
936fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return (*m->sq_concat)(v, w);
9370522d9891aec9b7d49049a8a47b687c81929e02dJeremy Hylton		}
938fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		result = binop_type_error(v, w, "+");
939e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	}
9405a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return result;
941e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
942e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
943d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject *
94418e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwissequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
945d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
94638fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum	Py_ssize_t count;
94700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (PyIndex_Check(n)) {
94800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
949d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		if (count == -1 && PyErr_Occurred())
950d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			return NULL;
951d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	}
952d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	else {
9530e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		return type_error("can't multiply sequence by "
9540e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters				  "non-int of type '%.200s'", n);
955d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	}
95638fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum	return (*repeatfunc)(seq, count);
957d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
958d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
959d4b0fea43a8655d15562fa42d56def93fe2348efNeil SchemenauerPyObject *
960d4b0fea43a8655d15562fa42d56def93fe2348efNeil SchemenauerPyNumber_Multiply(PyObject *v, PyObject *w)
961d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
962d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
963d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	if (result == Py_NotImplemented) {
964d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *mv = v->ob_type->tp_as_sequence;
965d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *mw = w->ob_type->tp_as_sequence;
966a3a243e9779b671efe59d407ca77edff01a32a57Guido van Rossum		Py_DECREF(result);
967d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		if  (mv && mv->sq_repeat) {
968d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			return sequence_repeat(mv->sq_repeat, v, w);
969d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		}
970d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		else if (mw && mw->sq_repeat) {
971d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			return sequence_repeat(mw->sq_repeat, w, v);
972d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		}
973d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		result = binop_type_error(v, w, "*");
974d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	}
975d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return result;
976d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
977d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
978e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
9794668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_FloorDivide(PyObject *v, PyObject *w)
9804668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
9814668b000a1d9113394941ad39875c827634feb49Guido van Rossum	return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
9824668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
9834668b000a1d9113394941ad39875c827634feb49Guido van Rossum
9844668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
9854668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_TrueDivide(PyObject *v, PyObject *w)
9864668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
9874668b000a1d9113394941ad39875c827634feb49Guido van Rossum	return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
9884668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
9894668b000a1d9113394941ad39875c827634feb49Guido van Rossum
9904668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
991799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Remainder(PyObject *v, PyObject *w)
992e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
9935a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return binary_op(v, w, NB_SLOT(nb_remainder), "%");
994e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
995e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
996e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
997799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
998e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
9995a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
1000e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1001e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1002e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* Binary in-place operators */
1003e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1004e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters/* The in-place operators are defined to fall back to the 'normal',
10055a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer   non in-place operations, if the in-place methods are not in place.
1006e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
10075a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer   - If the left hand object has the appropriate struct members, and
10085a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     they are filled, call the appropriate function and return the
10095a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     result.  No coercion is done on the arguments; the left-hand object
10105a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     is the one the operation is performed on, and it's up to the
10115a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     function to deal with the right-hand object.
10127766091e0447d6eb641526c8e70b13ab62f7b561Guido van Rossum
10135a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer   - Otherwise, in-place modification is not supported. Handle it exactly as
10145a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer     a non in-place operation of the same kind.
1015e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1016e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters   */
1017e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
10185a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauerstatic PyObject *
1019d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
10205a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer{
10215a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyNumberMethods *mv = v->ob_type->tp_as_number;
10223cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (mv != NULL) {
1023b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		binaryfunc slot = NB_BINOP(mv, iop_slot);
1024b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer		if (slot) {
1025b808c5cf2da088e66f43de61d3c5d741b134f419Neil Schemenauer			PyObject *x = (slot)(v, w);
10265a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer			if (x != Py_NotImplemented) {
10275a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer				return x;
10285a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer			}
10295a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer			Py_DECREF(x);
10305a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		}
1031e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	}
1032d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return binary_op1(v, w, op_slot);
1033d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer}
1034d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer
1035d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerstatic PyObject *
1036d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauerbinary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1037d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		const char *op_name)
1038d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer{
1039d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1040d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	if (result == Py_NotImplemented) {
1041d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		Py_DECREF(result);
1042d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		return binop_type_error(v, w, op_name);
1043d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	}
1044d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return result;
1045e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1046e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
10475a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer#define INPLACE_BINOP(func, iop, op, op_name) \
10485a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	PyObject * \
10495a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	func(PyObject *v, PyObject *w) { \
10505a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1051e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	}
1052e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
10535a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
10545a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
10555a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
10565a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
10575a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
10585a1f015bee85ca271316b1600ae67dae387d3dd8Neil SchemenauerINPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1059e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1060e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
10614668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
10624668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
10634668b000a1d9113394941ad39875c827634feb49Guido van Rossum	return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
10644668b000a1d9113394941ad39875c827634feb49Guido van Rossum			  NB_SLOT(nb_floor_divide), "//=");
10654668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
10664668b000a1d9113394941ad39875c827634feb49Guido van Rossum
10674668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
10684668b000a1d9113394941ad39875c827634feb49Guido van RossumPyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
10694668b000a1d9113394941ad39875c827634feb49Guido van Rossum{
10704668b000a1d9113394941ad39875c827634feb49Guido van Rossum	return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
10714668b000a1d9113394941ad39875c827634feb49Guido van Rossum			  NB_SLOT(nb_true_divide), "/=");
10724668b000a1d9113394941ad39875c827634feb49Guido van Rossum}
10734668b000a1d9113394941ad39875c827634feb49Guido van Rossum
10744668b000a1d9113394941ad39875c827634feb49Guido van RossumPyObject *
1075e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1076e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1077d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1078d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				       NB_SLOT(nb_add));
1079d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	if (result == Py_NotImplemented) {
1080d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *m = v->ob_type->tp_as_sequence;
1081d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		Py_DECREF(result);
1082d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		if (m != NULL) {
1083d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			binaryfunc f = NULL;
1084fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			f = m->sq_inplace_concat;
1085d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (f == NULL)
1086d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				f = m->sq_concat;
1087d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (f != NULL)
1088d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				return (*f)(v, w);
1089d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		}
1090d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		result = binop_type_error(v, w, "+=");
1091bb8be93a50b0293b812634575a493c4eaf676773Guido van Rossum	}
1092d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return result;
1093e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1094e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1095e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
1096e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1097e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1098d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1099d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				       NB_SLOT(nb_multiply));
1100d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	if (result == Py_NotImplemented) {
110118e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis		ssizeargfunc f = NULL;
1102d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1103d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1104d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		Py_DECREF(result);
1105d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		if (mv != NULL) {
11063cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum			f = mv->sq_inplace_repeat;
1107d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (f == NULL)
1108d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				f = mv->sq_repeat;
1109d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (f != NULL)
1110d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				return sequence_repeat(f, v, w);
1111e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		}
1112d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		else if (mw != NULL) {
1113d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			/* Note that the right hand operand should not be
1114d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			 * mutated in this case so sq_inplace_repeat is not
1115d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			 * used. */
1116d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer			if (mw->sq_repeat)
1117d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer				return sequence_repeat(mw->sq_repeat, w, v);
1118e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		}
1119d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer		result = binop_type_error(v, w, "*=");
1120e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	}
1121d4b0fea43a8655d15562fa42d56def93fe2348efNeil Schemenauer	return result;
1122e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1123e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1124e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
1125e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1126e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1127d46fbc322d0a057c3c4f0af801d28ea65074c4c7Neil Schemenauer	return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1128d46fbc322d0a057c3c4f0af801d28ea65074c4c7Neil Schemenauer				NB_SLOT(nb_remainder), "%=");
1129e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1130e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1131e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
1132e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1133e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
11343cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (v->ob_type->tp_as_number &&
11355a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	    v->ob_type->tp_as_number->nb_inplace_power != NULL) {
11365a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
11375a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	}
11385a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer	else {
11395a1f015bee85ca271316b1600ae67dae387d3dd8Neil Schemenauer		return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1140e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	}
1141e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1142e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1143e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1144cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Unary operators and functions */
1145e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1146e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1147799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Negative(PyObject *o)
1148e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1149cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
1150cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1151cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
1152cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1153cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_number;
1154cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->nb_negative)
1155cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return (*m->nb_negative)(o);
1156cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
11570e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("bad operand type for unary -: '%.200s'", o);
1158e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1159e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1160e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1161799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Positive(PyObject *o)
1162e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1163cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
1164cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1165cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
1166cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1167cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_number;
1168cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->nb_positive)
1169cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return (*m->nb_positive)(o);
1170cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
11710e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("bad operand type for unary +: '%.200s'", o);
1172e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1173e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1174e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1175799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Invert(PyObject *o)
1176e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1177cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
1178cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1179cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
1180cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1181cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_number;
1182cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->nb_invert)
1183cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return (*m->nb_invert)(o);
1184cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
11850e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("bad operand type for unary ~: '%.200s'", o);
1186e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1187e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1188e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1189799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Absolute(PyObject *o)
1190e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1191cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
1192e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1193cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
1194cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1195cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_number;
1196cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->nb_absolute)
1197cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->nb_absolute(o);
1198e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
11990e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("bad operand type for abs(): '%.200s'", o);
1200e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1201e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
120298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum/* Return a Python Int or Long from the object item
120300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters   Raise TypeError if the result is not an int-or-long
120498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum   or if the object cannot be interpreted as an index.
120500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters*/
120600ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPyObject *
120738fff8c4e4276e4e57660a78f305e68bfa87874bGuido van RossumPyNumber_Index(PyObject *item)
120838fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum{
120900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	PyObject *result = NULL;
121000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (item == NULL)
121100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		return null_error();
12121fe5f388529dcdf674d53f7d67abc16c9c6ca5e5Neal Norwitz	if (PyLong_Check(item)) {
121300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		Py_INCREF(item);
121400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		return item;
121500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	}
121600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (PyIndex_Check(item)) {
12177179220b57faca4606430b97847308b34f45f623Trent Nelson		result = item->ob_type->tp_as_number->nb_index(item);
12181fe5f388529dcdf674d53f7d67abc16c9c6ca5e5Neal Norwitz		if (result && !PyLong_Check(result)) {
121900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			PyErr_Format(PyExc_TypeError,
1220032a284752c4258be41a8b6a9658da55bb157273Guido van Rossum				     "__index__ returned non-int "
122100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters				     "(type %.200s)",
122200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters				     result->ob_type->tp_name);
122300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			Py_DECREF(result);
122400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			return NULL;
122500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		}
122638fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum	}
12277179220b57faca4606430b97847308b34f45f623Trent Nelson	else {
122849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyErr_Format(PyExc_TypeError,
122949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			     "'%.200s' object cannot be interpreted "
1230032a284752c4258be41a8b6a9658da55bb157273Guido van Rossum			     "as an integer", item->ob_type->tp_name);
123138fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum	}
123200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	return result;
123300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters}
123400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
123500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters/* Return an error on Overflow only if err is not NULL*/
123600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
123700ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPy_ssize_t
123800ee7baf49430d8a6eed355a5fd7a05179325747Thomas WoutersPyNumber_AsSsize_t(PyObject *item, PyObject *err)
123900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters{
124000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	Py_ssize_t result;
124100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	PyObject *runerr;
124200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	PyObject *value = PyNumber_Index(item);
124300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (value == NULL)
124400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		return -1;
124500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
1246217cfd1c86c59ed8a55ce6d6b88bbe37309e7ba2Christian Heimes	/* We're done if PyLong_AsSsize_t() returns without error. */
1247217cfd1c86c59ed8a55ce6d6b88bbe37309e7ba2Christian Heimes	result = PyLong_AsSsize_t(value);
124800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (result != -1 || !(runerr = PyErr_Occurred()))
124900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		goto finish;
125000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
125100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	/* Error handling code -- only manage OverflowError differently */
125298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
125300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		goto finish;
125400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
125500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	PyErr_Clear();
125698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum	/* If no error-handling desired then the default clipping
125700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	   is sufficient.
125800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	 */
125900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	if (!err) {
126000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		assert(PyLong_Check(value));
126198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		/* Whether or not it is less than or equal to
126200ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		   zero is determined by the sign of ob_size
126300ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		*/
126498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		if (_PyLong_Sign(value) < 0)
126500ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			result = PY_SSIZE_T_MIN;
126600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		else
126700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters			result = PY_SSIZE_T_MAX;
126800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	}
126900ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	else {
127000ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		/* Otherwise replace the error with caller's error object. */
127100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters		PyErr_Format(err,
127298297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum			     "cannot fit '%.200s' into an index-sized integer",
127398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum			     item->ob_type->tp_name);
127400ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	}
127598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
127600ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters finish:
127700ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	Py_DECREF(value);
127800ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters	return result;
127938fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum}
128038fff8c4e4276e4e57660a78f305e68bfa87874bGuido van Rossum
128100ee7baf49430d8a6eed355a5fd7a05179325747Thomas Wouters
128215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian HeimesPyObject *
128315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
128415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes{
128515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	static PyObject *int_name = NULL;
128615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	if (int_name == NULL) {
128715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		int_name = PyUnicode_InternFromString("__int__");
128815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		if (int_name == NULL)
128915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes			return NULL;
129015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	}
129115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes
129215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	if (integral && !PyLong_Check(integral)) {
129315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		/* Don't go through tp_as_number->nb_int to avoid
129415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		   hitting the classic class fallback to __trunc__. */
129515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		PyObject *int_func = PyObject_GetAttr(integral, int_name);
129615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		if (int_func == NULL) {
129715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes			PyErr_Clear(); /* Raise a different error. */
129815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes			goto non_integral_error;
129915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		}
130015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		Py_DECREF(integral);
130115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		integral = PyEval_CallObject(int_func, NULL);
130215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		Py_DECREF(int_func);
130315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		if (integral && !PyLong_Check(integral)) {
130415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes			goto non_integral_error;
130515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		}
130615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	}
130715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	return integral;
130815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes
130915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimesnon_integral_error:
131015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name);
131115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	Py_DECREF(integral);
131215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	return NULL;
131315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes}
131415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes
131515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes
13169e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum/* Add a check for embedded NULL-bytes in the argument. */
1317226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsawstatic PyObject *
131818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwislong_from_string(const char *s, Py_ssize_t len)
1319226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw{
13204c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	char *end;
1321226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw	PyObject *x;
1322226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw
13234c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	x = PyLong_FromString((char*)s, &end, 10);
13249e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum	if (x == NULL)
1325226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw		return NULL;
13269e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum	if (end != s + len) {
1327226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw		PyErr_SetString(PyExc_ValueError,
1328ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum				"null byte in argument for int()");
13299e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum		Py_DECREF(x);
1330226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw		return NULL;
1331226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw	}
1332226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw	return x;
1333226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw}
1334226ae6ca122f814dabdc40178c7b9656caf729c2Barry Warsaw
1335e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1336799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Long(PyObject *o)
1337e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1338cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
133915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	static PyObject *trunc_name = NULL;
134015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	PyObject *trunc_func;
13414c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	const char *buffer;
134218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t buffer_len;
1343e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
134415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	if (trunc_name == NULL) {
134515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		trunc_name = PyUnicode_InternFromString("__trunc__");
134615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		if (trunc_name == NULL)
134715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes			return NULL;
134815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	}
134915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes
1350cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
1351cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1352ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	if (PyLong_CheckExact(o)) {
1353ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		Py_INCREF(o);
1354ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		return o;
1355ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	}
1356c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	m = o->ob_type->tp_as_number;
1357ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	if (m && m->nb_int) { /* This should include subclasses of int */
1358ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		PyObject *res = m->nb_int(o);
1359ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		if (res && !PyLong_Check(res)) {
1360ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum			PyErr_Format(PyExc_TypeError,
1361ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum				     "__int__ returned non-int (type %.200s)",
1362ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum				     res->ob_type->tp_name);
1363ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum			Py_DECREF(res);
1364ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum			return NULL;
1365ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		}
1366ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum		return res;
1367ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	}
1368e5e298f8755c475e78f8cfc71ee0ea03c6674406Mark Dickinson	if (PyLong_Check(o)) /* An int subclass without nb_int */
1369db30ac41de4e9e8412429720445ea4852c3c241fTim Peters		return _PyLong_Copy((PyLongObject *)o);
137015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	trunc_func = PyObject_GetAttr(o, trunc_name);
137115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	if (trunc_func) {
137215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
137315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		PyObject *int_instance;
137415ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		Py_DECREF(trunc_func);
137515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		/* __trunc__ is specified to return an Integral type,
137615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		   but long() needs to return a long. */
137715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		int_instance = _PyNumber_ConvertIntegralToInt(
137815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes			truncated,
137915ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes			"__trunc__ returned non-Integral (type %.200s)");
138015ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		return int_instance;
138115ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	}
138215ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes	PyErr_Clear();  /* It's not an error if  o.__trunc__ doesn't exist. */
138315ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes
138472b710a59617ebe6dd1c41613d2c7eb81702efd9Christian Heimes	if (PyBytes_Check(o))
138515ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		/* need to do extra error checking that PyLong_FromString()
138615ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		 * doesn't do.  In particular long('9.5') must raise an
138715ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		 * exception, not truncate the float.
138815ebc88d87d2ff8f520581a9f6a6816d78a7e504Christian Heimes		 */
138972b710a59617ebe6dd1c41613d2c7eb81702efd9Christian Heimes		return long_from_string(PyBytes_AS_STRING(o),
139072b710a59617ebe6dd1c41613d2c7eb81702efd9Christian Heimes					PyBytes_GET_SIZE(o));
13919e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum	if (PyUnicode_Check(o))
13929e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum		/* The above check is done in PyLong_FromUnicode(). */
13939e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum		return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
13949e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum					  PyUnicode_GET_SIZE(o),
13959e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum					  10);
13964c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum	if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
13974c08d554b9009899780a5e003d6bbeb5413906eeGuido van Rossum		return long_from_string(buffer, buffer_len);
1398e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1399ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossum	return type_error("int() argument must be a string or a "
14000e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			  "number, not '%.200s'", o);
1401e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1402e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1403e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1404799124718ddfbb95440470037d8d7760b821646fFred DrakePyNumber_Float(PyObject *o)
1405e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1406cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyNumberMethods *m;
1407e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1408cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
1409cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1410c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	m = o->ob_type->tp_as_number;
1411c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	if (m && m->nb_float) { /* This should include subclasses of float */
1412c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		PyObject *res = m->nb_float(o);
1413c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		if (res && !PyFloat_Check(res)) {
1414c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon			PyErr_Format(PyExc_TypeError,
1415fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			  "__float__ returned non-float (type %.200s)",
1416fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			  res->ob_type->tp_name);
1417c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon			Py_DECREF(res);
1418c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon			return NULL;
1419c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		}
1420c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon		return res;
14219e896b37c7a554250d7d832566cc4fe7d30d034cGuido van Rossum	}
1422c3647ac93e2a38762de8a23b1d94a6380e9ad468Brett Cannon	if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
14237a50f2536e59762897a05b1d3996e51f3f1a9686Tim Peters		PyFloatObject *po = (PyFloatObject *)o;
14247a50f2536e59762897a05b1d3996e51f3f1a9686Tim Peters		return PyFloat_FromDouble(po->ob_fval);
14257a50f2536e59762897a05b1d3996e51f3f1a9686Tim Peters	}
1426428f0641ec34902b0cce2cfdca833c79e6fdab7cGeorg Brandl	return PyFloat_FromString(o);
1427e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1428e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1429cd16bf640405065e4702539632ce577536207d88Guido van Rossum
1430cd16bf640405065e4702539632ce577536207d88Guido van RossumPyObject *
1431cd16bf640405065e4702539632ce577536207d88Guido van RossumPyNumber_ToBase(PyObject *n, int base)
1432cd16bf640405065e4702539632ce577536207d88Guido van Rossum{
1433a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes	PyObject *res = NULL;
14345c960b8c6430684fd78290d087ce9aa1791672a4Raymond Hettinger	PyObject *index = PyNumber_Index(n);
1435cd16bf640405065e4702539632ce577536207d88Guido van Rossum
1436cd16bf640405065e4702539632ce577536207d88Guido van Rossum	if (!index)
1437cd16bf640405065e4702539632ce577536207d88Guido van Rossum		return NULL;
1438a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes	if (PyLong_Check(index))
1439a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes		res = _PyLong_Format(index, base);
1440a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes	else
1441a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes		/* It should not be possible to get here, as
1442a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes		   PyNumber_Index already has a check for the same
1443a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes		   condition */
1444a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes		PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1445a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes				"int or long");
1446cd16bf640405065e4702539632ce577536207d88Guido van Rossum	Py_DECREF(index);
1447cd16bf640405065e4702539632ce577536207d88Guido van Rossum	return res;
1448cd16bf640405065e4702539632ce577536207d88Guido van Rossum}
1449cd16bf640405065e4702539632ce577536207d88Guido van Rossum
1450cd16bf640405065e4702539632ce577536207d88Guido van Rossum
1451cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on sequences */
1452e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1453cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
1454799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Check(PyObject *s)
1455e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
14568f326b23695dc4996327da8477e11aad42c61953Benjamin Peterson	if (PyDict_Check(s))
1457cf297e46b85257396560774e5492e9d71a40f32eThomas Wouters		return 0;
14588700b4281af0561d9aafd3cc14c44d79c2a0934bGuido van Rossum	return s != NULL && s->ob_type->tp_as_sequence &&
14598700b4281af0561d9aafd3cc14c44d79c2a0934bGuido van Rossum		s->ob_type->tp_as_sequence->sq_item != NULL;
1460e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1461e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
146218e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
14636253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPySequence_Size(PyObject *s)
1464e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1465cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1466e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1467cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
1468cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1469cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1470cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1471e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1472cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1473cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_length)
1474cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_length(s);
1475e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
14760e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("object of type '%.200s' has no len()", s);
1477cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
1478e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1479e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1480cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PySequence_Length
148118e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
1482cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPySequence_Length(PyObject *s)
1483cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{
1484cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg	return PySequence_Size(s);
1485cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg}
1486cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PySequence_Length PySequence_Size
1487cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg
1488e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1489799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Concat(PyObject *s, PyObject *o)
1490e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1491cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1492cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1493cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL || o == NULL)
1494cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1495e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1496cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1497cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_concat)
1498cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_concat(s, o);
1499e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1500fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	/* Instances of user classes defining an __add__() method only
1501fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	   have an nb_add slot, not an sq_concat slot.	So we fall back
1502fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	   to nb_add if both arguments appear to be sequences. */
1503fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	if (PySequence_Check(s) && PySequence_Check(o)) {
1504fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1505fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (result != Py_NotImplemented)
1506fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return result;
1507fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
1508fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	}
15090e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object can't be concatenated", s);
1510e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1511e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1512e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
151318e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_Repeat(PyObject *o, Py_ssize_t count)
1514e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1515cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1516e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1517cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL)
1518cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1519e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1520cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_sequence;
1521cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_repeat)
1522cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_repeat(o, count);
1523cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1524fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	/* Instances of user classes defining a __mul__() method only
1525fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	   have an nb_multiply slot, not an sq_repeat slot. so we fall back
1526fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	   to nb_multiply if o appears to be a sequence. */
1527fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	if (PySequence_Check(o)) {
1528fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		PyObject *n, *result;
1529217cfd1c86c59ed8a55ce6d6b88bbe37309e7ba2Christian Heimes		n = PyLong_FromSsize_t(count);
1530fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (n == NULL)
1531fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return NULL;
1532fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		result = binary_op1(o, n, NB_SLOT(nb_multiply));
1533fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(n);
1534fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (result != Py_NotImplemented)
1535fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return result;
1536fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
1537fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	}
15380e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object can't be repeated", o);
1539e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1540e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1541e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1542e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPySequence_InPlaceConcat(PyObject *s, PyObject *o)
1543e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1544e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	PySequenceMethods *m;
1545e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1546e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	if (s == NULL || o == NULL)
1547e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return null_error();
1548e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1549e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	m = s->ob_type->tp_as_sequence;
15503cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (m && m->sq_inplace_concat)
1551e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return m->sq_inplace_concat(s, o);
1552e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	if (m && m->sq_concat)
1553e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return m->sq_concat(s, o);
1554e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1555fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	if (PySequence_Check(s) && PySequence_Check(o)) {
1556fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1557fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo					       NB_SLOT(nb_add));
1558fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (result != Py_NotImplemented)
1559fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return result;
1560fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
1561fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	}
15620e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object can't be concatenated", s);
1563e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1564e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1565e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
156618e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
1567e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters{
1568e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	PySequenceMethods *m;
1569e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1570e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	if (o == NULL)
1571e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return null_error();
1572e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1573e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	m = o->ob_type->tp_as_sequence;
15743cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	if (m && m->sq_inplace_repeat)
1575e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return m->sq_inplace_repeat(o, count);
1576e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters	if (m && m->sq_repeat)
1577e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters		return m->sq_repeat(o, count);
1578e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1579fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	if (PySequence_Check(o)) {
1580fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		PyObject *n, *result;
1581217cfd1c86c59ed8a55ce6d6b88bbe37309e7ba2Christian Heimes		n = PyLong_FromSsize_t(count);
1582fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (n == NULL)
1583fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return NULL;
1584fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1585fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo				     NB_SLOT(nb_multiply));
1586fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(n);
1587fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		if (result != Py_NotImplemented)
1588fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo			return result;
1589fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo		Py_DECREF(result);
1590fd163f92cee2aa8189879bd43670782f4cfd2cf8Armin Rigo	}
15910e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object can't be repeated", o);
1592e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters}
1593e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas Wouters
1594e289e0bd0c3db9755bb2ddd49b08091049bc301dThomas WoutersPyObject *
159518e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_GetItem(PyObject *s, Py_ssize_t i)
1596e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1597cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1598cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1599cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL)
1600cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1601cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1602cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1603cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_item) {
1604cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		if (i < 0) {
1605cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			if (m->sq_length) {
160618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis				Py_ssize_t l = (*m->sq_length)(s);
1607cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (l < 0)
1608cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum					return NULL;
1609cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				i += l;
1610cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			}
1611cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
1612cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_item(s, i);
1613cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1614e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
161586b2fb9d77e483cc56e85bc4c96ac54f55427d39Georg Brandl	return type_error("'%.200s' object does not support indexing", s);
1616e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1617e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1618e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
161918e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
1620e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
16211d75a79c009e500923128716a02efbe86135e64eThomas Wouters	PyMappingMethods *mp;
1622cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1623cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (!s) return null_error();
1624cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1625d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters	mp = s->ob_type->tp_as_mapping;
1626d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters	if (mp->mp_subscript) {
16271d75a79c009e500923128716a02efbe86135e64eThomas Wouters		PyObject *res;
162849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyObject *slice = _PySlice_FromIndices(i1, i2);
16291d75a79c009e500923128716a02efbe86135e64eThomas Wouters		if (!slice)
16301d75a79c009e500923128716a02efbe86135e64eThomas Wouters			return NULL;
16311d75a79c009e500923128716a02efbe86135e64eThomas Wouters		res = mp->mp_subscript(s, slice);
16321d75a79c009e500923128716a02efbe86135e64eThomas Wouters		Py_DECREF(slice);
16331d75a79c009e500923128716a02efbe86135e64eThomas Wouters		return res;
1634cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
16354669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum
16360e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	return type_error("'%.200s' object is unsliceable", s);
1637e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1638e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1639e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossumint
164018e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
1641e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1642cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1643cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1644cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
1645cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1646cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1647cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1648cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1649cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1650cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_ass_item) {
1651cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		if (i < 0) {
1652cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			if (m->sq_length) {
165318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis				Py_ssize_t l = (*m->sq_length)(s);
1654cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (l < 0)
1655ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum					return -1;
1656cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				i += l;
1657cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			}
1658cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
1659cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_ass_item(s, i, o);
1660cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1661cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
16620e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object does not support item assignment", s);
1663cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
1664e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1665e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
16666cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossumint
166718e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_DelItem(PyObject *s, Py_ssize_t i)
16686cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{
1669cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PySequenceMethods *m;
1670cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1671cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
1672cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1673cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1674cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1675cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1676cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = s->ob_type->tp_as_sequence;
1677cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->sq_ass_item) {
1678cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		if (i < 0) {
1679cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			if (m->sq_length) {
168018e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis				Py_ssize_t l = (*m->sq_length)(s);
1681cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				if (l < 0)
1682ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum					return -1;
1683cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum				i += l;
1684cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum			}
1685cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
1686cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->sq_ass_item(s, i, (PyObject *)NULL);
1687cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1688cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
16890e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object doesn't support item deletion", s);
1690cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
16916cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum}
16926cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1693cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
169418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
1695e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
16961d75a79c009e500923128716a02efbe86135e64eThomas Wouters	PyMappingMethods *mp;
1697e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1698cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
1699cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1700cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1701cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1702e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1703d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters	mp = s->ob_type->tp_as_mapping;
1704d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters	if (mp->mp_ass_subscript) {
17051d75a79c009e500923128716a02efbe86135e64eThomas Wouters		int res;
170649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyObject *slice = _PySlice_FromIndices(i1, i2);
17071d75a79c009e500923128716a02efbe86135e64eThomas Wouters		if (!slice)
17081d75a79c009e500923128716a02efbe86135e64eThomas Wouters			return -1;
17091d75a79c009e500923128716a02efbe86135e64eThomas Wouters		res = mp->mp_ass_subscript(s, slice, o);
17101d75a79c009e500923128716a02efbe86135e64eThomas Wouters		Py_DECREF(slice);
17111d75a79c009e500923128716a02efbe86135e64eThomas Wouters		return res;
1712cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
17131d75a79c009e500923128716a02efbe86135e64eThomas Wouters
17140e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object doesn't support slice assignment", s);
1715cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
1716e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1717e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1718cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
171918e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
17206cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum{
1721d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters	PyMappingMethods *mp;
17226cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1723cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (s == NULL) {
1724cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1725cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1726cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
17276cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1728d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters	mp = s->ob_type->tp_as_mapping;
1729d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters	if (mp->mp_ass_subscript) {
1730d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters		int res;
1731d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters		PyObject *slice = _PySlice_FromIndices(i1, i2);
1732d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters		if (!slice)
1733d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters			return -1;
1734d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters		res = mp->mp_ass_subscript(s, slice, NULL);
1735d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters		Py_DECREF(slice);
1736d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters		return res;
1737cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
17380e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("'%.200s' object doesn't support slice deletion", s);
1739cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
17406cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum}
17416cdc6f41465e88344b5ed62e45b036cf502f3770Guido van Rossum
1742e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
1743799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Tuple(PyObject *v)
1744e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
17456912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	PyObject *it;  /* iter(v) */
1746fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	Py_ssize_t n;	      /* guess for result tuple size */
1747e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger	PyObject *result = NULL;
174818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t j;
1749e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1750cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (v == NULL)
1751cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
1752e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
17536912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Special-case the common tuple and list cases, for efficiency. */
17544c3a0a35cd80a0abb9628dc8d4ade911fe2d5015Tim Peters	if (PyTuple_CheckExact(v)) {
17554c3a0a35cd80a0abb9628dc8d4ade911fe2d5015Tim Peters		/* Note that we can't know whether it's safe to return
17564c3a0a35cd80a0abb9628dc8d4ade911fe2d5015Tim Peters		   a tuple *subclass* instance as-is, hence the restriction
17578ff70a9606aa2f51f8329fbf09dfbbbae6ab6c11Tim Peters		   to exact tuples here.  In contrast, lists always make
17588ff70a9606aa2f51f8329fbf09dfbbbae6ab6c11Tim Peters		   a copy, so there's no need for exactness below. */
1759cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		Py_INCREF(v);
1760cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return v;
1761cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
1762cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (PyList_Check(v))
1763cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return PyList_AsTuple(v);
1764cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
17656912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Get iterator. */
17666912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	it = PyObject_GetIter(v);
17676912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	if (it == NULL)
17681fc240e85150f5cb39502a87cc9a4a0a8cbe5ab0Tim Peters		return NULL;
1769e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
17706912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Guess result size and allocate space. */
1771255f53bdb54a64b93035374ca4484ba0cc1b41e1Christian Heimes	n = _PyObject_LengthHint(v, 10);
1772e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger	if (n == -1)
1773e8364233aea88cf68e8f54a515dce10160ead35bRaymond Hettinger		goto Fail;
17746912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	result = PyTuple_New(n);
17756912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	if (result == NULL)
17766912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		goto Fail;
17776912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters
17786912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Fill the tuple. */
17796912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	for (j = 0; ; ++j) {
17806912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		PyObject *item = PyIter_Next(it);
17816912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		if (item == NULL) {
17826912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters			if (PyErr_Occurred())
17836912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters				goto Fail;
17846912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters			break;
17856912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		}
17866912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		if (j >= n) {
178718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis			Py_ssize_t oldn = n;
17884d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			/* The over-allocation strategy can grow a bit faster
178998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum			   than for lists because unlike lists the
17904d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			   over-allocation isn't permanent -- we reclaim
17914d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			   the excess before the end of this routine.
17924d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			   So, grow by ten and then add 25%.
17934d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			*/
17944d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			n += 10;
17954d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			n += n >> 2;
17964d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			if (n < oldn) {
17974d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger				/* Check for overflow */
17984d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger				PyErr_NoMemory();
1799e6bdb37e5bc7d250e17c3d4fef6961e178e02b64Raymond Hettinger				Py_DECREF(item);
180098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum				goto Fail;
18014d01259fb262e7eb035b56ae70637884ef4e8cd8Raymond Hettinger			}
18024324aa3572f123883e67a807b633b3d0d452a267Tim Peters			if (_PyTuple_Resize(&result, n) != 0) {
180312d0a6c78a376e8eddca3d3fa88ed3627aad795cTim Peters				Py_DECREF(item);
18046912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters				goto Fail;
180512d0a6c78a376e8eddca3d3fa88ed3627aad795cTim Peters			}
1806cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		}
18076912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		PyTuple_SET_ITEM(result, j, item);
1808e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum	}
1809cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
18106912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	/* Cut tuple back if guess was too large. */
18116912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	if (j < n &&
18124324aa3572f123883e67a807b633b3d0d452a267Tim Peters	    _PyTuple_Resize(&result, j) != 0)
18136912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters		goto Fail;
18146912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters
18156912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	Py_DECREF(it);
18166912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	return result;
18176912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters
18186912d4ddf0504a3d5611ddd12cbde3354bd48279Tim PetersFail:
18196912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	Py_XDECREF(result);
18206912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	Py_DECREF(it);
18216912d4ddf0504a3d5611ddd12cbde3354bd48279Tim Peters	return NULL;
1822e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1823e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
18243c5936afc5f067b3b591f554c31e1cfdce460fadGuido van RossumPyObject *
1825799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_List(PyObject *v)
18263c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum{
1827f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters	PyObject *result;  /* result list */
1828fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	PyObject *rv;	   /* return value from PyList_Extend */
1829cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
18305dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum	if (v == NULL)
18315dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum		return null_error();
18325dba9e8aef544c0f10bda0ecbd965ac08d019f27Guido van Rossum
18338ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger	result = PyList_New(0);
18348ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger	if (result == NULL)
1835f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters		return NULL;
1836f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters
18378ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger	rv = _PyList_Extend((PyListObject *)result, v);
18388ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger	if (rv == NULL) {
18398ca92ae54c3c0958bf073fe04d897f8f01e02547Raymond Hettinger		Py_DECREF(result);
1840f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters		return NULL;
1841f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters	}
1842969d8c0c8cbef8f8b838c3032bb6beb60cb59f4fRaymond Hettinger	Py_DECREF(rv);
1843f553f89d45f049e32f5eadc0c78a1e2440745d7aTim Peters	return result;
1844cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
18454669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum
184674042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. KuchlingPyObject *
1847799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Fast(PyObject *v, const char *m)
184874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling{
18492fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger	PyObject *it;
18502fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger
185174042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling	if (v == NULL)
185274042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling		return null_error();
185374042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
18542801fe1c8f7d629e396ed514c4df25b43547970aMichael W. Hudson	if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
185574042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling		Py_INCREF(v);
185674042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling		return v;
185774042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling	}
185874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
1859fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	it = PyObject_GetIter(v);
18602fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger	if (it == NULL) {
18612fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger		if (PyErr_ExceptionMatches(PyExc_TypeError))
18620e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters			PyErr_SetString(PyExc_TypeError, m);
18632fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger		return NULL;
18642fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger	}
18652fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger
1866193814c3082f1b81772009f9b7545278f16c3428Raymond Hettinger	v = PySequence_List(it);
18672fb702966c9c7e29c2697cf0d9dc6b1a19e465d7Raymond Hettinger	Py_DECREF(it);
186874042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
186974042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling	return v;
187074042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling}
187174042d6e5d44cc9d332c28414a1e04eadd204248Andrew M. Kuchling
187216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters/* Iterate over seq.  Result depends on the operation:
1873fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant   PY_ITERSEARCH_COUNT:	 -1 if error, else # of times obj appears in seq.
1874934896dc0977ea25dc37c13117525f2394625ceeMark Dickinson   PY_ITERSEARCH_INDEX:	 0-based index of first occurrence of obj in seq;
1875fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	set ValueError and return -1 if none found; also return -1 on error.
187616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters   Py_ITERSEARCH_CONTAINS:  return 1 if obj in seq, else 0; -1 on error.
187716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters*/
18781fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t
187916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
1880cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{
18811fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz	Py_ssize_t n;
188216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	int wrapped;  /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
188316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	PyObject *it;  /* iter(seq) */
18844669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum
188516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	if (seq == NULL || obj == NULL) {
1886cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
1887cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
1888cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
188975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters
189016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	it = PyObject_GetIter(seq);
189175f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters	if (it == NULL) {
18920e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		type_error("argument of type '%.200s' is not iterable", seq);
1893cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
189475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters	}
1895cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
189616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	n = wrapped = 0;
189775f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters	for (;;) {
189875f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		int cmp;
189975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		PyObject *item = PyIter_Next(it);
190075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		if (item == NULL) {
190175f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters			if (PyErr_Occurred())
190275f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters				goto Fail;
190375f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters			break;
190475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		}
190516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
190616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters		cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
1907cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		Py_DECREF(item);
190875f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		if (cmp < 0)
190975f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters			goto Fail;
191075f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		if (cmp > 0) {
191116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			switch (operation) {
191216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			case PY_ITERSEARCH_COUNT:
191389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters				if (n == PY_SSIZE_T_MAX) {
191416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters					PyErr_SetString(PyExc_OverflowError,
191589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters					       "count exceeds C integer size");
191616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters					goto Fail;
191716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				}
191889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters				++n;
191916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				break;
192016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
192116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			case PY_ITERSEARCH_INDEX:
192216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				if (wrapped) {
192316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters					PyErr_SetString(PyExc_OverflowError,
192489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters					       "index exceeds C integer size");
192516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters					goto Fail;
192616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				}
192716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				goto Done;
192816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
192916a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			case PY_ITERSEARCH_CONTAINS:
193016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				n = 1;
193116a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				goto Done;
193216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
193316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters			default:
193416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				assert(!"unknown operation");
193575f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters			}
193616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters		}
193716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
193816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters		if (operation == PY_ITERSEARCH_INDEX) {
193989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters			if (n == PY_SSIZE_T_MAX)
194016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters				wrapped = 1;
194189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters			++n;
194275f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters		}
19434669fb474b1a4b9e55467f4fe2fc9c0132f03291Guido van Rossum	}
194475f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters
194516a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	if (operation != PY_ITERSEARCH_INDEX)
194616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters		goto Done;
194716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
194816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	PyErr_SetString(PyExc_ValueError,
1949fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant			"sequence.index(x): x not in sequence");
195016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	/* fall into failure code */
195175f8e35ef41aa6e7c915d99de8bd40be2745955cTim PetersFail:
195216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	n = -1;
195316a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	/* fall through */
195416a77adfbd745c202878fabb0b921514fec7ca16Tim PetersDone:
195575f8e35ef41aa6e7c915d99de8bd40be2745955cTim Peters	Py_DECREF(it);
195616a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	return n;
195716a77adfbd745c202878fabb0b921514fec7ca16Tim Peters
19583c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum}
19593c5936afc5f067b3b591f554c31e1cfdce460fadGuido van Rossum
196016a77adfbd745c202878fabb0b921514fec7ca16Tim Peters/* Return # of times o appears in s. */
19611fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t
196216a77adfbd745c202878fabb0b921514fec7ca16Tim PetersPySequence_Count(PyObject *s, PyObject *o)
1963e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
196416a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
1965e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1966e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1967cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
196816a77adfbd745c202878fabb0b921514fec7ca16Tim Peters * Use sq_contains if possible, else defer to _PySequence_IterSearch().
1969cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters */
1970cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Petersint
1971cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim PetersPySequence_Contains(PyObject *seq, PyObject *ob)
1972cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters{
19731fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz	Py_ssize_t result;
19743cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1975fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	if (sqm != NULL && sqm->sq_contains != NULL)
19763cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum		return (*sqm->sq_contains)(seq, ob);
19771fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz	result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
19781fc4b776d47b45133a2730d191552ec2f1928baaNeal Norwitz	return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
1979cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters}
1980cb8d368b824a38a0b04598ba2bcd107d6aae3595Tim Peters
1981cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Backwards compatibility */
1982cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum#undef PySequence_In
1983cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
1984799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_In(PyObject *w, PyObject *v)
1985e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
1986cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return PySequence_Contains(w, v);
1987e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1988e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
19891fc4b776d47b45133a2730d191552ec2f1928baaNeal NorwitzPy_ssize_t
1990799124718ddfbb95440470037d8d7760b821646fFred DrakePySequence_Index(PyObject *s, PyObject *o)
1991e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
199216a77adfbd745c202878fabb0b921514fec7ca16Tim Peters	return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
1993e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
1994e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
1995cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on mappings */
1996cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
1997cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
1998799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_Check(PyObject *o)
1999e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2000fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	return	o && o->ob_type->tp_as_mapping &&
2001d2cf20eea2338a0369d4a5707adb01b201f7dfb2Thomas Wouters		o->ob_type->tp_as_mapping->mp_subscript;
2002e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2003e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
200418e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
20056253f83b0a2d261024cd5ef84d2e36fe4f4f1f3dJeremy HyltonPyMapping_Size(PyObject *o)
2006e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2007cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyMappingMethods *m;
2008e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2009cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (o == NULL) {
2010cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
2011cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
2012cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
2013e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2014cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	m = o->ob_type->tp_as_mapping;
2015cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (m && m->mp_length)
2016cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return m->mp_length(o);
2017e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
20180e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	type_error("object of type '%.200s' has no len()", o);
2019cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return -1;
2020e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2021e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2022cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#undef PyMapping_Length
202318e165558b24d29e7e0ca501842b9236589b012aMartin v. LöwisPy_ssize_t
2024cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André LemburgPyMapping_Length(PyObject *o)
2025cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg{
2026cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg	return PyMapping_Size(o);
2027cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg}
2028cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg#define PyMapping_Length PyMapping_Size
2029cf5f3587849e6fbdc68dc91bd3182625f616f2a0Marc-André Lemburg
2030cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van RossumPyObject *
2031799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_GetItemString(PyObject *o, char *key)
2032cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{
2033cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyObject *okey, *r;
2034cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2035cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (key == NULL)
2036cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
2037cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
20385b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis	okey = PyUnicode_FromString(key);
2039cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (okey == NULL)
2040cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return NULL;
2041cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	r = PyObject_GetItem(o, okey);
2042cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	Py_DECREF(okey);
2043cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return r;
2044cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
2045cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2046cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
2047799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
2048cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum{
2049cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyObject *okey;
2050cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	int r;
2051cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2052cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (key == NULL) {
2053cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		null_error();
2054cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return -1;
2055cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
2056cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
20575b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis	okey = PyUnicode_FromString(key);
2058cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (okey == NULL)
2059ed6219b11663c8d34cf52d0562b94b1b8dfaac97Guido van Rossum		return -1;
2060cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	r = PyObject_SetItem(o, okey, value);
2061cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	Py_DECREF(okey);
2062cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return r;
2063cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
2064cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2065cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
2066799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_HasKeyString(PyObject *o, char *key)
2067e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2068cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyObject *v;
2069cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2070cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	v = PyMapping_GetItemString(o, key);
2071cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (v) {
2072cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		Py_DECREF(v);
2073cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return 1;
2074cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
2075cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyErr_Clear();
2076cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return 0;
2077e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2078e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2079cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossumint
2080799124718ddfbb95440470037d8d7760b821646fFred DrakePyMapping_HasKey(PyObject *o, PyObject *key)
2081e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2082cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyObject *v;
2083cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2084cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	v = PyObject_GetItem(o, key);
2085cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (v) {
2086cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		Py_DECREF(v);
2087cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return 1;
2088cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
2089cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	PyErr_Clear();
2090cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return 0;
2091e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2092e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2093cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject *
2094cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Keys(PyObject *o)
2095cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{
2096cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *keys;
2097cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *fast;
2098cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2099cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (PyDict_CheckExact(o))
2100cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return PyDict_Keys(o);
2101cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	keys = PyObject_CallMethod(o, "keys", NULL);
2102cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (keys == NULL)
2103cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return NULL;
2104cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	fast = PySequence_Fast(keys, "o.keys() are not iterable");
2105cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	Py_DECREF(keys);
2106cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	return fast;
2107cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum}
2108cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2109cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject *
2110cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Items(PyObject *o)
2111cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{
2112cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *items;
2113cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *fast;
2114cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2115cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (PyDict_CheckExact(o))
2116cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return PyDict_Items(o);
2117cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	items = PyObject_CallMethod(o, "items", NULL);
2118cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (items == NULL)
2119cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return NULL;
2120cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	fast = PySequence_Fast(items, "o.items() are not iterable");
2121cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	Py_DECREF(items);
2122cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	return fast;
2123cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum}
2124cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2125cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyObject *
2126cc2b0161257495f859200bce0aea3ed7e646feb3Guido van RossumPyMapping_Values(PyObject *o)
2127cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum{
2128cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *values;
2129cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	PyObject *fast;
2130cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2131cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (PyDict_CheckExact(o))
2132cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return PyDict_Values(o);
2133cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	values = PyObject_CallMethod(o, "values", NULL);
2134cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	if (values == NULL)
2135cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum		return NULL;
2136cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	fast = PySequence_Fast(values, "o.values() are not iterable");
2137cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	Py_DECREF(values);
2138cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum	return fast;
2139cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum}
2140cc2b0161257495f859200bce0aea3ed7e646feb3Guido van Rossum
2141cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* Operations on callable objects */
2142cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2143cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum/* XXX PyCallable_Check() is in object.c */
2144cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2145e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
2146799124718ddfbb95440470037d8d7760b821646fFred DrakePyObject_CallObject(PyObject *o, PyObject *a)
2147e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
21485560b7492c8dbe17a29362a66102662e5e22a9d2Guido van Rossum	return PyEval_CallObjectWithKeywords(o, a, NULL);
2149cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum}
2150e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2151e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
21526d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim PetersPyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
21536d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters{
2154fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant	ternaryfunc call;
21556d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters
21566d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	if ((call = func->ob_type->tp_call) != NULL) {
215789d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters		PyObject *result;
215889d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters		if (Py_EnterRecursiveCall(" while calling a Python object"))
215989d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters		    return NULL;
216089d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters		result = (*call)(func, arg, kw);
216189d996e5c28d820e9bc91e0c025f47c754ae784cThomas Wouters		Py_LeaveRecursiveCall();
21626d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters		if (result == NULL && !PyErr_Occurred())
21636d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters			PyErr_SetString(
21646d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters				PyExc_SystemError,
21656d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters				"NULL result without error in PyObject_Call");
21666d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters		return result;
21676d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	}
21680e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters	PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
2169573395a7a8163c38630c5262ed3910c279e4a767Fred Drake		     func->ob_type->tp_name);
21706d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	return NULL;
21716d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters}
21726d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters
217349fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersstatic PyObject*
217449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouterscall_function_tail(PyObject *callable, PyObject *args)
217549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
217649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *retval;
217749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
217849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (args == NULL)
217949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		return NULL;
218049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
218149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (!PyTuple_Check(args)) {
218249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyObject *a;
218349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
218449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		a = PyTuple_New(1);
218549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		if (a == NULL) {
218649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			Py_DECREF(args);
218749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters			return NULL;
218849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		}
218949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyTuple_SET_ITEM(a, 0, args);
219049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = a;
219149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	}
219249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	retval = PyObject_Call(callable, args, NULL);
219349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
219449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	Py_DECREF(args);
219549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
219649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	return retval;
219749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
219849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
21996d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim PetersPyObject *
2200cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van RossumPyObject_CallFunction(PyObject *callable, char *format, ...)
2201e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2202cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	va_list va;
220349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *args;
2204e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2205b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	if (callable == NULL)
2206cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
2207cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2208b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	if (format && *format) {
2209b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake		va_start(va, format);
2210cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		args = Py_VaBuildValue(format, va);
2211b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake		va_end(va);
2212b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	}
2213cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	else
2214cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		args = PyTuple_New(0);
2215cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
221649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	return call_function_tail(callable, args);
221749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
2218cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
221949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyObject *
222049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
222149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
222249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	va_list va;
222349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *args;
2224cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
222549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (callable == NULL)
222649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		return null_error();
2227cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
222849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (format && *format) {
222949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		va_start(va, format);
223049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = _Py_VaBuildValue_SizeT(format, va);
223149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		va_end(va);
223249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	}
223349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	else
223449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = PyTuple_New(0);
2235cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
223649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	return call_function_tail(callable, args);
2237e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2238e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2239e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject *
2240e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van RossumPyObject_CallMethod(PyObject *o, char *name, char *format, ...)
2241e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum{
2242cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	va_list va;
224349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *args;
22440edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	PyObject *func = NULL;
22450edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	PyObject *retval = NULL;
2246e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2247b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	if (o == NULL || name == NULL)
2248cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return null_error();
2249e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2250cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	func = PyObject_GetAttrString(o, name);
2251cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	if (func == NULL) {
2252cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		PyErr_SetString(PyExc_AttributeError, name);
2253cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		return 0;
2254cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
2255e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
22560edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	if (!PyCallable_Check(func)) {
225798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		type_error("attribute of type '%.200s' is not callable", func);
22580edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson		goto exit;
22590edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	}
2260e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum
2261b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	if (format && *format) {
2262b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake		va_start(va, format);
2263cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		args = Py_VaBuildValue(format, va);
2264b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake		va_end(va);
2265b92cf067c63e3ed809f30ae51fdafc18c1db0c37Fred Drake	}
2266cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	else
2267cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum		args = PyTuple_New(0);
2268cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
226949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	retval = call_function_tail(func, args);
2270cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
227149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters  exit:
227249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	/* args gets consumed in call_function_tail */
227349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	Py_XDECREF(func);
2274cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
227549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	return retval;
227649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
227749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
227849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyObject *
227949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
228049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
228149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	va_list va;
228249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *args;
228349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *func = NULL;
228449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	PyObject *retval = NULL;
228549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
228649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (o == NULL || name == NULL)
228749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		return null_error();
228849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
228949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	func = PyObject_GetAttrString(o, name);
229049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (func == NULL) {
229149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		PyErr_SetString(PyExc_AttributeError, name);
229249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		return 0;
2293cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	}
2294cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
229549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (!PyCallable_Check(func)) {
229698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum		type_error("attribute of type '%.200s' is not callable", func);
229749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		goto exit;
229849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	}
229949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
230049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	if (format && *format) {
230149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		va_start(va, format);
230249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = _Py_VaBuildValue_SizeT(format, va);
230349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		va_end(va);
230449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	}
230549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	else
230649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters		args = PyTuple_New(0);
230749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
230849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	retval = call_function_tail(func, args);
2309cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
23100edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson  exit:
231149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters	/* args gets consumed in call_function_tail */
23120edc7a03e2505c4e9b3186f8b6caa18a7b3988e2Michael W. Hudson	Py_XDECREF(func);
2313cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum
2314cea1c8ca22b318ce38a9a135c68b812f76b24404Guido van Rossum	return retval;
2315e15dee5e3cf863657f47974cb51721ef3cca2ff8Guido van Rossum}
2316823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2317823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2318b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drakestatic PyObject *
2319b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred Drakeobjargs_mktuple(va_list va)
2320b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{
2321b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	int i, n = 0;
2322b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_list countva;
2323b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	PyObject *result, *tmp;
2324b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2325b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake#ifdef VA_LIST_IS_ARRAY
2326b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	memcpy(countva, va, sizeof(va_list));
2327b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake#else
232875d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#ifdef __va_copy
232975d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis	__va_copy(countva, va);
233075d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#else
2331b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	countva = va;
2332b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake#endif
233375d2d94e0f049162c6ef353a89c5703eb78eaaf6Martin v. Löwis#endif
2334b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2335b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2336b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		++n;
2337b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	result = PyTuple_New(n);
2338b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (result != NULL && n > 0) {
2339b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		for (i = 0; i < n; ++i) {
2340b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake			tmp = (PyObject *)va_arg(va, PyObject *);
2341b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake			PyTuple_SET_ITEM(result, i, tmp);
2342b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake			Py_INCREF(tmp);
2343b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		}
2344b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	}
2345b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	return result;
2346b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake}
2347b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2348b421b8c19105d08b97122b7c84eec37ad83c6de4Fred DrakePyObject *
2349b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred DrakePyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
2350b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{
2351b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	PyObject *args, *tmp;
2352b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_list vargs;
2353b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2354b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (callable == NULL || name == NULL)
2355b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return null_error();
2356b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2357b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	callable = PyObject_GetAttr(callable, name);
2358b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (callable == NULL)
2359b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return NULL;
2360b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2361b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	/* count the args */
2362b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_start(vargs, name);
2363b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred Drake	args = objargs_mktuple(vargs);
2364b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_end(vargs);
2365b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (args == NULL) {
2366b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		Py_DECREF(callable);
2367b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return NULL;
2368b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	}
2369b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	tmp = PyObject_Call(callable, args, NULL);
2370b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	Py_DECREF(args);
2371b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	Py_DECREF(callable);
2372b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2373b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	return tmp;
2374b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake}
2375b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2376b421b8c19105d08b97122b7c84eec37ad83c6de4Fred DrakePyObject *
2377b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred DrakePyObject_CallFunctionObjArgs(PyObject *callable, ...)
2378b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake{
2379b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	PyObject *args, *tmp;
2380b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_list vargs;
2381b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2382b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (callable == NULL)
2383b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return null_error();
2384b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2385b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	/* count the args */
2386b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_start(vargs, callable);
2387b0c079e3e5793290db8651ea4edbbf6d4ba18218Fred Drake	args = objargs_mktuple(vargs);
2388b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	va_end(vargs);
2389b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	if (args == NULL)
2390b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake		return NULL;
2391b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	tmp = PyObject_Call(callable, args, NULL);
2392b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	Py_DECREF(args);
2393b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2394b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake	return tmp;
2395b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake}
2396b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2397b421b8c19105d08b97122b7c84eec37ad83c6de4Fred Drake
2398823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum/* isinstance(), issubclass() */
2399823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2400f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2401f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * state that will almost never happen.
2402f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2403f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 0. creating the __bases__ static string could get a MemoryError
2404f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 1. getattr(cls, '__bases__') could raise an AttributeError
2405f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 2. getattr(cls, '__bases__') could raise some other exception
2406f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 3. getattr(cls, '__bases__') could return a tuple
2407f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * 4. getattr(cls, '__bases__') could return something other than a tuple
2408f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2409f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Only state #3 is a non-error state and only it returns a non-NULL object
2410f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * (it returns the retrieved tuple).
2411f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2412f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Any raised AttributeErrors are masked by clearing the exception and
2413f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * returning NULL.  If an object other than a tuple comes out of __bases__,
2414f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * then again, the return value is NULL.  So yes, these two situations
2415f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * produce exactly the same results: NULL is returned and no error is set.
2416f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2417f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * If some exception other than AttributeError is raised, then NULL is also
2418fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant * returned, but the exception is not cleared.	That's because we want the
2419f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * exception to be propagated along.
2420f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw *
2421f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * Callers are expected to test for PyErr_Occurred() when the return value
2422f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * is NULL to decide whether a valid exception should be propagated or not.
2423f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * When there's no exception to propagate, it's customary for the caller to
2424f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw * set a TypeError.
2425f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw */
24266b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerstatic PyObject *
24276b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerabstract_get_bases(PyObject *cls)
2428823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{
2429823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	static PyObject *__bases__ = NULL;
2430823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	PyObject *bases;
2431823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2432823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	if (__bases__ == NULL) {
2433fe82e774ea203de277968216126e26d0d09b3a15Christian Heimes		__bases__ = PyUnicode_InternFromString("__bases__");
2434823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum		if (__bases__ == NULL)
24356b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			return NULL;
2436823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
24375b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis	Py_ALLOW_RECURSION
24386b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	bases = PyObject_GetAttr(cls, __bases__);
24395b222135f8d2492713994f2cb003980e87ce6a72Martin v. Löwis	Py_END_ALLOW_RECURSION
2440f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw	if (bases == NULL) {
2441f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw		if (PyErr_ExceptionMatches(PyExc_AttributeError))
2442f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw			PyErr_Clear();
2443f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw		return NULL;
2444f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw	}
2445f16951cffe9e4171769213bbe1aecec3d8f5200aBarry Warsaw	if (!PyTuple_Check(bases)) {
2446fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant		Py_DECREF(bases);
24476b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		return NULL;
2448823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
24496b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	return bases;
24506b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer}
24516b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
24526b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
24536b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerstatic int
24546b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauerabstract_issubclass(PyObject *derived, PyObject *cls)
24556b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer{
2456ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	PyObject *bases = NULL;
245718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis	Py_ssize_t i, n;
24586b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	int r = 0;
24596b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer
2460ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	while (1) {
2461ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		if (derived == cls)
2462ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			return 1;
2463ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		bases = abstract_get_bases(derived);
2464ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		if (bases == NULL) {
2465ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			if (PyErr_Occurred())
2466ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou				return -1;
2467ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			return 0;
2468ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		}
2469ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		n = PyTuple_GET_SIZE(bases);
2470ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		if (n == 0) {
2471ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			Py_DECREF(bases);
2472ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			return 0;
2473ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		}
2474ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		/* Avoid recursivity in the single inheritance case */
2475ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		if (n == 1) {
2476ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			derived = PyTuple_GET_ITEM(bases, 0);
2477ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			Py_DECREF(bases);
2478ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			continue;
2479ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		}
2480d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		for (i = 0; i < n; i++) {
2481ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2482ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			if (r != 0)
2483ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou				break;
2484d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		}
2485ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		Py_DECREF(bases);
2486ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		return r;
2487d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	}
2488823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum}
2489823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2490d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwaldstatic int
2491d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwaldcheck_class(PyObject *cls, const char *error)
2492d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald{
2493d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	PyObject *bases = abstract_get_bases(cls);
2494d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	if (bases == NULL) {
2495d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		/* Do not mask errors. */
2496d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		if (!PyErr_Occurred())
2497d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			PyErr_SetString(PyExc_TypeError, error);
2498d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		return 0;
2499d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	}
2500d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	Py_DECREF(bases);
2501d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald	return -1;
2502d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald}
2503d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald
25044f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonstatic int
2505ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrourecursive_isinstance(PyObject *inst, PyObject *cls)
2506823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{
2507823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	PyObject *icls;
2508823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	static PyObject *__class__ = NULL;
2509823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	int retval = 0;
2510823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
251103bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum	if (__class__ == NULL) {
2512fe82e774ea203de277968216126e26d0d09b3a15Christian Heimes		__class__ = PyUnicode_InternFromString("__class__");
251303bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum		if (__class__ == NULL)
251403bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			return -1;
251503bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum	}
251603bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum
251745aecf451a64fb1ebe5e74d0b00965ac8d99dff6Guido van Rossum	if (PyType_Check(cls)) {
25186d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters		retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
251903bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum		if (retval == 0) {
252003bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			PyObject *c = PyObject_GetAttr(inst, __class__);
252103bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			if (c == NULL) {
252203bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum				PyErr_Clear();
252303bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			}
252403bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			else {
2525e5b130bcdb491b7d4af7cd4c9cf82ebf6ba5fc63Guido van Rossum				if (c != (PyObject *)(inst->ob_type) &&
2526e5b130bcdb491b7d4af7cd4c9cf82ebf6ba5fc63Guido van Rossum				    PyType_Check(c))
252703bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum					retval = PyType_IsSubtype(
252803bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum						(PyTypeObject *)c,
252903bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum						(PyTypeObject *)cls);
253003bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum				Py_DECREF(c);
253103bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum			}
253203bc7d3c4d22146b2e28c39e6c2e239137318f0aGuido van Rossum		}
2533823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
25346b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer	else {
2535d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald		if (!check_class(cls,
2536d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			"isinstance() arg 2 must be a class, type,"
2537d9a6ad3bebc2b451482db152171fca3144b2cd97Walter Dörwald			" or tuple of classes and types"))
25386b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			return -1;
2539823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum		icls = PyObject_GetAttr(inst, __class__);
25406b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		if (icls == NULL) {
25416b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			PyErr_Clear();
25426b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			retval = 0;
25436b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		}
25446b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer		else {
25456b471294242c70760ac64ad0b3853ad4d00e13bfNeil Schemenauer			retval = abstract_issubclass(icls, cls);
2546823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum			Py_DECREF(icls);
2547823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum		}
2548823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
2549823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2550823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	return retval;
2551823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum}
2552823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2553823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossumint
25544f65331483197a9909b19694688c55fdf9ca7a37Brett CannonPyObject_IsInstance(PyObject *inst, PyObject *cls)
25554f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon{
2556a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes	static PyObject *name = NULL;
2557e7ba4956272a7105ea90dd505f70e5947aa27161Guido van Rossum	PyObject *checker;
2558d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes
2559d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes	/* Quick test for an exact match */
2560d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes	if (Py_TYPE(inst) == (PyTypeObject *)cls)
2561d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes		return 1;
2562d5e2b6f3bcef9fea744bef331ad7278052223f11Christian Heimes
2563ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	if (PyTuple_Check(cls)) {
2564ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		Py_ssize_t i;
2565ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		Py_ssize_t n;
2566ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		int r = 0;
2567ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou
2568ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		if (Py_EnterRecursiveCall(" in __instancecheck__"))
2569ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			return -1;
2570ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		n = PyTuple_GET_SIZE(cls);
2571ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		for (i = 0; i < n; ++i) {
2572ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			PyObject *item = PyTuple_GET_ITEM(cls, i);
2573ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			r = PyObject_IsInstance(inst, item);
2574ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			if (r != 0)
2575ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou				/* either found it, or got an error */
2576ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou				break;
2577ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		}
2578ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		Py_LeaveRecursiveCall();
2579ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		return r;
2580ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	}
258188fe5f9776bca1dee330a76776f831e12ea8b36dBenjamin Peterson
258288fe5f9776bca1dee330a76776f831e12ea8b36dBenjamin Peterson	checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name);
2583adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum	if (checker != NULL) {
2584adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		PyObject *res;
2585adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		int ok = -1;
258629478ef990eadb04c9c1ff4a803b7c5172b31399Guido van Rossum		if (Py_EnterRecursiveCall(" in __instancecheck__")) {
258729478ef990eadb04c9c1ff4a803b7c5172b31399Guido van Rossum			Py_DECREF(checker);
2588adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum			return ok;
258929478ef990eadb04c9c1ff4a803b7c5172b31399Guido van Rossum		}
2590adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2591adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		Py_LeaveRecursiveCall();
2592adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		Py_DECREF(checker);
2593adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		if (res != NULL) {
2594adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum			ok = PyObject_IsTrue(res);
2595adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum			Py_DECREF(res);
2596adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		}
2597adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		return ok;
2598adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum	}
259994c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson	else if (PyErr_Occurred())
260094c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson		return -1;
2601ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	return recursive_isinstance(inst, cls);
26024f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon}
26034f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
2604fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphantstatic	int
2605ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrourecursive_issubclass(PyObject *derived, PyObject *cls)
2606823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum{
2607ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	if (PyType_Check(cls) && PyType_Check(derived)) {
2608ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		/* Fast path (non-recursive) */
2609ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2610823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum	}
2611ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	if (!check_class(derived,
2612ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			 "issubclass() arg 1 must be a class"))
2613ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		return -1;
2614ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	if (!check_class(cls,
2615ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			"issubclass() arg 2 must be a class"
2616ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			" or tuple of classes"))
2617ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		return -1;
2618823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum
2619ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	return abstract_issubclass(derived, cls);
2620823649d544eec66a61176dbb76b51a9408c7f4edGuido van Rossum}
262159d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum
26224f65331483197a9909b19694688c55fdf9ca7a37Brett Cannonint
26234f65331483197a9909b19694688c55fdf9ca7a37Brett CannonPyObject_IsSubclass(PyObject *derived, PyObject *cls)
26244f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon{
2625a156e09b19cd239176a9316ddca7641784eea99eChristian Heimes	static PyObject *name = NULL;
2626e7ba4956272a7105ea90dd505f70e5947aa27161Guido van Rossum	PyObject *checker;
2627dcfe8e44c3f4bbfa0752fe1130c1561b94a62a94Georg Brandl
2628ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	if (PyTuple_Check(cls)) {
2629ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		Py_ssize_t i;
2630ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		Py_ssize_t n;
2631ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		int r = 0;
2632ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou
2633ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2634ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			return -1;
2635ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		n = PyTuple_GET_SIZE(cls);
2636ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		for (i = 0; i < n; ++i) {
2637ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			PyObject *item = PyTuple_GET_ITEM(cls, i);
2638ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			r = PyObject_IsSubclass(derived, item);
2639ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			if (r != 0)
2640ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou				/* either found it, or got an error */
2641ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou				break;
2642ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		}
2643ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		Py_LeaveRecursiveCall();
2644ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		return r;
2645ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	}
264688fe5f9776bca1dee330a76776f831e12ea8b36dBenjamin Peterson
264788fe5f9776bca1dee330a76776f831e12ea8b36dBenjamin Peterson	checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name);
2648adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum	if (checker != NULL) {
2649adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		PyObject *res;
2650adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		int ok = -1;
2651ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
2652ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou			Py_DECREF(checker);
2653adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum			return ok;
2654ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou		}
2655adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
2656adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		Py_LeaveRecursiveCall();
2657adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		Py_DECREF(checker);
2658adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		if (res != NULL) {
2659adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum			ok = PyObject_IsTrue(res);
2660adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum			Py_DECREF(res);
2661adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		}
2662adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum		return ok;
2663adee45ed2c5c6602de6d9dd5f13c02fc262a23feGuido van Rossum	}
266494c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson	else if (PyErr_Occurred())
266594c65d9a8ff8ec56c2420f46a6622803f7f1b154Benjamin Peterson		return -1;
2666ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	return recursive_issubclass(derived, cls);
2667ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou}
2668ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou
2669ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrouint
2670ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2671ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou{
2672ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	return recursive_isinstance(inst, cls);
2673ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou}
2674ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou
2675ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrouint
2676ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2677ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou{
2678ec569b794737be248671d0dfac11b664fc930eefAntoine Pitrou	return recursive_issubclass(derived, cls);
26794f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon}
26804f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
26814f65331483197a9909b19694688c55fdf9ca7a37Brett Cannon
268259d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject *
268359d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van RossumPyObject_GetIter(PyObject *o)
268459d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum{
268559d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum	PyTypeObject *t = o->ob_type;
268659d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum	getiterfunc f = NULL;
26873cf5b1eef99fbd85bbd2bcd2e6223dfec92daf8bGuido van Rossum	f = t->tp_iter;
268859d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum	if (f == NULL) {
268959d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum		if (PySequence_Check(o))
2690213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum			return PySeqIter_New(o);
26910e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters		return type_error("'%.200s' object is not iterable", o);
269259d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum	}
2693213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum	else {
2694213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum		PyObject *res = (*f)(o);
2695213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum		if (res != NULL && !PyIter_Check(res)) {
2696213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum			PyErr_Format(PyExc_TypeError,
2697213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum				     "iter() returned non-iterator "
2698213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum				     "of type '%.100s'",
2699213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum				     res->ob_type->tp_name);
2700213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum			Py_DECREF(res);
2701213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum			res = NULL;
2702213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum		}
2703213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum		return res;
2704213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum	}
2705213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum}
2706213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum
2707f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters/* Return next item.
2708f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If an error occurs, return NULL.  PyErr_Occurred() will be true.
2709f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * If the iteration terminates normally, return NULL and clear the
2710f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * PyExc_StopIteration exception (if it was set).  PyErr_Occurred()
2711f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters * will be false.
2712fe9bed02e430613f95849fa49aaa4f823a762738Travis E. Oliphant * Else return the next object.	 PyErr_Occurred() will be false.
2713f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters */
2714213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyObject *
2715213c7a6aa5889f42495352199715a1c1a0833a00Guido van RossumPyIter_Next(PyObject *iter)
2716213c7a6aa5889f42495352199715a1c1a0833a00Guido van Rossum{
2717f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	PyObject *result;
2718f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	result = (*iter->ob_type->tp_iternext)(iter);
2719f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	if (result == NULL &&
2720f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	    PyErr_Occurred() &&
2721f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	    PyErr_ExceptionMatches(PyExc_StopIteration))
2722f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters		PyErr_Clear();
2723f4848dac41689d1f2f8bd224bd935beae9b8df86Tim Peters	return result;
272459d1d2b434e8cf79e8b1321f148254c68f56c1f7Guido van Rossum}
2725fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
2726fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
2727fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith/*
2728fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * Flatten a sequence of bytes() objects into a C array of
2729fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * NULL terminated string pointers with a NULL char* terminating the array.
2730fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * (ie: an argv or env list)
2731fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith *
2732fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * Memory allocated for the returned list is allocated using malloc() and MUST
2733fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * be freed by the caller using a free() loop or _Py_FreeCharPArray().
2734fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith */
2735fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithchar *const *
2736fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith_PySequence_BytesToCharpArray(PyObject* self)
2737fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith{
2738fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	char **array;
2739fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	Py_ssize_t i, argc;
2740fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
2741fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	argc = PySequence_Size(self);
2742fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	if (argc == -1)
2743fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		return NULL;
2744fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
2745fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	array = malloc((argc + 1) * sizeof(char *));
2746fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	if (array == NULL) {
2747fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		PyErr_NoMemory();
2748fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		return NULL;
2749fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	}
2750fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	for (i = 0; i < argc; ++i) {
2751fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		char *data;
2752fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		PyObject *item = PySequence_GetItem(self, i);
2753fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		data = PyBytes_AsString(item);
2754fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		if (data == NULL) {
2755fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith			/* NULL terminate before freeing. */
2756fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith			array[i] = NULL;
2757fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith			goto fail;
2758fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		}
2759fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		array[i] = strdup(data);
2760fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		if (!array[i]) {
2761fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith			PyErr_NoMemory();
2762fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith			goto fail;
2763fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		}
2764fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	}
2765fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	array[argc] = NULL;
2766fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
2767fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	return array;
2768fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
2769fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithfail:
2770fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	_Py_FreeCharPArray(array);
2771fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	return NULL;
2772fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith}
2773fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
2774fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
2775fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith/* Free's a NULL terminated char** array of C strings. */
2776fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithvoid
2777fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith_Py_FreeCharPArray(char *const array[])
2778fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith{
2779fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	Py_ssize_t i;
2780fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	for (i = 0; array[i] != NULL; ++i) {
2781fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith		free(array[i]);
2782fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	}
2783fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith	free((void*)array);
2784fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith}
2785