blob: 5fb89f367285ef895a53e98ed0aac21d3aa264da [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, \
Guido van Rossumc3189692001-01-17 15:29:42 +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{
Georg Brandlccff7852006-06-18 22:17:29 +000017 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000018 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{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +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{
35 int r;
36
37 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;
Guido van Rossume15dee51995-07-18 14:12:02 +000045 return 0;
46}
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{
51 PyObject *v;
52
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000053 if (o == NULL)
54 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000055 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
58}
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{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +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
Jeremy Hylton6253f832000-07-12 12:56:19 +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{
81 return PyObject_Size(o);
82}
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
88 value, then the defaultvalue is returned. This function never fails.
89 Accordingly, it will mask exceptions raised in either method.
90*/
91
92Py_ssize_t
93_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
94{
95 static PyObject *hintstrobj = NULL;
96 PyObject *ro;
97 Py_ssize_t rv;
98
99 /* try o.__len__() */
100 rv = PyObject_Size(o);
101 if (rv >= 0)
102 return rv;
103 if (PyErr_Occurred())
104 PyErr_Clear();
105
106 /* cache a hashed version of the attribute string */
107 if (hintstrobj == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000108 hintstrobj = PyString_InternFromString("__length_hint__");
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000109 if (hintstrobj == NULL)
110 goto defaultcase;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000111 }
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000112
113 /* try o.__length_hint__() */
114 ro = PyObject_CallMethodObjArgs(o, hintstrobj, NULL);
115 if (ro == NULL)
116 goto defaultcase;
117 rv = PyInt_AsLong(ro);
118 Py_DECREF(ro);
119 if (rv >= 0)
120 return rv;
121
122defaultcase:
123 if (PyErr_Occurred())
124 PyErr_Clear();
125 return defaultvalue;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000126}
127
Guido van Rossume15dee51995-07-18 14:12:02 +0000128PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000129PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000130{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000131 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000132
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133 if (o == NULL || key == NULL)
134 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000136 m = o->ob_type->tp_as_mapping;
137 if (m && m->mp_subscript)
138 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000139
Guido van Rossum21308241998-08-13 16:44:44 +0000140 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000141 if (PyIndex_Check(key)) {
142 Py_ssize_t key_value;
143 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000144 if (key_value == -1 && PyErr_Occurred())
145 return NULL;
146 return PySequence_GetItem(o, key_value);
147 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000148 else if (o->ob_type->tp_as_sequence->sq_item)
Georg Brandlccff7852006-06-18 22:17:29 +0000149 return type_error("sequence index must "
150 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000151 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000152
Georg Brandlccff7852006-06-18 22:17:29 +0000153 return type_error("'%.200s' object is unsubscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000154}
155
156int
Fred Drake79912472000-07-09 04:06:11 +0000157PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000158{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000159 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000161 if (o == NULL || key == NULL || value == NULL) {
162 null_error();
163 return -1;
164 }
165 m = o->ob_type->tp_as_mapping;
166 if (m && m->mp_ass_subscript)
167 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000168
Guido van Rossum21308241998-08-13 16:44:44 +0000169 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000170 if (PyIndex_Check(key)) {
171 Py_ssize_t key_value;
172 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000173 if (key_value == -1 && PyErr_Occurred())
174 return -1;
175 return PySequence_SetItem(o, key_value, value);
176 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000177 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000178 type_error("sequence index must be "
179 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000180 return -1;
181 }
Guido van Rossum21308241998-08-13 16:44:44 +0000182 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000183
Georg Brandlccff7852006-06-18 22:17:29 +0000184 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000185 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000186}
187
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000188int
Fred Drake79912472000-07-09 04:06:11 +0000189PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000190{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000191 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000193 if (o == NULL || key == NULL) {
194 null_error();
195 return -1;
196 }
197 m = o->ob_type->tp_as_mapping;
198 if (m && m->mp_ass_subscript)
199 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000200
Guido van Rossum21308241998-08-13 16:44:44 +0000201 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000202 if (PyIndex_Check(key)) {
203 Py_ssize_t key_value;
204 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000205 if (key_value == -1 && PyErr_Occurred())
206 return -1;
207 return PySequence_DelItem(o, key_value);
208 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000209 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000210 type_error("sequence index must be "
211 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000212 return -1;
213 }
Guido van Rossum21308241998-08-13 16:44:44 +0000214 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000215
Georg Brandlccff7852006-06-18 22:17:29 +0000216 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000217 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000218}
219
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000220int
221PyObject_DelItemString(PyObject *o, char *key)
222{
223 PyObject *okey;
224 int ret;
225
226 if (o == NULL || key == NULL) {
227 null_error();
228 return -1;
229 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000230 okey = PyString_FromString(key);
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000231 if (okey == NULL)
232 return -1;
233 ret = PyObject_DelItem(o, okey);
234 Py_DECREF(okey);
235 return ret;
236}
237
Brett Cannonea229bd2006-06-06 18:08:16 +0000238int
239PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000241 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242{
243 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000244 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000245 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246
247 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
248 null_error();
249 return -1;
250 }
251 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000253 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000255 PyErr_SetString(PyExc_TypeError,
256 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000257 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000258 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000260 PyErr_SetString(PyExc_TypeError,
261 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000262 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000266 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267 *buffer = pp;
268 *buffer_len = len;
269 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000270}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000272int
273PyObject_CheckReadBuffer(PyObject *obj)
274{
275 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
276
277 if (pb == NULL ||
278 pb->bf_getreadbuffer == NULL ||
279 pb->bf_getsegcount == NULL ||
280 (*pb->bf_getsegcount)(obj, NULL) != 1)
281 return 0;
282 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283}
284
285int PyObject_AsReadBuffer(PyObject *obj,
286 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288{
289 PyBufferProcs *pb;
290 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000291 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292
293 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
294 null_error();
295 return -1;
296 }
297 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000298 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000299 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000300 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 PyErr_SetString(PyExc_TypeError,
302 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000303 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000305 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000306 PyErr_SetString(PyExc_TypeError,
307 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000308 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000309 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000310 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 *buffer = pp;
314 *buffer_len = len;
315 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316}
317
318int PyObject_AsWriteBuffer(PyObject *obj,
319 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321{
322 PyBufferProcs *pb;
323 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000325
326 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
327 null_error();
328 return -1;
329 }
330 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000331 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000332 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000333 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000334 PyErr_SetString(PyExc_TypeError,
335 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000336 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000337 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000338 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000339 PyErr_SetString(PyExc_TypeError,
340 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000341 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000342 }
343 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
344 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000345 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000346 *buffer = pp;
347 *buffer_len = len;
348 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000349}
350
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000351/* Buffer C-API for Python 3.0 */
352
353int
354PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
355{
356 if (!PyObject_CheckBuffer(obj)) {
357 PyErr_Format(PyExc_TypeError,
358 "'%100s' does not have the buffer interface",
359 Py_TYPE(obj)->tp_name);
360 return -1;
361 }
362 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
363}
364
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000365static int
366_IsFortranContiguous(Py_buffer *view)
367{
368 Py_ssize_t sd, dim;
369 int i;
370
371 if (view->ndim == 0) return 1;
372 if (view->strides == NULL) return (view->ndim == 1);
373
374 sd = view->itemsize;
375 if (view->ndim == 1) return (view->shape[0] == 1 ||
376 sd == view->strides[0]);
377 for (i=0; i<view->ndim; i++) {
378 dim = view->shape[i];
379 if (dim == 0) return 1;
380 if (view->strides[i] != sd) return 0;
381 sd *= dim;
382 }
383 return 1;
384}
385
386static int
387_IsCContiguous(Py_buffer *view)
388{
389 Py_ssize_t sd, dim;
390 int i;
391
392 if (view->ndim == 0) return 1;
393 if (view->strides == NULL) return 1;
394
395 sd = view->itemsize;
396 if (view->ndim == 1) return (view->shape[0] == 1 ||
397 sd == view->strides[0]);
398 for (i=view->ndim-1; i>=0; i--) {
399 dim = view->shape[i];
400 if (dim == 0) return 1;
401 if (view->strides[i] != sd) return 0;
402 sd *= dim;
403 }
404 return 1;
405}
406
407int
408PyBuffer_IsContiguous(Py_buffer *view, char fort)
409{
410
411 if (view->suboffsets != NULL) return 0;
412
413 if (fort == 'C')
414 return _IsCContiguous(view);
415 else if (fort == 'F')
416 return _IsFortranContiguous(view);
417 else if (fort == 'A')
418 return (_IsCContiguous(view) || _IsFortranContiguous(view));
419 return 0;
420}
421
422
423void*
424PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
425{
426 char* pointer;
427 int i;
428 pointer = (char *)view->buf;
429 for (i = 0; i < view->ndim; i++) {
430 pointer += view->strides[i]*indices[i];
431 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
432 pointer = *((char**)pointer) + view->suboffsets[i];
433 }
434 }
435 return (void*)pointer;
436}
437
438
Neal Norwitzfddc4692008-04-15 03:46:21 +0000439static void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000440_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape)
441{
442 int k;
443
444 for (k=0; k<nd; k++) {
445 if (index[k] < shape[k]-1) {
446 index[k]++;
447 break;
448 }
449 else {
450 index[k] = 0;
451 }
452 }
453}
454
Neal Norwitzfddc4692008-04-15 03:46:21 +0000455static void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000456_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape)
457{
458 int k;
459
460 for (k=nd-1; k>=0; k--) {
461 if (index[k] < shape[k]-1) {
462 index[k]++;
463 break;
464 }
465 else {
466 index[k] = 0;
467 }
468 }
469}
470
471 /* view is not checked for consistency in either of these. It is
472 assumed that the size of the buffer is view->len in
473 view->len / view->itemsize elements.
474 */
475
476int
477PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
478{
479 int k;
480 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
481 Py_ssize_t *indices, elements;
482 char *dest, *ptr;
483
484 if (len > view->len) {
485 len = view->len;
486 }
487
488 if (PyBuffer_IsContiguous(view, fort)) {
489 /* simplest copy is all that is needed */
490 memcpy(buf, view->buf, len);
491 return 0;
492 }
493
494 /* Otherwise a more elaborate scheme is needed */
495
496 /* XXX(nnorwitz): need to check for overflow! */
497 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
498 if (indices == NULL) {
499 PyErr_NoMemory();
500 return -1;
501 }
502 for (k=0; k<view->ndim;k++) {
503 indices[k] = 0;
504 }
505
506 if (fort == 'F') {
507 addone = _add_one_to_index_F;
508 }
509 else {
510 addone = _add_one_to_index_C;
511 }
512 dest = buf;
513 /* XXX : This is not going to be the fastest code in the world
514 several optimizations are possible.
515 */
516 elements = len / view->itemsize;
517 while (elements--) {
518 addone(view->ndim, indices, view->shape);
519 ptr = PyBuffer_GetPointer(view, indices);
520 memcpy(dest, ptr, view->itemsize);
521 dest += view->itemsize;
522 }
523 PyMem_Free(indices);
524 return 0;
525}
526
527int
528PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
529{
530 int k;
531 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
532 Py_ssize_t *indices, elements;
533 char *src, *ptr;
534
535 if (len > view->len) {
536 len = view->len;
537 }
538
539 if (PyBuffer_IsContiguous(view, fort)) {
540 /* simplest copy is all that is needed */
541 memcpy(view->buf, buf, len);
542 return 0;
543 }
544
545 /* Otherwise a more elaborate scheme is needed */
546
547 /* XXX(nnorwitz): need to check for overflow! */
548 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
549 if (indices == NULL) {
550 PyErr_NoMemory();
551 return -1;
552 }
553 for (k=0; k<view->ndim;k++) {
554 indices[k] = 0;
555 }
556
557 if (fort == 'F') {
558 addone = _add_one_to_index_F;
559 }
560 else {
561 addone = _add_one_to_index_C;
562 }
563 src = buf;
564 /* XXX : This is not going to be the fastest code in the world
565 several optimizations are possible.
566 */
567 elements = len / view->itemsize;
568 while (elements--) {
569 addone(view->ndim, indices, view->shape);
570 ptr = PyBuffer_GetPointer(view, indices);
571 memcpy(ptr, src, view->itemsize);
572 src += view->itemsize;
573 }
574
575 PyMem_Free(indices);
576 return 0;
577}
578
579int PyObject_CopyData(PyObject *dest, PyObject *src)
580{
581 Py_buffer view_dest, view_src;
582 int k;
583 Py_ssize_t *indices, elements;
584 char *dptr, *sptr;
585
586 if (!PyObject_CheckBuffer(dest) ||
587 !PyObject_CheckBuffer(src)) {
588 PyErr_SetString(PyExc_TypeError,
589 "both destination and source must have the "\
590 "buffer interface");
591 return -1;
592 }
593
594 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
595 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000596 PyBuffer_Release(&view_dest);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000597 return -1;
598 }
599
600 if (view_dest.len < view_src.len) {
601 PyErr_SetString(PyExc_BufferError,
602 "destination is too small to receive data from source");
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000603 PyBuffer_Release(&view_dest);
604 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000605 return -1;
606 }
607
608 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
609 PyBuffer_IsContiguous(&view_src, 'C')) ||
610 (PyBuffer_IsContiguous(&view_dest, 'F') &&
611 PyBuffer_IsContiguous(&view_src, 'F'))) {
612 /* simplest copy is all that is needed */
613 memcpy(view_dest.buf, view_src.buf, view_src.len);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000614 PyBuffer_Release(&view_dest);
615 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000616 return 0;
617 }
618
619 /* Otherwise a more elaborate copy scheme is needed */
620
621 /* XXX(nnorwitz): need to check for overflow! */
622 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
623 if (indices == NULL) {
624 PyErr_NoMemory();
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000625 PyBuffer_Release(&view_dest);
626 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000627 return -1;
628 }
629 for (k=0; k<view_src.ndim;k++) {
630 indices[k] = 0;
631 }
632 elements = 1;
633 for (k=0; k<view_src.ndim; k++) {
634 /* XXX(nnorwitz): can this overflow? */
635 elements *= view_src.shape[k];
636 }
637 while (elements--) {
638 _add_one_to_index_C(view_src.ndim, indices, view_src.shape);
639 dptr = PyBuffer_GetPointer(&view_dest, indices);
640 sptr = PyBuffer_GetPointer(&view_src, indices);
641 memcpy(dptr, sptr, view_src.itemsize);
642 }
643 PyMem_Free(indices);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000644 PyBuffer_Release(&view_dest);
645 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000646 return 0;
647}
648
649void
650PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
651 Py_ssize_t *strides, int itemsize,
652 char fort)
653{
654 int k;
655 Py_ssize_t sd;
656
657 sd = itemsize;
658 if (fort == 'F') {
659 for (k=0; k<nd; k++) {
660 strides[k] = sd;
661 sd *= shape[k];
662 }
663 }
664 else {
665 for (k=nd-1; k>=0; k--) {
666 strides[k] = sd;
667 sd *= shape[k];
668 }
669 }
670 return;
671}
672
673int
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000674PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000675 int readonly, int flags)
676{
677 if (view == NULL) return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000678 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
679 (readonly == 1)) {
680 PyErr_SetString(PyExc_BufferError,
681 "Object is not writable.");
682 return -1;
683 }
684
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000685 view->obj = obj;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000686 view->buf = buf;
687 view->len = len;
688 view->readonly = readonly;
689 view->itemsize = 1;
690 view->format = NULL;
691 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
692 view->format = "B";
693 view->ndim = 1;
694 view->shape = NULL;
695 if ((flags & PyBUF_ND) == PyBUF_ND)
696 view->shape = &(view->len);
697 view->strides = NULL;
698 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
699 view->strides = &(view->itemsize);
700 view->suboffsets = NULL;
701 view->internal = NULL;
702 return 0;
703}
704
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000705void
706PyBuffer_Release(Py_buffer *view)
707{
708 PyObject *obj = view->obj;
709 if (!obj || !Py_TYPE(obj)->tp_as_buffer || !Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
710 /* Unmanaged buffer */
711 return;
712 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
713
714}
715
Eric Smitha9f7d622008-02-17 19:46:49 +0000716PyObject *
717PyObject_Format(PyObject* obj, PyObject *format_spec)
718{
719 static PyObject * str__format__ = NULL;
720 PyObject *empty = NULL;
721 PyObject *result = NULL;
722 int spec_is_unicode;
723 int result_is_unicode;
724
725 /* Initialize cached value */
726 if (str__format__ == NULL) {
727 /* Initialize static variable needed by _PyType_Lookup */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000728 str__format__ = PyString_InternFromString("__format__");
Eric Smitha9f7d622008-02-17 19:46:49 +0000729 if (str__format__ == NULL)
730 goto done;
731 }
732
733 /* If no format_spec is provided, use an empty string */
734 if (format_spec == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000735 empty = PyString_FromStringAndSize(NULL, 0);
Eric Smitha9f7d622008-02-17 19:46:49 +0000736 format_spec = empty;
737 }
738
739 /* Check the format_spec type, and make sure it's str or unicode */
740 if (PyUnicode_Check(format_spec))
741 spec_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000742 else if (PyString_Check(format_spec))
Eric Smitha9f7d622008-02-17 19:46:49 +0000743 spec_is_unicode = 0;
744 else {
745 PyErr_Format(PyExc_TypeError,
746 "format expects arg 2 to be string "
747 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
748 goto done;
749 }
750
751 /* Make sure the type is initialized. float gets initialized late */
752 if (Py_TYPE(obj)->tp_dict == NULL)
753 if (PyType_Ready(Py_TYPE(obj)) < 0)
754 goto done;
755
756 /* Check for a __format__ method and call it. */
757 if (PyInstance_Check(obj)) {
758 /* We're an instance of a classic class */
759 PyObject *bound_method = PyObject_GetAttr(obj,
760 str__format__);
761 if (bound_method != NULL) {
762 result = PyObject_CallFunctionObjArgs(bound_method,
763 format_spec,
764 NULL);
765 Py_DECREF(bound_method);
766 } else {
767 PyObject *self_as_str;
768 PyObject *format_method;
769
770 PyErr_Clear();
771 /* Per the PEP, convert to str (or unicode,
772 depending on the type of the format
773 specifier). For new-style classes, this
774 logic is done by object.__format__(). */
775 if (spec_is_unicode)
776 self_as_str = PyObject_Unicode(obj);
777 else
778 self_as_str = PyObject_Str(obj);
779 if (self_as_str == NULL)
780 goto done;
781
782 /* Then call str.__format__ on that result */
783 format_method = PyObject_GetAttr(self_as_str,
784 str__format__);
785 if (format_method == NULL) {
786 Py_DECREF(self_as_str);
787 goto done;
788 }
789 result = PyObject_CallFunctionObjArgs(format_method,
790 format_spec,
791 NULL);
792 Py_DECREF(self_as_str);
793 Py_DECREF(format_method);
794 if (result == NULL)
795 goto done;
796 }
797 } else {
798 /* Not an instance of a classic class, use the code
799 from py3k */
800
801 /* Find the (unbound!) __format__ method (a borrowed
802 reference) */
803 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
804 str__format__);
805 if (method == NULL) {
806 PyErr_Format(PyExc_TypeError,
807 "Type %.100s doesn't define __format__",
808 Py_TYPE(obj)->tp_name);
809 goto done;
810 }
811 /* And call it, binding it to the value */
812 result = PyObject_CallFunctionObjArgs(method, obj,
813 format_spec, NULL);
814 }
815
816 if (result == NULL)
817 goto done;
818
819 /* Check the result type, and make sure it's str or unicode */
820 if (PyUnicode_Check(result))
821 result_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000822 else if (PyString_Check(result))
Eric Smitha9f7d622008-02-17 19:46:49 +0000823 result_is_unicode = 0;
824 else {
825 PyErr_Format(PyExc_TypeError,
826 "%.100s.__format__ must return string or "
827 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
828 Py_TYPE(result)->tp_name);
829 Py_DECREF(result);
830 result = NULL;
831 goto done;
832 }
833
834 /* Convert to unicode, if needed. Required if spec is unicode
835 and result is str */
836 if (spec_is_unicode && !result_is_unicode) {
837 PyObject *tmp = PyObject_Unicode(result);
838 /* This logic works whether or not tmp is NULL */
839 Py_DECREF(result);
840 result = tmp;
841 }
842
843done:
844 Py_XDECREF(empty);
845 return result;
846}
847
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848/* Operations on numbers */
849
850int
Fred Drake79912472000-07-09 04:06:11 +0000851PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000852{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000853 return o && o->ob_type->tp_as_number &&
854 (o->ob_type->tp_as_number->nb_int ||
855 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000856}
857
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000859
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000860/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000861
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000862#define NB_SLOT(x) offsetof(PyNumberMethods, x)
863#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000864 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000865#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000866 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000867
868/*
869 Calling scheme used for binary operations:
870
871 v w Action
872 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000873 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000874 new old v.op(v,w), coerce(v,w), v.op(v,w)
875 old new w.op(v,w), coerce(v,w), v.op(v,w)
876 old old coerce(v,w), v.op(v,w)
877
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000878 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
879 v->ob_type
880
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000881 Legend:
882 -------
883 * new == new style number
884 * old == old style number
885 * Action indicates the order in which operations are tried until either
886 a valid result is produced or an error occurs.
887
888 */
889
890static PyObject *
891binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000892{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000893 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000894 binaryfunc slotv = NULL;
895 binaryfunc slotw = NULL;
896
897 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000898 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000899 if (w->ob_type != v->ob_type &&
900 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000901 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000902 if (slotw == slotv)
903 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000904 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000905 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000906 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
907 x = slotw(v, w);
908 if (x != Py_NotImplemented)
909 return x;
910 Py_DECREF(x); /* can't do it */
911 slotw = NULL;
912 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000913 x = slotv(v, w);
914 if (x != Py_NotImplemented)
915 return x;
916 Py_DECREF(x); /* can't do it */
917 }
918 if (slotw) {
919 x = slotw(v, w);
920 if (x != Py_NotImplemented)
921 return x;
922 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000923 }
924 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
925 int err = PyNumber_CoerceEx(&v, &w);
926 if (err < 0) {
927 return NULL;
928 }
929 if (err == 0) {
930 PyNumberMethods *mv = v->ob_type->tp_as_number;
931 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000932 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000933 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000934 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000935 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000936 Py_DECREF(v);
937 Py_DECREF(w);
938 return x;
939 }
940 }
941 /* CoerceEx incremented the reference counts */
942 Py_DECREF(v);
943 Py_DECREF(w);
944 }
945 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000946 Py_INCREF(Py_NotImplemented);
947 return Py_NotImplemented;
948}
Guido van Rossum77660912002-04-16 16:32:50 +0000949
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000950static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000951binop_type_error(PyObject *v, PyObject *w, const char *op_name)
952{
953 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000954 "unsupported operand type(s) for %.100s: "
955 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000956 op_name,
957 v->ob_type->tp_name,
958 w->ob_type->tp_name);
959 return NULL;
960}
961
962static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000963binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
964{
965 PyObject *result = binary_op1(v, w, op_slot);
966 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000967 Py_DECREF(result);
968 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000969 }
970 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000971}
972
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000973
974/*
975 Calling scheme used for ternary operations:
976
Guido van Rossum84675ac2001-09-29 01:05:03 +0000977 *** In some cases, w.op is called before v.op; see binary_op1. ***
978
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000979 v w z Action
980 -------------------------------------------------------------------
981 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
982 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
983 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
984 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
985 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
986 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
987 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
988 old old old coerce(v,w,z), v.op(v,w,z)
989
990 Legend:
991 -------
992 * new == new style number
993 * old == old style number
994 * Action indicates the order in which operations are tried until either
995 a valid result is produced or an error occurs.
996 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
997 only if z != Py_None; if z == Py_None, then it is treated as absent
998 variable and only coerce(v,w) is tried.
999
1000 */
1001
1002static PyObject *
1003ternary_op(PyObject *v,
1004 PyObject *w,
1005 PyObject *z,
1006 const int op_slot,
1007 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001008{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001009 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001010 PyObject *x = NULL;
1011 ternaryfunc slotv = NULL;
1012 ternaryfunc slotw = NULL;
1013 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001014
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001015 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001016 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001017 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001018 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001019 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001020 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001021 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001022 if (slotw == slotv)
1023 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001024 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001025 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001026 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1027 x = slotw(v, w, z);
1028 if (x != Py_NotImplemented)
1029 return x;
1030 Py_DECREF(x); /* can't do it */
1031 slotw = NULL;
1032 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001033 x = slotv(v, w, z);
1034 if (x != Py_NotImplemented)
1035 return x;
1036 Py_DECREF(x); /* can't do it */
1037 }
1038 if (slotw) {
1039 x = slotw(v, w, z);
1040 if (x != Py_NotImplemented)
1041 return x;
1042 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001043 }
1044 mz = z->ob_type->tp_as_number;
1045 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001046 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001047 if (slotz == slotv || slotz == slotw)
1048 slotz = NULL;
1049 if (slotz) {
1050 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001051 if (x != Py_NotImplemented)
1052 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001053 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001054 }
1055 }
1056
1057 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1058 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1059 /* we have an old style operand, coerce */
1060 PyObject *v1, *z1, *w2, *z2;
1061 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001062
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001063 c = PyNumber_Coerce(&v, &w);
1064 if (c != 0)
1065 goto error3;
1066
1067 /* Special case: if the third argument is None, it is
1068 treated as absent argument and not coerced. */
1069 if (z == Py_None) {
1070 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001071 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1072 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001073 if (slotz)
1074 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001075 else
1076 c = -1;
1077 }
1078 else
1079 c = -1;
1080 goto error2;
1081 }
1082 v1 = v;
1083 z1 = z;
1084 c = PyNumber_Coerce(&v1, &z1);
1085 if (c != 0)
1086 goto error2;
1087 w2 = w;
1088 z2 = z1;
1089 c = PyNumber_Coerce(&w2, &z2);
1090 if (c != 0)
1091 goto error1;
1092
1093 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001094 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1095 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001096 if (slotv)
1097 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001098 else
1099 c = -1;
1100 }
1101 else
1102 c = -1;
1103
1104 Py_DECREF(w2);
1105 Py_DECREF(z2);
1106 error1:
1107 Py_DECREF(v1);
1108 Py_DECREF(z1);
1109 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001110 Py_DECREF(v);
1111 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001112 error3:
1113 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001114 return x;
1115 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001116
1117 if (z == Py_None)
1118 PyErr_Format(
1119 PyExc_TypeError,
1120 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001121 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001122 v->ob_type->tp_name,
1123 w->ob_type->tp_name);
1124 else
1125 PyErr_Format(
1126 PyExc_TypeError,
1127 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001128 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001129 v->ob_type->tp_name,
1130 w->ob_type->tp_name,
1131 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001132 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001133}
1134
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001135#define BINARY_FUNC(func, op, op_name) \
1136 PyObject * \
1137 func(PyObject *v, PyObject *w) { \
1138 return binary_op(v, w, NB_SLOT(op), op_name); \
1139 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001140
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001141BINARY_FUNC(PyNumber_Or, nb_or, "|")
1142BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1143BINARY_FUNC(PyNumber_And, nb_and, "&")
1144BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1145BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1146BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001147BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1148BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001149
1150PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001151PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001152{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001153 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1154 if (result == Py_NotImplemented) {
1155 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001156 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001157 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001158 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001159 }
Armin Rigofd163f92005-12-29 15:59:19 +00001160 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001161 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001162 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001163}
1164
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001165static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001166sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001167{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001168 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001169 if (PyIndex_Check(n)) {
1170 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001171 if (count == -1 && PyErr_Occurred())
1172 return NULL;
1173 }
1174 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001175 return type_error("can't multiply sequence by "
1176 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001177 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001178 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001179}
1180
1181PyObject *
1182PyNumber_Multiply(PyObject *v, PyObject *w)
1183{
1184 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1185 if (result == Py_NotImplemented) {
1186 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1187 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001188 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001189 if (mv && mv->sq_repeat) {
1190 return sequence_repeat(mv->sq_repeat, v, w);
1191 }
1192 else if (mw && mw->sq_repeat) {
1193 return sequence_repeat(mw->sq_repeat, w, v);
1194 }
1195 result = binop_type_error(v, w, "*");
1196 }
1197 return result;
1198}
1199
Guido van Rossume15dee51995-07-18 14:12:02 +00001200PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001201PyNumber_FloorDivide(PyObject *v, PyObject *w)
1202{
1203 /* XXX tp_flags test */
1204 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1205}
1206
1207PyObject *
1208PyNumber_TrueDivide(PyObject *v, PyObject *w)
1209{
1210 /* XXX tp_flags test */
1211 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1212}
1213
1214PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001215PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001216{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001217 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001218}
1219
1220PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001221PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001222{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001223 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001224}
1225
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001226/* Binary in-place operators */
1227
1228/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001229 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001230
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001231 - If the left hand object has the appropriate struct members, and
1232 they are filled, call the appropriate function and return the
1233 result. No coercion is done on the arguments; the left-hand object
1234 is the one the operation is performed on, and it's up to the
1235 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001236
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001237 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001238 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001239
1240 */
1241
Guido van Rossum77660912002-04-16 16:32:50 +00001242#define HASINPLACE(t) \
1243 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001244
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001245static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001246binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001247{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001248 PyNumberMethods *mv = v->ob_type->tp_as_number;
1249 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001250 binaryfunc slot = NB_BINOP(mv, iop_slot);
1251 if (slot) {
1252 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001253 if (x != Py_NotImplemented) {
1254 return x;
1255 }
1256 Py_DECREF(x);
1257 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001258 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001259 return binary_op1(v, w, op_slot);
1260}
1261
1262static PyObject *
1263binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1264 const char *op_name)
1265{
1266 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1267 if (result == Py_NotImplemented) {
1268 Py_DECREF(result);
1269 return binop_type_error(v, w, op_name);
1270 }
1271 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001272}
1273
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001274#define INPLACE_BINOP(func, iop, op, op_name) \
1275 PyObject * \
1276 func(PyObject *v, PyObject *w) { \
1277 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001278 }
1279
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001280INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1281INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1282INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1283INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1284INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1285INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1286INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001287
1288PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001289PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1290{
1291 /* XXX tp_flags test */
1292 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1293 NB_SLOT(nb_floor_divide), "//=");
1294}
1295
1296PyObject *
1297PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1298{
1299 /* XXX tp_flags test */
1300 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1301 NB_SLOT(nb_true_divide), "/=");
1302}
1303
1304PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001305PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1306{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001307 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1308 NB_SLOT(nb_add));
1309 if (result == Py_NotImplemented) {
1310 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1311 Py_DECREF(result);
1312 if (m != NULL) {
1313 binaryfunc f = NULL;
1314 if (HASINPLACE(v))
1315 f = m->sq_inplace_concat;
1316 if (f == NULL)
1317 f = m->sq_concat;
1318 if (f != NULL)
1319 return (*f)(v, w);
1320 }
1321 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001322 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001323 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001324}
1325
1326PyObject *
1327PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1328{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001329 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1330 NB_SLOT(nb_multiply));
1331 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001332 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001333 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1334 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1335 Py_DECREF(result);
1336 if (mv != NULL) {
1337 if (HASINPLACE(v))
1338 f = mv->sq_inplace_repeat;
1339 if (f == NULL)
1340 f = mv->sq_repeat;
1341 if (f != NULL)
1342 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001343 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001344 else if (mw != NULL) {
1345 /* Note that the right hand operand should not be
1346 * mutated in this case so sq_inplace_repeat is not
1347 * used. */
1348 if (mw->sq_repeat)
1349 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001350 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001351 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001352 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001353 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001354}
1355
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001356PyObject *
1357PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1358{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001359 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1360 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001361}
1362
1363PyObject *
1364PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1365{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001366 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1367 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1368 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001369 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001370 else {
1371 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1372 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001373}
1374
1375
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001376/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001377
1378PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001379PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001380{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381 PyNumberMethods *m;
1382
1383 if (o == NULL)
1384 return null_error();
1385 m = o->ob_type->tp_as_number;
1386 if (m && m->nb_negative)
1387 return (*m->nb_negative)(o);
1388
Georg Brandlccff7852006-06-18 22:17:29 +00001389 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001390}
1391
1392PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001393PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001394{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001395 PyNumberMethods *m;
1396
1397 if (o == NULL)
1398 return null_error();
1399 m = o->ob_type->tp_as_number;
1400 if (m && m->nb_positive)
1401 return (*m->nb_positive)(o);
1402
Georg Brandlccff7852006-06-18 22:17:29 +00001403 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001404}
1405
1406PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001407PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001408{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001409 PyNumberMethods *m;
1410
1411 if (o == NULL)
1412 return null_error();
1413 m = o->ob_type->tp_as_number;
1414 if (m && m->nb_invert)
1415 return (*m->nb_invert)(o);
1416
Georg Brandlccff7852006-06-18 22:17:29 +00001417 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001418}
1419
1420PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001421PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001422{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001424
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 if (o == NULL)
1426 return null_error();
1427 m = o->ob_type->tp_as_number;
1428 if (m && m->nb_absolute)
1429 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001430
Georg Brandlccff7852006-06-18 22:17:29 +00001431 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001432}
1433
Guido van Rossum9e896b32000-04-05 20:11:21 +00001434/* Add a check for embedded NULL-bytes in the argument. */
1435static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001436int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001437{
1438 char *end;
1439 PyObject *x;
1440
1441 x = PyInt_FromString((char*)s, &end, 10);
1442 if (x == NULL)
1443 return NULL;
1444 if (end != s + len) {
1445 PyErr_SetString(PyExc_ValueError,
1446 "null byte in argument for int()");
1447 Py_DECREF(x);
1448 return NULL;
1449 }
1450 return x;
1451}
1452
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001453/* Return a Python Int or Long from the object item
1454 Raise TypeError if the result is not an int-or-long
1455 or if the object cannot be interpreted as an index.
1456*/
1457PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001458PyNumber_Index(PyObject *item)
1459{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001460 PyObject *result = NULL;
1461 if (item == NULL)
1462 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001463 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001464 Py_INCREF(item);
1465 return item;
1466 }
1467 if (PyIndex_Check(item)) {
1468 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001469 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001470 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001471 PyErr_Format(PyExc_TypeError,
1472 "__index__ returned non-(int,long) " \
1473 "(type %.200s)",
1474 result->ob_type->tp_name);
1475 Py_DECREF(result);
1476 return NULL;
1477 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001478 }
1479 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001480 PyErr_Format(PyExc_TypeError,
1481 "'%.200s' object cannot be interpreted "
1482 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001483 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001484 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001485}
1486
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001487/* Return an error on Overflow only if err is not NULL*/
1488
1489Py_ssize_t
1490PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1491{
1492 Py_ssize_t result;
1493 PyObject *runerr;
1494 PyObject *value = PyNumber_Index(item);
1495 if (value == NULL)
1496 return -1;
1497
1498 /* We're done if PyInt_AsSsize_t() returns without error. */
1499 result = PyInt_AsSsize_t(value);
1500 if (result != -1 || !(runerr = PyErr_Occurred()))
1501 goto finish;
1502
1503 /* Error handling code -- only manage OverflowError differently */
1504 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1505 goto finish;
1506
1507 PyErr_Clear();
1508 /* If no error-handling desired then the default clipping
1509 is sufficient.
1510 */
1511 if (!err) {
1512 assert(PyLong_Check(value));
1513 /* Whether or not it is less than or equal to
1514 zero is determined by the sign of ob_size
1515 */
1516 if (_PyLong_Sign(value) < 0)
1517 result = PY_SSIZE_T_MIN;
1518 else
1519 result = PY_SSIZE_T_MAX;
1520 }
1521 else {
1522 /* Otherwise replace the error with caller's error object. */
1523 PyErr_Format(err,
1524 "cannot fit '%.200s' into an index-sized integer",
1525 item->ob_type->tp_name);
1526 }
1527
1528 finish:
1529 Py_DECREF(value);
1530 return result;
1531}
1532
1533
Guido van Rossume15dee51995-07-18 14:12:02 +00001534PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001535_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1536{
1537 const char *type_name;
1538 static PyObject *int_name = NULL;
1539 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001540 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001541 if (int_name == NULL)
1542 return NULL;
1543 }
1544
1545 if (integral && (!PyInt_Check(integral) &&
1546 !PyLong_Check(integral))) {
1547 /* Don't go through tp_as_number->nb_int to avoid
1548 hitting the classic class fallback to __trunc__. */
1549 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1550 if (int_func == NULL) {
1551 PyErr_Clear(); /* Raise a different error. */
1552 goto non_integral_error;
1553 }
1554 Py_DECREF(integral);
1555 integral = PyEval_CallObject(int_func, NULL);
1556 Py_DECREF(int_func);
1557 if (integral && (!PyInt_Check(integral) &&
1558 !PyLong_Check(integral))) {
1559 goto non_integral_error;
1560 }
1561 }
1562 return integral;
1563
1564non_integral_error:
1565 if (PyInstance_Check(integral)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001566 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001567 ->in_class->cl_name);
1568 }
1569 else {
1570 type_name = integral->ob_type->tp_name;
1571 }
1572 PyErr_Format(PyExc_TypeError, error_format, type_name);
1573 Py_DECREF(integral);
1574 return NULL;
1575}
1576
1577
1578PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001579PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001580{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001581 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001582 static PyObject *trunc_name = NULL;
1583 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001584 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001585 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001586
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001587 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001588 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001589 if (trunc_name == NULL)
1590 return NULL;
1591 }
1592
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001593 if (o == NULL)
1594 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001595 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001596 Py_INCREF(o);
1597 return o;
1598 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001599 m = o->ob_type->tp_as_number;
1600 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001601 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001602 PyObject *res = m->nb_int(o);
1603 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1604 PyErr_Format(PyExc_TypeError,
1605 "__int__ returned non-int (type %.200s)",
1606 res->ob_type->tp_name);
1607 Py_DECREF(res);
1608 return NULL;
1609 }
1610 return res;
1611 }
1612 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001613 PyIntObject *io = (PyIntObject*)o;
1614 return PyInt_FromLong(io->ob_ival);
1615 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001616 trunc_func = PyObject_GetAttr(o, trunc_name);
1617 if (trunc_func) {
1618 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1619 Py_DECREF(trunc_func);
1620 /* __trunc__ is specified to return an Integral type, but
1621 int() needs to return an int. */
1622 return _PyNumber_ConvertIntegralToInt(
1623 truncated,
1624 "__trunc__ returned non-Integral (type %.200s)");
1625 }
1626 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1627
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001628 if (PyString_Check(o))
1629 return int_from_string(PyString_AS_STRING(o),
1630 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001631#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001632 if (PyUnicode_Check(o))
1633 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1634 PyUnicode_GET_SIZE(o),
1635 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001636#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001637 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001638 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001639
Georg Brandlccff7852006-06-18 22:17:29 +00001640 return type_error("int() argument must be a string or a "
1641 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001642}
1643
Guido van Rossum9e896b32000-04-05 20:11:21 +00001644/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001645static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001646long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001647{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001648 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001649 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001650
Guido van Rossum4c08d552000-03-10 22:55:18 +00001651 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001652 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001653 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001654 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001655 PyErr_SetString(PyExc_ValueError,
1656 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001657 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001658 return NULL;
1659 }
1660 return x;
1661}
1662
Guido van Rossume15dee51995-07-18 14:12:02 +00001663PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001664PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001665{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001666 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001667 static PyObject *trunc_name = NULL;
1668 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001669 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001670 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001671
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001672 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001673 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001674 if (trunc_name == NULL)
1675 return NULL;
1676 }
1677
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001678 if (o == NULL)
1679 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001680 m = o->ob_type->tp_as_number;
1681 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001682 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001683 PyObject *res = m->nb_long(o);
1684 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1685 PyErr_Format(PyExc_TypeError,
1686 "__long__ returned non-long (type %.200s)",
1687 res->ob_type->tp_name);
1688 Py_DECREF(res);
1689 return NULL;
1690 }
1691 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001692 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001693 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001694 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001695 trunc_func = PyObject_GetAttr(o, trunc_name);
1696 if (trunc_func) {
1697 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1698 PyObject *int_instance;
1699 Py_DECREF(trunc_func);
1700 /* __trunc__ is specified to return an Integral type,
1701 but long() needs to return a long. */
1702 int_instance = _PyNumber_ConvertIntegralToInt(
1703 truncated,
1704 "__trunc__ returned non-Integral (type %.200s)");
1705 if (int_instance && PyInt_Check(int_instance)) {
1706 /* Make sure that long() returns a long instance. */
1707 long value = PyInt_AS_LONG(int_instance);
1708 Py_DECREF(int_instance);
1709 return PyLong_FromLong(value);
1710 }
1711 return int_instance;
1712 }
1713 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1714
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001715 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001716 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001717 * doesn't do. In particular long('9.5') must raise an
1718 * exception, not truncate the float.
1719 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001720 return long_from_string(PyString_AS_STRING(o),
1721 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001722#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001723 if (PyUnicode_Check(o))
1724 /* The above check is done in PyLong_FromUnicode(). */
1725 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1726 PyUnicode_GET_SIZE(o),
1727 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001728#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001729 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1730 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001731
Georg Brandlccff7852006-06-18 22:17:29 +00001732 return type_error("long() argument must be a string or a "
1733 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001734}
1735
1736PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001737PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001738{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001739 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001740
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001741 if (o == NULL)
1742 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001743 m = o->ob_type->tp_as_number;
1744 if (m && m->nb_float) { /* This should include subclasses of float */
1745 PyObject *res = m->nb_float(o);
1746 if (res && !PyFloat_Check(res)) {
1747 PyErr_Format(PyExc_TypeError,
1748 "__float__ returned non-float (type %.200s)",
1749 res->ob_type->tp_name);
1750 Py_DECREF(res);
1751 return NULL;
1752 }
1753 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001754 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001755 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001756 PyFloatObject *po = (PyFloatObject *)o;
1757 return PyFloat_FromDouble(po->ob_fval);
1758 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001759 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001760}
1761
Eric Smith5e527eb2008-02-10 01:36:53 +00001762PyObject *
1763PyNumber_ToBase(PyObject *n, int base)
1764{
1765 PyObject *res = NULL;
1766 PyObject *index = PyNumber_Index(n);
1767
1768 if (!index)
1769 return NULL;
1770 if (PyLong_Check(index))
1771 res = _PyLong_Format(index, base, 0, 1);
1772 else if (PyInt_Check(index))
1773 res = _PyInt_Format((PyIntObject*)index, base, 1);
1774 else
Eric Smith3f914372008-02-15 12:14:32 +00001775 /* It should not be possible to get here, as
1776 PyNumber_Index already has a check for the same
1777 condition */
1778 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1779 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001780 Py_DECREF(index);
1781 return res;
1782}
1783
1784
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001785/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001786
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001787int
Fred Drake79912472000-07-09 04:06:11 +00001788PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001789{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001790 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001791 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001792 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001793 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001794 return s != NULL && s->ob_type->tp_as_sequence &&
1795 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001796}
1797
Martin v. Löwis18e16552006-02-15 17:27:45 +00001798Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001799PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001800{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001801 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001802
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001803 if (s == NULL) {
1804 null_error();
1805 return -1;
1806 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001807
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001808 m = s->ob_type->tp_as_sequence;
1809 if (m && m->sq_length)
1810 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001811
Georg Brandlb0061c82006-08-08 11:56:21 +00001812 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001813 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001814}
1815
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001816#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001817Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001818PySequence_Length(PyObject *s)
1819{
1820 return PySequence_Size(s);
1821}
1822#define PySequence_Length PySequence_Size
1823
Guido van Rossume15dee51995-07-18 14:12:02 +00001824PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001825PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001826{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001827 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001828
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001829 if (s == NULL || o == NULL)
1830 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001831
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001832 m = s->ob_type->tp_as_sequence;
1833 if (m && m->sq_concat)
1834 return m->sq_concat(s, o);
1835
Armin Rigofd163f92005-12-29 15:59:19 +00001836 /* Instances of user classes defining an __add__() method only
1837 have an nb_add slot, not an sq_concat slot. So we fall back
1838 to nb_add if both arguments appear to be sequences. */
1839 if (PySequence_Check(s) && PySequence_Check(o)) {
1840 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1841 if (result != Py_NotImplemented)
1842 return result;
1843 Py_DECREF(result);
1844 }
Georg Brandlccff7852006-06-18 22:17:29 +00001845 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001846}
1847
1848PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001849PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001850{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001851 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001852
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001853 if (o == NULL)
1854 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001855
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001856 m = o->ob_type->tp_as_sequence;
1857 if (m && m->sq_repeat)
1858 return m->sq_repeat(o, count);
1859
Armin Rigofd163f92005-12-29 15:59:19 +00001860 /* Instances of user classes defining a __mul__() method only
1861 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1862 to nb_multiply if o appears to be a sequence. */
1863 if (PySequence_Check(o)) {
1864 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001865 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001866 if (n == NULL)
1867 return NULL;
1868 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1869 Py_DECREF(n);
1870 if (result != Py_NotImplemented)
1871 return result;
1872 Py_DECREF(result);
1873 }
Georg Brandlccff7852006-06-18 22:17:29 +00001874 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001875}
1876
1877PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001878PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1879{
1880 PySequenceMethods *m;
1881
1882 if (s == NULL || o == NULL)
1883 return null_error();
1884
1885 m = s->ob_type->tp_as_sequence;
1886 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1887 return m->sq_inplace_concat(s, o);
1888 if (m && m->sq_concat)
1889 return m->sq_concat(s, o);
1890
Armin Rigofd163f92005-12-29 15:59:19 +00001891 if (PySequence_Check(s) && PySequence_Check(o)) {
1892 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1893 NB_SLOT(nb_add));
1894 if (result != Py_NotImplemented)
1895 return result;
1896 Py_DECREF(result);
1897 }
Georg Brandlccff7852006-06-18 22:17:29 +00001898 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001899}
1900
1901PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001902PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001903{
1904 PySequenceMethods *m;
1905
1906 if (o == NULL)
1907 return null_error();
1908
1909 m = o->ob_type->tp_as_sequence;
1910 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1911 return m->sq_inplace_repeat(o, count);
1912 if (m && m->sq_repeat)
1913 return m->sq_repeat(o, count);
1914
Armin Rigofd163f92005-12-29 15:59:19 +00001915 if (PySequence_Check(o)) {
1916 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001917 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001918 if (n == NULL)
1919 return NULL;
1920 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1921 NB_SLOT(nb_multiply));
1922 Py_DECREF(n);
1923 if (result != Py_NotImplemented)
1924 return result;
1925 Py_DECREF(result);
1926 }
Georg Brandlccff7852006-06-18 22:17:29 +00001927 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001928}
1929
1930PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001931PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001932{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001933 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001934
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001935 if (s == NULL)
1936 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001937
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001938 m = s->ob_type->tp_as_sequence;
1939 if (m && m->sq_item) {
1940 if (i < 0) {
1941 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001942 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001943 if (l < 0)
1944 return NULL;
1945 i += l;
1946 }
1947 }
1948 return m->sq_item(s, i);
1949 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001950
Skip Montanaro2c7ca9b2008-07-07 11:16:14 +00001951 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001952}
1953
1954PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001955PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001956{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001957 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001958 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001959
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001960 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001961
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001962 m = s->ob_type->tp_as_sequence;
1963 if (m && m->sq_slice) {
1964 if (i1 < 0 || i2 < 0) {
1965 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001966 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001967 if (l < 0)
1968 return NULL;
1969 if (i1 < 0)
1970 i1 += l;
1971 if (i2 < 0)
1972 i2 += l;
1973 }
1974 }
1975 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001976 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1977 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001978 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001979 if (!slice)
1980 return NULL;
1981 res = mp->mp_subscript(s, slice);
1982 Py_DECREF(slice);
1983 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001984 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001985
Georg Brandlccff7852006-06-18 22:17:29 +00001986 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001987}
1988
1989int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001990PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001991{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001992 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001993
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001994 if (s == NULL) {
1995 null_error();
1996 return -1;
1997 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001998
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001999 m = s->ob_type->tp_as_sequence;
2000 if (m && m->sq_ass_item) {
2001 if (i < 0) {
2002 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002003 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002004 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002005 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002006 i += l;
2007 }
2008 }
2009 return m->sq_ass_item(s, i, o);
2010 }
2011
Georg Brandlccff7852006-06-18 22:17:29 +00002012 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002013 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002014}
2015
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002016int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002017PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002018{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002019 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002020
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002021 if (s == NULL) {
2022 null_error();
2023 return -1;
2024 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002025
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002026 m = s->ob_type->tp_as_sequence;
2027 if (m && m->sq_ass_item) {
2028 if (i < 0) {
2029 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002030 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002031 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002032 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002033 i += l;
2034 }
2035 }
2036 return m->sq_ass_item(s, i, (PyObject *)NULL);
2037 }
2038
Georg Brandlccff7852006-06-18 22:17:29 +00002039 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002040 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002041}
2042
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002043int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002044PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002045{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002046 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002047 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002048
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002049 if (s == NULL) {
2050 null_error();
2051 return -1;
2052 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002053
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002054 m = s->ob_type->tp_as_sequence;
2055 if (m && m->sq_ass_slice) {
2056 if (i1 < 0 || i2 < 0) {
2057 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002058 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002059 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002060 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002061 if (i1 < 0)
2062 i1 += l;
2063 if (i2 < 0)
2064 i2 += l;
2065 }
2066 }
2067 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002068 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2069 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002070 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002071 if (!slice)
2072 return -1;
2073 res = mp->mp_ass_subscript(s, slice, o);
2074 Py_DECREF(slice);
2075 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002076 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002077
Georg Brandlccff7852006-06-18 22:17:29 +00002078 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002079 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002080}
2081
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002082int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002083PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002084{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002085 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002086
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002087 if (s == NULL) {
2088 null_error();
2089 return -1;
2090 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002091
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002092 m = s->ob_type->tp_as_sequence;
2093 if (m && m->sq_ass_slice) {
2094 if (i1 < 0 || i2 < 0) {
2095 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002096 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002097 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002098 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002099 if (i1 < 0)
2100 i1 += l;
2101 if (i2 < 0)
2102 i2 += l;
2103 }
2104 }
2105 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2106 }
Georg Brandlccff7852006-06-18 22:17:29 +00002107 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002108 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002109}
2110
Guido van Rossume15dee51995-07-18 14:12:02 +00002111PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002112PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002113{
Tim Peters6912d4d2001-05-05 03:56:37 +00002114 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002115 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00002116 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002117 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002118
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002119 if (v == NULL)
2120 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002121
Tim Peters6912d4d2001-05-05 03:56:37 +00002122 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002123 if (PyTuple_CheckExact(v)) {
2124 /* Note that we can't know whether it's safe to return
2125 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002126 to exact tuples here. In contrast, lists always make
2127 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002128 Py_INCREF(v);
2129 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002130 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002131 if (PyList_Check(v))
2132 return PyList_AsTuple(v);
2133
Tim Peters6912d4d2001-05-05 03:56:37 +00002134 /* Get iterator. */
2135 it = PyObject_GetIter(v);
2136 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002137 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002138
Tim Peters6912d4d2001-05-05 03:56:37 +00002139 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002140 n = _PyObject_LengthHint(v, 10);
Tim Peters6912d4d2001-05-05 03:56:37 +00002141 result = PyTuple_New(n);
2142 if (result == NULL)
2143 goto Fail;
2144
2145 /* Fill the tuple. */
2146 for (j = 0; ; ++j) {
2147 PyObject *item = PyIter_Next(it);
2148 if (item == NULL) {
2149 if (PyErr_Occurred())
2150 goto Fail;
2151 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002152 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002153 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002154 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002155 /* The over-allocation strategy can grow a bit faster
2156 than for lists because unlike lists the
2157 over-allocation isn't permanent -- we reclaim
2158 the excess before the end of this routine.
2159 So, grow by ten and then add 25%.
2160 */
2161 n += 10;
2162 n += n >> 2;
2163 if (n < oldn) {
2164 /* Check for overflow */
2165 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002166 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002167 goto Fail;
2168 }
Tim Peters4324aa32001-05-28 22:30:08 +00002169 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002170 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002171 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002172 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002173 }
2174 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002175 }
2176
Tim Peters6912d4d2001-05-05 03:56:37 +00002177 /* Cut tuple back if guess was too large. */
2178 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002179 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002180 goto Fail;
2181
2182 Py_DECREF(it);
2183 return result;
2184
2185Fail:
2186 Py_XDECREF(result);
2187 Py_DECREF(it);
2188 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002189}
2190
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002191PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002192PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002193{
Tim Petersf553f892001-05-01 20:45:31 +00002194 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002195 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002196
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002197 if (v == NULL)
2198 return null_error();
2199
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002200 result = PyList_New(0);
2201 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002202 return NULL;
2203
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002204 rv = _PyList_Extend((PyListObject *)result, v);
2205 if (rv == NULL) {
2206 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002207 return NULL;
2208 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002209 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002210 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002211}
2212
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002213PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002214PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002215{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002216 PyObject *it;
2217
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002218 if (v == NULL)
2219 return null_error();
2220
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002221 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002222 Py_INCREF(v);
2223 return v;
2224 }
2225
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002226 it = PyObject_GetIter(v);
2227 if (it == NULL) {
2228 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002229 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002230 return NULL;
2231 }
2232
Raymond Hettinger193814c2004-12-18 19:00:59 +00002233 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002234 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002235
2236 return v;
2237}
2238
Tim Peters16a77ad2001-09-08 04:00:12 +00002239/* Iterate over seq. Result depends on the operation:
2240 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2241 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
2242 set ValueError and return -1 if none found; also return -1 on error.
2243 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2244*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002245Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002246_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002247{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002248 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002249 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2250 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002251
Tim Peters16a77ad2001-09-08 04:00:12 +00002252 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002253 null_error();
2254 return -1;
2255 }
Tim Peters75f8e352001-05-05 11:33:43 +00002256
Tim Peters16a77ad2001-09-08 04:00:12 +00002257 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002258 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002259 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002260 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002261 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002262
Tim Peters16a77ad2001-09-08 04:00:12 +00002263 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002264 for (;;) {
2265 int cmp;
2266 PyObject *item = PyIter_Next(it);
2267 if (item == NULL) {
2268 if (PyErr_Occurred())
2269 goto Fail;
2270 break;
2271 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002272
2273 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002274 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002275 if (cmp < 0)
2276 goto Fail;
2277 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002278 switch (operation) {
2279 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002280 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002281 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002282 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002283 goto Fail;
2284 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002285 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002286 break;
2287
2288 case PY_ITERSEARCH_INDEX:
2289 if (wrapped) {
2290 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002291 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002292 goto Fail;
2293 }
2294 goto Done;
2295
2296 case PY_ITERSEARCH_CONTAINS:
2297 n = 1;
2298 goto Done;
2299
2300 default:
2301 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002302 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002303 }
2304
2305 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002306 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002307 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002308 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002309 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002310 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002311
2312 if (operation != PY_ITERSEARCH_INDEX)
2313 goto Done;
2314
2315 PyErr_SetString(PyExc_ValueError,
2316 "sequence.index(x): x not in sequence");
2317 /* fall into failure code */
2318Fail:
2319 n = -1;
2320 /* fall through */
2321Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002322 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002323 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002324
Guido van Rossume15dee51995-07-18 14:12:02 +00002325}
2326
Tim Peters16a77ad2001-09-08 04:00:12 +00002327/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002328Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002329PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002330{
Tim Peters16a77ad2001-09-08 04:00:12 +00002331 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002332}
2333
Tim Peterscb8d3682001-05-05 21:05:01 +00002334/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002335 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002336 */
2337int
2338PySequence_Contains(PyObject *seq, PyObject *ob)
2339{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002340 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002341 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2342 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2343 if (sqm != NULL && sqm->sq_contains != NULL)
2344 return (*sqm->sq_contains)(seq, ob);
2345 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002346 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2347 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002348}
2349
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002350/* Backwards compatibility */
2351#undef PySequence_In
2352int
Fred Drake79912472000-07-09 04:06:11 +00002353PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002354{
2355 return PySequence_Contains(w, v);
2356}
2357
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002358Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002359PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002360{
Tim Peters16a77ad2001-09-08 04:00:12 +00002361 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002362}
2363
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002364/* Operations on mappings */
2365
2366int
Fred Drake79912472000-07-09 04:06:11 +00002367PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002368{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002369 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002370 return PyObject_HasAttrString(o, "__getitem__");
2371
2372 return o && o->ob_type->tp_as_mapping &&
2373 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002374 !(o->ob_type->tp_as_sequence &&
2375 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002376}
2377
Martin v. Löwis18e16552006-02-15 17:27:45 +00002378Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002379PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002380{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002381 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002382
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002383 if (o == NULL) {
2384 null_error();
2385 return -1;
2386 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002387
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002388 m = o->ob_type->tp_as_mapping;
2389 if (m && m->mp_length)
2390 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002391
Georg Brandlb0061c82006-08-08 11:56:21 +00002392 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002393 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002394}
2395
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002396#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002397Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002398PyMapping_Length(PyObject *o)
2399{
2400 return PyMapping_Size(o);
2401}
2402#define PyMapping_Length PyMapping_Size
2403
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002404PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002405PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002406{
2407 PyObject *okey, *r;
2408
2409 if (key == NULL)
2410 return null_error();
2411
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002412 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002413 if (okey == NULL)
2414 return NULL;
2415 r = PyObject_GetItem(o, okey);
2416 Py_DECREF(okey);
2417 return r;
2418}
2419
2420int
Fred Drake79912472000-07-09 04:06:11 +00002421PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002422{
2423 PyObject *okey;
2424 int r;
2425
2426 if (key == NULL) {
2427 null_error();
2428 return -1;
2429 }
2430
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002431 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002432 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002433 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002434 r = PyObject_SetItem(o, okey, value);
2435 Py_DECREF(okey);
2436 return r;
2437}
2438
2439int
Fred Drake79912472000-07-09 04:06:11 +00002440PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002441{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002442 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002443
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002444 v = PyMapping_GetItemString(o, key);
2445 if (v) {
2446 Py_DECREF(v);
2447 return 1;
2448 }
2449 PyErr_Clear();
2450 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002451}
2452
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002453int
Fred Drake79912472000-07-09 04:06:11 +00002454PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002455{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002456 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002457
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002458 v = PyObject_GetItem(o, key);
2459 if (v) {
2460 Py_DECREF(v);
2461 return 1;
2462 }
2463 PyErr_Clear();
2464 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002465}
2466
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002467/* Operations on callable objects */
2468
2469/* XXX PyCallable_Check() is in object.c */
2470
Guido van Rossume15dee51995-07-18 14:12:02 +00002471PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002472PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002473{
Guido van Rossum5560b742001-09-14 16:47:50 +00002474 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002475}
Guido van Rossume15dee51995-07-18 14:12:02 +00002476
2477PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002478PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2479{
2480 ternaryfunc call;
2481
2482 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002483 PyObject *result;
2484 if (Py_EnterRecursiveCall(" while calling a Python object"))
2485 return NULL;
2486 result = (*call)(func, arg, kw);
2487 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002488 if (result == NULL && !PyErr_Occurred())
2489 PyErr_SetString(
2490 PyExc_SystemError,
2491 "NULL result without error in PyObject_Call");
2492 return result;
2493 }
Georg Brandlccff7852006-06-18 22:17:29 +00002494 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002495 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002496 return NULL;
2497}
2498
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002499static PyObject*
2500call_function_tail(PyObject *callable, PyObject *args)
2501{
2502 PyObject *retval;
2503
2504 if (args == NULL)
2505 return NULL;
2506
2507 if (!PyTuple_Check(args)) {
2508 PyObject *a;
2509
2510 a = PyTuple_New(1);
2511 if (a == NULL) {
2512 Py_DECREF(args);
2513 return NULL;
2514 }
2515 PyTuple_SET_ITEM(a, 0, args);
2516 args = a;
2517 }
2518 retval = PyObject_Call(callable, args, NULL);
2519
2520 Py_DECREF(args);
2521
2522 return retval;
2523}
2524
Tim Peters6d6c1a32001-08-02 04:15:00 +00002525PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002526PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002527{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002528 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002529 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002530
Fred Drakeb92cf062001-10-27 06:16:31 +00002531 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002532 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002533
Fred Drakeb92cf062001-10-27 06:16:31 +00002534 if (format && *format) {
2535 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002536 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002537 va_end(va);
2538 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002539 else
2540 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002541
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002542 return call_function_tail(callable, args);
2543}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002544
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002545PyObject *
2546_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2547{
2548 va_list va;
2549 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002550
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002551 if (callable == NULL)
2552 return null_error();
2553
2554 if (format && *format) {
2555 va_start(va, format);
2556 args = _Py_VaBuildValue_SizeT(format, va);
2557 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002558 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002559 else
2560 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002561
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002562 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002563}
2564
2565PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002566PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002567{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002568 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002569 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002570 PyObject *func = NULL;
2571 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002572
Fred Drakeb92cf062001-10-27 06:16:31 +00002573 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002574 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002575
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002576 func = PyObject_GetAttrString(o, name);
2577 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002578 PyErr_SetString(PyExc_AttributeError, name);
2579 return 0;
2580 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002581
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002582 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002583 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002584 goto exit;
2585 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002586
Fred Drakeb92cf062001-10-27 06:16:31 +00002587 if (format && *format) {
2588 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002589 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002590 va_end(va);
2591 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002592 else
2593 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002594
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002595 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002596
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002597 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002598 /* args gets consumed in call_function_tail */
2599 Py_XDECREF(func);
2600
2601 return retval;
2602}
2603
2604PyObject *
2605_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2606{
2607 va_list va;
2608 PyObject *args;
2609 PyObject *func = NULL;
2610 PyObject *retval = NULL;
2611
2612 if (o == NULL || name == NULL)
2613 return null_error();
2614
2615 func = PyObject_GetAttrString(o, name);
2616 if (func == NULL) {
2617 PyErr_SetString(PyExc_AttributeError, name);
2618 return 0;
2619 }
2620
2621 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002622 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002623 goto exit;
2624 }
2625
2626 if (format && *format) {
2627 va_start(va, format);
2628 args = _Py_VaBuildValue_SizeT(format, va);
2629 va_end(va);
2630 }
2631 else
2632 args = PyTuple_New(0);
2633
2634 retval = call_function_tail(func, args);
2635
2636 exit:
2637 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002638 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002639
2640 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002641}
Guido van Rossum823649d2001-03-21 18:40:58 +00002642
2643
Fred Drakeb421b8c2001-10-26 16:21:32 +00002644static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002645objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002646{
2647 int i, n = 0;
2648 va_list countva;
2649 PyObject *result, *tmp;
2650
2651#ifdef VA_LIST_IS_ARRAY
2652 memcpy(countva, va, sizeof(va_list));
2653#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002654#ifdef __va_copy
2655 __va_copy(countva, va);
2656#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002657 countva = va;
2658#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002659#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002660
2661 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2662 ++n;
2663 result = PyTuple_New(n);
2664 if (result != NULL && n > 0) {
2665 for (i = 0; i < n; ++i) {
2666 tmp = (PyObject *)va_arg(va, PyObject *);
2667 PyTuple_SET_ITEM(result, i, tmp);
2668 Py_INCREF(tmp);
2669 }
2670 }
2671 return result;
2672}
2673
2674PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002675PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002676{
2677 PyObject *args, *tmp;
2678 va_list vargs;
2679
2680 if (callable == NULL || name == NULL)
2681 return null_error();
2682
2683 callable = PyObject_GetAttr(callable, name);
2684 if (callable == NULL)
2685 return NULL;
2686
2687 /* count the args */
2688 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002689 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002690 va_end(vargs);
2691 if (args == NULL) {
2692 Py_DECREF(callable);
2693 return NULL;
2694 }
2695 tmp = PyObject_Call(callable, args, NULL);
2696 Py_DECREF(args);
2697 Py_DECREF(callable);
2698
2699 return tmp;
2700}
2701
2702PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002703PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002704{
2705 PyObject *args, *tmp;
2706 va_list vargs;
2707
2708 if (callable == NULL)
2709 return null_error();
2710
2711 /* count the args */
2712 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002713 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002714 va_end(vargs);
2715 if (args == NULL)
2716 return NULL;
2717 tmp = PyObject_Call(callable, args, NULL);
2718 Py_DECREF(args);
2719
2720 return tmp;
2721}
2722
2723
Guido van Rossum823649d2001-03-21 18:40:58 +00002724/* isinstance(), issubclass() */
2725
Barry Warsawf16951c2002-04-23 22:45:44 +00002726/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2727 * state that will almost never happen.
2728 *
2729 * 0. creating the __bases__ static string could get a MemoryError
2730 * 1. getattr(cls, '__bases__') could raise an AttributeError
2731 * 2. getattr(cls, '__bases__') could raise some other exception
2732 * 3. getattr(cls, '__bases__') could return a tuple
2733 * 4. getattr(cls, '__bases__') could return something other than a tuple
2734 *
2735 * Only state #3 is a non-error state and only it returns a non-NULL object
2736 * (it returns the retrieved tuple).
2737 *
2738 * Any raised AttributeErrors are masked by clearing the exception and
2739 * returning NULL. If an object other than a tuple comes out of __bases__,
2740 * then again, the return value is NULL. So yes, these two situations
2741 * produce exactly the same results: NULL is returned and no error is set.
2742 *
2743 * If some exception other than AttributeError is raised, then NULL is also
2744 * returned, but the exception is not cleared. That's because we want the
2745 * exception to be propagated along.
2746 *
2747 * Callers are expected to test for PyErr_Occurred() when the return value
2748 * is NULL to decide whether a valid exception should be propagated or not.
2749 * When there's no exception to propagate, it's customary for the caller to
2750 * set a TypeError.
2751 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002752static PyObject *
2753abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002754{
2755 static PyObject *__bases__ = NULL;
2756 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002757
2758 if (__bases__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002759 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002760 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002761 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002762 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002763 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002764 if (bases == NULL) {
2765 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2766 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002767 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002768 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002769 if (!PyTuple_Check(bases)) {
2770 Py_DECREF(bases);
2771 return NULL;
2772 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002773 return bases;
2774}
2775
2776
2777static int
2778abstract_issubclass(PyObject *derived, PyObject *cls)
2779{
2780 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002781 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002782 int r = 0;
2783
2784
Guido van Rossum823649d2001-03-21 18:40:58 +00002785 if (derived == cls)
2786 return 1;
2787
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002788 if (PyTuple_Check(cls)) {
2789 /* Not a general sequence -- that opens up the road to
2790 recursion and stack overflow. */
2791 n = PyTuple_GET_SIZE(cls);
2792 for (i = 0; i < n; i++) {
2793 if (derived == PyTuple_GET_ITEM(cls, i))
2794 return 1;
2795 }
2796 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002797 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002798 if (bases == NULL) {
2799 if (PyErr_Occurred())
2800 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002801 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002802 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002803 n = PyTuple_GET_SIZE(bases);
2804 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002805 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002806 if (r != 0)
2807 break;
2808 }
2809
2810 Py_DECREF(bases);
2811
2812 return r;
2813}
2814
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002815static int
2816check_class(PyObject *cls, const char *error)
2817{
2818 PyObject *bases = abstract_get_bases(cls);
2819 if (bases == NULL) {
2820 /* Do not mask errors. */
2821 if (!PyErr_Occurred())
2822 PyErr_SetString(PyExc_TypeError, error);
2823 return 0;
2824 }
2825 Py_DECREF(bases);
2826 return -1;
2827}
2828
Brett Cannon4f653312004-03-20 22:52:14 +00002829static int
2830recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002831{
2832 PyObject *icls;
2833 static PyObject *__class__ = NULL;
2834 int retval = 0;
2835
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002836 if (__class__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002837 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002838 if (__class__ == NULL)
2839 return -1;
2840 }
2841
Neil Schemenauer6b471292001-10-18 03:18:43 +00002842 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2843 PyObject *inclass =
2844 (PyObject*)((PyInstanceObject*)inst)->in_class;
2845 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002846 }
2847 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002848 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002849 if (retval == 0) {
2850 PyObject *c = PyObject_GetAttr(inst, __class__);
2851 if (c == NULL) {
2852 PyErr_Clear();
2853 }
2854 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002855 if (c != (PyObject *)(inst->ob_type) &&
2856 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002857 retval = PyType_IsSubtype(
2858 (PyTypeObject *)c,
2859 (PyTypeObject *)cls);
2860 Py_DECREF(c);
2861 }
2862 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002863 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002864 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002865 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002866
Brett Cannon4f653312004-03-20 22:52:14 +00002867 if (!recursion_depth) {
2868 PyErr_SetString(PyExc_RuntimeError,
2869 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002870 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002871 }
2872
Guido van Rossum03290ec2001-10-07 20:54:12 +00002873 n = PyTuple_GET_SIZE(cls);
2874 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002875 retval = recursive_isinstance(
2876 inst,
2877 PyTuple_GET_ITEM(cls, i),
2878 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002879 if (retval != 0)
2880 break;
2881 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002882 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002883 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002884 if (!check_class(cls,
2885 "isinstance() arg 2 must be a class, type,"
2886 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002887 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002888 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002889 if (icls == NULL) {
2890 PyErr_Clear();
2891 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002892 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002893 else {
2894 retval = abstract_issubclass(icls, cls);
2895 Py_DECREF(icls);
2896 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002897 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002898
Guido van Rossum823649d2001-03-21 18:40:58 +00002899 return retval;
2900}
2901
2902int
Brett Cannon4f653312004-03-20 22:52:14 +00002903PyObject_IsInstance(PyObject *inst, PyObject *cls)
2904{
Christian Heimese247f002008-02-14 22:40:11 +00002905 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002906 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002907
2908 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002909 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002910 return 1;
2911
Christian Heimese247f002008-02-14 22:40:11 +00002912 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002913 name = PyString_InternFromString("__instancecheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002914 if (name == NULL)
2915 return -1;
2916 }
2917 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002918 if (checker == NULL && PyErr_Occurred())
2919 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002920 if (checker != NULL) {
2921 PyObject *res;
2922 int ok = -1;
2923 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2924 Py_DECREF(checker);
2925 return ok;
2926 }
2927 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2928 Py_LeaveRecursiveCall();
2929 Py_DECREF(checker);
2930 if (res != NULL) {
2931 ok = PyObject_IsTrue(res);
2932 Py_DECREF(res);
2933 }
2934 return ok;
2935 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002936 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002937}
2938
2939static int
2940recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002941{
2942 int retval;
2943
2944 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002945 if (!check_class(derived,
2946 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002947 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002948
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002949 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002950 Py_ssize_t i;
2951 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002952
2953 if (!recursion_depth) {
2954 PyErr_SetString(PyExc_RuntimeError,
2955 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002956 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002957 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002958 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002959 retval = recursive_issubclass(
2960 derived,
2961 PyTuple_GET_ITEM(cls, i),
2962 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002963 if (retval != 0) {
2964 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002965 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002966 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002967 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002968 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002969 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002970 else {
2971 if (!check_class(cls,
2972 "issubclass() arg 2 must be a class"
2973 " or tuple of classes"))
2974 return -1;
2975 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002976
2977 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002978 }
2979 else {
2980 /* shortcut */
2981 if (!(retval = (derived == cls)))
2982 retval = PyClass_IsSubclass(derived, cls);
2983 }
2984
2985 return retval;
2986}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002987
Brett Cannon4f653312004-03-20 22:52:14 +00002988int
2989PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2990{
Christian Heimese247f002008-02-14 22:40:11 +00002991 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002992 PyObject *t, *v, *tb;
2993 PyObject *checker;
2994 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00002995
2996 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002997 name = PyString_InternFromString("__subclasscheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002998 if (name == NULL)
2999 return -1;
3000 }
3001 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003002 PyErr_Restore(t, v, tb);
3003 if (checker != NULL) {
3004 PyObject *res;
3005 int ok = -1;
3006 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3007 return ok;
3008 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3009 Py_LeaveRecursiveCall();
3010 Py_DECREF(checker);
3011 if (res != NULL) {
3012 ok = PyObject_IsTrue(res);
3013 Py_DECREF(res);
3014 }
3015 return ok;
3016 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00003017 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00003018}
3019
3020
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003021PyObject *
3022PyObject_GetIter(PyObject *o)
3023{
3024 PyTypeObject *t = o->ob_type;
3025 getiterfunc f = NULL;
3026 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3027 f = t->tp_iter;
3028 if (f == NULL) {
3029 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003030 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003031 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003032 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003033 else {
3034 PyObject *res = (*f)(o);
3035 if (res != NULL && !PyIter_Check(res)) {
3036 PyErr_Format(PyExc_TypeError,
3037 "iter() returned non-iterator "
3038 "of type '%.100s'",
3039 res->ob_type->tp_name);
3040 Py_DECREF(res);
3041 res = NULL;
3042 }
3043 return res;
3044 }
3045}
3046
Tim Petersf4848da2001-05-05 00:14:56 +00003047/* Return next item.
3048 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3049 * If the iteration terminates normally, return NULL and clear the
3050 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3051 * will be false.
3052 * Else return the next object. PyErr_Occurred() will be false.
3053 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003054PyObject *
3055PyIter_Next(PyObject *iter)
3056{
Tim Petersf4848da2001-05-05 00:14:56 +00003057 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00003058 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00003059 result = (*iter->ob_type->tp_iternext)(iter);
3060 if (result == NULL &&
3061 PyErr_Occurred() &&
3062 PyErr_ExceptionMatches(PyExc_StopIteration))
3063 PyErr_Clear();
3064 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003065}