blob: 7d0ed06117f3781e13b6f7599b8a54a55de49e6f [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Guido van Rossume15dee51995-07-18 14:12:02 +00003#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00004#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00005#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00006#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00007
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00008
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00009
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000010/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000011
12static PyObject *
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000014{
Thomas Wouters0e3f5912006-08-11 14:57:12 +000015 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000016 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000017}
18
Guido van Rossum052b7e11996-11-11 15:08:19 +000019static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000020null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000021{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000022 if (!PyErr_Occurred())
23 PyErr_SetString(PyExc_SystemError,
24 "null argument to internal routine");
25 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000026}
27
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000028/* Operations on any object */
29
Guido van Rossume15dee51995-07-18 14:12:02 +000030PyObject *
Fred Drake79912472000-07-09 04:06:11 +000031PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000032{
33 PyObject *v;
34
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000035 if (o == NULL)
36 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000037 v = (PyObject *)o->ob_type;
38 Py_INCREF(v);
39 return v;
40}
41
Martin v. Löwis18e16552006-02-15 17:27:45 +000042Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000043PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000044{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000045 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000046
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000047 if (o == NULL) {
48 null_error();
49 return -1;
50 }
Guido van Rossume15dee51995-07-18 14:12:02 +000051
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000052 m = o->ob_type->tp_as_sequence;
53 if (m && m->sq_length)
54 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000055
Jeremy Hylton6253f832000-07-12 12:56:19 +000056 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000057}
58
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000059#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000060Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000061PyObject_Length(PyObject *o)
62{
63 return PyObject_Size(o);
64}
65#define PyObject_Length PyObject_Size
66
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000067
Christian Heimes255f53b2007-12-08 15:33:56 +000068/* The length hint function returns a non-negative value from o.__len__()
69 or o.__length_hint__(). If those methods aren't found or return a negative
Raymond Hettingere8364232009-02-02 22:55:09 +000070 value, then the defaultvalue is returned. If one of the calls fails,
71 this function returns -1.
Christian Heimes255f53b2007-12-08 15:33:56 +000072*/
73
74Py_ssize_t
75_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
76{
77 static PyObject *hintstrobj = NULL;
78 PyObject *ro;
79 Py_ssize_t rv;
80
81 /* try o.__len__() */
82 rv = PyObject_Size(o);
83 if (rv >= 0)
84 return rv;
Raymond Hettingere8364232009-02-02 22:55:09 +000085 if (PyErr_Occurred()) {
86 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
87 !PyErr_ExceptionMatches(PyExc_AttributeError))
88 return -1;
Christian Heimes255f53b2007-12-08 15:33:56 +000089 PyErr_Clear();
Raymond Hettingere8364232009-02-02 22:55:09 +000090 }
Christian Heimes255f53b2007-12-08 15:33:56 +000091
92 /* cache a hashed version of the attribute string */
93 if (hintstrobj == NULL) {
94 hintstrobj = PyUnicode_InternFromString("__length_hint__");
95 if (hintstrobj == NULL)
Raymond Hettingere8364232009-02-02 22:55:09 +000096 return -1;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000097 }
Christian Heimes255f53b2007-12-08 15:33:56 +000098
99 /* try o.__length_hint__() */
100 ro = PyObject_CallMethodObjArgs(o, hintstrobj, NULL);
Raymond Hettingere8364232009-02-02 22:55:09 +0000101 if (ro == NULL) {
102 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
103 !PyErr_ExceptionMatches(PyExc_AttributeError))
104 return -1;
105 PyErr_Clear();
106 return defaultvalue;
107 }
Raymond Hettinger5d654122009-02-03 02:12:10 +0000108 rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
Christian Heimes255f53b2007-12-08 15:33:56 +0000109 Py_DECREF(ro);
Raymond Hettingere8364232009-02-02 22:55:09 +0000110 return rv;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000111}
112
Guido van Rossume15dee51995-07-18 14:12:02 +0000113PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000114PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000115{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000116 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000118 if (o == NULL || key == NULL)
119 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000120
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000121 m = o->ob_type->tp_as_mapping;
122 if (m && m->mp_subscript)
123 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000124
Guido van Rossum21308241998-08-13 16:44:44 +0000125 if (o->ob_type->tp_as_sequence) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000126 if (PyIndex_Check(key)) {
127 Py_ssize_t key_value;
128 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000129 if (key_value == -1 && PyErr_Occurred())
130 return NULL;
131 return PySequence_GetItem(o, key_value);
132 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000133 else if (o->ob_type->tp_as_sequence->sq_item)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000134 return type_error("sequence index must "
135 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000136 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000137
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000138 return type_error("'%.200s' object is unsubscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000139}
140
141int
Fred Drake79912472000-07-09 04:06:11 +0000142PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000143{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000144 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000145
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000146 if (o == NULL || key == NULL || value == NULL) {
147 null_error();
148 return -1;
149 }
150 m = o->ob_type->tp_as_mapping;
151 if (m && m->mp_ass_subscript)
152 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000153
Guido van Rossum21308241998-08-13 16:44:44 +0000154 if (o->ob_type->tp_as_sequence) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000155 if (PyIndex_Check(key)) {
156 Py_ssize_t key_value;
157 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000158 if (key_value == -1 && PyErr_Occurred())
159 return -1;
160 return PySequence_SetItem(o, key_value, value);
161 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000162 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000163 type_error("sequence index must be "
164 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000165 return -1;
166 }
Guido van Rossum21308241998-08-13 16:44:44 +0000167 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000168
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000169 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000170 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000171}
172
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000173int
Fred Drake79912472000-07-09 04:06:11 +0000174PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000175{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000176 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000177
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000178 if (o == NULL || key == NULL) {
179 null_error();
180 return -1;
181 }
182 m = o->ob_type->tp_as_mapping;
183 if (m && m->mp_ass_subscript)
184 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000185
Guido van Rossum21308241998-08-13 16:44:44 +0000186 if (o->ob_type->tp_as_sequence) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000187 if (PyIndex_Check(key)) {
188 Py_ssize_t key_value;
189 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000190 if (key_value == -1 && PyErr_Occurred())
191 return -1;
192 return PySequence_DelItem(o, key_value);
193 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000194 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000195 type_error("sequence index must be "
196 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000197 return -1;
198 }
Guido van Rossum21308241998-08-13 16:44:44 +0000199 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000200
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000201 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000202 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000203}
204
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000205int
206PyObject_DelItemString(PyObject *o, char *key)
207{
208 PyObject *okey;
209 int ret;
210
211 if (o == NULL || key == NULL) {
212 null_error();
213 return -1;
214 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000215 okey = PyUnicode_FromString(key);
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000216 if (okey == NULL)
217 return -1;
218 ret = PyObject_DelItem(o, okey);
219 Py_DECREF(okey);
220 return ret;
221}
222
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000223/* We release the buffer right after use of this function which could
Guido van Rossum98297ee2007-11-06 21:34:58 +0000224 cause issues later on. Don't use these functions in new code.
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000225 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000226int
227PyObject_AsCharBuffer(PyObject *obj,
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000228 const char **buffer,
229 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000230{
231 PyBufferProcs *pb;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000232 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000233
234 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
235 null_error();
236 return -1;
237 }
238 pb = obj->ob_type->tp_as_buffer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000239 if (pb == NULL || pb->bf_getbuffer == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 PyErr_SetString(PyExc_TypeError,
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000241 "expected an object with the buffer interface");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000242 return -1;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000243 }
Travis E. Oliphantddacf962007-10-13 21:03:27 +0000244 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000245
246 *buffer = view.buf;
247 *buffer_len = view.len;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000248 if (pb->bf_releasebuffer != NULL)
249 (*pb->bf_releasebuffer)(obj, &view);
Benjamin Peterson9edd2bd2008-08-27 00:31:37 +0000250 Py_XDECREF(view.obj);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000251 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000253
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254int
255PyObject_CheckReadBuffer(PyObject *obj)
256{
Guido van Rossum98297ee2007-11-06 21:34:58 +0000257 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000258 Py_buffer view;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259
260 if (pb == NULL ||
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000261 pb->bf_getbuffer == NULL)
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000262 return 0;
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000263 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000264 PyErr_Clear();
265 return 0;
266 }
Benjamin Peterson60320cb2008-09-26 21:49:22 +0000267 PyBuffer_Release(&view);
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000268 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000269}
270
271int PyObject_AsReadBuffer(PyObject *obj,
272 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000273 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000274{
275 PyBufferProcs *pb;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000276 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000277
278 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
279 null_error();
280 return -1;
281 }
282 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000283 if (pb == NULL ||
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000284 pb->bf_getbuffer == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000285 PyErr_SetString(PyExc_TypeError,
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000286 "expected an object with a buffer interface");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000287 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000289
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000290 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000291
292 *buffer = view.buf;
293 *buffer_len = view.len;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000294 if (pb->bf_releasebuffer != NULL)
295 (*pb->bf_releasebuffer)(obj, &view);
Benjamin Peterson9edd2bd2008-08-27 00:31:37 +0000296 Py_XDECREF(view.obj);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000297 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000298}
299
300int PyObject_AsWriteBuffer(PyObject *obj,
301 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000302 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000303{
304 PyBufferProcs *pb;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000305 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000306
307 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
308 null_error();
309 return -1;
310 }
311 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 if (pb == NULL ||
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000313 pb->bf_getbuffer == NULL ||
314 ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +0000315 PyErr_SetString(PyExc_TypeError,
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000316 "expected an object with a writable buffer interface");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000317 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000318 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000319
320 *buffer = view.buf;
321 *buffer_len = view.len;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000322 if (pb->bf_releasebuffer != NULL)
323 (*pb->bf_releasebuffer)(obj, &view);
Benjamin Peterson9edd2bd2008-08-27 00:31:37 +0000324 Py_XDECREF(view.obj);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000325 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000326}
327
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000328/* Buffer C-API for Python 3.0 */
329
330int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000331PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000332{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000333 if (!PyObject_CheckBuffer(obj)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +0000334 PyErr_Format(PyExc_TypeError,
335 "'%100s' does not have the buffer interface",
Christian Heimes90aa7642007-12-19 02:45:37 +0000336 Py_TYPE(obj)->tp_name);
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000337 return -1;
338 }
339 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000340}
341
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000342static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000343_IsFortranContiguous(Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000344{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000345 Py_ssize_t sd, dim;
346 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000347
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000348 if (view->ndim == 0) return 1;
349 if (view->strides == NULL) return (view->ndim == 1);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000350
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000351 sd = view->itemsize;
352 if (view->ndim == 1) return (view->shape[0] == 1 ||
353 sd == view->strides[0]);
354 for (i=0; i<view->ndim; i++) {
355 dim = view->shape[i];
356 if (dim == 0) return 1;
357 if (view->strides[i] != sd) return 0;
358 sd *= dim;
359 }
360 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000361}
362
363static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000364_IsCContiguous(Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000365{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000366 Py_ssize_t sd, dim;
367 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000368
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000369 if (view->ndim == 0) return 1;
370 if (view->strides == NULL) return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000371
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000372 sd = view->itemsize;
373 if (view->ndim == 1) return (view->shape[0] == 1 ||
374 sd == view->strides[0]);
375 for (i=view->ndim-1; i>=0; i--) {
376 dim = view->shape[i];
377 if (dim == 0) return 1;
378 if (view->strides[i] != sd) return 0;
379 sd *= dim;
380 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000381 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000382}
383
384int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000385PyBuffer_IsContiguous(Py_buffer *view, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000386{
387
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000388 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000389
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000390 if (fort == 'C')
391 return _IsCContiguous(view);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000392 else if (fort == 'F')
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000393 return _IsFortranContiguous(view);
394 else if (fort == 'A')
395 return (_IsCContiguous(view) || _IsFortranContiguous(view));
396 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000397}
398
399
Guido van Rossum98297ee2007-11-06 21:34:58 +0000400void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000401PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000402{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000403 char* pointer;
404 int i;
405 pointer = (char *)view->buf;
406 for (i = 0; i < view->ndim; i++) {
407 pointer += view->strides[i]*indices[i];
408 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
409 pointer = *((char**)pointer) + view->suboffsets[i];
410 }
411 }
412 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000413}
414
415
Guido van Rossum98297ee2007-11-06 21:34:58 +0000416void
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000417_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape)
418{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000419 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000420
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000421 for (k=0; k<nd; k++) {
422 if (index[k] < shape[k]-1) {
423 index[k]++;
424 break;
425 }
426 else {
427 index[k] = 0;
428 }
429 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000430}
431
Guido van Rossum98297ee2007-11-06 21:34:58 +0000432void
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000433_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape)
434{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000435 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000436
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000437 for (k=nd-1; k>=0; k--) {
438 if (index[k] < shape[k]-1) {
439 index[k]++;
440 break;
441 }
442 else {
443 index[k] = 0;
444 }
445 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000446}
447
448 /* view is not checked for consistency in either of these. It is
Guido van Rossum98297ee2007-11-06 21:34:58 +0000449 assumed that the size of the buffer is view->len in
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000450 view->len / view->itemsize elements.
451 */
452
Guido van Rossum98297ee2007-11-06 21:34:58 +0000453int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000454PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000455{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000456 int k;
457 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
458 Py_ssize_t *indices, elements;
459 char *dest, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000460
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000461 if (len > view->len) {
462 len = view->len;
463 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000464
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000465 if (PyBuffer_IsContiguous(view, fort)) {
466 /* simplest copy is all that is needed */
467 memcpy(buf, view->buf, len);
468 return 0;
469 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000470
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000471 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000472
Neal Norwitzfaa54a32007-08-19 04:23:20 +0000473 /* XXX(nnorwitz): need to check for overflow! */
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000474 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
475 if (indices == NULL) {
476 PyErr_NoMemory();
477 return -1;
478 }
479 for (k=0; k<view->ndim;k++) {
480 indices[k] = 0;
481 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000482
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000483 if (fort == 'F') {
484 addone = _add_one_to_index_F;
485 }
486 else {
487 addone = _add_one_to_index_C;
488 }
489 dest = buf;
490 /* XXX : This is not going to be the fastest code in the world
Guido van Rossum98297ee2007-11-06 21:34:58 +0000491 several optimizations are possible.
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000492 */
493 elements = len / view->itemsize;
494 while (elements--) {
495 addone(view->ndim, indices, view->shape);
496 ptr = PyBuffer_GetPointer(view, indices);
497 memcpy(dest, ptr, view->itemsize);
498 dest += view->itemsize;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000499 }
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000500 PyMem_Free(indices);
501 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000502}
503
504int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000505PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000506{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000507 int k;
508 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
509 Py_ssize_t *indices, elements;
510 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000511
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000512 if (len > view->len) {
513 len = view->len;
514 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000515
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000516 if (PyBuffer_IsContiguous(view, fort)) {
517 /* simplest copy is all that is needed */
518 memcpy(view->buf, buf, len);
519 return 0;
520 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000521
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000522 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000523
Neal Norwitzfaa54a32007-08-19 04:23:20 +0000524 /* XXX(nnorwitz): need to check for overflow! */
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000525 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
526 if (indices == NULL) {
527 PyErr_NoMemory();
528 return -1;
529 }
530 for (k=0; k<view->ndim;k++) {
531 indices[k] = 0;
532 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000533
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000534 if (fort == 'F') {
535 addone = _add_one_to_index_F;
536 }
537 else {
538 addone = _add_one_to_index_C;
539 }
540 src = buf;
541 /* XXX : This is not going to be the fastest code in the world
Guido van Rossum98297ee2007-11-06 21:34:58 +0000542 several optimizations are possible.
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000543 */
544 elements = len / view->itemsize;
545 while (elements--) {
546 addone(view->ndim, indices, view->shape);
547 ptr = PyBuffer_GetPointer(view, indices);
548 memcpy(ptr, src, view->itemsize);
549 src += view->itemsize;
550 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000551
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000552 PyMem_Free(indices);
553 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000554}
555
Guido van Rossum98297ee2007-11-06 21:34:58 +0000556int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000557{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000558 Py_buffer view_dest, view_src;
559 int k;
560 Py_ssize_t *indices, elements;
561 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000562
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000563 if (!PyObject_CheckBuffer(dest) ||
564 !PyObject_CheckBuffer(src)) {
565 PyErr_SetString(PyExc_TypeError,
566 "both destination and source must have the "\
567 "buffer interface");
568 return -1;
569 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000570
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000571 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
572 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000573 PyBuffer_Release(&view_dest);
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000574 return -1;
575 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000576
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000577 if (view_dest.len < view_src.len) {
Guido van Rossum98297ee2007-11-06 21:34:58 +0000578 PyErr_SetString(PyExc_BufferError,
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000579 "destination is too small to receive data from source");
Martin v. Löwis423be952008-08-13 15:53:07 +0000580 PyBuffer_Release(&view_dest);
581 PyBuffer_Release(&view_src);
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000582 return -1;
583 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000584
Guido van Rossum98297ee2007-11-06 21:34:58 +0000585 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000586 PyBuffer_IsContiguous(&view_src, 'C')) ||
Guido van Rossum98297ee2007-11-06 21:34:58 +0000587 (PyBuffer_IsContiguous(&view_dest, 'F') &&
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000588 PyBuffer_IsContiguous(&view_src, 'F'))) {
589 /* simplest copy is all that is needed */
590 memcpy(view_dest.buf, view_src.buf, view_src.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000591 PyBuffer_Release(&view_dest);
592 PyBuffer_Release(&view_src);
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000593 return 0;
594 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000595
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000596 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000597
Neal Norwitzfaa54a32007-08-19 04:23:20 +0000598 /* XXX(nnorwitz): need to check for overflow! */
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000599 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
600 if (indices == NULL) {
601 PyErr_NoMemory();
Martin v. Löwis423be952008-08-13 15:53:07 +0000602 PyBuffer_Release(&view_dest);
603 PyBuffer_Release(&view_src);
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000604 return -1;
605 }
606 for (k=0; k<view_src.ndim;k++) {
607 indices[k] = 0;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000608 }
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000609 elements = 1;
610 for (k=0; k<view_src.ndim; k++) {
Neal Norwitzfaa54a32007-08-19 04:23:20 +0000611 /* XXX(nnorwitz): can this overflow? */
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000612 elements *= view_src.shape[k];
613 }
614 while (elements--) {
615 _add_one_to_index_C(view_src.ndim, indices, view_src.shape);
616 dptr = PyBuffer_GetPointer(&view_dest, indices);
617 sptr = PyBuffer_GetPointer(&view_src, indices);
618 memcpy(dptr, sptr, view_src.itemsize);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000619 }
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000620 PyMem_Free(indices);
Martin v. Löwis423be952008-08-13 15:53:07 +0000621 PyBuffer_Release(&view_dest);
622 PyBuffer_Release(&view_src);
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000623 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000624}
625
626void
627PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000628 Py_ssize_t *strides, int itemsize,
629 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000630{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000631 int k;
632 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000633
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000634 sd = itemsize;
635 if (fort == 'F') {
636 for (k=0; k<nd; k++) {
637 strides[k] = sd;
638 sd *= shape[k];
Guido van Rossum98297ee2007-11-06 21:34:58 +0000639 }
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000640 }
641 else {
642 for (k=nd-1; k>=0; k--) {
643 strides[k] = sd;
644 sd *= shape[k];
645 }
646 }
647 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000648}
649
650int
Martin v. Löwis423be952008-08-13 15:53:07 +0000651PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000652 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000653{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000654 if (view == NULL) return 0;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000655 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
656 (readonly == 1)) {
657 PyErr_SetString(PyExc_BufferError,
658 "Object is not writable.");
659 return -1;
660 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000661
Martin v. Löwis423be952008-08-13 15:53:07 +0000662 view->obj = obj;
Martin v. Löwis74bbea72008-08-14 20:32:30 +0000663 if (obj)
664 Py_INCREF(obj);
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000665 view->buf = buf;
666 view->len = len;
667 view->readonly = readonly;
668 view->itemsize = 1;
669 view->format = NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000670 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +0000671 view->format = "B";
672 view->ndim = 1;
673 view->shape = NULL;
674 if ((flags & PyBUF_ND) == PyBUF_ND)
675 view->shape = &(view->len);
676 view->strides = NULL;
677 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
678 view->strides = &(view->itemsize);
679 view->suboffsets = NULL;
680 view->internal = NULL;
681 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000682}
683
Martin v. Löwis423be952008-08-13 15:53:07 +0000684void
685PyBuffer_Release(Py_buffer *view)
686{
687 PyObject *obj = view->obj;
Martin v. Löwis74bbea72008-08-14 20:32:30 +0000688 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
689 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
690 Py_XDECREF(obj);
691 view->obj = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000692}
693
Eric Smith8fd3eba2008-02-17 19:48:00 +0000694PyObject *
695PyObject_Format(PyObject *obj, PyObject *format_spec)
696{
697 static PyObject * str__format__ = NULL;
698 PyObject *meth;
699 PyObject *empty = NULL;
700 PyObject *result = NULL;
701
702 /* Initialize cached value */
703 if (str__format__ == NULL) {
704 /* Initialize static variable needed by _PyType_Lookup */
705 str__format__ = PyUnicode_FromString("__format__");
706 if (str__format__ == NULL)
707 goto done;
708 }
709
710 /* If no format_spec is provided, use an empty string */
711 if (format_spec == NULL) {
712 empty = PyUnicode_FromUnicode(NULL, 0);
713 format_spec = empty;
714 }
715
716 /* Make sure the type is initialized. float gets initialized late */
717 if (Py_TYPE(obj)->tp_dict == NULL)
718 if (PyType_Ready(Py_TYPE(obj)) < 0)
719 goto done;
720
721 /* Find the (unbound!) __format__ method (a borrowed reference) */
722 meth = _PyType_Lookup(Py_TYPE(obj), str__format__);
723 if (meth == NULL) {
724 PyErr_Format(PyExc_TypeError,
725 "Type %.100s doesn't define __format__",
726 Py_TYPE(obj)->tp_name);
727 goto done;
728 }
729
730 /* And call it, binding it to the value */
731 result = PyObject_CallFunctionObjArgs(meth, obj, format_spec, NULL);
732
733 if (result && !PyUnicode_Check(result)) {
734 PyErr_SetString(PyExc_TypeError,
735 "__format__ method did not return string");
736 Py_DECREF(result);
737 result = NULL;
738 goto done;
739 }
740
741done:
742 Py_XDECREF(empty);
743 return result;
744}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000745/* Operations on numbers */
746
747int
Fred Drake79912472000-07-09 04:06:11 +0000748PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000749{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000750 return o && o->ob_type->tp_as_number &&
751 (o->ob_type->tp_as_number->nb_int ||
752 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000753}
754
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000756
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000757#define NB_SLOT(x) offsetof(PyNumberMethods, x)
758#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000759 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000760#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000761 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000762
763/*
764 Calling scheme used for binary operations:
765
Neal Norwitz4886cc32006-08-21 17:06:07 +0000766 Order operations are tried until either a valid result or error:
767 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000768
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000769 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
770 v->ob_type
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000771 */
772
773static PyObject *
774binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000775{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000776 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000777 binaryfunc slotv = NULL;
778 binaryfunc slotw = NULL;
779
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000780 if (v->ob_type->tp_as_number != NULL)
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000781 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000782 if (w->ob_type != v->ob_type &&
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000783 w->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000784 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000785 if (slotw == slotv)
786 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000787 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000788 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000789 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
790 x = slotw(v, w);
791 if (x != Py_NotImplemented)
792 return x;
793 Py_DECREF(x); /* can't do it */
794 slotw = NULL;
795 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000796 x = slotv(v, w);
797 if (x != Py_NotImplemented)
798 return x;
799 Py_DECREF(x); /* can't do it */
800 }
801 if (slotw) {
802 x = slotw(v, w);
803 if (x != Py_NotImplemented)
804 return x;
805 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000806 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000807 Py_INCREF(Py_NotImplemented);
808 return Py_NotImplemented;
809}
Guido van Rossum77660912002-04-16 16:32:50 +0000810
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000811static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000812binop_type_error(PyObject *v, PyObject *w, const char *op_name)
813{
814 PyErr_Format(PyExc_TypeError,
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000815 "unsupported operand type(s) for %.100s: "
816 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000817 op_name,
818 v->ob_type->tp_name,
819 w->ob_type->tp_name);
820 return NULL;
821}
822
823static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000824binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
825{
826 PyObject *result = binary_op1(v, w, op_slot);
827 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000828 Py_DECREF(result);
829 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000830 }
831 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000832}
833
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000834
835/*
836 Calling scheme used for ternary operations:
837
Neal Norwitz4886cc32006-08-21 17:06:07 +0000838 Order operations are tried until either a valid result or error:
839 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000840 */
841
842static PyObject *
843ternary_op(PyObject *v,
844 PyObject *w,
845 PyObject *z,
846 const int op_slot,
847 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000848{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000849 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000850 PyObject *x = NULL;
851 ternaryfunc slotv = NULL;
852 ternaryfunc slotw = NULL;
853 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000854
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000855 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000856 mw = w->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000857 if (mv != NULL)
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000858 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000859 if (w->ob_type != v->ob_type &&
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000860 mw != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000861 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000862 if (slotw == slotv)
863 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000864 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000865 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000866 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
867 x = slotw(v, w, z);
868 if (x != Py_NotImplemented)
869 return x;
870 Py_DECREF(x); /* can't do it */
871 slotw = NULL;
872 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000873 x = slotv(v, w, z);
874 if (x != Py_NotImplemented)
875 return x;
876 Py_DECREF(x); /* can't do it */
877 }
878 if (slotw) {
879 x = slotw(v, w, z);
880 if (x != Py_NotImplemented)
881 return x;
882 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000883 }
884 mz = z->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000885 if (mz != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000886 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000887 if (slotz == slotv || slotz == slotw)
888 slotz = NULL;
889 if (slotz) {
890 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000891 if (x != Py_NotImplemented)
892 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000893 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000894 }
895 }
896
Guido van Rossum5c66a262001-10-22 04:12:44 +0000897 if (z == Py_None)
898 PyErr_Format(
899 PyExc_TypeError,
900 "unsupported operand type(s) for ** or pow(): "
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000901 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000902 v->ob_type->tp_name,
903 w->ob_type->tp_name);
904 else
905 PyErr_Format(
906 PyExc_TypeError,
907 "unsupported operand type(s) for pow(): "
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000908 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000909 v->ob_type->tp_name,
910 w->ob_type->tp_name,
911 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000912 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000913}
914
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000915#define BINARY_FUNC(func, op, op_name) \
916 PyObject * \
917 func(PyObject *v, PyObject *w) { \
918 return binary_op(v, w, NB_SLOT(op), op_name); \
919 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000920
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000921BINARY_FUNC(PyNumber_Or, nb_or, "|")
922BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
923BINARY_FUNC(PyNumber_And, nb_and, "&")
924BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
925BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
926BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000927BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000928
929PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000930PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000931{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000932 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
933 if (result == Py_NotImplemented) {
934 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000935 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000936 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000937 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000938 }
Armin Rigofd163f92005-12-29 15:59:19 +0000939 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000940 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000941 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000942}
943
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000944static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000945sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000946{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000947 Py_ssize_t count;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000948 if (PyIndex_Check(n)) {
949 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000950 if (count == -1 && PyErr_Occurred())
951 return NULL;
952 }
953 else {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000954 return type_error("can't multiply sequence by "
955 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000956 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000957 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000958}
959
960PyObject *
961PyNumber_Multiply(PyObject *v, PyObject *w)
962{
963 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
964 if (result == Py_NotImplemented) {
965 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
966 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000967 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000968 if (mv && mv->sq_repeat) {
969 return sequence_repeat(mv->sq_repeat, v, w);
970 }
971 else if (mw && mw->sq_repeat) {
972 return sequence_repeat(mw->sq_repeat, w, v);
973 }
974 result = binop_type_error(v, w, "*");
975 }
976 return result;
977}
978
Guido van Rossume15dee51995-07-18 14:12:02 +0000979PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000980PyNumber_FloorDivide(PyObject *v, PyObject *w)
981{
Guido van Rossum4668b002001-08-08 05:00:18 +0000982 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
983}
984
985PyObject *
986PyNumber_TrueDivide(PyObject *v, PyObject *w)
987{
Guido van Rossum4668b002001-08-08 05:00:18 +0000988 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
989}
990
991PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000992PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000993{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000994 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000995}
996
997PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000998PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000999{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001000 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001001}
1002
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001003/* Binary in-place operators */
1004
1005/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001006 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001007
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001008 - If the left hand object has the appropriate struct members, and
1009 they are filled, call the appropriate function and return the
1010 result. No coercion is done on the arguments; the left-hand object
1011 is the one the operation is performed on, and it's up to the
1012 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001013
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001014 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001015 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001016
1017 */
1018
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001019static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001020binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001021{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001022 PyNumberMethods *mv = v->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001023 if (mv != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001024 binaryfunc slot = NB_BINOP(mv, iop_slot);
1025 if (slot) {
1026 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001027 if (x != Py_NotImplemented) {
1028 return x;
1029 }
1030 Py_DECREF(x);
1031 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001032 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001033 return binary_op1(v, w, op_slot);
1034}
1035
1036static PyObject *
1037binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1038 const char *op_name)
1039{
1040 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1041 if (result == Py_NotImplemented) {
1042 Py_DECREF(result);
1043 return binop_type_error(v, w, op_name);
1044 }
1045 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001046}
1047
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001048#define INPLACE_BINOP(func, iop, op, op_name) \
1049 PyObject * \
1050 func(PyObject *v, PyObject *w) { \
1051 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001052 }
1053
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001054INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1055INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1056INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1057INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1058INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1059INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001060
1061PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001062PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1063{
Guido van Rossum4668b002001-08-08 05:00:18 +00001064 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1065 NB_SLOT(nb_floor_divide), "//=");
1066}
1067
1068PyObject *
1069PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1070{
Guido van Rossum4668b002001-08-08 05:00:18 +00001071 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1072 NB_SLOT(nb_true_divide), "/=");
1073}
1074
1075PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001076PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1077{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001078 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1079 NB_SLOT(nb_add));
1080 if (result == Py_NotImplemented) {
1081 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1082 Py_DECREF(result);
1083 if (m != NULL) {
1084 binaryfunc f = NULL;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00001085 f = m->sq_inplace_concat;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001086 if (f == NULL)
1087 f = m->sq_concat;
1088 if (f != NULL)
1089 return (*f)(v, w);
1090 }
1091 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001092 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001093 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001094}
1095
1096PyObject *
1097PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1098{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001099 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1100 NB_SLOT(nb_multiply));
1101 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001102 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001103 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1104 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1105 Py_DECREF(result);
1106 if (mv != NULL) {
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001107 f = mv->sq_inplace_repeat;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001108 if (f == NULL)
1109 f = mv->sq_repeat;
1110 if (f != NULL)
1111 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001112 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001113 else if (mw != NULL) {
1114 /* Note that the right hand operand should not be
1115 * mutated in this case so sq_inplace_repeat is not
1116 * used. */
1117 if (mw->sq_repeat)
1118 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001119 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001120 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001121 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001122 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001123}
1124
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001125PyObject *
1126PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1127{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001128 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1129 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001130}
1131
1132PyObject *
1133PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1134{
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001135 if (v->ob_type->tp_as_number &&
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001136 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1137 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001138 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001139 else {
1140 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1141 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001142}
1143
1144
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001145/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001146
1147PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001148PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001149{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150 PyNumberMethods *m;
1151
1152 if (o == NULL)
1153 return null_error();
1154 m = o->ob_type->tp_as_number;
1155 if (m && m->nb_negative)
1156 return (*m->nb_negative)(o);
1157
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001158 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001159}
1160
1161PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001162PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001163{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001164 PyNumberMethods *m;
1165
1166 if (o == NULL)
1167 return null_error();
1168 m = o->ob_type->tp_as_number;
1169 if (m && m->nb_positive)
1170 return (*m->nb_positive)(o);
1171
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001172 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001173}
1174
1175PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001176PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001177{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178 PyNumberMethods *m;
1179
1180 if (o == NULL)
1181 return null_error();
1182 m = o->ob_type->tp_as_number;
1183 if (m && m->nb_invert)
1184 return (*m->nb_invert)(o);
1185
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001186 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001187}
1188
1189PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001190PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001191{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001192 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001193
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001194 if (o == NULL)
1195 return null_error();
1196 m = o->ob_type->tp_as_number;
1197 if (m && m->nb_absolute)
1198 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001199
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001200 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001201}
1202
Guido van Rossum98297ee2007-11-06 21:34:58 +00001203/* Return a Python Int or Long from the object item
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001204 Raise TypeError if the result is not an int-or-long
Guido van Rossum98297ee2007-11-06 21:34:58 +00001205 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001206*/
1207PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001208PyNumber_Index(PyObject *item)
1209{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001210 PyObject *result = NULL;
1211 if (item == NULL)
1212 return null_error();
Neal Norwitz1fe5f382007-08-31 04:32:55 +00001213 if (PyLong_Check(item)) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001214 Py_INCREF(item);
1215 return item;
1216 }
1217 if (PyIndex_Check(item)) {
Trent Nelson71792202008-04-11 23:02:37 +00001218 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz1fe5f382007-08-31 04:32:55 +00001219 if (result && !PyLong_Check(result)) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001220 PyErr_Format(PyExc_TypeError,
Guido van Rossum032a2842007-02-26 05:44:27 +00001221 "__index__ returned non-int "
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001222 "(type %.200s)",
1223 result->ob_type->tp_name);
1224 Py_DECREF(result);
1225 return NULL;
1226 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001227 }
Trent Nelson71792202008-04-11 23:02:37 +00001228 else {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001229 PyErr_Format(PyExc_TypeError,
1230 "'%.200s' object cannot be interpreted "
Guido van Rossum032a2842007-02-26 05:44:27 +00001231 "as an integer", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001232 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001233 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001234}
1235
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001236/* Return an error on Overflow only if err is not NULL*/
1237
1238Py_ssize_t
1239PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1240{
1241 Py_ssize_t result;
1242 PyObject *runerr;
1243 PyObject *value = PyNumber_Index(item);
1244 if (value == NULL)
1245 return -1;
1246
Christian Heimes217cfd12007-12-02 14:31:20 +00001247 /* We're done if PyLong_AsSsize_t() returns without error. */
1248 result = PyLong_AsSsize_t(value);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001249 if (result != -1 || !(runerr = PyErr_Occurred()))
1250 goto finish;
1251
1252 /* Error handling code -- only manage OverflowError differently */
Guido van Rossum98297ee2007-11-06 21:34:58 +00001253 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001254 goto finish;
1255
1256 PyErr_Clear();
Guido van Rossum98297ee2007-11-06 21:34:58 +00001257 /* If no error-handling desired then the default clipping
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001258 is sufficient.
1259 */
1260 if (!err) {
1261 assert(PyLong_Check(value));
Guido van Rossum98297ee2007-11-06 21:34:58 +00001262 /* Whether or not it is less than or equal to
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001263 zero is determined by the sign of ob_size
1264 */
Guido van Rossum98297ee2007-11-06 21:34:58 +00001265 if (_PyLong_Sign(value) < 0)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001266 result = PY_SSIZE_T_MIN;
1267 else
1268 result = PY_SSIZE_T_MAX;
1269 }
1270 else {
1271 /* Otherwise replace the error with caller's error object. */
1272 PyErr_Format(err,
Guido van Rossum98297ee2007-11-06 21:34:58 +00001273 "cannot fit '%.200s' into an index-sized integer",
1274 item->ob_type->tp_name);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001275 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001276
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001277 finish:
1278 Py_DECREF(value);
1279 return result;
1280}
1281
1282
Christian Heimes15ebc882008-02-04 18:48:49 +00001283PyObject *
1284_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1285{
1286 static PyObject *int_name = NULL;
1287 if (int_name == NULL) {
1288 int_name = PyUnicode_InternFromString("__int__");
1289 if (int_name == NULL)
1290 return NULL;
1291 }
1292
1293 if (integral && !PyLong_Check(integral)) {
1294 /* Don't go through tp_as_number->nb_int to avoid
1295 hitting the classic class fallback to __trunc__. */
1296 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1297 if (int_func == NULL) {
1298 PyErr_Clear(); /* Raise a different error. */
1299 goto non_integral_error;
1300 }
1301 Py_DECREF(integral);
1302 integral = PyEval_CallObject(int_func, NULL);
1303 Py_DECREF(int_func);
1304 if (integral && !PyLong_Check(integral)) {
1305 goto non_integral_error;
1306 }
1307 }
1308 return integral;
1309
1310non_integral_error:
1311 PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name);
1312 Py_DECREF(integral);
1313 return NULL;
1314}
1315
1316
Guido van Rossum9e896b32000-04-05 20:11:21 +00001317/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001318static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001319long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001320{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001321 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001322 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001323
Guido van Rossum4c08d552000-03-10 22:55:18 +00001324 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001325 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001326 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001327 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001328 PyErr_SetString(PyExc_ValueError,
Guido van Rossumddefaf32007-01-14 03:31:43 +00001329 "null byte in argument for int()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001330 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001331 return NULL;
1332 }
1333 return x;
1334}
1335
Guido van Rossume15dee51995-07-18 14:12:02 +00001336PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001337PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001338{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001339 PyNumberMethods *m;
Christian Heimes15ebc882008-02-04 18:48:49 +00001340 static PyObject *trunc_name = NULL;
1341 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001342 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001343 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001344
Christian Heimes15ebc882008-02-04 18:48:49 +00001345 if (trunc_name == NULL) {
1346 trunc_name = PyUnicode_InternFromString("__trunc__");
1347 if (trunc_name == NULL)
1348 return NULL;
1349 }
1350
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001351 if (o == NULL)
1352 return null_error();
Guido van Rossumddefaf32007-01-14 03:31:43 +00001353 if (PyLong_CheckExact(o)) {
1354 Py_INCREF(o);
1355 return o;
1356 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001357 m = o->ob_type->tp_as_number;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001358 if (m && m->nb_int) { /* This should include subclasses of int */
1359 PyObject *res = m->nb_int(o);
1360 if (res && !PyLong_Check(res)) {
1361 PyErr_Format(PyExc_TypeError,
1362 "__int__ returned non-int (type %.200s)",
1363 res->ob_type->tp_name);
1364 Py_DECREF(res);
1365 return NULL;
1366 }
1367 return res;
1368 }
Mark Dickinsone5e298f2009-01-12 20:49:19 +00001369 if (PyLong_Check(o)) /* An int subclass without nb_int */
Tim Petersdb30ac42002-03-02 04:14:21 +00001370 return _PyLong_Copy((PyLongObject *)o);
Christian Heimes15ebc882008-02-04 18:48:49 +00001371 trunc_func = PyObject_GetAttr(o, trunc_name);
1372 if (trunc_func) {
1373 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1374 PyObject *int_instance;
1375 Py_DECREF(trunc_func);
1376 /* __trunc__ is specified to return an Integral type,
1377 but long() needs to return a long. */
1378 int_instance = _PyNumber_ConvertIntegralToInt(
1379 truncated,
1380 "__trunc__ returned non-Integral (type %.200s)");
1381 return int_instance;
1382 }
1383 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1384
Christian Heimes72b710a2008-05-26 13:28:38 +00001385 if (PyBytes_Check(o))
Christian Heimes15ebc882008-02-04 18:48:49 +00001386 /* need to do extra error checking that PyLong_FromString()
1387 * doesn't do. In particular long('9.5') must raise an
1388 * exception, not truncate the float.
1389 */
Christian Heimes72b710a2008-05-26 13:28:38 +00001390 return long_from_string(PyBytes_AS_STRING(o),
1391 PyBytes_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +00001392 if (PyUnicode_Check(o))
1393 /* The above check is done in PyLong_FromUnicode(). */
1394 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1395 PyUnicode_GET_SIZE(o),
1396 10);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001397 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1398 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001399
Guido van Rossumddefaf32007-01-14 03:31:43 +00001400 return type_error("int() argument must be a string or a "
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001401 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001402}
1403
1404PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001405PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001406{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001407 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001408
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001409 if (o == NULL)
1410 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001411 m = o->ob_type->tp_as_number;
1412 if (m && m->nb_float) { /* This should include subclasses of float */
1413 PyObject *res = m->nb_float(o);
1414 if (res && !PyFloat_Check(res)) {
1415 PyErr_Format(PyExc_TypeError,
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00001416 "__float__ returned non-float (type %.200s)",
1417 res->ob_type->tp_name);
Brett Cannonc3647ac2005-04-26 03:45:26 +00001418 Py_DECREF(res);
1419 return NULL;
1420 }
1421 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001422 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001423 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001424 PyFloatObject *po = (PyFloatObject *)o;
1425 return PyFloat_FromDouble(po->ob_fval);
1426 }
Georg Brandl428f0642007-03-18 18:35:15 +00001427 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001428}
1429
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001430
1431PyObject *
1432PyNumber_ToBase(PyObject *n, int base)
1433{
Christian Heimesa156e092008-02-16 07:38:31 +00001434 PyObject *res = NULL;
Raymond Hettinger5c960b82008-06-24 22:28:56 +00001435 PyObject *index = PyNumber_Index(n);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001436
1437 if (!index)
1438 return NULL;
Christian Heimesa156e092008-02-16 07:38:31 +00001439 if (PyLong_Check(index))
1440 res = _PyLong_Format(index, base);
1441 else
1442 /* It should not be possible to get here, as
1443 PyNumber_Index already has a check for the same
1444 condition */
1445 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1446 "int or long");
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001447 Py_DECREF(index);
1448 return res;
1449}
1450
1451
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001452/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001453
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001454int
Fred Drake79912472000-07-09 04:06:11 +00001455PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001456{
Thomas Wouterscf297e42007-02-23 15:07:44 +00001457 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
1458 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001459 return s != NULL && s->ob_type->tp_as_sequence &&
1460 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001461}
1462
Martin v. Löwis18e16552006-02-15 17:27:45 +00001463Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001464PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001465{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001467
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001468 if (s == NULL) {
1469 null_error();
1470 return -1;
1471 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001472
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001473 m = s->ob_type->tp_as_sequence;
1474 if (m && m->sq_length)
1475 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001476
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001477 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001478 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001479}
1480
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001481#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001482Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001483PySequence_Length(PyObject *s)
1484{
1485 return PySequence_Size(s);
1486}
1487#define PySequence_Length PySequence_Size
1488
Guido van Rossume15dee51995-07-18 14:12:02 +00001489PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001490PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001491{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001492 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001493
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001494 if (s == NULL || o == NULL)
1495 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001496
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001497 m = s->ob_type->tp_as_sequence;
1498 if (m && m->sq_concat)
1499 return m->sq_concat(s, o);
1500
Armin Rigofd163f92005-12-29 15:59:19 +00001501 /* Instances of user classes defining an __add__() method only
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00001502 have an nb_add slot, not an sq_concat slot. So we fall back
Armin Rigofd163f92005-12-29 15:59:19 +00001503 to nb_add if both arguments appear to be sequences. */
1504 if (PySequence_Check(s) && PySequence_Check(o)) {
1505 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1506 if (result != Py_NotImplemented)
1507 return result;
1508 Py_DECREF(result);
1509 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001510 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001511}
1512
1513PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001514PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001515{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001516 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001517
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001518 if (o == NULL)
1519 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001520
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001521 m = o->ob_type->tp_as_sequence;
1522 if (m && m->sq_repeat)
1523 return m->sq_repeat(o, count);
1524
Armin Rigofd163f92005-12-29 15:59:19 +00001525 /* Instances of user classes defining a __mul__() method only
1526 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1527 to nb_multiply if o appears to be a sequence. */
1528 if (PySequence_Check(o)) {
1529 PyObject *n, *result;
Christian Heimes217cfd12007-12-02 14:31:20 +00001530 n = PyLong_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001531 if (n == NULL)
1532 return NULL;
1533 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1534 Py_DECREF(n);
1535 if (result != Py_NotImplemented)
1536 return result;
1537 Py_DECREF(result);
1538 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001539 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001540}
1541
1542PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001543PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1544{
1545 PySequenceMethods *m;
1546
1547 if (s == NULL || o == NULL)
1548 return null_error();
1549
1550 m = s->ob_type->tp_as_sequence;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001551 if (m && m->sq_inplace_concat)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001552 return m->sq_inplace_concat(s, o);
1553 if (m && m->sq_concat)
1554 return m->sq_concat(s, o);
1555
Armin Rigofd163f92005-12-29 15:59:19 +00001556 if (PySequence_Check(s) && PySequence_Check(o)) {
1557 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1558 NB_SLOT(nb_add));
1559 if (result != Py_NotImplemented)
1560 return result;
1561 Py_DECREF(result);
1562 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001563 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001564}
1565
1566PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001567PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001568{
1569 PySequenceMethods *m;
1570
1571 if (o == NULL)
1572 return null_error();
1573
1574 m = o->ob_type->tp_as_sequence;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001575 if (m && m->sq_inplace_repeat)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001576 return m->sq_inplace_repeat(o, count);
1577 if (m && m->sq_repeat)
1578 return m->sq_repeat(o, count);
1579
Armin Rigofd163f92005-12-29 15:59:19 +00001580 if (PySequence_Check(o)) {
1581 PyObject *n, *result;
Christian Heimes217cfd12007-12-02 14:31:20 +00001582 n = PyLong_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001583 if (n == NULL)
1584 return NULL;
1585 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1586 NB_SLOT(nb_multiply));
1587 Py_DECREF(n);
1588 if (result != Py_NotImplemented)
1589 return result;
1590 Py_DECREF(result);
1591 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001592 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001593}
1594
1595PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001596PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001597{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001598 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001599
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001600 if (s == NULL)
1601 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001602
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001603 m = s->ob_type->tp_as_sequence;
1604 if (m && m->sq_item) {
1605 if (i < 0) {
1606 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001607 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001608 if (l < 0)
1609 return NULL;
1610 i += l;
1611 }
1612 }
1613 return m->sq_item(s, i);
1614 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001615
Georg Brandl86b2fb92008-07-16 03:43:04 +00001616 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001617}
1618
1619PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001620PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001621{
Thomas Wouters1d75a792000-08-17 22:37:32 +00001622 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001623
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001624 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001625
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001626 mp = s->ob_type->tp_as_mapping;
1627 if (mp->mp_subscript) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001628 PyObject *res;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001629 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001630 if (!slice)
1631 return NULL;
1632 res = mp->mp_subscript(s, slice);
1633 Py_DECREF(slice);
1634 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001635 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001636
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001637 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001638}
1639
1640int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001641PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001642{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001643 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001644
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001645 if (s == NULL) {
1646 null_error();
1647 return -1;
1648 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001649
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001650 m = s->ob_type->tp_as_sequence;
1651 if (m && m->sq_ass_item) {
1652 if (i < 0) {
1653 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001654 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001655 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001656 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001657 i += l;
1658 }
1659 }
1660 return m->sq_ass_item(s, i, o);
1661 }
1662
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001663 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001664 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001665}
1666
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001667int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001668PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001669{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001670 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001671
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001672 if (s == NULL) {
1673 null_error();
1674 return -1;
1675 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001676
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001677 m = s->ob_type->tp_as_sequence;
1678 if (m && m->sq_ass_item) {
1679 if (i < 0) {
1680 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001681 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001682 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001683 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001684 i += l;
1685 }
1686 }
1687 return m->sq_ass_item(s, i, (PyObject *)NULL);
1688 }
1689
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001690 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001691 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001692}
1693
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001694int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001695PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001696{
Thomas Wouters1d75a792000-08-17 22:37:32 +00001697 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001698
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001699 if (s == NULL) {
1700 null_error();
1701 return -1;
1702 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001703
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001704 mp = s->ob_type->tp_as_mapping;
1705 if (mp->mp_ass_subscript) {
Thomas Wouters1d75a792000-08-17 22:37:32 +00001706 int res;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001707 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001708 if (!slice)
1709 return -1;
1710 res = mp->mp_ass_subscript(s, slice, o);
1711 Py_DECREF(slice);
1712 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001713 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001714
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001715 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001716 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001717}
1718
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001719int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001720PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001721{
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001722 PyMappingMethods *mp;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001723
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001724 if (s == NULL) {
1725 null_error();
1726 return -1;
1727 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001728
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001729 mp = s->ob_type->tp_as_mapping;
1730 if (mp->mp_ass_subscript) {
1731 int res;
1732 PyObject *slice = _PySlice_FromIndices(i1, i2);
1733 if (!slice)
1734 return -1;
1735 res = mp->mp_ass_subscript(s, slice, NULL);
1736 Py_DECREF(slice);
1737 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001738 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001739 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001740 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001741}
1742
Guido van Rossume15dee51995-07-18 14:12:02 +00001743PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001744PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001745{
Tim Peters6912d4d2001-05-05 03:56:37 +00001746 PyObject *it; /* iter(v) */
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00001747 Py_ssize_t n; /* guess for result tuple size */
Raymond Hettingere8364232009-02-02 22:55:09 +00001748 PyObject *result = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001749 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001750
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001751 if (v == NULL)
1752 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001753
Tim Peters6912d4d2001-05-05 03:56:37 +00001754 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001755 if (PyTuple_CheckExact(v)) {
1756 /* Note that we can't know whether it's safe to return
1757 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001758 to exact tuples here. In contrast, lists always make
1759 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760 Py_INCREF(v);
1761 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001762 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001763 if (PyList_Check(v))
1764 return PyList_AsTuple(v);
1765
Tim Peters6912d4d2001-05-05 03:56:37 +00001766 /* Get iterator. */
1767 it = PyObject_GetIter(v);
1768 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001769 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001770
Tim Peters6912d4d2001-05-05 03:56:37 +00001771 /* Guess result size and allocate space. */
Christian Heimes255f53b2007-12-08 15:33:56 +00001772 n = _PyObject_LengthHint(v, 10);
Raymond Hettingere8364232009-02-02 22:55:09 +00001773 if (n == -1)
1774 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001775 result = PyTuple_New(n);
1776 if (result == NULL)
1777 goto Fail;
1778
1779 /* Fill the tuple. */
1780 for (j = 0; ; ++j) {
1781 PyObject *item = PyIter_Next(it);
1782 if (item == NULL) {
1783 if (PyErr_Occurred())
1784 goto Fail;
1785 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001786 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001787 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001788 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001789 /* The over-allocation strategy can grow a bit faster
Guido van Rossum98297ee2007-11-06 21:34:58 +00001790 than for lists because unlike lists the
Raymond Hettinger4d012592004-12-16 10:38:38 +00001791 over-allocation isn't permanent -- we reclaim
1792 the excess before the end of this routine.
1793 So, grow by ten and then add 25%.
1794 */
1795 n += 10;
1796 n += n >> 2;
1797 if (n < oldn) {
1798 /* Check for overflow */
1799 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001800 Py_DECREF(item);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001801 goto Fail;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001802 }
Tim Peters4324aa32001-05-28 22:30:08 +00001803 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001804 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001805 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001806 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001807 }
1808 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001809 }
1810
Tim Peters6912d4d2001-05-05 03:56:37 +00001811 /* Cut tuple back if guess was too large. */
1812 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001813 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001814 goto Fail;
1815
1816 Py_DECREF(it);
1817 return result;
1818
1819Fail:
1820 Py_XDECREF(result);
1821 Py_DECREF(it);
1822 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001823}
1824
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001825PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001826PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001827{
Tim Petersf553f892001-05-01 20:45:31 +00001828 PyObject *result; /* result list */
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00001829 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001830
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001831 if (v == NULL)
1832 return null_error();
1833
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001834 result = PyList_New(0);
1835 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001836 return NULL;
1837
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001838 rv = _PyList_Extend((PyListObject *)result, v);
1839 if (rv == NULL) {
1840 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001841 return NULL;
1842 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001843 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001844 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001845}
1846
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001847PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001848PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001849{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001850 PyObject *it;
1851
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001852 if (v == NULL)
1853 return null_error();
1854
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001855 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001856 Py_INCREF(v);
1857 return v;
1858 }
1859
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00001860 it = PyObject_GetIter(v);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001861 if (it == NULL) {
1862 if (PyErr_ExceptionMatches(PyExc_TypeError))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001863 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001864 return NULL;
1865 }
1866
Raymond Hettinger193814c2004-12-18 19:00:59 +00001867 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001868 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001869
1870 return v;
1871}
1872
Tim Peters16a77ad2001-09-08 04:00:12 +00001873/* Iterate over seq. Result depends on the operation:
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00001874 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1875 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1876 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00001877 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1878*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001879Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001880_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001881{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001882 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001883 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1884 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001885
Tim Peters16a77ad2001-09-08 04:00:12 +00001886 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001887 null_error();
1888 return -1;
1889 }
Tim Peters75f8e352001-05-05 11:33:43 +00001890
Tim Peters16a77ad2001-09-08 04:00:12 +00001891 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001892 if (it == NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001893 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001894 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001895 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001896
Tim Peters16a77ad2001-09-08 04:00:12 +00001897 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001898 for (;;) {
1899 int cmp;
1900 PyObject *item = PyIter_Next(it);
1901 if (item == NULL) {
1902 if (PyErr_Occurred())
1903 goto Fail;
1904 break;
1905 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001906
1907 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001908 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001909 if (cmp < 0)
1910 goto Fail;
1911 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001912 switch (operation) {
1913 case PY_ITERSEARCH_COUNT:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001914 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001915 PyErr_SetString(PyExc_OverflowError,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001916 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001917 goto Fail;
1918 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001919 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001920 break;
1921
1922 case PY_ITERSEARCH_INDEX:
1923 if (wrapped) {
1924 PyErr_SetString(PyExc_OverflowError,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001925 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001926 goto Fail;
1927 }
1928 goto Done;
1929
1930 case PY_ITERSEARCH_CONTAINS:
1931 n = 1;
1932 goto Done;
1933
1934 default:
1935 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001936 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001937 }
1938
1939 if (operation == PY_ITERSEARCH_INDEX) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001940 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00001941 wrapped = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00001943 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001944 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001945
1946 if (operation != PY_ITERSEARCH_INDEX)
1947 goto Done;
1948
1949 PyErr_SetString(PyExc_ValueError,
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00001950 "sequence.index(x): x not in sequence");
Tim Peters16a77ad2001-09-08 04:00:12 +00001951 /* fall into failure code */
1952Fail:
1953 n = -1;
1954 /* fall through */
1955Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001956 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001957 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001958
Guido van Rossume15dee51995-07-18 14:12:02 +00001959}
1960
Tim Peters16a77ad2001-09-08 04:00:12 +00001961/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001962Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001963PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001964{
Tim Peters16a77ad2001-09-08 04:00:12 +00001965 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001966}
1967
Tim Peterscb8d3682001-05-05 21:05:01 +00001968/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001969 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001970 */
1971int
1972PySequence_Contains(PyObject *seq, PyObject *ob)
1973{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001974 Py_ssize_t result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001975 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00001976 if (sqm != NULL && sqm->sq_contains != NULL)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001977 return (*sqm->sq_contains)(seq, ob);
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001978 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1979 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001980}
1981
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001982/* Backwards compatibility */
1983#undef PySequence_In
1984int
Fred Drake79912472000-07-09 04:06:11 +00001985PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001986{
1987 return PySequence_Contains(w, v);
1988}
1989
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001990Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001991PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001992{
Tim Peters16a77ad2001-09-08 04:00:12 +00001993 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001994}
1995
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001996/* Operations on mappings */
1997
1998int
Fred Drake79912472000-07-09 04:06:11 +00001999PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002000{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00002001 return o && o->ob_type->tp_as_mapping &&
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002002 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00002003}
2004
Martin v. Löwis18e16552006-02-15 17:27:45 +00002005Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002006PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002007{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002008 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002009
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002010 if (o == NULL) {
2011 null_error();
2012 return -1;
2013 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002014
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002015 m = o->ob_type->tp_as_mapping;
2016 if (m && m->mp_length)
2017 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002018
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002019 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002020 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002021}
2022
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002023#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002024Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002025PyMapping_Length(PyObject *o)
2026{
2027 return PyMapping_Size(o);
2028}
2029#define PyMapping_Length PyMapping_Size
2030
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002031PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002032PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002033{
2034 PyObject *okey, *r;
2035
2036 if (key == NULL)
2037 return null_error();
2038
Martin v. Löwis5b222132007-06-10 09:51:05 +00002039 okey = PyUnicode_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002040 if (okey == NULL)
2041 return NULL;
2042 r = PyObject_GetItem(o, okey);
2043 Py_DECREF(okey);
2044 return r;
2045}
2046
2047int
Fred Drake79912472000-07-09 04:06:11 +00002048PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002049{
2050 PyObject *okey;
2051 int r;
2052
2053 if (key == NULL) {
2054 null_error();
2055 return -1;
2056 }
2057
Martin v. Löwis5b222132007-06-10 09:51:05 +00002058 okey = PyUnicode_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002059 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002060 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002061 r = PyObject_SetItem(o, okey, value);
2062 Py_DECREF(okey);
2063 return r;
2064}
2065
2066int
Fred Drake79912472000-07-09 04:06:11 +00002067PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002068{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002069 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002070
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002071 v = PyMapping_GetItemString(o, key);
2072 if (v) {
2073 Py_DECREF(v);
2074 return 1;
2075 }
2076 PyErr_Clear();
2077 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002078}
2079
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002080int
Fred Drake79912472000-07-09 04:06:11 +00002081PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002082{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002083 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002084
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002085 v = PyObject_GetItem(o, key);
2086 if (v) {
2087 Py_DECREF(v);
2088 return 1;
2089 }
2090 PyErr_Clear();
2091 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002092}
2093
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002094PyObject *
2095PyMapping_Keys(PyObject *o)
2096{
2097 PyObject *keys;
2098 PyObject *fast;
2099
2100 if (PyDict_CheckExact(o))
2101 return PyDict_Keys(o);
2102 keys = PyObject_CallMethod(o, "keys", NULL);
2103 if (keys == NULL)
2104 return NULL;
2105 fast = PySequence_Fast(keys, "o.keys() are not iterable");
2106 Py_DECREF(keys);
2107 return fast;
2108}
2109
2110PyObject *
2111PyMapping_Items(PyObject *o)
2112{
2113 PyObject *items;
2114 PyObject *fast;
2115
2116 if (PyDict_CheckExact(o))
2117 return PyDict_Items(o);
2118 items = PyObject_CallMethod(o, "items", NULL);
2119 if (items == NULL)
2120 return NULL;
2121 fast = PySequence_Fast(items, "o.items() are not iterable");
2122 Py_DECREF(items);
2123 return fast;
2124}
2125
2126PyObject *
2127PyMapping_Values(PyObject *o)
2128{
2129 PyObject *values;
2130 PyObject *fast;
2131
2132 if (PyDict_CheckExact(o))
2133 return PyDict_Values(o);
2134 values = PyObject_CallMethod(o, "values", NULL);
2135 if (values == NULL)
2136 return NULL;
2137 fast = PySequence_Fast(values, "o.values() are not iterable");
2138 Py_DECREF(values);
2139 return fast;
2140}
2141
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002142/* Operations on callable objects */
2143
2144/* XXX PyCallable_Check() is in object.c */
2145
Guido van Rossume15dee51995-07-18 14:12:02 +00002146PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002147PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002148{
Guido van Rossum5560b742001-09-14 16:47:50 +00002149 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002150}
Guido van Rossume15dee51995-07-18 14:12:02 +00002151
2152PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002153PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2154{
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00002155 ternaryfunc call;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002156
2157 if ((call = func->ob_type->tp_call) != NULL) {
Thomas Wouters89d996e2007-09-08 17:39:28 +00002158 PyObject *result;
2159 if (Py_EnterRecursiveCall(" while calling a Python object"))
2160 return NULL;
2161 result = (*call)(func, arg, kw);
2162 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002163 if (result == NULL && !PyErr_Occurred())
2164 PyErr_SetString(
2165 PyExc_SystemError,
2166 "NULL result without error in PyObject_Call");
2167 return result;
2168 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002169 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002170 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002171 return NULL;
2172}
2173
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002174static PyObject*
2175call_function_tail(PyObject *callable, PyObject *args)
2176{
2177 PyObject *retval;
2178
2179 if (args == NULL)
2180 return NULL;
2181
2182 if (!PyTuple_Check(args)) {
2183 PyObject *a;
2184
2185 a = PyTuple_New(1);
2186 if (a == NULL) {
2187 Py_DECREF(args);
2188 return NULL;
2189 }
2190 PyTuple_SET_ITEM(a, 0, args);
2191 args = a;
2192 }
2193 retval = PyObject_Call(callable, args, NULL);
2194
2195 Py_DECREF(args);
2196
2197 return retval;
2198}
2199
Tim Peters6d6c1a32001-08-02 04:15:00 +00002200PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002201PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002202{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002203 va_list va;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002204 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002205
Fred Drakeb92cf062001-10-27 06:16:31 +00002206 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002207 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002208
Fred Drakeb92cf062001-10-27 06:16:31 +00002209 if (format && *format) {
2210 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002211 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002212 va_end(va);
2213 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002214 else
2215 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002216
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002217 return call_function_tail(callable, args);
2218}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002219
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002220PyObject *
2221_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2222{
2223 va_list va;
2224 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002225
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002226 if (callable == NULL)
2227 return null_error();
2228
2229 if (format && *format) {
2230 va_start(va, format);
2231 args = _Py_VaBuildValue_SizeT(format, va);
2232 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002233 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002234 else
2235 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002236
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002237 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002238}
2239
2240PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002241PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002242{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002243 va_list va;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002244 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002245 PyObject *func = NULL;
2246 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002247
Fred Drakeb92cf062001-10-27 06:16:31 +00002248 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002249 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002250
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002251 func = PyObject_GetAttrString(o, name);
2252 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002253 PyErr_SetString(PyExc_AttributeError, name);
2254 return 0;
2255 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002256
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002257 if (!PyCallable_Check(func)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002258 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002259 goto exit;
2260 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002261
Fred Drakeb92cf062001-10-27 06:16:31 +00002262 if (format && *format) {
2263 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002264 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002265 va_end(va);
2266 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002267 else
2268 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002269
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002270 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002271
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002272 exit:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002273 /* args gets consumed in call_function_tail */
2274 Py_XDECREF(func);
2275
2276 return retval;
2277}
2278
2279PyObject *
2280_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2281{
2282 va_list va;
2283 PyObject *args;
2284 PyObject *func = NULL;
2285 PyObject *retval = NULL;
2286
2287 if (o == NULL || name == NULL)
2288 return null_error();
2289
2290 func = PyObject_GetAttrString(o, name);
2291 if (func == NULL) {
2292 PyErr_SetString(PyExc_AttributeError, name);
2293 return 0;
2294 }
2295
2296 if (!PyCallable_Check(func)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00002297 type_error("attribute of type '%.200s' is not callable", func);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002298 goto exit;
2299 }
2300
2301 if (format && *format) {
2302 va_start(va, format);
2303 args = _Py_VaBuildValue_SizeT(format, va);
2304 va_end(va);
2305 }
2306 else
2307 args = PyTuple_New(0);
2308
2309 retval = call_function_tail(func, args);
2310
2311 exit:
2312 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002313 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002314
2315 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002316}
Guido van Rossum823649d2001-03-21 18:40:58 +00002317
2318
Fred Drakeb421b8c2001-10-26 16:21:32 +00002319static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002320objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002321{
2322 int i, n = 0;
2323 va_list countva;
2324 PyObject *result, *tmp;
2325
2326#ifdef VA_LIST_IS_ARRAY
2327 memcpy(countva, va, sizeof(va_list));
2328#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002329#ifdef __va_copy
2330 __va_copy(countva, va);
2331#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002332 countva = va;
2333#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002334#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002335
2336 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2337 ++n;
2338 result = PyTuple_New(n);
2339 if (result != NULL && n > 0) {
2340 for (i = 0; i < n; ++i) {
2341 tmp = (PyObject *)va_arg(va, PyObject *);
2342 PyTuple_SET_ITEM(result, i, tmp);
2343 Py_INCREF(tmp);
2344 }
2345 }
2346 return result;
2347}
2348
2349PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002350PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002351{
2352 PyObject *args, *tmp;
2353 va_list vargs;
2354
2355 if (callable == NULL || name == NULL)
2356 return null_error();
2357
2358 callable = PyObject_GetAttr(callable, name);
2359 if (callable == NULL)
2360 return NULL;
2361
2362 /* count the args */
2363 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002364 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002365 va_end(vargs);
2366 if (args == NULL) {
2367 Py_DECREF(callable);
2368 return NULL;
2369 }
2370 tmp = PyObject_Call(callable, args, NULL);
2371 Py_DECREF(args);
2372 Py_DECREF(callable);
2373
2374 return tmp;
2375}
2376
2377PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002378PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002379{
2380 PyObject *args, *tmp;
2381 va_list vargs;
2382
2383 if (callable == NULL)
2384 return null_error();
2385
2386 /* count the args */
2387 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002388 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002389 va_end(vargs);
2390 if (args == NULL)
2391 return NULL;
2392 tmp = PyObject_Call(callable, args, NULL);
2393 Py_DECREF(args);
2394
2395 return tmp;
2396}
2397
2398
Guido van Rossum823649d2001-03-21 18:40:58 +00002399/* isinstance(), issubclass() */
2400
Barry Warsawf16951c2002-04-23 22:45:44 +00002401/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2402 * state that will almost never happen.
2403 *
2404 * 0. creating the __bases__ static string could get a MemoryError
2405 * 1. getattr(cls, '__bases__') could raise an AttributeError
2406 * 2. getattr(cls, '__bases__') could raise some other exception
2407 * 3. getattr(cls, '__bases__') could return a tuple
2408 * 4. getattr(cls, '__bases__') could return something other than a tuple
2409 *
2410 * Only state #3 is a non-error state and only it returns a non-NULL object
2411 * (it returns the retrieved tuple).
2412 *
2413 * Any raised AttributeErrors are masked by clearing the exception and
2414 * returning NULL. If an object other than a tuple comes out of __bases__,
2415 * then again, the return value is NULL. So yes, these two situations
2416 * produce exactly the same results: NULL is returned and no error is set.
2417 *
2418 * If some exception other than AttributeError is raised, then NULL is also
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00002419 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002420 * exception to be propagated along.
2421 *
2422 * Callers are expected to test for PyErr_Occurred() when the return value
2423 * is NULL to decide whether a valid exception should be propagated or not.
2424 * When there's no exception to propagate, it's customary for the caller to
2425 * set a TypeError.
2426 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002427static PyObject *
2428abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002429{
2430 static PyObject *__bases__ = NULL;
2431 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002432
2433 if (__bases__ == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00002434 __bases__ = PyUnicode_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002435 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002436 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002437 }
Martin v. Löwis5b222132007-06-10 09:51:05 +00002438 Py_ALLOW_RECURSION
Neil Schemenauer6b471292001-10-18 03:18:43 +00002439 bases = PyObject_GetAttr(cls, __bases__);
Martin v. Löwis5b222132007-06-10 09:51:05 +00002440 Py_END_ALLOW_RECURSION
Barry Warsawf16951c2002-04-23 22:45:44 +00002441 if (bases == NULL) {
2442 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2443 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002444 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002445 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002446 if (!PyTuple_Check(bases)) {
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00002447 Py_DECREF(bases);
Barry Warsawf16951c2002-04-23 22:45:44 +00002448 return NULL;
2449 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002450 return bases;
2451}
2452
2453
2454static int
2455abstract_issubclass(PyObject *derived, PyObject *cls)
2456{
Antoine Pitrouec569b72008-08-26 22:40:48 +00002457 PyObject *bases = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002458 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002459 int r = 0;
2460
Antoine Pitrouec569b72008-08-26 22:40:48 +00002461 while (1) {
2462 if (derived == cls)
2463 return 1;
2464 bases = abstract_get_bases(derived);
2465 if (bases == NULL) {
2466 if (PyErr_Occurred())
2467 return -1;
2468 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002469 }
Antoine Pitrouec569b72008-08-26 22:40:48 +00002470 n = PyTuple_GET_SIZE(bases);
2471 if (n == 0) {
2472 Py_DECREF(bases);
2473 return 0;
2474 }
2475 /* Avoid recursivity in the single inheritance case */
2476 if (n == 1) {
2477 derived = PyTuple_GET_ITEM(bases, 0);
2478 Py_DECREF(bases);
2479 continue;
2480 }
2481 for (i = 0; i < n; i++) {
2482 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2483 if (r != 0)
2484 break;
2485 }
2486 Py_DECREF(bases);
2487 return r;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002488 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002489}
2490
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002491static int
2492check_class(PyObject *cls, const char *error)
2493{
2494 PyObject *bases = abstract_get_bases(cls);
2495 if (bases == NULL) {
2496 /* Do not mask errors. */
2497 if (!PyErr_Occurred())
2498 PyErr_SetString(PyExc_TypeError, error);
2499 return 0;
2500 }
2501 Py_DECREF(bases);
2502 return -1;
2503}
2504
Brett Cannon4f653312004-03-20 22:52:14 +00002505static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002506recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002507{
2508 PyObject *icls;
2509 static PyObject *__class__ = NULL;
2510 int retval = 0;
2511
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002512 if (__class__ == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +00002513 __class__ = PyUnicode_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002514 if (__class__ == NULL)
2515 return -1;
2516 }
2517
Guido van Rossum45aecf42006-03-15 04:58:47 +00002518 if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002519 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002520 if (retval == 0) {
2521 PyObject *c = PyObject_GetAttr(inst, __class__);
2522 if (c == NULL) {
2523 PyErr_Clear();
2524 }
2525 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002526 if (c != (PyObject *)(inst->ob_type) &&
2527 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002528 retval = PyType_IsSubtype(
2529 (PyTypeObject *)c,
2530 (PyTypeObject *)cls);
2531 Py_DECREF(c);
2532 }
2533 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002534 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002535 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002536 if (!check_class(cls,
2537 "isinstance() arg 2 must be a class, type,"
2538 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002539 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002540 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002541 if (icls == NULL) {
2542 PyErr_Clear();
2543 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002544 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002545 else {
2546 retval = abstract_issubclass(icls, cls);
2547 Py_DECREF(icls);
2548 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002549 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002550
Guido van Rossum823649d2001-03-21 18:40:58 +00002551 return retval;
2552}
2553
2554int
Brett Cannon4f653312004-03-20 22:52:14 +00002555PyObject_IsInstance(PyObject *inst, PyObject *cls)
2556{
Christian Heimesa156e092008-02-16 07:38:31 +00002557 static PyObject *name = NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002558 PyObject *checker;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002559
2560 /* Quick test for an exact match */
2561 if (Py_TYPE(inst) == (PyTypeObject *)cls)
2562 return 1;
2563
Antoine Pitrouec569b72008-08-26 22:40:48 +00002564 if (PyTuple_Check(cls)) {
2565 Py_ssize_t i;
2566 Py_ssize_t n;
2567 int r = 0;
2568
2569 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2570 return -1;
2571 n = PyTuple_GET_SIZE(cls);
2572 for (i = 0; i < n; ++i) {
2573 PyObject *item = PyTuple_GET_ITEM(cls, i);
2574 r = PyObject_IsInstance(inst, item);
2575 if (r != 0)
2576 /* either found it, or got an error */
2577 break;
2578 }
2579 Py_LeaveRecursiveCall();
2580 return r;
2581 }
Christian Heimesa156e092008-02-16 07:38:31 +00002582 if (name == NULL) {
2583 name = PyUnicode_InternFromString("__instancecheck__");
2584 if (name == NULL)
2585 return -1;
2586 }
2587 checker = PyObject_GetAttr(cls, name);
Christian Heimese25f35e2008-03-20 10:49:03 +00002588 if (checker == NULL && PyErr_Occurred())
2589 PyErr_Clear();
Guido van Rossumadee45e2007-05-25 17:55:52 +00002590 if (checker != NULL) {
2591 PyObject *res;
2592 int ok = -1;
Guido van Rossum29478ef2007-05-29 00:39:44 +00002593 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2594 Py_DECREF(checker);
Guido van Rossumadee45e2007-05-25 17:55:52 +00002595 return ok;
Guido van Rossum29478ef2007-05-29 00:39:44 +00002596 }
Guido van Rossumadee45e2007-05-25 17:55:52 +00002597 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2598 Py_LeaveRecursiveCall();
2599 Py_DECREF(checker);
2600 if (res != NULL) {
2601 ok = PyObject_IsTrue(res);
2602 Py_DECREF(res);
2603 }
2604 return ok;
2605 }
Antoine Pitrouec569b72008-08-26 22:40:48 +00002606 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002607}
2608
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00002609static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002610recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002611{
Antoine Pitrouec569b72008-08-26 22:40:48 +00002612 if (PyType_Check(cls) && PyType_Check(derived)) {
2613 /* Fast path (non-recursive) */
2614 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002615 }
Antoine Pitrouec569b72008-08-26 22:40:48 +00002616 if (!check_class(derived,
2617 "issubclass() arg 1 must be a class"))
2618 return -1;
2619 if (!check_class(cls,
2620 "issubclass() arg 2 must be a class"
2621 " or tuple of classes"))
2622 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002623
Antoine Pitrouec569b72008-08-26 22:40:48 +00002624 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002625}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002626
Brett Cannon4f653312004-03-20 22:52:14 +00002627int
2628PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2629{
Christian Heimesa156e092008-02-16 07:38:31 +00002630 static PyObject *name = NULL;
Guido van Rossumadee45e2007-05-25 17:55:52 +00002631 PyObject *t, *v, *tb;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002632 PyObject *checker;
Christian Heimesa156e092008-02-16 07:38:31 +00002633
Antoine Pitrouec569b72008-08-26 22:40:48 +00002634 if (PyTuple_Check(cls)) {
2635 Py_ssize_t i;
2636 Py_ssize_t n;
2637 int r = 0;
2638
2639 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2640 return -1;
2641 n = PyTuple_GET_SIZE(cls);
2642 for (i = 0; i < n; ++i) {
2643 PyObject *item = PyTuple_GET_ITEM(cls, i);
2644 r = PyObject_IsSubclass(derived, item);
2645 if (r != 0)
2646 /* either found it, or got an error */
2647 break;
2648 }
2649 Py_LeaveRecursiveCall();
2650 return r;
2651 }
Christian Heimesa156e092008-02-16 07:38:31 +00002652 if (name == NULL) {
2653 name = PyUnicode_InternFromString("__subclasscheck__");
2654 if (name == NULL)
2655 return -1;
2656 }
Antoine Pitrouec569b72008-08-26 22:40:48 +00002657 PyErr_Fetch(&t, &v, &tb);
Christian Heimesa156e092008-02-16 07:38:31 +00002658 checker = PyObject_GetAttr(cls, name);
Guido van Rossumadee45e2007-05-25 17:55:52 +00002659 PyErr_Restore(t, v, tb);
2660 if (checker != NULL) {
2661 PyObject *res;
2662 int ok = -1;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002663 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
2664 Py_DECREF(checker);
Guido van Rossumadee45e2007-05-25 17:55:52 +00002665 return ok;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002666 }
Guido van Rossumadee45e2007-05-25 17:55:52 +00002667 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
2668 Py_LeaveRecursiveCall();
2669 Py_DECREF(checker);
2670 if (res != NULL) {
2671 ok = PyObject_IsTrue(res);
2672 Py_DECREF(res);
2673 }
2674 return ok;
2675 }
Antoine Pitrouec569b72008-08-26 22:40:48 +00002676 return recursive_issubclass(derived, cls);
2677}
2678
2679int
2680_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2681{
2682 return recursive_isinstance(inst, cls);
2683}
2684
2685int
2686_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2687{
2688 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002689}
2690
2691
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002692PyObject *
2693PyObject_GetIter(PyObject *o)
2694{
2695 PyTypeObject *t = o->ob_type;
2696 getiterfunc f = NULL;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002697 f = t->tp_iter;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002698 if (f == NULL) {
2699 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002700 return PySeqIter_New(o);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002701 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002702 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002703 else {
2704 PyObject *res = (*f)(o);
2705 if (res != NULL && !PyIter_Check(res)) {
2706 PyErr_Format(PyExc_TypeError,
2707 "iter() returned non-iterator "
2708 "of type '%.100s'",
2709 res->ob_type->tp_name);
2710 Py_DECREF(res);
2711 res = NULL;
2712 }
2713 return res;
2714 }
2715}
2716
Tim Petersf4848da2001-05-05 00:14:56 +00002717/* Return next item.
2718 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2719 * If the iteration terminates normally, return NULL and clear the
2720 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2721 * will be false.
Travis E. Oliphantfe9bed02007-10-12 23:27:53 +00002722 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002723 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002724PyObject *
2725PyIter_Next(PyObject *iter)
2726{
Tim Petersf4848da2001-05-05 00:14:56 +00002727 PyObject *result;
Tim Petersf4848da2001-05-05 00:14:56 +00002728 result = (*iter->ob_type->tp_iternext)(iter);
2729 if (result == NULL &&
2730 PyErr_Occurred() &&
2731 PyErr_ExceptionMatches(PyExc_StopIteration))
2732 PyErr_Clear();
2733 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002734}