blob: 3a50b7364d620d7fc0a4204aab83f14ddc1f12d7 [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
8#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00009 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000010
Martin v. Löwis5cb69362006-04-14 09:08:42 +000011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000013
14static PyObject *
Georg Brandlccff7852006-06-18 22:17:29 +000015type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000016{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000017 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
18 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000019}
20
Guido van Rossum052b7e11996-11-11 15:08:19 +000021static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000022null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000023{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000024 if (!PyErr_Occurred())
25 PyErr_SetString(PyExc_SystemError,
26 "null argument to internal routine");
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000030/* Operations on any object */
31
32int
Fred Drake79912472000-07-09 04:06:11 +000033PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000035 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000036
Antoine Pitrouc83ea132010-05-09 14:46:46 +000037 if (o1 == NULL || o2 == NULL) {
38 null_error();
39 return -1;
40 }
41 r = PyObject_Compare(o1, o2);
42 if (PyErr_Occurred())
43 return -1;
44 *result = r;
45 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +000046}
Guido van Rossume15dee51995-07-18 14:12:02 +000047
48PyObject *
Fred Drake79912472000-07-09 04:06:11 +000049PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000050{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000051 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000052
Antoine Pitrouc83ea132010-05-09 14:46:46 +000053 if (o == NULL)
54 return null_error();
55 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +000058}
59
Martin v. Löwis18e16552006-02-15 17:27:45 +000060Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000061PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000062{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Antoine Pitrouc83ea132010-05-09 14:46:46 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Antoine Pitrouc83ea132010-05-09 14:46:46 +000070 m = o->ob_type->tp_as_sequence;
71 if (m && m->sq_length)
72 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Antoine Pitrouc83ea132010-05-09 14:46:46 +000074 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075}
76
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000077#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000078Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000079PyObject_Length(PyObject *o)
80{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000081 return PyObject_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000082}
83#define PyObject_Length PyObject_Size
84
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000085
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000086/* The length hint function returns a non-negative value from o.__len__()
87 or o.__length_hint__(). If those methods aren't found or return a negative
Raymond Hettingerb5163702009-02-02 21:50:13 +000088 value, then the defaultvalue is returned. If one of the calls fails,
89 this function returns -1.
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000090*/
91
92Py_ssize_t
93_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
94{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000095 static PyObject *hintstrobj = NULL;
96 PyObject *ro, *hintmeth;
97 Py_ssize_t rv;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000098
Antoine Pitrouc83ea132010-05-09 14:46:46 +000099 /* try o.__len__() */
100 rv = PyObject_Size(o);
101 if (rv >= 0)
102 return rv;
103 if (PyErr_Occurred()) {
104 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
105 !PyErr_ExceptionMatches(PyExc_AttributeError))
106 return -1;
107 PyErr_Clear();
108 }
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000109
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000110 if (PyInstance_Check(o))
111 return defaultvalue;
112 /* try o.__length_hint__() */
113 hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
114 if (hintmeth == NULL) {
115 if (PyErr_Occurred())
116 return -1;
117 else
118 return defaultvalue;
119 }
120 ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
121 Py_DECREF(hintmeth);
122 if (ro == NULL) {
123 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
124 !PyErr_ExceptionMatches(PyExc_AttributeError))
125 return -1;
126 PyErr_Clear();
127 return defaultvalue;
128 }
Benjamin Peterson7d8a2e42012-07-14 17:53:55 -0700129 rv = PyNumber_Check(ro) ? PyInt_AsSsize_t(ro) : defaultvalue;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000130 Py_DECREF(ro);
131 return rv;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000132}
133
Guido van Rossume15dee51995-07-18 14:12:02 +0000134PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000135PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000136{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000137 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000138
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000139 if (o == NULL || key == NULL)
140 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000141
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000142 m = o->ob_type->tp_as_mapping;
143 if (m && m->mp_subscript)
144 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000145
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000146 if (o->ob_type->tp_as_sequence) {
147 if (PyIndex_Check(key)) {
148 Py_ssize_t key_value;
149 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
150 if (key_value == -1 && PyErr_Occurred())
151 return NULL;
152 return PySequence_GetItem(o, key_value);
153 }
154 else if (o->ob_type->tp_as_sequence->sq_item)
155 return type_error("sequence index must "
156 "be integer, not '%.200s'", key);
157 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000158
Raymond Hettinger7d1483c2011-11-20 10:38:53 -0800159 return type_error("'%.200s' object has no attribute '__getitem__'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000160}
161
162int
Fred Drake79912472000-07-09 04:06:11 +0000163PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000164{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000165 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000166
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000167 if (o == NULL || key == NULL || value == NULL) {
168 null_error();
169 return -1;
170 }
171 m = o->ob_type->tp_as_mapping;
172 if (m && m->mp_ass_subscript)
173 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000174
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000175 if (o->ob_type->tp_as_sequence) {
176 if (PyIndex_Check(key)) {
177 Py_ssize_t key_value;
178 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
179 if (key_value == -1 && PyErr_Occurred())
180 return -1;
181 return PySequence_SetItem(o, key_value, value);
182 }
183 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
184 type_error("sequence index must be "
185 "integer, not '%.200s'", key);
186 return -1;
187 }
188 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000189
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000190 type_error("'%.200s' object does not support item assignment", o);
191 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000192}
193
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000194int
Fred Drake79912472000-07-09 04:06:11 +0000195PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000196{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000197 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000198
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000199 if (o == NULL || key == NULL) {
200 null_error();
201 return -1;
202 }
203 m = o->ob_type->tp_as_mapping;
204 if (m && m->mp_ass_subscript)
205 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000206
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000207 if (o->ob_type->tp_as_sequence) {
208 if (PyIndex_Check(key)) {
209 Py_ssize_t key_value;
210 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
211 if (key_value == -1 && PyErr_Occurred())
212 return -1;
213 return PySequence_DelItem(o, key_value);
214 }
215 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
216 type_error("sequence index must be "
217 "integer, not '%.200s'", key);
218 return -1;
219 }
220 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000221
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000222 type_error("'%.200s' object does not support item deletion", o);
223 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000224}
225
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000226int
227PyObject_DelItemString(PyObject *o, char *key)
228{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000229 PyObject *okey;
230 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000231
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000232 if (o == NULL || key == NULL) {
233 null_error();
234 return -1;
235 }
236 okey = PyString_FromString(key);
237 if (okey == NULL)
238 return -1;
239 ret = PyObject_DelItem(o, okey);
240 Py_DECREF(okey);
241 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000242}
243
Brett Cannonea229bd2006-06-06 18:08:16 +0000244int
245PyObject_AsCharBuffer(PyObject *obj,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000246 const char **buffer,
247 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000248{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000249 PyBufferProcs *pb;
250 char *pp;
251 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000252
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000253 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
254 null_error();
255 return -1;
256 }
257 pb = obj->ob_type->tp_as_buffer;
258 if (pb == NULL ||
259 pb->bf_getcharbuffer == NULL ||
260 pb->bf_getsegcount == NULL) {
261 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger9c90e252015-10-08 21:14:15 -0400262 "expected a string or other character buffer object");
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000263 return -1;
264 }
265 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
266 PyErr_SetString(PyExc_TypeError,
267 "expected a single-segment buffer object");
268 return -1;
269 }
270 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
271 if (len < 0)
272 return -1;
273 *buffer = pp;
274 *buffer_len = len;
275 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000276}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000277
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000278int
279PyObject_CheckReadBuffer(PyObject *obj)
280{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000281 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000282
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000283 if (pb == NULL ||
284 pb->bf_getreadbuffer == NULL ||
285 pb->bf_getsegcount == NULL ||
286 (*pb->bf_getsegcount)(obj, NULL) != 1)
287 return 0;
288 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000289}
290
291int PyObject_AsReadBuffer(PyObject *obj,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000292 const void **buffer,
293 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000294{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000295 PyBufferProcs *pb;
296 void *pp;
297 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000298
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000299 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
300 null_error();
301 return -1;
302 }
303 pb = obj->ob_type->tp_as_buffer;
304 if (pb == NULL ||
305 pb->bf_getreadbuffer == NULL ||
306 pb->bf_getsegcount == NULL) {
307 PyErr_SetString(PyExc_TypeError,
308 "expected a readable buffer object");
309 return -1;
310 }
311 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
312 PyErr_SetString(PyExc_TypeError,
313 "expected a single-segment buffer object");
314 return -1;
315 }
316 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
317 if (len < 0)
318 return -1;
319 *buffer = pp;
320 *buffer_len = len;
321 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000322}
323
324int PyObject_AsWriteBuffer(PyObject *obj,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000325 void **buffer,
326 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000327{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000328 PyBufferProcs *pb;
329 void*pp;
330 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000331
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000332 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
333 null_error();
334 return -1;
335 }
336 pb = obj->ob_type->tp_as_buffer;
337 if (pb == NULL ||
338 pb->bf_getwritebuffer == NULL ||
339 pb->bf_getsegcount == NULL) {
340 PyErr_SetString(PyExc_TypeError,
341 "expected a writeable buffer object");
342 return -1;
343 }
344 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
345 PyErr_SetString(PyExc_TypeError,
346 "expected a single-segment buffer object");
347 return -1;
348 }
349 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
350 if (len < 0)
351 return -1;
352 *buffer = pp;
353 *buffer_len = len;
354 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000355}
356
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000357/* Buffer C-API for Python 3.0 */
358
359int
360PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
361{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000362 if (!PyObject_CheckBuffer(obj)) {
363 PyErr_Format(PyExc_TypeError,
364 "'%100s' does not have the buffer interface",
365 Py_TYPE(obj)->tp_name);
366 return -1;
367 }
368 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000369}
370
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000371static int
372_IsFortranContiguous(Py_buffer *view)
373{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000374 Py_ssize_t sd, dim;
375 int i;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000376
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000377 if (view->ndim == 0) return 1;
378 if (view->strides == NULL) return (view->ndim == 1);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000379
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000380 sd = view->itemsize;
381 if (view->ndim == 1) return (view->shape[0] == 1 ||
382 sd == view->strides[0]);
383 for (i=0; i<view->ndim; i++) {
384 dim = view->shape[i];
385 if (dim == 0) return 1;
386 if (view->strides[i] != sd) return 0;
387 sd *= dim;
388 }
389 return 1;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000390}
391
392static int
393_IsCContiguous(Py_buffer *view)
394{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000395 Py_ssize_t sd, dim;
396 int i;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000397
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000398 if (view->ndim == 0) return 1;
399 if (view->strides == NULL) return 1;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000400
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000401 sd = view->itemsize;
402 if (view->ndim == 1) return (view->shape[0] == 1 ||
403 sd == view->strides[0]);
404 for (i=view->ndim-1; i>=0; i--) {
405 dim = view->shape[i];
406 if (dim == 0) return 1;
407 if (view->strides[i] != sd) return 0;
408 sd *= dim;
409 }
410 return 1;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000411}
412
413int
414PyBuffer_IsContiguous(Py_buffer *view, char fort)
415{
416
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000417 if (view->suboffsets != NULL) return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000418
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000419 if (fort == 'C')
420 return _IsCContiguous(view);
421 else if (fort == 'F')
422 return _IsFortranContiguous(view);
423 else if (fort == 'A')
424 return (_IsCContiguous(view) || _IsFortranContiguous(view));
425 return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000426}
427
428
429void*
430PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
431{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000432 char* pointer;
433 int i;
434 pointer = (char *)view->buf;
435 for (i = 0; i < view->ndim; i++) {
436 pointer += view->strides[i]*indices[i];
437 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
438 pointer = *((char**)pointer) + view->suboffsets[i];
439 }
440 }
441 return (void*)pointer;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000442}
443
444
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000445void
Antoine Pitrou1fcdba82010-09-01 13:02:50 +0000446_Py_add_one_to_index_F(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000447{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000448 int k;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000449
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000450 for (k=0; k<nd; k++) {
451 if (index[k] < shape[k]-1) {
452 index[k]++;
453 break;
454 }
455 else {
456 index[k] = 0;
457 }
458 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000459}
460
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000461void
Antoine Pitrou1fcdba82010-09-01 13:02:50 +0000462_Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000463{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000464 int k;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000465
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000466 for (k=nd-1; k>=0; k--) {
467 if (index[k] < shape[k]-1) {
468 index[k]++;
469 break;
470 }
471 else {
472 index[k] = 0;
473 }
474 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000475}
476
477 /* view is not checked for consistency in either of these. It is
478 assumed that the size of the buffer is view->len in
479 view->len / view->itemsize elements.
480 */
481
482int
483PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
484{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000485 int k;
Antoine Pitrou1fcdba82010-09-01 13:02:50 +0000486 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000487 Py_ssize_t *indices, elements;
488 char *dest, *ptr;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000489
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000490 if (len > view->len) {
491 len = view->len;
492 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000493
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000494 if (PyBuffer_IsContiguous(view, fort)) {
495 /* simplest copy is all that is needed */
496 memcpy(buf, view->buf, len);
497 return 0;
498 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000499
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000500 /* Otherwise a more elaborate scheme is needed */
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000501
Stefan Krah5606cd92015-01-30 20:11:10 +0100502 /* view->ndim <= 64 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000503 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
504 if (indices == NULL) {
505 PyErr_NoMemory();
506 return -1;
507 }
508 for (k=0; k<view->ndim;k++) {
509 indices[k] = 0;
510 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000511
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000512 if (fort == 'F') {
Antoine Pitrou1fcdba82010-09-01 13:02:50 +0000513 addone = _Py_add_one_to_index_F;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000514 }
515 else {
Antoine Pitrou1fcdba82010-09-01 13:02:50 +0000516 addone = _Py_add_one_to_index_C;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000517 }
518 dest = buf;
519 /* XXX : This is not going to be the fastest code in the world
520 several optimizations are possible.
521 */
522 elements = len / view->itemsize;
523 while (elements--) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000524 ptr = PyBuffer_GetPointer(view, indices);
525 memcpy(dest, ptr, view->itemsize);
526 dest += view->itemsize;
Stefan Krah5606cd92015-01-30 20:11:10 +0100527 addone(view->ndim, indices, view->shape);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000528 }
529 PyMem_Free(indices);
530 return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000531}
532
533int
534PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
535{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000536 int k;
Antoine Pitrou1fcdba82010-09-01 13:02:50 +0000537 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000538 Py_ssize_t *indices, elements;
539 char *src, *ptr;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000540
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000541 if (len > view->len) {
542 len = view->len;
543 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000544
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000545 if (PyBuffer_IsContiguous(view, fort)) {
546 /* simplest copy is all that is needed */
547 memcpy(view->buf, buf, len);
548 return 0;
549 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000550
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000551 /* Otherwise a more elaborate scheme is needed */
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000552
Stefan Krah0a7fc532015-02-01 16:10:35 +0100553 /* view->ndim <= 64 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000554 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
555 if (indices == NULL) {
556 PyErr_NoMemory();
557 return -1;
558 }
559 for (k=0; k<view->ndim;k++) {
560 indices[k] = 0;
561 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000562
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000563 if (fort == 'F') {
Antoine Pitrou1fcdba82010-09-01 13:02:50 +0000564 addone = _Py_add_one_to_index_F;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000565 }
566 else {
Antoine Pitrou1fcdba82010-09-01 13:02:50 +0000567 addone = _Py_add_one_to_index_C;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000568 }
569 src = buf;
570 /* XXX : This is not going to be the fastest code in the world
571 several optimizations are possible.
572 */
573 elements = len / view->itemsize;
574 while (elements--) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000575 ptr = PyBuffer_GetPointer(view, indices);
576 memcpy(ptr, src, view->itemsize);
577 src += view->itemsize;
Stefan Krah0a7fc532015-02-01 16:10:35 +0100578 addone(view->ndim, indices, view->shape);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000579 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000580
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000581 PyMem_Free(indices);
582 return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000583}
584
585int PyObject_CopyData(PyObject *dest, PyObject *src)
586{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000587 Py_buffer view_dest, view_src;
588 int k;
589 Py_ssize_t *indices, elements;
590 char *dptr, *sptr;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000591
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000592 if (!PyObject_CheckBuffer(dest) ||
593 !PyObject_CheckBuffer(src)) {
594 PyErr_SetString(PyExc_TypeError,
595 "both destination and source must have the "\
596 "buffer interface");
597 return -1;
598 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000599
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000600 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
601 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
602 PyBuffer_Release(&view_dest);
603 return -1;
604 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000605
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000606 if (view_dest.len < view_src.len) {
607 PyErr_SetString(PyExc_BufferError,
608 "destination is too small to receive data from source");
609 PyBuffer_Release(&view_dest);
610 PyBuffer_Release(&view_src);
611 return -1;
612 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000613
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000614 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
615 PyBuffer_IsContiguous(&view_src, 'C')) ||
616 (PyBuffer_IsContiguous(&view_dest, 'F') &&
617 PyBuffer_IsContiguous(&view_src, 'F'))) {
618 /* simplest copy is all that is needed */
619 memcpy(view_dest.buf, view_src.buf, view_src.len);
620 PyBuffer_Release(&view_dest);
621 PyBuffer_Release(&view_src);
622 return 0;
623 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000624
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000625 /* Otherwise a more elaborate copy scheme is needed */
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000626
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000627 /* XXX(nnorwitz): need to check for overflow! */
628 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
629 if (indices == NULL) {
630 PyErr_NoMemory();
631 PyBuffer_Release(&view_dest);
632 PyBuffer_Release(&view_src);
633 return -1;
634 }
635 for (k=0; k<view_src.ndim;k++) {
636 indices[k] = 0;
637 }
638 elements = 1;
639 for (k=0; k<view_src.ndim; k++) {
640 /* XXX(nnorwitz): can this overflow? */
641 elements *= view_src.shape[k];
642 }
643 while (elements--) {
Antoine Pitrou1fcdba82010-09-01 13:02:50 +0000644 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000645 dptr = PyBuffer_GetPointer(&view_dest, indices);
646 sptr = PyBuffer_GetPointer(&view_src, indices);
647 memcpy(dptr, sptr, view_src.itemsize);
648 }
649 PyMem_Free(indices);
650 PyBuffer_Release(&view_dest);
651 PyBuffer_Release(&view_src);
652 return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000653}
654
655void
656PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000657 Py_ssize_t *strides, int itemsize,
658 char fort)
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000659{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000660 int k;
661 Py_ssize_t sd;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000662
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000663 sd = itemsize;
664 if (fort == 'F') {
665 for (k=0; k<nd; k++) {
666 strides[k] = sd;
667 sd *= shape[k];
668 }
669 }
670 else {
671 for (k=nd-1; k>=0; k--) {
672 strides[k] = sd;
673 sd *= shape[k];
674 }
675 }
676 return;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000677}
678
679int
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000680PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000681 int readonly, int flags)
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000682{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000683 if (view == NULL) return 0;
684 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
685 (readonly == 1)) {
686 PyErr_SetString(PyExc_BufferError,
687 "Object is not writable.");
688 return -1;
689 }
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000690
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000691 view->obj = obj;
692 if (obj)
693 Py_INCREF(obj);
694 view->buf = buf;
695 view->len = len;
696 view->readonly = readonly;
697 view->itemsize = 1;
698 view->format = NULL;
699 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
700 view->format = "B";
701 view->ndim = 1;
702 view->shape = NULL;
703 if ((flags & PyBUF_ND) == PyBUF_ND)
704 view->shape = &(view->len);
705 view->strides = NULL;
706 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
707 view->strides = &(view->itemsize);
708 view->suboffsets = NULL;
709 view->internal = NULL;
710 return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000711}
712
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000713void
714PyBuffer_Release(Py_buffer *view)
715{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000716 PyObject *obj = view->obj;
717 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
718 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
719 Py_XDECREF(obj);
720 view->obj = NULL;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000721}
722
Eric Smitha9f7d622008-02-17 19:46:49 +0000723PyObject *
724PyObject_Format(PyObject* obj, PyObject *format_spec)
725{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000726 PyObject *empty = NULL;
727 PyObject *result = NULL;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000728#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000729 int spec_is_unicode;
730 int result_is_unicode;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000731#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000732
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000733 /* If no format_spec is provided, use an empty string */
734 if (format_spec == NULL) {
735 empty = PyString_FromStringAndSize(NULL, 0);
736 format_spec = empty;
737 }
Eric Smitha9f7d622008-02-17 19:46:49 +0000738
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000739 /* Check the format_spec type, and make sure it's str or unicode */
Hirokazu Yamamoto1e234e82009-01-25 17:46:48 +0000740#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000741 if (PyUnicode_Check(format_spec))
742 spec_is_unicode = 1;
743 else if (PyString_Check(format_spec))
744 spec_is_unicode = 0;
745 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000746#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000747 if (!PyString_Check(format_spec)) {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000748#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000749 PyErr_Format(PyExc_TypeError,
750 "format expects arg 2 to be string "
751 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
752 goto done;
753 }
Eric Smitha9f7d622008-02-17 19:46:49 +0000754
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000755 /* Check for a __format__ method and call it. */
756 if (PyInstance_Check(obj)) {
757 /* We're an instance of a classic class */
Benjamin Peterson2aa6c382010-06-05 00:32:50 +0000758 PyObject *bound_method = PyObject_GetAttrString(obj, "__format__");
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000759 if (bound_method != NULL) {
760 result = PyObject_CallFunctionObjArgs(bound_method,
761 format_spec,
762 NULL);
763 Py_DECREF(bound_method);
764 } else {
765 PyObject *self_as_str = NULL;
766 PyObject *format_method = NULL;
767 Py_ssize_t format_len;
Eric Smitha9f7d622008-02-17 19:46:49 +0000768
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000769 PyErr_Clear();
770 /* Per the PEP, convert to str (or unicode,
771 depending on the type of the format
772 specifier). For new-style classes, this
773 logic is done by object.__format__(). */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000774#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000775 if (spec_is_unicode) {
776 format_len = PyUnicode_GET_SIZE(format_spec);
777 self_as_str = PyObject_Unicode(obj);
778 } else
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000779#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000780 {
781 format_len = PyString_GET_SIZE(format_spec);
782 self_as_str = PyObject_Str(obj);
783 }
784 if (self_as_str == NULL)
785 goto done1;
Eric Smithd44b2fc2010-04-02 12:30:56 +0000786
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000787 if (format_len > 0) {
788 /* See the almost identical code in
789 typeobject.c for new-style
790 classes. */
791 if (PyErr_WarnEx(
792 PyExc_PendingDeprecationWarning,
793 "object.__format__ with a non-empty "
794 "format string is deprecated", 1)
795 < 0) {
796 goto done1;
797 }
798 /* Eventually this will become an
799 error:
800 PyErr_Format(PyExc_TypeError,
801 "non-empty format string passed to "
802 "object.__format__");
803 goto done1;
804 */
805 }
Eric Smitha9f7d622008-02-17 19:46:49 +0000806
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000807 /* Then call str.__format__ on that result */
Benjamin Peterson2aa6c382010-06-05 00:32:50 +0000808 format_method = PyObject_GetAttrString(self_as_str, "__format__");
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000809 if (format_method == NULL) {
810 goto done1;
811 }
812 result = PyObject_CallFunctionObjArgs(format_method,
813 format_spec,
814 NULL);
Eric Smithd44b2fc2010-04-02 12:30:56 +0000815done1:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000816 Py_XDECREF(self_as_str);
817 Py_XDECREF(format_method);
818 if (result == NULL)
819 goto done;
820 }
821 } else {
822 /* Not an instance of a classic class, use the code
823 from py3k */
Benjamin Peterson3a2acb52010-06-05 00:38:22 +0000824 static PyObject *format_cache = NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +0000825
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000826 /* Find the (unbound!) __format__ method (a borrowed
827 reference) */
Benjamin Peterson2aa6c382010-06-05 00:32:50 +0000828 PyObject *method = _PyObject_LookupSpecial(obj, "__format__",
829 &format_cache);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000830 if (method == NULL) {
Benjamin Peterson2aa6c382010-06-05 00:32:50 +0000831 if (!PyErr_Occurred())
832 PyErr_Format(PyExc_TypeError,
833 "Type %.100s doesn't define __format__",
834 Py_TYPE(obj)->tp_name);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000835 goto done;
836 }
Benjamin Peterson2aa6c382010-06-05 00:32:50 +0000837 /* And call it. */
838 result = PyObject_CallFunctionObjArgs(method, format_spec, NULL);
Benjamin Petersond5adb5d2010-06-05 02:07:01 +0000839 Py_DECREF(method);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000840 }
Eric Smitha9f7d622008-02-17 19:46:49 +0000841
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000842 if (result == NULL)
843 goto done;
Eric Smitha9f7d622008-02-17 19:46:49 +0000844
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000845 /* Check the result type, and make sure it's str or unicode */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000846#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000847 if (PyUnicode_Check(result))
848 result_is_unicode = 1;
849 else if (PyString_Check(result))
850 result_is_unicode = 0;
851 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000852#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000853 if (!PyString_Check(result)) {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000854#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000855 PyErr_Format(PyExc_TypeError,
856 "%.100s.__format__ must return string or "
857 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
858 Py_TYPE(result)->tp_name);
859 Py_DECREF(result);
860 result = NULL;
861 goto done;
862 }
Eric Smitha9f7d622008-02-17 19:46:49 +0000863
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000864 /* Convert to unicode, if needed. Required if spec is unicode
865 and result is str */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000866#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000867 if (spec_is_unicode && !result_is_unicode) {
868 PyObject *tmp = PyObject_Unicode(result);
869 /* This logic works whether or not tmp is NULL */
870 Py_DECREF(result);
871 result = tmp;
872 }
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000873#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000874
875done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000876 Py_XDECREF(empty);
877 return result;
Eric Smitha9f7d622008-02-17 19:46:49 +0000878}
879
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000880/* Operations on numbers */
881
882int
Fred Drake79912472000-07-09 04:06:11 +0000883PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000884{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000885 return o && o->ob_type->tp_as_number &&
886 (o->ob_type->tp_as_number->nb_int ||
887 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000888}
889
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000890/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000891
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000892/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000893
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000894#define NB_SLOT(x) offsetof(PyNumberMethods, x)
895#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000896 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000897#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000898 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000899
900/*
901 Calling scheme used for binary operations:
902
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000903 v w Action
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000904 -------------------------------------------------------------------
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000905 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
906 new old v.op(v,w), coerce(v,w), v.op(v,w)
907 old new w.op(v,w), coerce(v,w), v.op(v,w)
908 old old coerce(v,w), v.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000909
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000910 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
911 v->ob_type
912
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000913 Legend:
914 -------
915 * new == new style number
916 * old == old style number
917 * Action indicates the order in which operations are tried until either
918 a valid result is produced or an error occurs.
919
920 */
921
922static PyObject *
923binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000924{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000925 PyObject *x;
926 binaryfunc slotv = NULL;
927 binaryfunc slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000928
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000929 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
930 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
931 if (w->ob_type != v->ob_type &&
932 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
933 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
934 if (slotw == slotv)
935 slotw = NULL;
936 }
937 if (slotv) {
938 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
939 x = slotw(v, w);
940 if (x != Py_NotImplemented)
941 return x;
942 Py_DECREF(x); /* can't do it */
943 slotw = NULL;
944 }
945 x = slotv(v, w);
946 if (x != Py_NotImplemented)
947 return x;
948 Py_DECREF(x); /* can't do it */
949 }
950 if (slotw) {
951 x = slotw(v, w);
952 if (x != Py_NotImplemented)
953 return x;
954 Py_DECREF(x); /* can't do it */
955 }
956 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
957 int err = PyNumber_CoerceEx(&v, &w);
958 if (err < 0) {
959 return NULL;
960 }
961 if (err == 0) {
962 PyNumberMethods *mv = v->ob_type->tp_as_number;
963 if (mv) {
964 binaryfunc slot;
965 slot = NB_BINOP(mv, op_slot);
966 if (slot) {
967 x = slot(v, w);
968 Py_DECREF(v);
969 Py_DECREF(w);
970 return x;
971 }
972 }
973 /* CoerceEx incremented the reference counts */
974 Py_DECREF(v);
975 Py_DECREF(w);
976 }
977 }
978 Py_INCREF(Py_NotImplemented);
979 return Py_NotImplemented;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000980}
Guido van Rossum77660912002-04-16 16:32:50 +0000981
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000982static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000983binop_type_error(PyObject *v, PyObject *w, const char *op_name)
984{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000985 PyErr_Format(PyExc_TypeError,
986 "unsupported operand type(s) for %.100s: "
987 "'%.100s' and '%.100s'",
988 op_name,
989 v->ob_type->tp_name,
990 w->ob_type->tp_name);
991 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000992}
993
994static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000995binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
996{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000997 PyObject *result = binary_op1(v, w, op_slot);
998 if (result == Py_NotImplemented) {
999 Py_DECREF(result);
1000 return binop_type_error(v, w, op_name);
1001 }
1002 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001003}
1004
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001005
1006/*
1007 Calling scheme used for ternary operations:
1008
Guido van Rossum84675ac2001-09-29 01:05:03 +00001009 *** In some cases, w.op is called before v.op; see binary_op1. ***
1010
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001011 v w z Action
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001012 -------------------------------------------------------------------
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001013 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
1014 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1015 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1016 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1017 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1018 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1019 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1020 old old old coerce(v,w,z), v.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001021
1022 Legend:
1023 -------
1024 * new == new style number
1025 * old == old style number
1026 * Action indicates the order in which operations are tried until either
1027 a valid result is produced or an error occurs.
1028 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
1029 only if z != Py_None; if z == Py_None, then it is treated as absent
1030 variable and only coerce(v,w) is tried.
1031
1032 */
1033
1034static PyObject *
1035ternary_op(PyObject *v,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001036 PyObject *w,
1037 PyObject *z,
1038 const int op_slot,
1039 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001040{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001041 PyNumberMethods *mv, *mw, *mz;
1042 PyObject *x = NULL;
1043 ternaryfunc slotv = NULL;
1044 ternaryfunc slotw = NULL;
1045 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001046
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001047 mv = v->ob_type->tp_as_number;
1048 mw = w->ob_type->tp_as_number;
1049 if (mv != NULL && NEW_STYLE_NUMBER(v))
1050 slotv = NB_TERNOP(mv, op_slot);
1051 if (w->ob_type != v->ob_type &&
1052 mw != NULL && NEW_STYLE_NUMBER(w)) {
1053 slotw = NB_TERNOP(mw, op_slot);
1054 if (slotw == slotv)
1055 slotw = NULL;
1056 }
1057 if (slotv) {
1058 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1059 x = slotw(v, w, z);
1060 if (x != Py_NotImplemented)
1061 return x;
1062 Py_DECREF(x); /* can't do it */
1063 slotw = NULL;
1064 }
1065 x = slotv(v, w, z);
1066 if (x != Py_NotImplemented)
1067 return x;
1068 Py_DECREF(x); /* can't do it */
1069 }
1070 if (slotw) {
1071 x = slotw(v, w, z);
1072 if (x != Py_NotImplemented)
1073 return x;
1074 Py_DECREF(x); /* can't do it */
1075 }
1076 mz = z->ob_type->tp_as_number;
1077 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
1078 slotz = NB_TERNOP(mz, op_slot);
1079 if (slotz == slotv || slotz == slotw)
1080 slotz = NULL;
1081 if (slotz) {
1082 x = slotz(v, w, z);
1083 if (x != Py_NotImplemented)
1084 return x;
1085 Py_DECREF(x); /* can't do it */
1086 }
1087 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001088
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001089 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1090 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1091 /* we have an old style operand, coerce */
1092 PyObject *v1, *z1, *w2, *z2;
1093 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001094
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001095 c = PyNumber_Coerce(&v, &w);
1096 if (c != 0)
1097 goto error3;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001098
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001099 /* Special case: if the third argument is None, it is
1100 treated as absent argument and not coerced. */
1101 if (z == Py_None) {
1102 if (v->ob_type->tp_as_number) {
1103 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1104 op_slot);
1105 if (slotz)
1106 x = slotz(v, w, z);
1107 else
1108 c = -1;
1109 }
1110 else
1111 c = -1;
1112 goto error2;
1113 }
1114 v1 = v;
1115 z1 = z;
1116 c = PyNumber_Coerce(&v1, &z1);
1117 if (c != 0)
1118 goto error2;
1119 w2 = w;
1120 z2 = z1;
1121 c = PyNumber_Coerce(&w2, &z2);
1122 if (c != 0)
1123 goto error1;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001124
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001125 if (v1->ob_type->tp_as_number != NULL) {
1126 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1127 op_slot);
1128 if (slotv)
1129 x = slotv(v1, w2, z2);
1130 else
1131 c = -1;
1132 }
1133 else
1134 c = -1;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001135
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001136 Py_DECREF(w2);
1137 Py_DECREF(z2);
1138 error1:
1139 Py_DECREF(v1);
1140 Py_DECREF(z1);
1141 error2:
1142 Py_DECREF(v);
1143 Py_DECREF(w);
1144 error3:
1145 if (c >= 0)
1146 return x;
1147 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001148
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001149 if (z == Py_None)
1150 PyErr_Format(
1151 PyExc_TypeError,
1152 "unsupported operand type(s) for ** or pow(): "
1153 "'%.100s' and '%.100s'",
1154 v->ob_type->tp_name,
1155 w->ob_type->tp_name);
1156 else
1157 PyErr_Format(
1158 PyExc_TypeError,
1159 "unsupported operand type(s) for pow(): "
1160 "'%.100s', '%.100s', '%.100s'",
1161 v->ob_type->tp_name,
1162 w->ob_type->tp_name,
1163 z->ob_type->tp_name);
1164 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001165}
1166
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001167#define BINARY_FUNC(func, op, op_name) \
1168 PyObject * \
1169 func(PyObject *v, PyObject *w) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001170 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001171 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001172
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001173BINARY_FUNC(PyNumber_Or, nb_or, "|")
1174BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1175BINARY_FUNC(PyNumber_And, nb_and, "&")
1176BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1177BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1178BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001179BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1180BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001181
1182PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001183PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001184{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001185 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1186 if (result == Py_NotImplemented) {
1187 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1188 Py_DECREF(result);
1189 if (m && m->sq_concat) {
1190 return (*m->sq_concat)(v, w);
1191 }
1192 result = binop_type_error(v, w, "+");
1193 }
1194 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001195}
1196
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001197static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001198sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001199{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001200 Py_ssize_t count;
1201 if (PyIndex_Check(n)) {
1202 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
1203 if (count == -1 && PyErr_Occurred())
1204 return NULL;
1205 }
1206 else {
1207 return type_error("can't multiply sequence by "
1208 "non-int of type '%.200s'", n);
1209 }
1210 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001211}
1212
1213PyObject *
1214PyNumber_Multiply(PyObject *v, PyObject *w)
1215{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001216 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1217 if (result == Py_NotImplemented) {
1218 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1219 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1220 Py_DECREF(result);
1221 if (mv && mv->sq_repeat) {
1222 return sequence_repeat(mv->sq_repeat, v, w);
1223 }
1224 else if (mw && mw->sq_repeat) {
1225 return sequence_repeat(mw->sq_repeat, w, v);
1226 }
1227 result = binop_type_error(v, w, "*");
1228 }
1229 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001230}
1231
Guido van Rossume15dee51995-07-18 14:12:02 +00001232PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001233PyNumber_FloorDivide(PyObject *v, PyObject *w)
1234{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001235 /* XXX tp_flags test */
1236 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +00001237}
1238
1239PyObject *
1240PyNumber_TrueDivide(PyObject *v, PyObject *w)
1241{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001242 /* XXX tp_flags test */
1243 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +00001244}
1245
1246PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001247PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001248{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001249 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001250}
1251
1252PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001253PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001254{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001255 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001256}
1257
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001258/* Binary in-place operators */
1259
1260/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001261 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001262
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001263 - If the left hand object has the appropriate struct members, and
1264 they are filled, call the appropriate function and return the
1265 result. No coercion is done on the arguments; the left-hand object
1266 is the one the operation is performed on, and it's up to the
1267 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001268
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001269 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001270 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001271
1272 */
1273
Guido van Rossum77660912002-04-16 16:32:50 +00001274#define HASINPLACE(t) \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001275 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001276
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001277static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001278binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001279{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001280 PyNumberMethods *mv = v->ob_type->tp_as_number;
1281 if (mv != NULL && HASINPLACE(v)) {
1282 binaryfunc slot = NB_BINOP(mv, iop_slot);
1283 if (slot) {
1284 PyObject *x = (slot)(v, w);
1285 if (x != Py_NotImplemented) {
1286 return x;
1287 }
1288 Py_DECREF(x);
1289 }
1290 }
1291 return binary_op1(v, w, op_slot);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001292}
1293
1294static PyObject *
1295binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001296 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001297{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001298 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1299 if (result == Py_NotImplemented) {
1300 Py_DECREF(result);
1301 return binop_type_error(v, w, op_name);
1302 }
1303 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001304}
1305
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001306#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001307 PyObject * \
1308 func(PyObject *v, PyObject *w) { \
1309 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1310 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001311
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001312INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1313INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1314INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1315INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1316INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1317INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1318INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001319
1320PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001321PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1322{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001323 /* XXX tp_flags test */
1324 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1325 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001326}
1327
1328PyObject *
1329PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1330{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001331 /* XXX tp_flags test */
1332 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1333 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001334}
1335
1336PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001337PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1338{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001339 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1340 NB_SLOT(nb_add));
1341 if (result == Py_NotImplemented) {
1342 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1343 Py_DECREF(result);
1344 if (m != NULL) {
1345 binaryfunc f = NULL;
1346 if (HASINPLACE(v))
1347 f = m->sq_inplace_concat;
1348 if (f == NULL)
1349 f = m->sq_concat;
1350 if (f != NULL)
1351 return (*f)(v, w);
1352 }
1353 result = binop_type_error(v, w, "+=");
1354 }
1355 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001356}
1357
1358PyObject *
1359PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1360{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001361 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1362 NB_SLOT(nb_multiply));
1363 if (result == Py_NotImplemented) {
1364 ssizeargfunc f = NULL;
1365 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1366 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1367 Py_DECREF(result);
1368 if (mv != NULL) {
1369 if (HASINPLACE(v))
1370 f = mv->sq_inplace_repeat;
1371 if (f == NULL)
1372 f = mv->sq_repeat;
1373 if (f != NULL)
1374 return sequence_repeat(f, v, w);
1375 }
1376 else if (mw != NULL) {
1377 /* Note that the right hand operand should not be
1378 * mutated in this case so sq_inplace_repeat is not
1379 * used. */
1380 if (mw->sq_repeat)
1381 return sequence_repeat(mw->sq_repeat, w, v);
1382 }
1383 result = binop_type_error(v, w, "*=");
1384 }
1385 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001386}
1387
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001388PyObject *
1389PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1390{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001391 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1392 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001393}
1394
1395PyObject *
1396PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1397{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001398 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1399 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1400 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
1401 }
1402 else {
1403 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1404 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001405}
1406
1407
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001408/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001409
1410PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001411PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001412{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001413 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001414
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001415 if (o == NULL)
1416 return null_error();
1417 m = o->ob_type->tp_as_number;
1418 if (m && m->nb_negative)
1419 return (*m->nb_negative)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001420
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001421 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001422}
1423
1424PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001425PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001426{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001427 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001428
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001429 if (o == NULL)
1430 return null_error();
1431 m = o->ob_type->tp_as_number;
1432 if (m && m->nb_positive)
1433 return (*m->nb_positive)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001434
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001435 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001436}
1437
1438PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001439PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001440{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001441 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001443 if (o == NULL)
1444 return null_error();
1445 m = o->ob_type->tp_as_number;
1446 if (m && m->nb_invert)
1447 return (*m->nb_invert)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001448
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001449 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001450}
1451
1452PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001453PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001454{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001455 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001456
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001457 if (o == NULL)
1458 return null_error();
1459 m = o->ob_type->tp_as_number;
1460 if (m && m->nb_absolute)
1461 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001462
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001463 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001464}
1465
Guido van Rossum9e896b32000-04-05 20:11:21 +00001466/* Add a check for embedded NULL-bytes in the argument. */
1467static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001468int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001469{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001470 char *end;
1471 PyObject *x;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001472
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001473 x = PyInt_FromString((char*)s, &end, 10);
1474 if (x == NULL)
1475 return NULL;
1476 if (end != s + len) {
1477 PyErr_SetString(PyExc_ValueError,
1478 "null byte in argument for int()");
1479 Py_DECREF(x);
1480 return NULL;
1481 }
1482 return x;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001483}
1484
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001485/* Return a Python Int or Long from the object item
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001486 Raise TypeError if the result is not an int-or-long
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001487 or if the object cannot be interpreted as an index.
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001488*/
1489PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001490PyNumber_Index(PyObject *item)
1491{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001492 PyObject *result = NULL;
1493 if (item == NULL)
1494 return null_error();
1495 if (PyInt_Check(item) || PyLong_Check(item)) {
1496 Py_INCREF(item);
1497 return item;
1498 }
1499 if (PyIndex_Check(item)) {
1500 result = item->ob_type->tp_as_number->nb_index(item);
1501 if (result &&
1502 !PyInt_Check(result) && !PyLong_Check(result)) {
1503 PyErr_Format(PyExc_TypeError,
1504 "__index__ returned non-(int,long) " \
1505 "(type %.200s)",
1506 result->ob_type->tp_name);
1507 Py_DECREF(result);
1508 return NULL;
1509 }
1510 }
1511 else {
1512 PyErr_Format(PyExc_TypeError,
1513 "'%.200s' object cannot be interpreted "
1514 "as an index", item->ob_type->tp_name);
1515 }
1516 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001517}
1518
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001519/* Return an error on Overflow only if err is not NULL*/
1520
1521Py_ssize_t
1522PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1523{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001524 Py_ssize_t result;
1525 PyObject *runerr;
1526 PyObject *value = PyNumber_Index(item);
1527 if (value == NULL)
1528 return -1;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001529
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001530 /* We're done if PyInt_AsSsize_t() returns without error. */
1531 result = PyInt_AsSsize_t(value);
1532 if (result != -1 || !(runerr = PyErr_Occurred()))
1533 goto finish;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001534
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001535 /* Error handling code -- only manage OverflowError differently */
1536 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1537 goto finish;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001538
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001539 PyErr_Clear();
1540 /* If no error-handling desired then the default clipping
1541 is sufficient.
1542 */
1543 if (!err) {
1544 assert(PyLong_Check(value));
1545 /* Whether or not it is less than or equal to
1546 zero is determined by the sign of ob_size
1547 */
1548 if (_PyLong_Sign(value) < 0)
1549 result = PY_SSIZE_T_MIN;
1550 else
1551 result = PY_SSIZE_T_MAX;
1552 }
1553 else {
1554 /* Otherwise replace the error with caller's error object. */
1555 PyErr_Format(err,
1556 "cannot fit '%.200s' into an index-sized integer",
1557 item->ob_type->tp_name);
1558 }
1559
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001560 finish:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001561 Py_DECREF(value);
1562 return result;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001563}
1564
1565
Guido van Rossume15dee51995-07-18 14:12:02 +00001566PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001567_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1568{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001569 const char *type_name;
1570 static PyObject *int_name = NULL;
1571 if (int_name == NULL) {
1572 int_name = PyString_InternFromString("__int__");
1573 if (int_name == NULL)
1574 return NULL;
1575 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001576
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001577 if (integral && (!PyInt_Check(integral) &&
1578 !PyLong_Check(integral))) {
1579 /* Don't go through tp_as_number->nb_int to avoid
1580 hitting the classic class fallback to __trunc__. */
1581 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1582 if (int_func == NULL) {
1583 PyErr_Clear(); /* Raise a different error. */
1584 goto non_integral_error;
1585 }
1586 Py_DECREF(integral);
1587 integral = PyEval_CallObject(int_func, NULL);
1588 Py_DECREF(int_func);
1589 if (integral && (!PyInt_Check(integral) &&
1590 !PyLong_Check(integral))) {
1591 goto non_integral_error;
1592 }
1593 }
1594 return integral;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001595
1596non_integral_error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001597 if (PyInstance_Check(integral)) {
1598 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
1599 ->in_class->cl_name);
1600 }
1601 else {
1602 type_name = integral->ob_type->tp_name;
1603 }
1604 PyErr_Format(PyExc_TypeError, error_format, type_name);
1605 Py_DECREF(integral);
1606 return NULL;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001607}
1608
1609
1610PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001611PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001612{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001613 PyNumberMethods *m;
1614 static PyObject *trunc_name = NULL;
1615 PyObject *trunc_func;
1616 const char *buffer;
1617 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001618
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001619 if (trunc_name == NULL) {
1620 trunc_name = PyString_InternFromString("__trunc__");
1621 if (trunc_name == NULL)
1622 return NULL;
1623 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001624
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001625 if (o == NULL)
1626 return null_error();
1627 if (PyInt_CheckExact(o)) {
1628 Py_INCREF(o);
1629 return o;
1630 }
1631 m = o->ob_type->tp_as_number;
1632 if (m && m->nb_int) { /* This should include subclasses of int */
1633 /* Classic classes always take this branch. */
1634 PyObject *res = m->nb_int(o);
1635 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1636 PyErr_Format(PyExc_TypeError,
1637 "__int__ returned non-int (type %.200s)",
1638 res->ob_type->tp_name);
1639 Py_DECREF(res);
1640 return NULL;
1641 }
1642 return res;
1643 }
1644 if (PyInt_Check(o)) { /* A int subclass without nb_int */
1645 PyIntObject *io = (PyIntObject*)o;
1646 return PyInt_FromLong(io->ob_ival);
1647 }
1648 trunc_func = PyObject_GetAttr(o, trunc_name);
1649 if (trunc_func) {
1650 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1651 Py_DECREF(trunc_func);
1652 /* __trunc__ is specified to return an Integral type, but
1653 int() needs to return an int. */
1654 return _PyNumber_ConvertIntegralToInt(
1655 truncated,
1656 "__trunc__ returned non-Integral (type %.200s)");
1657 }
1658 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001659
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001660 if (PyString_Check(o))
1661 return int_from_string(PyString_AS_STRING(o),
1662 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001663#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001664 if (PyUnicode_Check(o))
1665 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1666 PyUnicode_GET_SIZE(o),
1667 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001668#endif
Serhiy Storchaka61565602015-11-20 21:56:21 +02001669 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) {
1670 PyObject *result, *str;
1671
1672 /* Copy to NUL-terminated buffer. */
1673 str = PyString_FromStringAndSize((const char *)buffer, buffer_len);
1674 if (str == NULL)
1675 return NULL;
1676 result = int_from_string(PyString_AS_STRING(str), buffer_len);
1677 Py_DECREF(str);
1678 return result;
1679 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001680
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001681 return type_error("int() argument must be a string or a "
1682 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001683}
1684
Guido van Rossum9e896b32000-04-05 20:11:21 +00001685/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001686static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001687long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001688{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001689 char *end;
1690 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001691
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001692 x = PyLong_FromString((char*)s, &end, 10);
1693 if (x == NULL)
1694 return NULL;
1695 if (end != s + len) {
1696 PyErr_SetString(PyExc_ValueError,
1697 "null byte in argument for long()");
1698 Py_DECREF(x);
1699 return NULL;
1700 }
1701 return x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001702}
1703
Guido van Rossume15dee51995-07-18 14:12:02 +00001704PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001705PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001706{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001707 PyNumberMethods *m;
1708 static PyObject *trunc_name = NULL;
1709 PyObject *trunc_func;
1710 const char *buffer;
1711 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001712
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001713 if (trunc_name == NULL) {
1714 trunc_name = PyString_InternFromString("__trunc__");
1715 if (trunc_name == NULL)
1716 return NULL;
1717 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001718
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001719 if (o == NULL)
1720 return null_error();
1721 m = o->ob_type->tp_as_number;
1722 if (m && m->nb_long) { /* This should include subclasses of long */
1723 /* Classic classes always take this branch. */
1724 PyObject *res = m->nb_long(o);
Mark Dickinsoncb61e5d2010-09-26 10:37:12 +00001725 if (res == NULL)
1726 return NULL;
1727 if (PyInt_Check(res)) {
1728 long value = PyInt_AS_LONG(res);
1729 Py_DECREF(res);
1730 return PyLong_FromLong(value);
1731 }
1732 else if (!PyLong_Check(res)) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001733 PyErr_Format(PyExc_TypeError,
1734 "__long__ returned non-long (type %.200s)",
1735 res->ob_type->tp_name);
1736 Py_DECREF(res);
1737 return NULL;
1738 }
1739 return res;
1740 }
1741 if (PyLong_Check(o)) /* A long subclass without nb_long */
1742 return _PyLong_Copy((PyLongObject *)o);
1743 trunc_func = PyObject_GetAttr(o, trunc_name);
1744 if (trunc_func) {
1745 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1746 PyObject *int_instance;
1747 Py_DECREF(trunc_func);
1748 /* __trunc__ is specified to return an Integral type,
1749 but long() needs to return a long. */
1750 int_instance = _PyNumber_ConvertIntegralToInt(
1751 truncated,
1752 "__trunc__ returned non-Integral (type %.200s)");
1753 if (int_instance && PyInt_Check(int_instance)) {
1754 /* Make sure that long() returns a long instance. */
1755 long value = PyInt_AS_LONG(int_instance);
1756 Py_DECREF(int_instance);
1757 return PyLong_FromLong(value);
1758 }
1759 return int_instance;
1760 }
1761 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001762
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001763 if (PyString_Check(o))
1764 /* need to do extra error checking that PyLong_FromString()
1765 * doesn't do. In particular long('9.5') must raise an
1766 * exception, not truncate the float.
1767 */
1768 return long_from_string(PyString_AS_STRING(o),
1769 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001770#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001771 if (PyUnicode_Check(o))
1772 /* The above check is done in PyLong_FromUnicode(). */
1773 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1774 PyUnicode_GET_SIZE(o),
1775 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001776#endif
Serhiy Storchaka61565602015-11-20 21:56:21 +02001777 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) {
1778 PyObject *result, *str;
Guido van Rossume15dee51995-07-18 14:12:02 +00001779
Serhiy Storchaka61565602015-11-20 21:56:21 +02001780 /* Copy to NUL-terminated buffer. */
1781 str = PyString_FromStringAndSize((const char *)buffer, buffer_len);
1782 if (str == NULL)
1783 return NULL;
1784 result = long_from_string(PyString_AS_STRING(str), buffer_len);
1785 Py_DECREF(str);
1786 return result;
1787 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001788 return type_error("long() argument must be a string or a "
1789 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001790}
1791
1792PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001793PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001794{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001795 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001796
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001797 if (o == NULL)
1798 return null_error();
1799 m = o->ob_type->tp_as_number;
1800 if (m && m->nb_float) { /* This should include subclasses of float */
1801 PyObject *res = m->nb_float(o);
1802 if (res && !PyFloat_Check(res)) {
1803 PyErr_Format(PyExc_TypeError,
1804 "__float__ returned non-float (type %.200s)",
1805 res->ob_type->tp_name);
1806 Py_DECREF(res);
1807 return NULL;
1808 }
1809 return res;
1810 }
1811 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
1812 PyFloatObject *po = (PyFloatObject *)o;
1813 return PyFloat_FromDouble(po->ob_fval);
1814 }
1815 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001816}
1817
Eric Smith5e527eb2008-02-10 01:36:53 +00001818PyObject *
1819PyNumber_ToBase(PyObject *n, int base)
1820{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001821 PyObject *res = NULL;
1822 PyObject *index = PyNumber_Index(n);
Eric Smith5e527eb2008-02-10 01:36:53 +00001823
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001824 if (!index)
1825 return NULL;
1826 if (PyLong_Check(index))
1827 res = _PyLong_Format(index, base, 0, 1);
1828 else if (PyInt_Check(index))
1829 res = _PyInt_Format((PyIntObject*)index, base, 1);
1830 else
1831 /* It should not be possible to get here, as
1832 PyNumber_Index already has a check for the same
1833 condition */
1834 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1835 "int or long");
1836 Py_DECREF(index);
1837 return res;
Eric Smith5e527eb2008-02-10 01:36:53 +00001838}
1839
1840
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001841/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001842
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001843int
Fred Drake79912472000-07-09 04:06:11 +00001844PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001845{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001846 if (s == NULL)
1847 return 0;
1848 if (PyInstance_Check(s))
1849 return PyObject_HasAttrString(s, "__getitem__");
1850 if (PyDict_Check(s))
1851 return 0;
1852 return s->ob_type->tp_as_sequence &&
1853 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001854}
1855
Martin v. Löwis18e16552006-02-15 17:27:45 +00001856Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001857PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001858{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001859 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001860
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001861 if (s == NULL) {
1862 null_error();
1863 return -1;
1864 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001865
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001866 m = s->ob_type->tp_as_sequence;
1867 if (m && m->sq_length)
1868 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001869
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001870 type_error("object of type '%.200s' has no len()", s);
1871 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001872}
1873
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001874#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001875Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001876PySequence_Length(PyObject *s)
1877{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001878 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001879}
1880#define PySequence_Length PySequence_Size
1881
Guido van Rossume15dee51995-07-18 14:12:02 +00001882PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001883PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001884{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001885 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001886
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001887 if (s == NULL || o == NULL)
1888 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001889
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001890 m = s->ob_type->tp_as_sequence;
1891 if (m && m->sq_concat)
1892 return m->sq_concat(s, o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001893
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001894 /* Instances of user classes defining an __add__() method only
1895 have an nb_add slot, not an sq_concat slot. So we fall back
1896 to nb_add if both arguments appear to be sequences. */
1897 if (PySequence_Check(s) && PySequence_Check(o)) {
1898 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1899 if (result != Py_NotImplemented)
1900 return result;
1901 Py_DECREF(result);
1902 }
1903 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001904}
1905
1906PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001907PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001908{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001909 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001910
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001911 if (o == NULL)
1912 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001913
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001914 m = o->ob_type->tp_as_sequence;
1915 if (m && m->sq_repeat)
1916 return m->sq_repeat(o, count);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001917
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001918 /* Instances of user classes defining a __mul__() method only
1919 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1920 to nb_multiply if o appears to be a sequence. */
1921 if (PySequence_Check(o)) {
1922 PyObject *n, *result;
1923 n = PyInt_FromSsize_t(count);
1924 if (n == NULL)
1925 return NULL;
1926 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1927 Py_DECREF(n);
1928 if (result != Py_NotImplemented)
1929 return result;
1930 Py_DECREF(result);
1931 }
1932 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001933}
1934
1935PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001936PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1937{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001938 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001939
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001940 if (s == NULL || o == NULL)
1941 return null_error();
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001942
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001943 m = s->ob_type->tp_as_sequence;
1944 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1945 return m->sq_inplace_concat(s, o);
1946 if (m && m->sq_concat)
1947 return m->sq_concat(s, o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001948
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001949 if (PySequence_Check(s) && PySequence_Check(o)) {
1950 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1951 NB_SLOT(nb_add));
1952 if (result != Py_NotImplemented)
1953 return result;
1954 Py_DECREF(result);
1955 }
1956 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001957}
1958
1959PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001960PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001961{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001962 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001963
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001964 if (o == NULL)
1965 return null_error();
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001966
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001967 m = o->ob_type->tp_as_sequence;
1968 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1969 return m->sq_inplace_repeat(o, count);
1970 if (m && m->sq_repeat)
1971 return m->sq_repeat(o, count);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001972
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001973 if (PySequence_Check(o)) {
1974 PyObject *n, *result;
1975 n = PyInt_FromSsize_t(count);
1976 if (n == NULL)
1977 return NULL;
1978 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1979 NB_SLOT(nb_multiply));
1980 Py_DECREF(n);
1981 if (result != Py_NotImplemented)
1982 return result;
1983 Py_DECREF(result);
1984 }
1985 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001986}
1987
1988PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001989PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001990{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001991 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001992
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001993 if (s == NULL)
1994 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001995
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001996 m = s->ob_type->tp_as_sequence;
1997 if (m && m->sq_item) {
1998 if (i < 0) {
1999 if (m->sq_length) {
2000 Py_ssize_t l = (*m->sq_length)(s);
2001 if (l < 0)
2002 return NULL;
2003 i += l;
2004 }
2005 }
2006 return m->sq_item(s, i);
2007 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002008
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002009 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00002010}
2011
2012PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00002013PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00002014{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002015 PySequenceMethods *m;
2016 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002017
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002018 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002019
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002020 m = s->ob_type->tp_as_sequence;
2021 if (m && m->sq_slice) {
2022 if (i1 < 0 || i2 < 0) {
2023 if (m->sq_length) {
2024 Py_ssize_t l = (*m->sq_length)(s);
2025 if (l < 0)
2026 return NULL;
2027 if (i1 < 0)
2028 i1 += l;
2029 if (i2 < 0)
2030 i2 += l;
2031 }
2032 }
2033 return m->sq_slice(s, i1, i2);
2034 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
2035 PyObject *res;
2036 PyObject *slice = _PySlice_FromIndices(i1, i2);
2037 if (!slice)
2038 return NULL;
2039 res = mp->mp_subscript(s, slice);
2040 Py_DECREF(slice);
2041 return res;
2042 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002043
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002044 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00002045}
2046
2047int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002048PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002049{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002050 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002051
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002052 if (s == NULL) {
2053 null_error();
2054 return -1;
2055 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002056
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002057 m = s->ob_type->tp_as_sequence;
2058 if (m && m->sq_ass_item) {
2059 if (i < 0) {
2060 if (m->sq_length) {
2061 Py_ssize_t l = (*m->sq_length)(s);
2062 if (l < 0)
2063 return -1;
2064 i += l;
2065 }
2066 }
2067 return m->sq_ass_item(s, i, o);
2068 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002069
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002070 type_error("'%.200s' object does not support item assignment", s);
2071 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002072}
2073
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002074int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002075PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002076{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002077 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002078
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002079 if (s == NULL) {
2080 null_error();
2081 return -1;
2082 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002083
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002084 m = s->ob_type->tp_as_sequence;
2085 if (m && m->sq_ass_item) {
2086 if (i < 0) {
2087 if (m->sq_length) {
2088 Py_ssize_t l = (*m->sq_length)(s);
2089 if (l < 0)
2090 return -1;
2091 i += l;
2092 }
2093 }
2094 return m->sq_ass_item(s, i, (PyObject *)NULL);
2095 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002096
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002097 type_error("'%.200s' object doesn't support item deletion", s);
2098 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002099}
2100
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002101int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002102PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002103{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002104 PySequenceMethods *m;
2105 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002106
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002107 if (s == NULL) {
2108 null_error();
2109 return -1;
2110 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002111
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002112 m = s->ob_type->tp_as_sequence;
2113 if (m && m->sq_ass_slice) {
2114 if (i1 < 0 || i2 < 0) {
2115 if (m->sq_length) {
2116 Py_ssize_t l = (*m->sq_length)(s);
2117 if (l < 0)
2118 return -1;
2119 if (i1 < 0)
2120 i1 += l;
2121 if (i2 < 0)
2122 i2 += l;
2123 }
2124 }
2125 return m->sq_ass_slice(s, i1, i2, o);
2126 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2127 int res;
2128 PyObject *slice = _PySlice_FromIndices(i1, i2);
2129 if (!slice)
2130 return -1;
2131 res = mp->mp_ass_subscript(s, slice, o);
2132 Py_DECREF(slice);
2133 return res;
2134 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002135
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002136 type_error("'%.200s' object doesn't support slice assignment", s);
2137 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002138}
2139
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002140int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002141PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002142{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002143 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002144
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002145 if (s == NULL) {
2146 null_error();
2147 return -1;
2148 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002149
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002150 m = s->ob_type->tp_as_sequence;
2151 if (m && m->sq_ass_slice) {
2152 if (i1 < 0 || i2 < 0) {
2153 if (m->sq_length) {
2154 Py_ssize_t l = (*m->sq_length)(s);
2155 if (l < 0)
2156 return -1;
2157 if (i1 < 0)
2158 i1 += l;
2159 if (i2 < 0)
2160 i2 += l;
2161 }
2162 }
2163 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2164 }
2165 type_error("'%.200s' object doesn't support slice deletion", s);
2166 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002167}
2168
Guido van Rossume15dee51995-07-18 14:12:02 +00002169PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002170PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002171{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002172 PyObject *it; /* iter(v) */
2173 Py_ssize_t n; /* guess for result tuple size */
2174 PyObject *result = NULL;
2175 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002176
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002177 if (v == NULL)
2178 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002179
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002180 /* Special-case the common tuple and list cases, for efficiency. */
2181 if (PyTuple_CheckExact(v)) {
2182 /* Note that we can't know whether it's safe to return
2183 a tuple *subclass* instance as-is, hence the restriction
2184 to exact tuples here. In contrast, lists always make
2185 a copy, so there's no need for exactness below. */
2186 Py_INCREF(v);
2187 return v;
2188 }
Raymond Hettinger51dbc9a2015-05-17 14:37:39 -07002189 if (PyList_CheckExact(v))
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002190 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002191
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002192 /* Get iterator. */
2193 it = PyObject_GetIter(v);
2194 if (it == NULL)
2195 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002196
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002197 /* Guess result size and allocate space. */
2198 n = _PyObject_LengthHint(v, 10);
2199 if (n == -1)
2200 goto Fail;
2201 result = PyTuple_New(n);
2202 if (result == NULL)
2203 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002204
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002205 /* Fill the tuple. */
2206 for (j = 0; ; ++j) {
2207 PyObject *item = PyIter_Next(it);
2208 if (item == NULL) {
2209 if (PyErr_Occurred())
2210 goto Fail;
2211 break;
2212 }
2213 if (j >= n) {
2214 Py_ssize_t oldn = n;
2215 /* The over-allocation strategy can grow a bit faster
2216 than for lists because unlike lists the
2217 over-allocation isn't permanent -- we reclaim
2218 the excess before the end of this routine.
2219 So, grow by ten and then add 25%.
2220 */
2221 n += 10;
2222 n += n >> 2;
2223 if (n < oldn) {
2224 /* Check for overflow */
2225 PyErr_NoMemory();
2226 Py_DECREF(item);
2227 goto Fail;
2228 }
2229 if (_PyTuple_Resize(&result, n) != 0) {
2230 Py_DECREF(item);
2231 goto Fail;
2232 }
2233 }
2234 PyTuple_SET_ITEM(result, j, item);
2235 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002236
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002237 /* Cut tuple back if guess was too large. */
2238 if (j < n &&
2239 _PyTuple_Resize(&result, j) != 0)
2240 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002241
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002242 Py_DECREF(it);
2243 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00002244
2245Fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002246 Py_XDECREF(result);
2247 Py_DECREF(it);
2248 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002249}
2250
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002251PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002252PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002253{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002254 PyObject *result; /* result list */
2255 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002256
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002257 if (v == NULL)
2258 return null_error();
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002259
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002260 result = PyList_New(0);
2261 if (result == NULL)
2262 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00002263
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002264 rv = _PyList_Extend((PyListObject *)result, v);
2265 if (rv == NULL) {
2266 Py_DECREF(result);
2267 return NULL;
2268 }
2269 Py_DECREF(rv);
2270 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002271}
2272
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002273PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002274PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002275{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002276 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002277
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002278 if (v == NULL)
2279 return null_error();
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002280
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002281 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
2282 Py_INCREF(v);
2283 return v;
2284 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002285
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002286 it = PyObject_GetIter(v);
2287 if (it == NULL) {
2288 if (PyErr_ExceptionMatches(PyExc_TypeError))
2289 PyErr_SetString(PyExc_TypeError, m);
2290 return NULL;
2291 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002292
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002293 v = PySequence_List(it);
2294 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002295
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002296 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002297}
2298
Tim Peters16a77ad2001-09-08 04:00:12 +00002299/* Iterate over seq. Result depends on the operation:
2300 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002301 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002302 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00002303 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2304*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002305Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002306_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002307{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002308 Py_ssize_t n;
2309 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2310 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002311
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002312 if (seq == NULL || obj == NULL) {
2313 null_error();
2314 return -1;
2315 }
Tim Peters75f8e352001-05-05 11:33:43 +00002316
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002317 it = PyObject_GetIter(seq);
2318 if (it == NULL) {
2319 type_error("argument of type '%.200s' is not iterable", seq);
2320 return -1;
2321 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002322
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002323 n = wrapped = 0;
2324 for (;;) {
2325 int cmp;
2326 PyObject *item = PyIter_Next(it);
2327 if (item == NULL) {
2328 if (PyErr_Occurred())
2329 goto Fail;
2330 break;
2331 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002332
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002333 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
2334 Py_DECREF(item);
2335 if (cmp < 0)
2336 goto Fail;
2337 if (cmp > 0) {
2338 switch (operation) {
2339 case PY_ITERSEARCH_COUNT:
2340 if (n == PY_SSIZE_T_MAX) {
2341 PyErr_SetString(PyExc_OverflowError,
2342 "count exceeds C integer size");
2343 goto Fail;
2344 }
2345 ++n;
2346 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00002347
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002348 case PY_ITERSEARCH_INDEX:
2349 if (wrapped) {
2350 PyErr_SetString(PyExc_OverflowError,
2351 "index exceeds C integer size");
2352 goto Fail;
2353 }
2354 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002355
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002356 case PY_ITERSEARCH_CONTAINS:
2357 n = 1;
2358 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002359
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002360 default:
2361 assert(!"unknown operation");
2362 }
2363 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002364
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002365 if (operation == PY_ITERSEARCH_INDEX) {
2366 if (n == PY_SSIZE_T_MAX)
2367 wrapped = 1;
2368 ++n;
2369 }
2370 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002371
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002372 if (operation != PY_ITERSEARCH_INDEX)
2373 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002374
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002375 PyErr_SetString(PyExc_ValueError,
2376 "sequence.index(x): x not in sequence");
2377 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00002378Fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002379 n = -1;
2380 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00002381Done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002382 Py_DECREF(it);
2383 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002384
Guido van Rossume15dee51995-07-18 14:12:02 +00002385}
2386
Tim Peters16a77ad2001-09-08 04:00:12 +00002387/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002388Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002389PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002390{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002391 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002392}
2393
Tim Peterscb8d3682001-05-05 21:05:01 +00002394/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002395 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002396 */
2397int
2398PySequence_Contains(PyObject *seq, PyObject *ob)
2399{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002400 Py_ssize_t result;
2401 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2402 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2403 if (sqm != NULL && sqm->sq_contains != NULL)
2404 return (*sqm->sq_contains)(seq, ob);
2405 }
2406 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2407 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002408}
2409
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002410/* Backwards compatibility */
2411#undef PySequence_In
2412int
Fred Drake79912472000-07-09 04:06:11 +00002413PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002414{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002415 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002416}
2417
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002418Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002419PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002420{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002421 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002422}
2423
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002424/* Operations on mappings */
2425
2426int
Fred Drake79912472000-07-09 04:06:11 +00002427PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002428{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002429 if (o && PyInstance_Check(o))
2430 return PyObject_HasAttrString(o, "__getitem__");
Raymond Hettingere2eda602004-04-04 08:51:41 +00002431
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002432 return o && o->ob_type->tp_as_mapping &&
2433 o->ob_type->tp_as_mapping->mp_subscript &&
2434 !(o->ob_type->tp_as_sequence &&
2435 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002436}
2437
Martin v. Löwis18e16552006-02-15 17:27:45 +00002438Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002439PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002440{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002441 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002442
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002443 if (o == NULL) {
2444 null_error();
2445 return -1;
2446 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002447
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002448 m = o->ob_type->tp_as_mapping;
2449 if (m && m->mp_length)
2450 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002451
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002452 type_error("object of type '%.200s' has no len()", o);
2453 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002454}
2455
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002456#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002457Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002458PyMapping_Length(PyObject *o)
2459{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002460 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002461}
2462#define PyMapping_Length PyMapping_Size
2463
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002464PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002465PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002466{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002467 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002468
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002469 if (key == NULL)
2470 return null_error();
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002471
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002472 okey = PyString_FromString(key);
2473 if (okey == NULL)
2474 return NULL;
2475 r = PyObject_GetItem(o, okey);
2476 Py_DECREF(okey);
2477 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002478}
2479
2480int
Fred Drake79912472000-07-09 04:06:11 +00002481PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002482{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002483 PyObject *okey;
2484 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002485
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002486 if (key == NULL) {
2487 null_error();
2488 return -1;
2489 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002490
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002491 okey = PyString_FromString(key);
2492 if (okey == NULL)
2493 return -1;
2494 r = PyObject_SetItem(o, okey, value);
2495 Py_DECREF(okey);
2496 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002497}
2498
2499int
Fred Drake79912472000-07-09 04:06:11 +00002500PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002501{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002502 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002503
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002504 v = PyMapping_GetItemString(o, key);
2505 if (v) {
2506 Py_DECREF(v);
2507 return 1;
2508 }
2509 PyErr_Clear();
2510 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002511}
2512
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002513int
Fred Drake79912472000-07-09 04:06:11 +00002514PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002515{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002516 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002517
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002518 v = PyObject_GetItem(o, key);
2519 if (v) {
2520 Py_DECREF(v);
2521 return 1;
2522 }
2523 PyErr_Clear();
2524 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002525}
2526
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002527/* Operations on callable objects */
2528
2529/* XXX PyCallable_Check() is in object.c */
2530
Guido van Rossume15dee51995-07-18 14:12:02 +00002531PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002532PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002533{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002534 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002535}
Guido van Rossume15dee51995-07-18 14:12:02 +00002536
2537PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002538PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2539{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002540 ternaryfunc call;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002541
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002542 if ((call = func->ob_type->tp_call) != NULL) {
2543 PyObject *result;
2544 if (Py_EnterRecursiveCall(" while calling a Python object"))
2545 return NULL;
2546 result = (*call)(func, arg, kw);
2547 Py_LeaveRecursiveCall();
2548 if (result == NULL && !PyErr_Occurred())
2549 PyErr_SetString(
2550 PyExc_SystemError,
2551 "NULL result without error in PyObject_Call");
2552 return result;
2553 }
2554 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
2555 func->ob_type->tp_name);
2556 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002557}
2558
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002559static PyObject*
2560call_function_tail(PyObject *callable, PyObject *args)
2561{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002562 PyObject *retval;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002563
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002564 if (args == NULL)
2565 return NULL;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002566
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002567 if (!PyTuple_Check(args)) {
2568 PyObject *a;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002569
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002570 a = PyTuple_New(1);
2571 if (a == NULL) {
2572 Py_DECREF(args);
2573 return NULL;
2574 }
2575 PyTuple_SET_ITEM(a, 0, args);
2576 args = a;
2577 }
2578 retval = PyObject_Call(callable, args, NULL);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002579
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002580 Py_DECREF(args);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002582 return retval;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002583}
2584
Tim Peters6d6c1a32001-08-02 04:15:00 +00002585PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002586PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002587{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002588 va_list va;
2589 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002590
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002591 if (callable == NULL)
2592 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002593
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002594 if (format && *format) {
2595 va_start(va, format);
2596 args = Py_VaBuildValue(format, va);
2597 va_end(va);
2598 }
2599 else
2600 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002601
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002602 return call_function_tail(callable, args);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002603}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002604
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002605PyObject *
2606_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2607{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002608 va_list va;
2609 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002610
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002611 if (callable == NULL)
2612 return null_error();
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002613
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002614 if (format && *format) {
2615 va_start(va, format);
2616 args = _Py_VaBuildValue_SizeT(format, va);
2617 va_end(va);
2618 }
2619 else
2620 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002621
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002622 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002623}
2624
2625PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002626PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002627{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002628 va_list va;
2629 PyObject *args;
2630 PyObject *func = NULL;
2631 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002632
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002633 if (o == NULL || name == NULL)
2634 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002635
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002636 func = PyObject_GetAttrString(o, name);
Benjamin Petersondf71dcb2014-06-26 23:27:41 -07002637 if (func == NULL)
2638 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002639
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002640 if (!PyCallable_Check(func)) {
2641 type_error("attribute of type '%.200s' is not callable", func);
2642 goto exit;
2643 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002644
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002645 if (format && *format) {
2646 va_start(va, format);
2647 args = Py_VaBuildValue(format, va);
2648 va_end(va);
2649 }
2650 else
2651 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002652
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002653 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002654
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002655 exit:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002656 /* args gets consumed in call_function_tail */
2657 Py_XDECREF(func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002658
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002659 return retval;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002660}
2661
2662PyObject *
2663_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2664{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002665 va_list va;
2666 PyObject *args;
2667 PyObject *func = NULL;
2668 PyObject *retval = NULL;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002669
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002670 if (o == NULL || name == NULL)
2671 return null_error();
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002672
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002673 func = PyObject_GetAttrString(o, name);
Benjamin Petersondf71dcb2014-06-26 23:27:41 -07002674 if (func == NULL)
2675 return NULL;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002676
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002677 if (!PyCallable_Check(func)) {
2678 type_error("attribute of type '%.200s' is not callable", func);
2679 goto exit;
2680 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002681
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002682 if (format && *format) {
2683 va_start(va, format);
2684 args = _Py_VaBuildValue_SizeT(format, va);
2685 va_end(va);
2686 }
2687 else
2688 args = PyTuple_New(0);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002689
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002690 retval = call_function_tail(func, args);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002691
2692 exit:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002693 /* args gets consumed in call_function_tail */
2694 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002695
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002696 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002697}
Guido van Rossum823649d2001-03-21 18:40:58 +00002698
2699
Fred Drakeb421b8c2001-10-26 16:21:32 +00002700static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002701objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002702{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002703 int i, n = 0;
2704 va_list countva;
2705 PyObject *result, *tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002706
2707#ifdef VA_LIST_IS_ARRAY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002708 memcpy(countva, va, sizeof(va_list));
Fred Drakeb421b8c2001-10-26 16:21:32 +00002709#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002710#ifdef __va_copy
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002711 __va_copy(countva, va);
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002712#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002713 countva = va;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002714#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002715#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002716
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002717 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2718 ++n;
2719 result = PyTuple_New(n);
2720 if (result != NULL && n > 0) {
2721 for (i = 0; i < n; ++i) {
2722 tmp = (PyObject *)va_arg(va, PyObject *);
2723 PyTuple_SET_ITEM(result, i, tmp);
2724 Py_INCREF(tmp);
2725 }
2726 }
2727 return result;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002728}
2729
2730PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002731PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002732{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002733 PyObject *args, *tmp;
2734 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002735
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002736 if (callable == NULL || name == NULL)
2737 return null_error();
Fred Drakeb421b8c2001-10-26 16:21:32 +00002738
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002739 callable = PyObject_GetAttr(callable, name);
2740 if (callable == NULL)
2741 return NULL;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002742
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002743 /* count the args */
2744 va_start(vargs, name);
2745 args = objargs_mktuple(vargs);
2746 va_end(vargs);
2747 if (args == NULL) {
2748 Py_DECREF(callable);
2749 return NULL;
2750 }
2751 tmp = PyObject_Call(callable, args, NULL);
2752 Py_DECREF(args);
2753 Py_DECREF(callable);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002754
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002755 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002756}
2757
2758PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002759PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002760{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002761 PyObject *args, *tmp;
2762 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002763
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002764 if (callable == NULL)
2765 return null_error();
Fred Drakeb421b8c2001-10-26 16:21:32 +00002766
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002767 /* count the args */
2768 va_start(vargs, callable);
2769 args = objargs_mktuple(vargs);
2770 va_end(vargs);
2771 if (args == NULL)
2772 return NULL;
2773 tmp = PyObject_Call(callable, args, NULL);
2774 Py_DECREF(args);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002775
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002776 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002777}
2778
2779
Guido van Rossum823649d2001-03-21 18:40:58 +00002780/* isinstance(), issubclass() */
2781
Barry Warsawf16951c2002-04-23 22:45:44 +00002782/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2783 * state that will almost never happen.
2784 *
2785 * 0. creating the __bases__ static string could get a MemoryError
2786 * 1. getattr(cls, '__bases__') could raise an AttributeError
2787 * 2. getattr(cls, '__bases__') could raise some other exception
2788 * 3. getattr(cls, '__bases__') could return a tuple
2789 * 4. getattr(cls, '__bases__') could return something other than a tuple
2790 *
2791 * Only state #3 is a non-error state and only it returns a non-NULL object
2792 * (it returns the retrieved tuple).
2793 *
2794 * Any raised AttributeErrors are masked by clearing the exception and
2795 * returning NULL. If an object other than a tuple comes out of __bases__,
2796 * then again, the return value is NULL. So yes, these two situations
2797 * produce exactly the same results: NULL is returned and no error is set.
2798 *
2799 * If some exception other than AttributeError is raised, then NULL is also
2800 * returned, but the exception is not cleared. That's because we want the
2801 * exception to be propagated along.
2802 *
2803 * Callers are expected to test for PyErr_Occurred() when the return value
2804 * is NULL to decide whether a valid exception should be propagated or not.
2805 * When there's no exception to propagate, it's customary for the caller to
2806 * set a TypeError.
2807 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002808static PyObject *
2809abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002810{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002811 static PyObject *__bases__ = NULL;
2812 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002813
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002814 if (__bases__ == NULL) {
2815 __bases__ = PyString_InternFromString("__bases__");
2816 if (__bases__ == NULL)
2817 return NULL;
2818 }
2819 bases = PyObject_GetAttr(cls, __bases__);
2820 if (bases == NULL) {
2821 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2822 PyErr_Clear();
2823 return NULL;
2824 }
2825 if (!PyTuple_Check(bases)) {
2826 Py_DECREF(bases);
2827 return NULL;
2828 }
2829 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002830}
2831
2832
2833static int
2834abstract_issubclass(PyObject *derived, PyObject *cls)
2835{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002836 PyObject *bases = NULL;
2837 Py_ssize_t i, n;
2838 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002839
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002840 while (1) {
2841 if (derived == cls)
2842 return 1;
2843 bases = abstract_get_bases(derived);
2844 if (bases == NULL) {
2845 if (PyErr_Occurred())
2846 return -1;
2847 return 0;
2848 }
2849 n = PyTuple_GET_SIZE(bases);
2850 if (n == 0) {
2851 Py_DECREF(bases);
2852 return 0;
2853 }
2854 /* Avoid recursivity in the single inheritance case */
2855 if (n == 1) {
2856 derived = PyTuple_GET_ITEM(bases, 0);
2857 Py_DECREF(bases);
2858 continue;
2859 }
2860 for (i = 0; i < n; i++) {
2861 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2862 if (r != 0)
2863 break;
2864 }
2865 Py_DECREF(bases);
2866 return r;
2867 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002868}
2869
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002870static int
2871check_class(PyObject *cls, const char *error)
2872{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002873 PyObject *bases = abstract_get_bases(cls);
2874 if (bases == NULL) {
2875 /* Do not mask errors. */
2876 if (!PyErr_Occurred())
2877 PyErr_SetString(PyExc_TypeError, error);
2878 return 0;
2879 }
2880 Py_DECREF(bases);
2881 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002882}
2883
Brett Cannon4f653312004-03-20 22:52:14 +00002884static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002885recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002886{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002887 PyObject *icls;
2888 static PyObject *__class__ = NULL;
2889 int retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002890
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002891 if (__class__ == NULL) {
2892 __class__ = PyString_InternFromString("__class__");
2893 if (__class__ == NULL)
2894 return -1;
2895 }
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002896
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002897 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2898 PyObject *inclass =
2899 (PyObject*)((PyInstanceObject*)inst)->in_class;
2900 retval = PyClass_IsSubclass(inclass, cls);
2901 }
2902 else if (PyType_Check(cls)) {
2903 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2904 if (retval == 0) {
2905 PyObject *c = PyObject_GetAttr(inst, __class__);
2906 if (c == NULL) {
2907 PyErr_Clear();
2908 }
2909 else {
2910 if (c != (PyObject *)(inst->ob_type) &&
2911 PyType_Check(c))
2912 retval = PyType_IsSubtype(
2913 (PyTypeObject *)c,
2914 (PyTypeObject *)cls);
2915 Py_DECREF(c);
2916 }
2917 }
2918 }
2919 else {
2920 if (!check_class(cls,
2921 "isinstance() arg 2 must be a class, type,"
2922 " or tuple of classes and types"))
2923 return -1;
2924 icls = PyObject_GetAttr(inst, __class__);
2925 if (icls == NULL) {
2926 PyErr_Clear();
2927 retval = 0;
2928 }
2929 else {
2930 retval = abstract_issubclass(icls, cls);
2931 Py_DECREF(icls);
2932 }
2933 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002934
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002935 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002936}
2937
2938int
Brett Cannon4f653312004-03-20 22:52:14 +00002939PyObject_IsInstance(PyObject *inst, PyObject *cls)
2940{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002941 static PyObject *name = NULL;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002942
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002943 /* Quick test for an exact match */
2944 if (Py_TYPE(inst) == (PyTypeObject *)cls)
2945 return 1;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002946
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002947 if (PyTuple_Check(cls)) {
2948 Py_ssize_t i;
2949 Py_ssize_t n;
2950 int r = 0;
Antoine Pitrou0668c622008-08-26 22:42:08 +00002951
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002952 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2953 return -1;
2954 n = PyTuple_GET_SIZE(cls);
2955 for (i = 0; i < n; ++i) {
2956 PyObject *item = PyTuple_GET_ITEM(cls, i);
2957 r = PyObject_IsInstance(inst, item);
2958 if (r != 0)
2959 /* either found it, or got an error */
2960 break;
2961 }
2962 Py_LeaveRecursiveCall();
2963 return r;
2964 }
Benjamin Petersonfb6fb062009-05-16 21:44:25 +00002965
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002966 if (!(PyClass_Check(cls) || PyInstance_Check(cls))) {
2967 PyObject *checker;
2968 checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name);
2969 if (checker != NULL) {
2970 PyObject *res;
2971 int ok = -1;
2972 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2973 Py_DECREF(checker);
2974 return ok;
2975 }
2976 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2977 Py_LeaveRecursiveCall();
2978 Py_DECREF(checker);
2979 if (res != NULL) {
2980 ok = PyObject_IsTrue(res);
2981 Py_DECREF(res);
2982 }
2983 return ok;
2984 }
2985 else if (PyErr_Occurred())
2986 return -1;
2987 }
2988 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002989}
2990
2991static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002992recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002993{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002994 int retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002995
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002996 if (PyType_Check(cls) && PyType_Check(derived)) {
2997 /* Fast path (non-recursive) */
2998 return PyType_IsSubtype(
2999 (PyTypeObject *)derived, (PyTypeObject *)cls);
3000 }
3001 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
3002 if (!check_class(derived,
3003 "issubclass() arg 1 must be a class"))
3004 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00003005
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003006 if (!check_class(cls,
3007 "issubclass() arg 2 must be a class"
3008 " or tuple of classes"))
3009 return -1;
3010 retval = abstract_issubclass(derived, cls);
3011 }
3012 else {
3013 /* shortcut */
3014 if (!(retval = (derived == cls)))
3015 retval = PyClass_IsSubclass(derived, cls);
3016 }
Guido van Rossum823649d2001-03-21 18:40:58 +00003017
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003018 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00003019}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003020
Brett Cannon4f653312004-03-20 22:52:14 +00003021int
3022PyObject_IsSubclass(PyObject *derived, PyObject *cls)
3023{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003024 static PyObject *name = NULL;
3025
3026 if (PyTuple_Check(cls)) {
3027 Py_ssize_t i;
3028 Py_ssize_t n;
3029 int r = 0;
3030
3031 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3032 return -1;
3033 n = PyTuple_GET_SIZE(cls);
3034 for (i = 0; i < n; ++i) {
3035 PyObject *item = PyTuple_GET_ITEM(cls, i);
3036 r = PyObject_IsSubclass(derived, item);
3037 if (r != 0)
3038 /* either found it, or got an error */
3039 break;
3040 }
3041 Py_LeaveRecursiveCall();
3042 return r;
3043 }
3044 if (!(PyClass_Check(cls) || PyInstance_Check(cls))) {
3045 PyObject *checker;
3046 checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name);
3047 if (checker != NULL) {
3048 PyObject *res;
3049 int ok = -1;
3050 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
3051 Py_DECREF(checker);
3052 return ok;
3053 }
3054 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3055 Py_LeaveRecursiveCall();
3056 Py_DECREF(checker);
3057 if (res != NULL) {
3058 ok = PyObject_IsTrue(res);
3059 Py_DECREF(res);
3060 }
3061 return ok;
3062 }
3063 else if (PyErr_Occurred()) {
3064 return -1;
3065 }
3066 }
3067 return recursive_issubclass(derived, cls);
Antoine Pitrou0668c622008-08-26 22:42:08 +00003068}
3069
3070int
3071_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
3072{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003073 return recursive_isinstance(inst, cls);
Antoine Pitrou0668c622008-08-26 22:42:08 +00003074}
3075
3076int
3077_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
3078{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003079 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00003080}
3081
3082
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003083PyObject *
3084PyObject_GetIter(PyObject *o)
3085{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003086 PyTypeObject *t = o->ob_type;
3087 getiterfunc f = NULL;
3088 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3089 f = t->tp_iter;
3090 if (f == NULL) {
3091 if (PySequence_Check(o))
3092 return PySeqIter_New(o);
3093 return type_error("'%.200s' object is not iterable", o);
3094 }
3095 else {
3096 PyObject *res = (*f)(o);
3097 if (res != NULL && !PyIter_Check(res)) {
3098 PyErr_Format(PyExc_TypeError,
3099 "iter() returned non-iterator "
3100 "of type '%.100s'",
3101 res->ob_type->tp_name);
3102 Py_DECREF(res);
3103 res = NULL;
3104 }
3105 return res;
3106 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003107}
3108
Tim Petersf4848da2001-05-05 00:14:56 +00003109/* Return next item.
3110 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3111 * If the iteration terminates normally, return NULL and clear the
3112 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3113 * will be false.
3114 * Else return the next object. PyErr_Occurred() will be false.
3115 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003116PyObject *
3117PyIter_Next(PyObject *iter)
3118{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003119 PyObject *result;
3120 result = (*iter->ob_type->tp_iternext)(iter);
3121 if (result == NULL &&
3122 PyErr_Occurred() &&
3123 PyErr_ExceptionMatches(PyExc_StopIteration))
3124 PyErr_Clear();
3125 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003126}