blob: aca60bdfcf5f541290a28d677951706c549c38c7 [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;
Martin v. Löwis241b8342008-08-14 15:54:27 +0000686 if (obj)
687 Py_INCREF(obj);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000688 view->buf = buf;
689 view->len = len;
690 view->readonly = readonly;
691 view->itemsize = 1;
692 view->format = NULL;
693 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
694 view->format = "B";
695 view->ndim = 1;
696 view->shape = NULL;
697 if ((flags & PyBUF_ND) == PyBUF_ND)
698 view->shape = &(view->len);
699 view->strides = NULL;
700 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
701 view->strides = &(view->itemsize);
702 view->suboffsets = NULL;
703 view->internal = NULL;
704 return 0;
705}
706
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000707void
708PyBuffer_Release(Py_buffer *view)
709{
710 PyObject *obj = view->obj;
711 if (!obj || !Py_TYPE(obj)->tp_as_buffer || !Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
712 /* Unmanaged buffer */
713 return;
714 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
Martin v. Löwis241b8342008-08-14 15:54:27 +0000715 Py_DECREF(obj);
716 view->obj = NULL;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000717}
718
Eric Smitha9f7d622008-02-17 19:46:49 +0000719PyObject *
720PyObject_Format(PyObject* obj, PyObject *format_spec)
721{
722 static PyObject * str__format__ = NULL;
723 PyObject *empty = NULL;
724 PyObject *result = NULL;
725 int spec_is_unicode;
726 int result_is_unicode;
727
728 /* Initialize cached value */
729 if (str__format__ == NULL) {
730 /* Initialize static variable needed by _PyType_Lookup */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000731 str__format__ = PyString_InternFromString("__format__");
Eric Smitha9f7d622008-02-17 19:46:49 +0000732 if (str__format__ == NULL)
733 goto done;
734 }
735
736 /* If no format_spec is provided, use an empty string */
737 if (format_spec == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000738 empty = PyString_FromStringAndSize(NULL, 0);
Eric Smitha9f7d622008-02-17 19:46:49 +0000739 format_spec = empty;
740 }
741
742 /* Check the format_spec type, and make sure it's str or unicode */
743 if (PyUnicode_Check(format_spec))
744 spec_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000745 else if (PyString_Check(format_spec))
Eric Smitha9f7d622008-02-17 19:46:49 +0000746 spec_is_unicode = 0;
747 else {
748 PyErr_Format(PyExc_TypeError,
749 "format expects arg 2 to be string "
750 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
751 goto done;
752 }
753
754 /* Make sure the type is initialized. float gets initialized late */
755 if (Py_TYPE(obj)->tp_dict == NULL)
756 if (PyType_Ready(Py_TYPE(obj)) < 0)
757 goto done;
758
759 /* Check for a __format__ method and call it. */
760 if (PyInstance_Check(obj)) {
761 /* We're an instance of a classic class */
762 PyObject *bound_method = PyObject_GetAttr(obj,
763 str__format__);
764 if (bound_method != NULL) {
765 result = PyObject_CallFunctionObjArgs(bound_method,
766 format_spec,
767 NULL);
768 Py_DECREF(bound_method);
769 } else {
770 PyObject *self_as_str;
771 PyObject *format_method;
772
773 PyErr_Clear();
774 /* Per the PEP, convert to str (or unicode,
775 depending on the type of the format
776 specifier). For new-style classes, this
777 logic is done by object.__format__(). */
778 if (spec_is_unicode)
779 self_as_str = PyObject_Unicode(obj);
780 else
781 self_as_str = PyObject_Str(obj);
782 if (self_as_str == NULL)
783 goto done;
784
785 /* Then call str.__format__ on that result */
786 format_method = PyObject_GetAttr(self_as_str,
787 str__format__);
788 if (format_method == NULL) {
789 Py_DECREF(self_as_str);
790 goto done;
791 }
792 result = PyObject_CallFunctionObjArgs(format_method,
793 format_spec,
794 NULL);
795 Py_DECREF(self_as_str);
796 Py_DECREF(format_method);
797 if (result == NULL)
798 goto done;
799 }
800 } else {
801 /* Not an instance of a classic class, use the code
802 from py3k */
803
804 /* Find the (unbound!) __format__ method (a borrowed
805 reference) */
806 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
807 str__format__);
808 if (method == NULL) {
809 PyErr_Format(PyExc_TypeError,
810 "Type %.100s doesn't define __format__",
811 Py_TYPE(obj)->tp_name);
812 goto done;
813 }
814 /* And call it, binding it to the value */
815 result = PyObject_CallFunctionObjArgs(method, obj,
816 format_spec, NULL);
817 }
818
819 if (result == NULL)
820 goto done;
821
822 /* Check the result type, and make sure it's str or unicode */
823 if (PyUnicode_Check(result))
824 result_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000825 else if (PyString_Check(result))
Eric Smitha9f7d622008-02-17 19:46:49 +0000826 result_is_unicode = 0;
827 else {
828 PyErr_Format(PyExc_TypeError,
829 "%.100s.__format__ must return string or "
830 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
831 Py_TYPE(result)->tp_name);
832 Py_DECREF(result);
833 result = NULL;
834 goto done;
835 }
836
837 /* Convert to unicode, if needed. Required if spec is unicode
838 and result is str */
839 if (spec_is_unicode && !result_is_unicode) {
840 PyObject *tmp = PyObject_Unicode(result);
841 /* This logic works whether or not tmp is NULL */
842 Py_DECREF(result);
843 result = tmp;
844 }
845
846done:
847 Py_XDECREF(empty);
848 return result;
849}
850
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000851/* Operations on numbers */
852
853int
Fred Drake79912472000-07-09 04:06:11 +0000854PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000855{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000856 return o && o->ob_type->tp_as_number &&
857 (o->ob_type->tp_as_number->nb_int ||
858 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000859}
860
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000861/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000862
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000863/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000864
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000865#define NB_SLOT(x) offsetof(PyNumberMethods, x)
866#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000867 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000868#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000869 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000870
871/*
872 Calling scheme used for binary operations:
873
874 v w Action
875 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000876 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000877 new old v.op(v,w), coerce(v,w), v.op(v,w)
878 old new w.op(v,w), coerce(v,w), v.op(v,w)
879 old old coerce(v,w), v.op(v,w)
880
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000881 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
882 v->ob_type
883
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000884 Legend:
885 -------
886 * new == new style number
887 * old == old style number
888 * Action indicates the order in which operations are tried until either
889 a valid result is produced or an error occurs.
890
891 */
892
893static PyObject *
894binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000895{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000896 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000897 binaryfunc slotv = NULL;
898 binaryfunc slotw = NULL;
899
900 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000901 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000902 if (w->ob_type != v->ob_type &&
903 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000904 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000905 if (slotw == slotv)
906 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000907 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000908 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000909 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
910 x = slotw(v, w);
911 if (x != Py_NotImplemented)
912 return x;
913 Py_DECREF(x); /* can't do it */
914 slotw = NULL;
915 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000916 x = slotv(v, w);
917 if (x != Py_NotImplemented)
918 return x;
919 Py_DECREF(x); /* can't do it */
920 }
921 if (slotw) {
922 x = slotw(v, w);
923 if (x != Py_NotImplemented)
924 return x;
925 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000926 }
927 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
928 int err = PyNumber_CoerceEx(&v, &w);
929 if (err < 0) {
930 return NULL;
931 }
932 if (err == 0) {
933 PyNumberMethods *mv = v->ob_type->tp_as_number;
934 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000935 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000936 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000937 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000938 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000939 Py_DECREF(v);
940 Py_DECREF(w);
941 return x;
942 }
943 }
944 /* CoerceEx incremented the reference counts */
945 Py_DECREF(v);
946 Py_DECREF(w);
947 }
948 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000949 Py_INCREF(Py_NotImplemented);
950 return Py_NotImplemented;
951}
Guido van Rossum77660912002-04-16 16:32:50 +0000952
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000953static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000954binop_type_error(PyObject *v, PyObject *w, const char *op_name)
955{
956 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000957 "unsupported operand type(s) for %.100s: "
958 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000959 op_name,
960 v->ob_type->tp_name,
961 w->ob_type->tp_name);
962 return NULL;
963}
964
965static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000966binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
967{
968 PyObject *result = binary_op1(v, w, op_slot);
969 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000970 Py_DECREF(result);
971 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000972 }
973 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000974}
975
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000976
977/*
978 Calling scheme used for ternary operations:
979
Guido van Rossum84675ac2001-09-29 01:05:03 +0000980 *** In some cases, w.op is called before v.op; see binary_op1. ***
981
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000982 v w z Action
983 -------------------------------------------------------------------
984 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
985 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
986 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
987 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
988 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
989 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
990 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
991 old old old coerce(v,w,z), v.op(v,w,z)
992
993 Legend:
994 -------
995 * new == new style number
996 * old == old style number
997 * Action indicates the order in which operations are tried until either
998 a valid result is produced or an error occurs.
999 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
1000 only if z != Py_None; if z == Py_None, then it is treated as absent
1001 variable and only coerce(v,w) is tried.
1002
1003 */
1004
1005static PyObject *
1006ternary_op(PyObject *v,
1007 PyObject *w,
1008 PyObject *z,
1009 const int op_slot,
1010 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001011{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001012 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001013 PyObject *x = NULL;
1014 ternaryfunc slotv = NULL;
1015 ternaryfunc slotw = NULL;
1016 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001017
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001018 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001019 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001020 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001021 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001022 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001023 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001024 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001025 if (slotw == slotv)
1026 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001027 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001028 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001029 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1030 x = slotw(v, w, z);
1031 if (x != Py_NotImplemented)
1032 return x;
1033 Py_DECREF(x); /* can't do it */
1034 slotw = NULL;
1035 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001036 x = slotv(v, w, z);
1037 if (x != Py_NotImplemented)
1038 return x;
1039 Py_DECREF(x); /* can't do it */
1040 }
1041 if (slotw) {
1042 x = slotw(v, w, z);
1043 if (x != Py_NotImplemented)
1044 return x;
1045 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001046 }
1047 mz = z->ob_type->tp_as_number;
1048 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001049 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001050 if (slotz == slotv || slotz == slotw)
1051 slotz = NULL;
1052 if (slotz) {
1053 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001054 if (x != Py_NotImplemented)
1055 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001056 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001057 }
1058 }
1059
1060 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1061 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1062 /* we have an old style operand, coerce */
1063 PyObject *v1, *z1, *w2, *z2;
1064 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001065
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001066 c = PyNumber_Coerce(&v, &w);
1067 if (c != 0)
1068 goto error3;
1069
1070 /* Special case: if the third argument is None, it is
1071 treated as absent argument and not coerced. */
1072 if (z == Py_None) {
1073 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001074 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1075 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001076 if (slotz)
1077 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001078 else
1079 c = -1;
1080 }
1081 else
1082 c = -1;
1083 goto error2;
1084 }
1085 v1 = v;
1086 z1 = z;
1087 c = PyNumber_Coerce(&v1, &z1);
1088 if (c != 0)
1089 goto error2;
1090 w2 = w;
1091 z2 = z1;
1092 c = PyNumber_Coerce(&w2, &z2);
1093 if (c != 0)
1094 goto error1;
1095
1096 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001097 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1098 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001099 if (slotv)
1100 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001101 else
1102 c = -1;
1103 }
1104 else
1105 c = -1;
1106
1107 Py_DECREF(w2);
1108 Py_DECREF(z2);
1109 error1:
1110 Py_DECREF(v1);
1111 Py_DECREF(z1);
1112 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001113 Py_DECREF(v);
1114 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001115 error3:
1116 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001117 return x;
1118 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001119
1120 if (z == Py_None)
1121 PyErr_Format(
1122 PyExc_TypeError,
1123 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001124 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001125 v->ob_type->tp_name,
1126 w->ob_type->tp_name);
1127 else
1128 PyErr_Format(
1129 PyExc_TypeError,
1130 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001131 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001132 v->ob_type->tp_name,
1133 w->ob_type->tp_name,
1134 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001135 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001136}
1137
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001138#define BINARY_FUNC(func, op, op_name) \
1139 PyObject * \
1140 func(PyObject *v, PyObject *w) { \
1141 return binary_op(v, w, NB_SLOT(op), op_name); \
1142 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001143
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001144BINARY_FUNC(PyNumber_Or, nb_or, "|")
1145BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1146BINARY_FUNC(PyNumber_And, nb_and, "&")
1147BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1148BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1149BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001150BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1151BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001152
1153PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001154PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001155{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001156 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1157 if (result == Py_NotImplemented) {
1158 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001159 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001160 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001161 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001162 }
Armin Rigofd163f92005-12-29 15:59:19 +00001163 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001164 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001165 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001166}
1167
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001168static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001169sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001170{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001171 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001172 if (PyIndex_Check(n)) {
1173 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001174 if (count == -1 && PyErr_Occurred())
1175 return NULL;
1176 }
1177 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001178 return type_error("can't multiply sequence by "
1179 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001180 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001181 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001182}
1183
1184PyObject *
1185PyNumber_Multiply(PyObject *v, PyObject *w)
1186{
1187 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1188 if (result == Py_NotImplemented) {
1189 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1190 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001191 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001192 if (mv && mv->sq_repeat) {
1193 return sequence_repeat(mv->sq_repeat, v, w);
1194 }
1195 else if (mw && mw->sq_repeat) {
1196 return sequence_repeat(mw->sq_repeat, w, v);
1197 }
1198 result = binop_type_error(v, w, "*");
1199 }
1200 return result;
1201}
1202
Guido van Rossume15dee51995-07-18 14:12:02 +00001203PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001204PyNumber_FloorDivide(PyObject *v, PyObject *w)
1205{
1206 /* XXX tp_flags test */
1207 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1208}
1209
1210PyObject *
1211PyNumber_TrueDivide(PyObject *v, PyObject *w)
1212{
1213 /* XXX tp_flags test */
1214 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1215}
1216
1217PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001218PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001219{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001220 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001221}
1222
1223PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001224PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001225{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001226 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001227}
1228
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001229/* Binary in-place operators */
1230
1231/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001232 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001233
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001234 - If the left hand object has the appropriate struct members, and
1235 they are filled, call the appropriate function and return the
1236 result. No coercion is done on the arguments; the left-hand object
1237 is the one the operation is performed on, and it's up to the
1238 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001239
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001240 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001241 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001242
1243 */
1244
Guido van Rossum77660912002-04-16 16:32:50 +00001245#define HASINPLACE(t) \
1246 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001247
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001248static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001249binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001250{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001251 PyNumberMethods *mv = v->ob_type->tp_as_number;
1252 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001253 binaryfunc slot = NB_BINOP(mv, iop_slot);
1254 if (slot) {
1255 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001256 if (x != Py_NotImplemented) {
1257 return x;
1258 }
1259 Py_DECREF(x);
1260 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001261 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001262 return binary_op1(v, w, op_slot);
1263}
1264
1265static PyObject *
1266binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1267 const char *op_name)
1268{
1269 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1270 if (result == Py_NotImplemented) {
1271 Py_DECREF(result);
1272 return binop_type_error(v, w, op_name);
1273 }
1274 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001275}
1276
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001277#define INPLACE_BINOP(func, iop, op, op_name) \
1278 PyObject * \
1279 func(PyObject *v, PyObject *w) { \
1280 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001281 }
1282
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001283INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1284INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1285INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1286INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1287INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1288INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1289INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001290
1291PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001292PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1293{
1294 /* XXX tp_flags test */
1295 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1296 NB_SLOT(nb_floor_divide), "//=");
1297}
1298
1299PyObject *
1300PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1301{
1302 /* XXX tp_flags test */
1303 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1304 NB_SLOT(nb_true_divide), "/=");
1305}
1306
1307PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001308PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1309{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001310 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1311 NB_SLOT(nb_add));
1312 if (result == Py_NotImplemented) {
1313 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1314 Py_DECREF(result);
1315 if (m != NULL) {
1316 binaryfunc f = NULL;
1317 if (HASINPLACE(v))
1318 f = m->sq_inplace_concat;
1319 if (f == NULL)
1320 f = m->sq_concat;
1321 if (f != NULL)
1322 return (*f)(v, w);
1323 }
1324 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001325 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001326 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001327}
1328
1329PyObject *
1330PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1331{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001332 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1333 NB_SLOT(nb_multiply));
1334 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001335 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001336 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1337 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1338 Py_DECREF(result);
1339 if (mv != NULL) {
1340 if (HASINPLACE(v))
1341 f = mv->sq_inplace_repeat;
1342 if (f == NULL)
1343 f = mv->sq_repeat;
1344 if (f != NULL)
1345 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001346 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001347 else if (mw != NULL) {
1348 /* Note that the right hand operand should not be
1349 * mutated in this case so sq_inplace_repeat is not
1350 * used. */
1351 if (mw->sq_repeat)
1352 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001353 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001354 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001355 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001356 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001357}
1358
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001359PyObject *
1360PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1361{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001362 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1363 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001364}
1365
1366PyObject *
1367PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1368{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001369 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1370 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1371 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001372 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001373 else {
1374 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1375 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001376}
1377
1378
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001379/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001380
1381PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001382PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001383{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 PyNumberMethods *m;
1385
1386 if (o == NULL)
1387 return null_error();
1388 m = o->ob_type->tp_as_number;
1389 if (m && m->nb_negative)
1390 return (*m->nb_negative)(o);
1391
Georg Brandlccff7852006-06-18 22:17:29 +00001392 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001393}
1394
1395PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001396PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001397{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001398 PyNumberMethods *m;
1399
1400 if (o == NULL)
1401 return null_error();
1402 m = o->ob_type->tp_as_number;
1403 if (m && m->nb_positive)
1404 return (*m->nb_positive)(o);
1405
Georg Brandlccff7852006-06-18 22:17:29 +00001406 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001407}
1408
1409PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001410PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001411{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001412 PyNumberMethods *m;
1413
1414 if (o == NULL)
1415 return null_error();
1416 m = o->ob_type->tp_as_number;
1417 if (m && m->nb_invert)
1418 return (*m->nb_invert)(o);
1419
Georg Brandlccff7852006-06-18 22:17:29 +00001420 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001421}
1422
1423PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001424PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001425{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001426 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001427
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001428 if (o == NULL)
1429 return null_error();
1430 m = o->ob_type->tp_as_number;
1431 if (m && m->nb_absolute)
1432 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001433
Georg Brandlccff7852006-06-18 22:17:29 +00001434 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001435}
1436
Guido van Rossum9e896b32000-04-05 20:11:21 +00001437/* Add a check for embedded NULL-bytes in the argument. */
1438static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001439int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001440{
1441 char *end;
1442 PyObject *x;
1443
1444 x = PyInt_FromString((char*)s, &end, 10);
1445 if (x == NULL)
1446 return NULL;
1447 if (end != s + len) {
1448 PyErr_SetString(PyExc_ValueError,
1449 "null byte in argument for int()");
1450 Py_DECREF(x);
1451 return NULL;
1452 }
1453 return x;
1454}
1455
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001456/* Return a Python Int or Long from the object item
1457 Raise TypeError if the result is not an int-or-long
1458 or if the object cannot be interpreted as an index.
1459*/
1460PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001461PyNumber_Index(PyObject *item)
1462{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001463 PyObject *result = NULL;
1464 if (item == NULL)
1465 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001466 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001467 Py_INCREF(item);
1468 return item;
1469 }
1470 if (PyIndex_Check(item)) {
1471 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001472 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001473 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001474 PyErr_Format(PyExc_TypeError,
1475 "__index__ returned non-(int,long) " \
1476 "(type %.200s)",
1477 result->ob_type->tp_name);
1478 Py_DECREF(result);
1479 return NULL;
1480 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001481 }
1482 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001483 PyErr_Format(PyExc_TypeError,
1484 "'%.200s' object cannot be interpreted "
1485 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001486 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001487 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001488}
1489
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001490/* Return an error on Overflow only if err is not NULL*/
1491
1492Py_ssize_t
1493PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1494{
1495 Py_ssize_t result;
1496 PyObject *runerr;
1497 PyObject *value = PyNumber_Index(item);
1498 if (value == NULL)
1499 return -1;
1500
1501 /* We're done if PyInt_AsSsize_t() returns without error. */
1502 result = PyInt_AsSsize_t(value);
1503 if (result != -1 || !(runerr = PyErr_Occurred()))
1504 goto finish;
1505
1506 /* Error handling code -- only manage OverflowError differently */
1507 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1508 goto finish;
1509
1510 PyErr_Clear();
1511 /* If no error-handling desired then the default clipping
1512 is sufficient.
1513 */
1514 if (!err) {
1515 assert(PyLong_Check(value));
1516 /* Whether or not it is less than or equal to
1517 zero is determined by the sign of ob_size
1518 */
1519 if (_PyLong_Sign(value) < 0)
1520 result = PY_SSIZE_T_MIN;
1521 else
1522 result = PY_SSIZE_T_MAX;
1523 }
1524 else {
1525 /* Otherwise replace the error with caller's error object. */
1526 PyErr_Format(err,
1527 "cannot fit '%.200s' into an index-sized integer",
1528 item->ob_type->tp_name);
1529 }
1530
1531 finish:
1532 Py_DECREF(value);
1533 return result;
1534}
1535
1536
Guido van Rossume15dee51995-07-18 14:12:02 +00001537PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001538_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1539{
1540 const char *type_name;
1541 static PyObject *int_name = NULL;
1542 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001543 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001544 if (int_name == NULL)
1545 return NULL;
1546 }
1547
1548 if (integral && (!PyInt_Check(integral) &&
1549 !PyLong_Check(integral))) {
1550 /* Don't go through tp_as_number->nb_int to avoid
1551 hitting the classic class fallback to __trunc__. */
1552 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1553 if (int_func == NULL) {
1554 PyErr_Clear(); /* Raise a different error. */
1555 goto non_integral_error;
1556 }
1557 Py_DECREF(integral);
1558 integral = PyEval_CallObject(int_func, NULL);
1559 Py_DECREF(int_func);
1560 if (integral && (!PyInt_Check(integral) &&
1561 !PyLong_Check(integral))) {
1562 goto non_integral_error;
1563 }
1564 }
1565 return integral;
1566
1567non_integral_error:
1568 if (PyInstance_Check(integral)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001569 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001570 ->in_class->cl_name);
1571 }
1572 else {
1573 type_name = integral->ob_type->tp_name;
1574 }
1575 PyErr_Format(PyExc_TypeError, error_format, type_name);
1576 Py_DECREF(integral);
1577 return NULL;
1578}
1579
1580
1581PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001582PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001583{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001584 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001585 static PyObject *trunc_name = NULL;
1586 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001587 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001588 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001589
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001590 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001591 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001592 if (trunc_name == NULL)
1593 return NULL;
1594 }
1595
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001596 if (o == NULL)
1597 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001598 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001599 Py_INCREF(o);
1600 return o;
1601 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001602 m = o->ob_type->tp_as_number;
1603 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001604 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001605 PyObject *res = m->nb_int(o);
1606 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1607 PyErr_Format(PyExc_TypeError,
1608 "__int__ returned non-int (type %.200s)",
1609 res->ob_type->tp_name);
1610 Py_DECREF(res);
1611 return NULL;
1612 }
1613 return res;
1614 }
1615 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001616 PyIntObject *io = (PyIntObject*)o;
1617 return PyInt_FromLong(io->ob_ival);
1618 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001619 trunc_func = PyObject_GetAttr(o, trunc_name);
1620 if (trunc_func) {
1621 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1622 Py_DECREF(trunc_func);
1623 /* __trunc__ is specified to return an Integral type, but
1624 int() needs to return an int. */
1625 return _PyNumber_ConvertIntegralToInt(
1626 truncated,
1627 "__trunc__ returned non-Integral (type %.200s)");
1628 }
1629 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1630
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001631 if (PyString_Check(o))
1632 return int_from_string(PyString_AS_STRING(o),
1633 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001634#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001635 if (PyUnicode_Check(o))
1636 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1637 PyUnicode_GET_SIZE(o),
1638 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001639#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001640 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001641 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001642
Georg Brandlccff7852006-06-18 22:17:29 +00001643 return type_error("int() argument must be a string or a "
1644 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001645}
1646
Guido van Rossum9e896b32000-04-05 20:11:21 +00001647/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001648static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001649long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001650{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001651 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001652 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001653
Guido van Rossum4c08d552000-03-10 22:55:18 +00001654 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001655 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001656 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001657 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001658 PyErr_SetString(PyExc_ValueError,
1659 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001660 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001661 return NULL;
1662 }
1663 return x;
1664}
1665
Guido van Rossume15dee51995-07-18 14:12:02 +00001666PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001667PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001668{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001669 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001670 static PyObject *trunc_name = NULL;
1671 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001672 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001673 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001674
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001675 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001676 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001677 if (trunc_name == NULL)
1678 return NULL;
1679 }
1680
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001681 if (o == NULL)
1682 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001683 m = o->ob_type->tp_as_number;
1684 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001685 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001686 PyObject *res = m->nb_long(o);
1687 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1688 PyErr_Format(PyExc_TypeError,
1689 "__long__ returned non-long (type %.200s)",
1690 res->ob_type->tp_name);
1691 Py_DECREF(res);
1692 return NULL;
1693 }
1694 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001695 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001696 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001697 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001698 trunc_func = PyObject_GetAttr(o, trunc_name);
1699 if (trunc_func) {
1700 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1701 PyObject *int_instance;
1702 Py_DECREF(trunc_func);
1703 /* __trunc__ is specified to return an Integral type,
1704 but long() needs to return a long. */
1705 int_instance = _PyNumber_ConvertIntegralToInt(
1706 truncated,
1707 "__trunc__ returned non-Integral (type %.200s)");
1708 if (int_instance && PyInt_Check(int_instance)) {
1709 /* Make sure that long() returns a long instance. */
1710 long value = PyInt_AS_LONG(int_instance);
1711 Py_DECREF(int_instance);
1712 return PyLong_FromLong(value);
1713 }
1714 return int_instance;
1715 }
1716 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1717
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001718 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001719 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001720 * doesn't do. In particular long('9.5') must raise an
1721 * exception, not truncate the float.
1722 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001723 return long_from_string(PyString_AS_STRING(o),
1724 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001725#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001726 if (PyUnicode_Check(o))
1727 /* The above check is done in PyLong_FromUnicode(). */
1728 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1729 PyUnicode_GET_SIZE(o),
1730 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001731#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001732 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1733 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001734
Georg Brandlccff7852006-06-18 22:17:29 +00001735 return type_error("long() argument must be a string or a "
1736 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001737}
1738
1739PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001740PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001741{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001742 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001743
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001744 if (o == NULL)
1745 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001746 m = o->ob_type->tp_as_number;
1747 if (m && m->nb_float) { /* This should include subclasses of float */
1748 PyObject *res = m->nb_float(o);
1749 if (res && !PyFloat_Check(res)) {
1750 PyErr_Format(PyExc_TypeError,
1751 "__float__ returned non-float (type %.200s)",
1752 res->ob_type->tp_name);
1753 Py_DECREF(res);
1754 return NULL;
1755 }
1756 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001757 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001758 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001759 PyFloatObject *po = (PyFloatObject *)o;
1760 return PyFloat_FromDouble(po->ob_fval);
1761 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001762 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001763}
1764
Eric Smith5e527eb2008-02-10 01:36:53 +00001765PyObject *
1766PyNumber_ToBase(PyObject *n, int base)
1767{
1768 PyObject *res = NULL;
1769 PyObject *index = PyNumber_Index(n);
1770
1771 if (!index)
1772 return NULL;
1773 if (PyLong_Check(index))
1774 res = _PyLong_Format(index, base, 0, 1);
1775 else if (PyInt_Check(index))
1776 res = _PyInt_Format((PyIntObject*)index, base, 1);
1777 else
Eric Smith3f914372008-02-15 12:14:32 +00001778 /* It should not be possible to get here, as
1779 PyNumber_Index already has a check for the same
1780 condition */
1781 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1782 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001783 Py_DECREF(index);
1784 return res;
1785}
1786
1787
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001788/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001789
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001790int
Fred Drake79912472000-07-09 04:06:11 +00001791PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001792{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001793 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001794 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001795 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001796 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001797 return s != NULL && s->ob_type->tp_as_sequence &&
1798 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001799}
1800
Martin v. Löwis18e16552006-02-15 17:27:45 +00001801Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001802PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001803{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001804 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001805
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001806 if (s == NULL) {
1807 null_error();
1808 return -1;
1809 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001810
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001811 m = s->ob_type->tp_as_sequence;
1812 if (m && m->sq_length)
1813 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001814
Georg Brandlb0061c82006-08-08 11:56:21 +00001815 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001816 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001817}
1818
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001819#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001820Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001821PySequence_Length(PyObject *s)
1822{
1823 return PySequence_Size(s);
1824}
1825#define PySequence_Length PySequence_Size
1826
Guido van Rossume15dee51995-07-18 14:12:02 +00001827PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001828PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001829{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001830 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001831
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001832 if (s == NULL || o == NULL)
1833 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001834
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001835 m = s->ob_type->tp_as_sequence;
1836 if (m && m->sq_concat)
1837 return m->sq_concat(s, o);
1838
Armin Rigofd163f92005-12-29 15:59:19 +00001839 /* Instances of user classes defining an __add__() method only
1840 have an nb_add slot, not an sq_concat slot. So we fall back
1841 to nb_add if both arguments appear to be sequences. */
1842 if (PySequence_Check(s) && PySequence_Check(o)) {
1843 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1844 if (result != Py_NotImplemented)
1845 return result;
1846 Py_DECREF(result);
1847 }
Georg Brandlccff7852006-06-18 22:17:29 +00001848 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001849}
1850
1851PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001852PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001853{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001854 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001855
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001856 if (o == NULL)
1857 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001858
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001859 m = o->ob_type->tp_as_sequence;
1860 if (m && m->sq_repeat)
1861 return m->sq_repeat(o, count);
1862
Armin Rigofd163f92005-12-29 15:59:19 +00001863 /* Instances of user classes defining a __mul__() method only
1864 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1865 to nb_multiply if o appears to be a sequence. */
1866 if (PySequence_Check(o)) {
1867 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001868 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001869 if (n == NULL)
1870 return NULL;
1871 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1872 Py_DECREF(n);
1873 if (result != Py_NotImplemented)
1874 return result;
1875 Py_DECREF(result);
1876 }
Georg Brandlccff7852006-06-18 22:17:29 +00001877 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001878}
1879
1880PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001881PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1882{
1883 PySequenceMethods *m;
1884
1885 if (s == NULL || o == NULL)
1886 return null_error();
1887
1888 m = s->ob_type->tp_as_sequence;
1889 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1890 return m->sq_inplace_concat(s, o);
1891 if (m && m->sq_concat)
1892 return m->sq_concat(s, o);
1893
Armin Rigofd163f92005-12-29 15:59:19 +00001894 if (PySequence_Check(s) && PySequence_Check(o)) {
1895 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1896 NB_SLOT(nb_add));
1897 if (result != Py_NotImplemented)
1898 return result;
1899 Py_DECREF(result);
1900 }
Georg Brandlccff7852006-06-18 22:17:29 +00001901 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001902}
1903
1904PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001905PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001906{
1907 PySequenceMethods *m;
1908
1909 if (o == NULL)
1910 return null_error();
1911
1912 m = o->ob_type->tp_as_sequence;
1913 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1914 return m->sq_inplace_repeat(o, count);
1915 if (m && m->sq_repeat)
1916 return m->sq_repeat(o, count);
1917
Armin Rigofd163f92005-12-29 15:59:19 +00001918 if (PySequence_Check(o)) {
1919 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001920 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001921 if (n == NULL)
1922 return NULL;
1923 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1924 NB_SLOT(nb_multiply));
1925 Py_DECREF(n);
1926 if (result != Py_NotImplemented)
1927 return result;
1928 Py_DECREF(result);
1929 }
Georg Brandlccff7852006-06-18 22:17:29 +00001930 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001931}
1932
1933PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001934PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001935{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001936 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001937
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001938 if (s == NULL)
1939 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001940
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001941 m = s->ob_type->tp_as_sequence;
1942 if (m && m->sq_item) {
1943 if (i < 0) {
1944 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001945 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001946 if (l < 0)
1947 return NULL;
1948 i += l;
1949 }
1950 }
1951 return m->sq_item(s, i);
1952 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001953
Skip Montanaro2c7ca9b2008-07-07 11:16:14 +00001954 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001955}
1956
1957PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001958PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001959{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001960 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001961 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001962
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001963 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001964
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001965 m = s->ob_type->tp_as_sequence;
1966 if (m && m->sq_slice) {
1967 if (i1 < 0 || i2 < 0) {
1968 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001969 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001970 if (l < 0)
1971 return NULL;
1972 if (i1 < 0)
1973 i1 += l;
1974 if (i2 < 0)
1975 i2 += l;
1976 }
1977 }
1978 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001979 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1980 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001981 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001982 if (!slice)
1983 return NULL;
1984 res = mp->mp_subscript(s, slice);
1985 Py_DECREF(slice);
1986 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001987 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001988
Georg Brandlccff7852006-06-18 22:17:29 +00001989 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001990}
1991
1992int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001993PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001994{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001995 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001996
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001997 if (s == NULL) {
1998 null_error();
1999 return -1;
2000 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002001
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002002 m = s->ob_type->tp_as_sequence;
2003 if (m && m->sq_ass_item) {
2004 if (i < 0) {
2005 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002006 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002007 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002008 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002009 i += l;
2010 }
2011 }
2012 return m->sq_ass_item(s, i, o);
2013 }
2014
Georg Brandlccff7852006-06-18 22:17:29 +00002015 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002016 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002017}
2018
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002019int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002020PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002021{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002022 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002023
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002024 if (s == NULL) {
2025 null_error();
2026 return -1;
2027 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002028
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002029 m = s->ob_type->tp_as_sequence;
2030 if (m && m->sq_ass_item) {
2031 if (i < 0) {
2032 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002033 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002034 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002035 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002036 i += l;
2037 }
2038 }
2039 return m->sq_ass_item(s, i, (PyObject *)NULL);
2040 }
2041
Georg Brandlccff7852006-06-18 22:17:29 +00002042 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002043 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002044}
2045
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002046int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002047PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002048{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002049 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002050 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002051
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002052 if (s == NULL) {
2053 null_error();
2054 return -1;
2055 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002056
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002057 m = s->ob_type->tp_as_sequence;
2058 if (m && m->sq_ass_slice) {
2059 if (i1 < 0 || i2 < 0) {
2060 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002061 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002062 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002063 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002064 if (i1 < 0)
2065 i1 += l;
2066 if (i2 < 0)
2067 i2 += l;
2068 }
2069 }
2070 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002071 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2072 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002073 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002074 if (!slice)
2075 return -1;
2076 res = mp->mp_ass_subscript(s, slice, o);
2077 Py_DECREF(slice);
2078 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002079 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002080
Georg Brandlccff7852006-06-18 22:17:29 +00002081 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002082 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002083}
2084
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002085int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002086PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002087{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002088 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002089
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002090 if (s == NULL) {
2091 null_error();
2092 return -1;
2093 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002094
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002095 m = s->ob_type->tp_as_sequence;
2096 if (m && m->sq_ass_slice) {
2097 if (i1 < 0 || i2 < 0) {
2098 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002099 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002100 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002101 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002102 if (i1 < 0)
2103 i1 += l;
2104 if (i2 < 0)
2105 i2 += l;
2106 }
2107 }
2108 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2109 }
Georg Brandlccff7852006-06-18 22:17:29 +00002110 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002111 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002112}
2113
Guido van Rossume15dee51995-07-18 14:12:02 +00002114PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002115PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002116{
Tim Peters6912d4d2001-05-05 03:56:37 +00002117 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002118 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00002119 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002120 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002121
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002122 if (v == NULL)
2123 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002124
Tim Peters6912d4d2001-05-05 03:56:37 +00002125 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002126 if (PyTuple_CheckExact(v)) {
2127 /* Note that we can't know whether it's safe to return
2128 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002129 to exact tuples here. In contrast, lists always make
2130 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002131 Py_INCREF(v);
2132 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002133 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002134 if (PyList_Check(v))
2135 return PyList_AsTuple(v);
2136
Tim Peters6912d4d2001-05-05 03:56:37 +00002137 /* Get iterator. */
2138 it = PyObject_GetIter(v);
2139 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002140 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002141
Tim Peters6912d4d2001-05-05 03:56:37 +00002142 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002143 n = _PyObject_LengthHint(v, 10);
Tim Peters6912d4d2001-05-05 03:56:37 +00002144 result = PyTuple_New(n);
2145 if (result == NULL)
2146 goto Fail;
2147
2148 /* Fill the tuple. */
2149 for (j = 0; ; ++j) {
2150 PyObject *item = PyIter_Next(it);
2151 if (item == NULL) {
2152 if (PyErr_Occurred())
2153 goto Fail;
2154 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002155 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002156 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002157 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002158 /* The over-allocation strategy can grow a bit faster
2159 than for lists because unlike lists the
2160 over-allocation isn't permanent -- we reclaim
2161 the excess before the end of this routine.
2162 So, grow by ten and then add 25%.
2163 */
2164 n += 10;
2165 n += n >> 2;
2166 if (n < oldn) {
2167 /* Check for overflow */
2168 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002169 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002170 goto Fail;
2171 }
Tim Peters4324aa32001-05-28 22:30:08 +00002172 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002173 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002174 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002175 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002176 }
2177 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002178 }
2179
Tim Peters6912d4d2001-05-05 03:56:37 +00002180 /* Cut tuple back if guess was too large. */
2181 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002182 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002183 goto Fail;
2184
2185 Py_DECREF(it);
2186 return result;
2187
2188Fail:
2189 Py_XDECREF(result);
2190 Py_DECREF(it);
2191 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002192}
2193
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002194PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002195PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002196{
Tim Petersf553f892001-05-01 20:45:31 +00002197 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002198 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002199
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002200 if (v == NULL)
2201 return null_error();
2202
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002203 result = PyList_New(0);
2204 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002205 return NULL;
2206
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002207 rv = _PyList_Extend((PyListObject *)result, v);
2208 if (rv == NULL) {
2209 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002210 return NULL;
2211 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002212 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002213 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002214}
2215
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002216PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002217PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002218{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002219 PyObject *it;
2220
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002221 if (v == NULL)
2222 return null_error();
2223
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002224 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002225 Py_INCREF(v);
2226 return v;
2227 }
2228
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002229 it = PyObject_GetIter(v);
2230 if (it == NULL) {
2231 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002232 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002233 return NULL;
2234 }
2235
Raymond Hettinger193814c2004-12-18 19:00:59 +00002236 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002237 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002238
2239 return v;
2240}
2241
Tim Peters16a77ad2001-09-08 04:00:12 +00002242/* Iterate over seq. Result depends on the operation:
2243 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2244 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
2245 set ValueError and return -1 if none found; also return -1 on error.
2246 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2247*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002248Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002249_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002250{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002251 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002252 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2253 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002254
Tim Peters16a77ad2001-09-08 04:00:12 +00002255 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002256 null_error();
2257 return -1;
2258 }
Tim Peters75f8e352001-05-05 11:33:43 +00002259
Tim Peters16a77ad2001-09-08 04:00:12 +00002260 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002261 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002262 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002263 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002264 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002265
Tim Peters16a77ad2001-09-08 04:00:12 +00002266 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002267 for (;;) {
2268 int cmp;
2269 PyObject *item = PyIter_Next(it);
2270 if (item == NULL) {
2271 if (PyErr_Occurred())
2272 goto Fail;
2273 break;
2274 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002275
2276 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002277 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002278 if (cmp < 0)
2279 goto Fail;
2280 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002281 switch (operation) {
2282 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002283 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002284 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002285 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002286 goto Fail;
2287 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002288 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002289 break;
2290
2291 case PY_ITERSEARCH_INDEX:
2292 if (wrapped) {
2293 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002294 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002295 goto Fail;
2296 }
2297 goto Done;
2298
2299 case PY_ITERSEARCH_CONTAINS:
2300 n = 1;
2301 goto Done;
2302
2303 default:
2304 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002305 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002306 }
2307
2308 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002309 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002310 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002311 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002312 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002313 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002314
2315 if (operation != PY_ITERSEARCH_INDEX)
2316 goto Done;
2317
2318 PyErr_SetString(PyExc_ValueError,
2319 "sequence.index(x): x not in sequence");
2320 /* fall into failure code */
2321Fail:
2322 n = -1;
2323 /* fall through */
2324Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002325 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002326 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002327
Guido van Rossume15dee51995-07-18 14:12:02 +00002328}
2329
Tim Peters16a77ad2001-09-08 04:00:12 +00002330/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002331Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002332PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002333{
Tim Peters16a77ad2001-09-08 04:00:12 +00002334 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002335}
2336
Tim Peterscb8d3682001-05-05 21:05:01 +00002337/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002338 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002339 */
2340int
2341PySequence_Contains(PyObject *seq, PyObject *ob)
2342{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002343 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002344 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2345 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2346 if (sqm != NULL && sqm->sq_contains != NULL)
2347 return (*sqm->sq_contains)(seq, ob);
2348 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002349 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2350 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002351}
2352
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002353/* Backwards compatibility */
2354#undef PySequence_In
2355int
Fred Drake79912472000-07-09 04:06:11 +00002356PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002357{
2358 return PySequence_Contains(w, v);
2359}
2360
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002361Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002362PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002363{
Tim Peters16a77ad2001-09-08 04:00:12 +00002364 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002365}
2366
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002367/* Operations on mappings */
2368
2369int
Fred Drake79912472000-07-09 04:06:11 +00002370PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002371{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002372 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002373 return PyObject_HasAttrString(o, "__getitem__");
2374
2375 return o && o->ob_type->tp_as_mapping &&
2376 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002377 !(o->ob_type->tp_as_sequence &&
2378 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002379}
2380
Martin v. Löwis18e16552006-02-15 17:27:45 +00002381Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002382PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002383{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002384 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002385
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002386 if (o == NULL) {
2387 null_error();
2388 return -1;
2389 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002390
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002391 m = o->ob_type->tp_as_mapping;
2392 if (m && m->mp_length)
2393 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002394
Georg Brandlb0061c82006-08-08 11:56:21 +00002395 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002396 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002397}
2398
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002399#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002400Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002401PyMapping_Length(PyObject *o)
2402{
2403 return PyMapping_Size(o);
2404}
2405#define PyMapping_Length PyMapping_Size
2406
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002407PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002408PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002409{
2410 PyObject *okey, *r;
2411
2412 if (key == NULL)
2413 return null_error();
2414
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002415 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002416 if (okey == NULL)
2417 return NULL;
2418 r = PyObject_GetItem(o, okey);
2419 Py_DECREF(okey);
2420 return r;
2421}
2422
2423int
Fred Drake79912472000-07-09 04:06:11 +00002424PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002425{
2426 PyObject *okey;
2427 int r;
2428
2429 if (key == NULL) {
2430 null_error();
2431 return -1;
2432 }
2433
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002434 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002435 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002436 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002437 r = PyObject_SetItem(o, okey, value);
2438 Py_DECREF(okey);
2439 return r;
2440}
2441
2442int
Fred Drake79912472000-07-09 04:06:11 +00002443PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002444{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002445 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002446
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002447 v = PyMapping_GetItemString(o, key);
2448 if (v) {
2449 Py_DECREF(v);
2450 return 1;
2451 }
2452 PyErr_Clear();
2453 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002454}
2455
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002456int
Fred Drake79912472000-07-09 04:06:11 +00002457PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002458{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002459 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002460
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002461 v = PyObject_GetItem(o, key);
2462 if (v) {
2463 Py_DECREF(v);
2464 return 1;
2465 }
2466 PyErr_Clear();
2467 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002468}
2469
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002470/* Operations on callable objects */
2471
2472/* XXX PyCallable_Check() is in object.c */
2473
Guido van Rossume15dee51995-07-18 14:12:02 +00002474PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002475PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002476{
Guido van Rossum5560b742001-09-14 16:47:50 +00002477 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002478}
Guido van Rossume15dee51995-07-18 14:12:02 +00002479
2480PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002481PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2482{
2483 ternaryfunc call;
2484
2485 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002486 PyObject *result;
2487 if (Py_EnterRecursiveCall(" while calling a Python object"))
2488 return NULL;
2489 result = (*call)(func, arg, kw);
2490 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002491 if (result == NULL && !PyErr_Occurred())
2492 PyErr_SetString(
2493 PyExc_SystemError,
2494 "NULL result without error in PyObject_Call");
2495 return result;
2496 }
Georg Brandlccff7852006-06-18 22:17:29 +00002497 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002498 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002499 return NULL;
2500}
2501
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002502static PyObject*
2503call_function_tail(PyObject *callable, PyObject *args)
2504{
2505 PyObject *retval;
2506
2507 if (args == NULL)
2508 return NULL;
2509
2510 if (!PyTuple_Check(args)) {
2511 PyObject *a;
2512
2513 a = PyTuple_New(1);
2514 if (a == NULL) {
2515 Py_DECREF(args);
2516 return NULL;
2517 }
2518 PyTuple_SET_ITEM(a, 0, args);
2519 args = a;
2520 }
2521 retval = PyObject_Call(callable, args, NULL);
2522
2523 Py_DECREF(args);
2524
2525 return retval;
2526}
2527
Tim Peters6d6c1a32001-08-02 04:15:00 +00002528PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002529PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002530{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002531 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002532 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002533
Fred Drakeb92cf062001-10-27 06:16:31 +00002534 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002535 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002536
Fred Drakeb92cf062001-10-27 06:16:31 +00002537 if (format && *format) {
2538 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002539 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002540 va_end(va);
2541 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002542 else
2543 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002544
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002545 return call_function_tail(callable, args);
2546}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002547
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002548PyObject *
2549_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2550{
2551 va_list va;
2552 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002553
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002554 if (callable == NULL)
2555 return null_error();
2556
2557 if (format && *format) {
2558 va_start(va, format);
2559 args = _Py_VaBuildValue_SizeT(format, va);
2560 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002561 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002562 else
2563 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002564
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002565 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002566}
2567
2568PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002569PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002570{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002571 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002572 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002573 PyObject *func = NULL;
2574 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002575
Fred Drakeb92cf062001-10-27 06:16:31 +00002576 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002577 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002578
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002579 func = PyObject_GetAttrString(o, name);
2580 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002581 PyErr_SetString(PyExc_AttributeError, name);
2582 return 0;
2583 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002584
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002585 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002586 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002587 goto exit;
2588 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002589
Fred Drakeb92cf062001-10-27 06:16:31 +00002590 if (format && *format) {
2591 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002592 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002593 va_end(va);
2594 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002595 else
2596 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002597
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002598 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002599
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002600 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002601 /* args gets consumed in call_function_tail */
2602 Py_XDECREF(func);
2603
2604 return retval;
2605}
2606
2607PyObject *
2608_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2609{
2610 va_list va;
2611 PyObject *args;
2612 PyObject *func = NULL;
2613 PyObject *retval = NULL;
2614
2615 if (o == NULL || name == NULL)
2616 return null_error();
2617
2618 func = PyObject_GetAttrString(o, name);
2619 if (func == NULL) {
2620 PyErr_SetString(PyExc_AttributeError, name);
2621 return 0;
2622 }
2623
2624 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002625 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002626 goto exit;
2627 }
2628
2629 if (format && *format) {
2630 va_start(va, format);
2631 args = _Py_VaBuildValue_SizeT(format, va);
2632 va_end(va);
2633 }
2634 else
2635 args = PyTuple_New(0);
2636
2637 retval = call_function_tail(func, args);
2638
2639 exit:
2640 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002641 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002642
2643 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002644}
Guido van Rossum823649d2001-03-21 18:40:58 +00002645
2646
Fred Drakeb421b8c2001-10-26 16:21:32 +00002647static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002648objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002649{
2650 int i, n = 0;
2651 va_list countva;
2652 PyObject *result, *tmp;
2653
2654#ifdef VA_LIST_IS_ARRAY
2655 memcpy(countva, va, sizeof(va_list));
2656#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002657#ifdef __va_copy
2658 __va_copy(countva, va);
2659#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002660 countva = va;
2661#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002662#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002663
2664 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2665 ++n;
2666 result = PyTuple_New(n);
2667 if (result != NULL && n > 0) {
2668 for (i = 0; i < n; ++i) {
2669 tmp = (PyObject *)va_arg(va, PyObject *);
2670 PyTuple_SET_ITEM(result, i, tmp);
2671 Py_INCREF(tmp);
2672 }
2673 }
2674 return result;
2675}
2676
2677PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002678PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002679{
2680 PyObject *args, *tmp;
2681 va_list vargs;
2682
2683 if (callable == NULL || name == NULL)
2684 return null_error();
2685
2686 callable = PyObject_GetAttr(callable, name);
2687 if (callable == NULL)
2688 return NULL;
2689
2690 /* count the args */
2691 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002692 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002693 va_end(vargs);
2694 if (args == NULL) {
2695 Py_DECREF(callable);
2696 return NULL;
2697 }
2698 tmp = PyObject_Call(callable, args, NULL);
2699 Py_DECREF(args);
2700 Py_DECREF(callable);
2701
2702 return tmp;
2703}
2704
2705PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002706PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002707{
2708 PyObject *args, *tmp;
2709 va_list vargs;
2710
2711 if (callable == NULL)
2712 return null_error();
2713
2714 /* count the args */
2715 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002716 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002717 va_end(vargs);
2718 if (args == NULL)
2719 return NULL;
2720 tmp = PyObject_Call(callable, args, NULL);
2721 Py_DECREF(args);
2722
2723 return tmp;
2724}
2725
2726
Guido van Rossum823649d2001-03-21 18:40:58 +00002727/* isinstance(), issubclass() */
2728
Barry Warsawf16951c2002-04-23 22:45:44 +00002729/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2730 * state that will almost never happen.
2731 *
2732 * 0. creating the __bases__ static string could get a MemoryError
2733 * 1. getattr(cls, '__bases__') could raise an AttributeError
2734 * 2. getattr(cls, '__bases__') could raise some other exception
2735 * 3. getattr(cls, '__bases__') could return a tuple
2736 * 4. getattr(cls, '__bases__') could return something other than a tuple
2737 *
2738 * Only state #3 is a non-error state and only it returns a non-NULL object
2739 * (it returns the retrieved tuple).
2740 *
2741 * Any raised AttributeErrors are masked by clearing the exception and
2742 * returning NULL. If an object other than a tuple comes out of __bases__,
2743 * then again, the return value is NULL. So yes, these two situations
2744 * produce exactly the same results: NULL is returned and no error is set.
2745 *
2746 * If some exception other than AttributeError is raised, then NULL is also
2747 * returned, but the exception is not cleared. That's because we want the
2748 * exception to be propagated along.
2749 *
2750 * Callers are expected to test for PyErr_Occurred() when the return value
2751 * is NULL to decide whether a valid exception should be propagated or not.
2752 * When there's no exception to propagate, it's customary for the caller to
2753 * set a TypeError.
2754 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002755static PyObject *
2756abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002757{
2758 static PyObject *__bases__ = NULL;
2759 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002760
2761 if (__bases__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002762 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002763 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002764 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002765 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002766 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002767 if (bases == NULL) {
2768 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2769 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002770 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002771 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002772 if (!PyTuple_Check(bases)) {
2773 Py_DECREF(bases);
2774 return NULL;
2775 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002776 return bases;
2777}
2778
2779
2780static int
2781abstract_issubclass(PyObject *derived, PyObject *cls)
2782{
2783 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002784 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002785 int r = 0;
2786
2787
Guido van Rossum823649d2001-03-21 18:40:58 +00002788 if (derived == cls)
2789 return 1;
2790
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002791 if (PyTuple_Check(cls)) {
2792 /* Not a general sequence -- that opens up the road to
2793 recursion and stack overflow. */
2794 n = PyTuple_GET_SIZE(cls);
2795 for (i = 0; i < n; i++) {
2796 if (derived == PyTuple_GET_ITEM(cls, i))
2797 return 1;
2798 }
2799 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002800 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002801 if (bases == NULL) {
2802 if (PyErr_Occurred())
2803 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002804 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002805 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002806 n = PyTuple_GET_SIZE(bases);
2807 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002808 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002809 if (r != 0)
2810 break;
2811 }
2812
2813 Py_DECREF(bases);
2814
2815 return r;
2816}
2817
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002818static int
2819check_class(PyObject *cls, const char *error)
2820{
2821 PyObject *bases = abstract_get_bases(cls);
2822 if (bases == NULL) {
2823 /* Do not mask errors. */
2824 if (!PyErr_Occurred())
2825 PyErr_SetString(PyExc_TypeError, error);
2826 return 0;
2827 }
2828 Py_DECREF(bases);
2829 return -1;
2830}
2831
Brett Cannon4f653312004-03-20 22:52:14 +00002832static int
2833recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002834{
2835 PyObject *icls;
2836 static PyObject *__class__ = NULL;
2837 int retval = 0;
2838
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002839 if (__class__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002840 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002841 if (__class__ == NULL)
2842 return -1;
2843 }
2844
Neil Schemenauer6b471292001-10-18 03:18:43 +00002845 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2846 PyObject *inclass =
2847 (PyObject*)((PyInstanceObject*)inst)->in_class;
2848 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002849 }
2850 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002851 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002852 if (retval == 0) {
2853 PyObject *c = PyObject_GetAttr(inst, __class__);
2854 if (c == NULL) {
2855 PyErr_Clear();
2856 }
2857 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002858 if (c != (PyObject *)(inst->ob_type) &&
2859 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002860 retval = PyType_IsSubtype(
2861 (PyTypeObject *)c,
2862 (PyTypeObject *)cls);
2863 Py_DECREF(c);
2864 }
2865 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002866 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002867 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002868 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002869
Brett Cannon4f653312004-03-20 22:52:14 +00002870 if (!recursion_depth) {
2871 PyErr_SetString(PyExc_RuntimeError,
2872 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002873 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002874 }
2875
Guido van Rossum03290ec2001-10-07 20:54:12 +00002876 n = PyTuple_GET_SIZE(cls);
2877 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002878 retval = recursive_isinstance(
2879 inst,
2880 PyTuple_GET_ITEM(cls, i),
2881 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002882 if (retval != 0)
2883 break;
2884 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002885 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002886 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002887 if (!check_class(cls,
2888 "isinstance() arg 2 must be a class, type,"
2889 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002890 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002891 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002892 if (icls == NULL) {
2893 PyErr_Clear();
2894 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002895 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002896 else {
2897 retval = abstract_issubclass(icls, cls);
2898 Py_DECREF(icls);
2899 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002900 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002901
Guido van Rossum823649d2001-03-21 18:40:58 +00002902 return retval;
2903}
2904
2905int
Brett Cannon4f653312004-03-20 22:52:14 +00002906PyObject_IsInstance(PyObject *inst, PyObject *cls)
2907{
Christian Heimese247f002008-02-14 22:40:11 +00002908 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002909 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002910
2911 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002912 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002913 return 1;
2914
Christian Heimese247f002008-02-14 22:40:11 +00002915 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002916 name = PyString_InternFromString("__instancecheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002917 if (name == NULL)
2918 return -1;
2919 }
2920 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002921 if (checker == NULL && PyErr_Occurred())
2922 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002923 if (checker != NULL) {
2924 PyObject *res;
2925 int ok = -1;
2926 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2927 Py_DECREF(checker);
2928 return ok;
2929 }
2930 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2931 Py_LeaveRecursiveCall();
2932 Py_DECREF(checker);
2933 if (res != NULL) {
2934 ok = PyObject_IsTrue(res);
2935 Py_DECREF(res);
2936 }
2937 return ok;
2938 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002939 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002940}
2941
2942static int
2943recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002944{
2945 int retval;
2946
2947 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002948 if (!check_class(derived,
2949 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002950 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002951
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002952 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002953 Py_ssize_t i;
2954 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002955
2956 if (!recursion_depth) {
2957 PyErr_SetString(PyExc_RuntimeError,
2958 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002959 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002960 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002961 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002962 retval = recursive_issubclass(
2963 derived,
2964 PyTuple_GET_ITEM(cls, i),
2965 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002966 if (retval != 0) {
2967 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002968 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002969 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002970 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002971 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002972 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002973 else {
2974 if (!check_class(cls,
2975 "issubclass() arg 2 must be a class"
2976 " or tuple of classes"))
2977 return -1;
2978 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002979
2980 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002981 }
2982 else {
2983 /* shortcut */
2984 if (!(retval = (derived == cls)))
2985 retval = PyClass_IsSubclass(derived, cls);
2986 }
2987
2988 return retval;
2989}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002990
Brett Cannon4f653312004-03-20 22:52:14 +00002991int
2992PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2993{
Christian Heimese247f002008-02-14 22:40:11 +00002994 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002995 PyObject *t, *v, *tb;
2996 PyObject *checker;
2997 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00002998
2999 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003000 name = PyString_InternFromString("__subclasscheck__");
Christian Heimese247f002008-02-14 22:40:11 +00003001 if (name == NULL)
3002 return -1;
3003 }
3004 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003005 PyErr_Restore(t, v, tb);
3006 if (checker != NULL) {
3007 PyObject *res;
3008 int ok = -1;
3009 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3010 return ok;
3011 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3012 Py_LeaveRecursiveCall();
3013 Py_DECREF(checker);
3014 if (res != NULL) {
3015 ok = PyObject_IsTrue(res);
3016 Py_DECREF(res);
3017 }
3018 return ok;
3019 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00003020 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00003021}
3022
3023
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003024PyObject *
3025PyObject_GetIter(PyObject *o)
3026{
3027 PyTypeObject *t = o->ob_type;
3028 getiterfunc f = NULL;
3029 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3030 f = t->tp_iter;
3031 if (f == NULL) {
3032 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003033 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003034 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003035 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003036 else {
3037 PyObject *res = (*f)(o);
3038 if (res != NULL && !PyIter_Check(res)) {
3039 PyErr_Format(PyExc_TypeError,
3040 "iter() returned non-iterator "
3041 "of type '%.100s'",
3042 res->ob_type->tp_name);
3043 Py_DECREF(res);
3044 res = NULL;
3045 }
3046 return res;
3047 }
3048}
3049
Tim Petersf4848da2001-05-05 00:14:56 +00003050/* Return next item.
3051 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3052 * If the iteration terminates normally, return NULL and clear the
3053 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3054 * will be false.
3055 * Else return the next object. PyErr_Occurred() will be false.
3056 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003057PyObject *
3058PyIter_Next(PyObject *iter)
3059{
Tim Petersf4848da2001-05-05 00:14:56 +00003060 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00003061 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00003062 result = (*iter->ob_type->tp_iternext)(iter);
3063 if (result == NULL &&
3064 PyErr_Occurred() &&
3065 PyErr_ExceptionMatches(PyExc_StopIteration))
3066 PyErr_Clear();
3067 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003068}