blob: 68e15491b60369e10254a556a41233761707ea40 [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;
Martin v. Löwis64034f92008-08-14 20:12:06 +0000711 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
712 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
713 Py_XDECREF(obj);
Martin v. Löwis241b8342008-08-14 15:54:27 +0000714 view->obj = NULL;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000715}
716
Eric Smitha9f7d622008-02-17 19:46:49 +0000717PyObject *
718PyObject_Format(PyObject* obj, PyObject *format_spec)
719{
720 static PyObject * str__format__ = NULL;
721 PyObject *empty = NULL;
722 PyObject *result = NULL;
723 int spec_is_unicode;
724 int result_is_unicode;
725
726 /* Initialize cached value */
727 if (str__format__ == NULL) {
728 /* Initialize static variable needed by _PyType_Lookup */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000729 str__format__ = PyString_InternFromString("__format__");
Eric Smitha9f7d622008-02-17 19:46:49 +0000730 if (str__format__ == NULL)
731 goto done;
732 }
733
734 /* If no format_spec is provided, use an empty string */
735 if (format_spec == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000736 empty = PyString_FromStringAndSize(NULL, 0);
Eric Smitha9f7d622008-02-17 19:46:49 +0000737 format_spec = empty;
738 }
739
740 /* Check the format_spec type, and make sure it's str or unicode */
741 if (PyUnicode_Check(format_spec))
742 spec_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000743 else if (PyString_Check(format_spec))
Eric Smitha9f7d622008-02-17 19:46:49 +0000744 spec_is_unicode = 0;
745 else {
746 PyErr_Format(PyExc_TypeError,
747 "format expects arg 2 to be string "
748 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
749 goto done;
750 }
751
752 /* Make sure the type is initialized. float gets initialized late */
753 if (Py_TYPE(obj)->tp_dict == NULL)
754 if (PyType_Ready(Py_TYPE(obj)) < 0)
755 goto done;
756
757 /* Check for a __format__ method and call it. */
758 if (PyInstance_Check(obj)) {
759 /* We're an instance of a classic class */
760 PyObject *bound_method = PyObject_GetAttr(obj,
761 str__format__);
762 if (bound_method != NULL) {
763 result = PyObject_CallFunctionObjArgs(bound_method,
764 format_spec,
765 NULL);
766 Py_DECREF(bound_method);
767 } else {
768 PyObject *self_as_str;
769 PyObject *format_method;
770
771 PyErr_Clear();
772 /* Per the PEP, convert to str (or unicode,
773 depending on the type of the format
774 specifier). For new-style classes, this
775 logic is done by object.__format__(). */
776 if (spec_is_unicode)
777 self_as_str = PyObject_Unicode(obj);
778 else
779 self_as_str = PyObject_Str(obj);
780 if (self_as_str == NULL)
781 goto done;
782
783 /* Then call str.__format__ on that result */
784 format_method = PyObject_GetAttr(self_as_str,
785 str__format__);
786 if (format_method == NULL) {
787 Py_DECREF(self_as_str);
788 goto done;
789 }
790 result = PyObject_CallFunctionObjArgs(format_method,
791 format_spec,
792 NULL);
793 Py_DECREF(self_as_str);
794 Py_DECREF(format_method);
795 if (result == NULL)
796 goto done;
797 }
798 } else {
799 /* Not an instance of a classic class, use the code
800 from py3k */
801
802 /* Find the (unbound!) __format__ method (a borrowed
803 reference) */
804 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
805 str__format__);
806 if (method == NULL) {
807 PyErr_Format(PyExc_TypeError,
808 "Type %.100s doesn't define __format__",
809 Py_TYPE(obj)->tp_name);
810 goto done;
811 }
812 /* And call it, binding it to the value */
813 result = PyObject_CallFunctionObjArgs(method, obj,
814 format_spec, NULL);
815 }
816
817 if (result == NULL)
818 goto done;
819
820 /* Check the result type, and make sure it's str or unicode */
821 if (PyUnicode_Check(result))
822 result_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000823 else if (PyString_Check(result))
Eric Smitha9f7d622008-02-17 19:46:49 +0000824 result_is_unicode = 0;
825 else {
826 PyErr_Format(PyExc_TypeError,
827 "%.100s.__format__ must return string or "
828 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
829 Py_TYPE(result)->tp_name);
830 Py_DECREF(result);
831 result = NULL;
832 goto done;
833 }
834
835 /* Convert to unicode, if needed. Required if spec is unicode
836 and result is str */
837 if (spec_is_unicode && !result_is_unicode) {
838 PyObject *tmp = PyObject_Unicode(result);
839 /* This logic works whether or not tmp is NULL */
840 Py_DECREF(result);
841 result = tmp;
842 }
843
844done:
845 Py_XDECREF(empty);
846 return result;
847}
848
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000849/* Operations on numbers */
850
851int
Fred Drake79912472000-07-09 04:06:11 +0000852PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000853{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000854 return o && o->ob_type->tp_as_number &&
855 (o->ob_type->tp_as_number->nb_int ||
856 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000857}
858
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000859/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000860
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000861/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000862
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000863#define NB_SLOT(x) offsetof(PyNumberMethods, x)
864#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000865 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000866#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000867 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000868
869/*
870 Calling scheme used for binary operations:
871
872 v w Action
873 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000874 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000875 new old v.op(v,w), coerce(v,w), v.op(v,w)
876 old new w.op(v,w), coerce(v,w), v.op(v,w)
877 old old coerce(v,w), v.op(v,w)
878
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000879 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
880 v->ob_type
881
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000882 Legend:
883 -------
884 * new == new style number
885 * old == old style number
886 * Action indicates the order in which operations are tried until either
887 a valid result is produced or an error occurs.
888
889 */
890
891static PyObject *
892binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000893{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000894 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000895 binaryfunc slotv = NULL;
896 binaryfunc slotw = NULL;
897
898 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000899 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000900 if (w->ob_type != v->ob_type &&
901 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000902 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000903 if (slotw == slotv)
904 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000905 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000906 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000907 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
908 x = slotw(v, w);
909 if (x != Py_NotImplemented)
910 return x;
911 Py_DECREF(x); /* can't do it */
912 slotw = NULL;
913 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000914 x = slotv(v, w);
915 if (x != Py_NotImplemented)
916 return x;
917 Py_DECREF(x); /* can't do it */
918 }
919 if (slotw) {
920 x = slotw(v, w);
921 if (x != Py_NotImplemented)
922 return x;
923 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000924 }
925 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
926 int err = PyNumber_CoerceEx(&v, &w);
927 if (err < 0) {
928 return NULL;
929 }
930 if (err == 0) {
931 PyNumberMethods *mv = v->ob_type->tp_as_number;
932 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000933 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000934 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000935 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000936 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000937 Py_DECREF(v);
938 Py_DECREF(w);
939 return x;
940 }
941 }
942 /* CoerceEx incremented the reference counts */
943 Py_DECREF(v);
944 Py_DECREF(w);
945 }
946 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000947 Py_INCREF(Py_NotImplemented);
948 return Py_NotImplemented;
949}
Guido van Rossum77660912002-04-16 16:32:50 +0000950
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000951static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000952binop_type_error(PyObject *v, PyObject *w, const char *op_name)
953{
954 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000955 "unsupported operand type(s) for %.100s: "
956 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000957 op_name,
958 v->ob_type->tp_name,
959 w->ob_type->tp_name);
960 return NULL;
961}
962
963static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000964binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
965{
966 PyObject *result = binary_op1(v, w, op_slot);
967 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000968 Py_DECREF(result);
969 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000970 }
971 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000972}
973
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000974
975/*
976 Calling scheme used for ternary operations:
977
Guido van Rossum84675ac2001-09-29 01:05:03 +0000978 *** In some cases, w.op is called before v.op; see binary_op1. ***
979
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000980 v w z Action
981 -------------------------------------------------------------------
982 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
983 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
984 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
985 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
986 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
987 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
988 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
989 old old old coerce(v,w,z), v.op(v,w,z)
990
991 Legend:
992 -------
993 * new == new style number
994 * old == old style number
995 * Action indicates the order in which operations are tried until either
996 a valid result is produced or an error occurs.
997 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
998 only if z != Py_None; if z == Py_None, then it is treated as absent
999 variable and only coerce(v,w) is tried.
1000
1001 */
1002
1003static PyObject *
1004ternary_op(PyObject *v,
1005 PyObject *w,
1006 PyObject *z,
1007 const int op_slot,
1008 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001009{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001010 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001011 PyObject *x = NULL;
1012 ternaryfunc slotv = NULL;
1013 ternaryfunc slotw = NULL;
1014 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001015
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001016 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001017 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001018 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001019 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001020 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001021 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001022 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001023 if (slotw == slotv)
1024 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001025 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001026 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001027 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1028 x = slotw(v, w, z);
1029 if (x != Py_NotImplemented)
1030 return x;
1031 Py_DECREF(x); /* can't do it */
1032 slotw = NULL;
1033 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001034 x = slotv(v, w, z);
1035 if (x != Py_NotImplemented)
1036 return x;
1037 Py_DECREF(x); /* can't do it */
1038 }
1039 if (slotw) {
1040 x = slotw(v, w, z);
1041 if (x != Py_NotImplemented)
1042 return x;
1043 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001044 }
1045 mz = z->ob_type->tp_as_number;
1046 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001047 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001048 if (slotz == slotv || slotz == slotw)
1049 slotz = NULL;
1050 if (slotz) {
1051 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001052 if (x != Py_NotImplemented)
1053 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001054 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001055 }
1056 }
1057
1058 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1059 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1060 /* we have an old style operand, coerce */
1061 PyObject *v1, *z1, *w2, *z2;
1062 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001063
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001064 c = PyNumber_Coerce(&v, &w);
1065 if (c != 0)
1066 goto error3;
1067
1068 /* Special case: if the third argument is None, it is
1069 treated as absent argument and not coerced. */
1070 if (z == Py_None) {
1071 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001072 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1073 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001074 if (slotz)
1075 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001076 else
1077 c = -1;
1078 }
1079 else
1080 c = -1;
1081 goto error2;
1082 }
1083 v1 = v;
1084 z1 = z;
1085 c = PyNumber_Coerce(&v1, &z1);
1086 if (c != 0)
1087 goto error2;
1088 w2 = w;
1089 z2 = z1;
1090 c = PyNumber_Coerce(&w2, &z2);
1091 if (c != 0)
1092 goto error1;
1093
1094 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001095 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1096 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001097 if (slotv)
1098 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001099 else
1100 c = -1;
1101 }
1102 else
1103 c = -1;
1104
1105 Py_DECREF(w2);
1106 Py_DECREF(z2);
1107 error1:
1108 Py_DECREF(v1);
1109 Py_DECREF(z1);
1110 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001111 Py_DECREF(v);
1112 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001113 error3:
1114 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001115 return x;
1116 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001117
1118 if (z == Py_None)
1119 PyErr_Format(
1120 PyExc_TypeError,
1121 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001122 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001123 v->ob_type->tp_name,
1124 w->ob_type->tp_name);
1125 else
1126 PyErr_Format(
1127 PyExc_TypeError,
1128 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001129 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001130 v->ob_type->tp_name,
1131 w->ob_type->tp_name,
1132 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001133 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001134}
1135
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001136#define BINARY_FUNC(func, op, op_name) \
1137 PyObject * \
1138 func(PyObject *v, PyObject *w) { \
1139 return binary_op(v, w, NB_SLOT(op), op_name); \
1140 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001141
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001142BINARY_FUNC(PyNumber_Or, nb_or, "|")
1143BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1144BINARY_FUNC(PyNumber_And, nb_and, "&")
1145BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1146BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1147BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001148BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1149BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001150
1151PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001152PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001153{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001154 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1155 if (result == Py_NotImplemented) {
1156 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001157 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001158 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001159 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001160 }
Armin Rigofd163f92005-12-29 15:59:19 +00001161 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001162 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001163 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001164}
1165
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001166static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001167sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001168{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001169 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001170 if (PyIndex_Check(n)) {
1171 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001172 if (count == -1 && PyErr_Occurred())
1173 return NULL;
1174 }
1175 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001176 return type_error("can't multiply sequence by "
1177 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001178 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001179 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001180}
1181
1182PyObject *
1183PyNumber_Multiply(PyObject *v, PyObject *w)
1184{
1185 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1186 if (result == Py_NotImplemented) {
1187 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1188 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001189 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001190 if (mv && mv->sq_repeat) {
1191 return sequence_repeat(mv->sq_repeat, v, w);
1192 }
1193 else if (mw && mw->sq_repeat) {
1194 return sequence_repeat(mw->sq_repeat, w, v);
1195 }
1196 result = binop_type_error(v, w, "*");
1197 }
1198 return result;
1199}
1200
Guido van Rossume15dee51995-07-18 14:12:02 +00001201PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001202PyNumber_FloorDivide(PyObject *v, PyObject *w)
1203{
1204 /* XXX tp_flags test */
1205 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1206}
1207
1208PyObject *
1209PyNumber_TrueDivide(PyObject *v, PyObject *w)
1210{
1211 /* XXX tp_flags test */
1212 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1213}
1214
1215PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001216PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001217{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001218 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001219}
1220
1221PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001222PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001223{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001224 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001225}
1226
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001227/* Binary in-place operators */
1228
1229/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001230 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001231
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001232 - If the left hand object has the appropriate struct members, and
1233 they are filled, call the appropriate function and return the
1234 result. No coercion is done on the arguments; the left-hand object
1235 is the one the operation is performed on, and it's up to the
1236 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001237
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001238 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001239 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001240
1241 */
1242
Guido van Rossum77660912002-04-16 16:32:50 +00001243#define HASINPLACE(t) \
1244 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001245
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001246static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001247binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001248{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001249 PyNumberMethods *mv = v->ob_type->tp_as_number;
1250 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001251 binaryfunc slot = NB_BINOP(mv, iop_slot);
1252 if (slot) {
1253 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001254 if (x != Py_NotImplemented) {
1255 return x;
1256 }
1257 Py_DECREF(x);
1258 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001259 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001260 return binary_op1(v, w, op_slot);
1261}
1262
1263static PyObject *
1264binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1265 const char *op_name)
1266{
1267 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1268 if (result == Py_NotImplemented) {
1269 Py_DECREF(result);
1270 return binop_type_error(v, w, op_name);
1271 }
1272 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001273}
1274
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001275#define INPLACE_BINOP(func, iop, op, op_name) \
1276 PyObject * \
1277 func(PyObject *v, PyObject *w) { \
1278 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001279 }
1280
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001281INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1282INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1283INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1284INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1285INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1286INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1287INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001288
1289PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001290PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1291{
1292 /* XXX tp_flags test */
1293 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1294 NB_SLOT(nb_floor_divide), "//=");
1295}
1296
1297PyObject *
1298PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1299{
1300 /* XXX tp_flags test */
1301 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1302 NB_SLOT(nb_true_divide), "/=");
1303}
1304
1305PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001306PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1307{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001308 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1309 NB_SLOT(nb_add));
1310 if (result == Py_NotImplemented) {
1311 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1312 Py_DECREF(result);
1313 if (m != NULL) {
1314 binaryfunc f = NULL;
1315 if (HASINPLACE(v))
1316 f = m->sq_inplace_concat;
1317 if (f == NULL)
1318 f = m->sq_concat;
1319 if (f != NULL)
1320 return (*f)(v, w);
1321 }
1322 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001323 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001324 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001325}
1326
1327PyObject *
1328PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1329{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001330 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1331 NB_SLOT(nb_multiply));
1332 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001333 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001334 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1335 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1336 Py_DECREF(result);
1337 if (mv != NULL) {
1338 if (HASINPLACE(v))
1339 f = mv->sq_inplace_repeat;
1340 if (f == NULL)
1341 f = mv->sq_repeat;
1342 if (f != NULL)
1343 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001344 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001345 else if (mw != NULL) {
1346 /* Note that the right hand operand should not be
1347 * mutated in this case so sq_inplace_repeat is not
1348 * used. */
1349 if (mw->sq_repeat)
1350 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001351 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001352 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001353 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001354 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001355}
1356
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001357PyObject *
1358PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1359{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001360 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1361 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001362}
1363
1364PyObject *
1365PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1366{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001367 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1368 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1369 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001370 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001371 else {
1372 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1373 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001374}
1375
1376
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001377/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001378
1379PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001380PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001381{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001382 PyNumberMethods *m;
1383
1384 if (o == NULL)
1385 return null_error();
1386 m = o->ob_type->tp_as_number;
1387 if (m && m->nb_negative)
1388 return (*m->nb_negative)(o);
1389
Georg Brandlccff7852006-06-18 22:17:29 +00001390 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001391}
1392
1393PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001394PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001395{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 PyNumberMethods *m;
1397
1398 if (o == NULL)
1399 return null_error();
1400 m = o->ob_type->tp_as_number;
1401 if (m && m->nb_positive)
1402 return (*m->nb_positive)(o);
1403
Georg Brandlccff7852006-06-18 22:17:29 +00001404 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001405}
1406
1407PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001408PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001409{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001410 PyNumberMethods *m;
1411
1412 if (o == NULL)
1413 return null_error();
1414 m = o->ob_type->tp_as_number;
1415 if (m && m->nb_invert)
1416 return (*m->nb_invert)(o);
1417
Georg Brandlccff7852006-06-18 22:17:29 +00001418 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001419}
1420
1421PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001422PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001423{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001425
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001426 if (o == NULL)
1427 return null_error();
1428 m = o->ob_type->tp_as_number;
1429 if (m && m->nb_absolute)
1430 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001431
Georg Brandlccff7852006-06-18 22:17:29 +00001432 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001433}
1434
Guido van Rossum9e896b32000-04-05 20:11:21 +00001435/* Add a check for embedded NULL-bytes in the argument. */
1436static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001437int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001438{
1439 char *end;
1440 PyObject *x;
1441
1442 x = PyInt_FromString((char*)s, &end, 10);
1443 if (x == NULL)
1444 return NULL;
1445 if (end != s + len) {
1446 PyErr_SetString(PyExc_ValueError,
1447 "null byte in argument for int()");
1448 Py_DECREF(x);
1449 return NULL;
1450 }
1451 return x;
1452}
1453
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001454/* Return a Python Int or Long from the object item
1455 Raise TypeError if the result is not an int-or-long
1456 or if the object cannot be interpreted as an index.
1457*/
1458PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001459PyNumber_Index(PyObject *item)
1460{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001461 PyObject *result = NULL;
1462 if (item == NULL)
1463 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001464 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001465 Py_INCREF(item);
1466 return item;
1467 }
1468 if (PyIndex_Check(item)) {
1469 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001470 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001471 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001472 PyErr_Format(PyExc_TypeError,
1473 "__index__ returned non-(int,long) " \
1474 "(type %.200s)",
1475 result->ob_type->tp_name);
1476 Py_DECREF(result);
1477 return NULL;
1478 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001479 }
1480 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001481 PyErr_Format(PyExc_TypeError,
1482 "'%.200s' object cannot be interpreted "
1483 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001484 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001485 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001486}
1487
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001488/* Return an error on Overflow only if err is not NULL*/
1489
1490Py_ssize_t
1491PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1492{
1493 Py_ssize_t result;
1494 PyObject *runerr;
1495 PyObject *value = PyNumber_Index(item);
1496 if (value == NULL)
1497 return -1;
1498
1499 /* We're done if PyInt_AsSsize_t() returns without error. */
1500 result = PyInt_AsSsize_t(value);
1501 if (result != -1 || !(runerr = PyErr_Occurred()))
1502 goto finish;
1503
1504 /* Error handling code -- only manage OverflowError differently */
1505 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1506 goto finish;
1507
1508 PyErr_Clear();
1509 /* If no error-handling desired then the default clipping
1510 is sufficient.
1511 */
1512 if (!err) {
1513 assert(PyLong_Check(value));
1514 /* Whether or not it is less than or equal to
1515 zero is determined by the sign of ob_size
1516 */
1517 if (_PyLong_Sign(value) < 0)
1518 result = PY_SSIZE_T_MIN;
1519 else
1520 result = PY_SSIZE_T_MAX;
1521 }
1522 else {
1523 /* Otherwise replace the error with caller's error object. */
1524 PyErr_Format(err,
1525 "cannot fit '%.200s' into an index-sized integer",
1526 item->ob_type->tp_name);
1527 }
1528
1529 finish:
1530 Py_DECREF(value);
1531 return result;
1532}
1533
1534
Guido van Rossume15dee51995-07-18 14:12:02 +00001535PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001536_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1537{
1538 const char *type_name;
1539 static PyObject *int_name = NULL;
1540 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001541 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001542 if (int_name == NULL)
1543 return NULL;
1544 }
1545
1546 if (integral && (!PyInt_Check(integral) &&
1547 !PyLong_Check(integral))) {
1548 /* Don't go through tp_as_number->nb_int to avoid
1549 hitting the classic class fallback to __trunc__. */
1550 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1551 if (int_func == NULL) {
1552 PyErr_Clear(); /* Raise a different error. */
1553 goto non_integral_error;
1554 }
1555 Py_DECREF(integral);
1556 integral = PyEval_CallObject(int_func, NULL);
1557 Py_DECREF(int_func);
1558 if (integral && (!PyInt_Check(integral) &&
1559 !PyLong_Check(integral))) {
1560 goto non_integral_error;
1561 }
1562 }
1563 return integral;
1564
1565non_integral_error:
1566 if (PyInstance_Check(integral)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001567 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001568 ->in_class->cl_name);
1569 }
1570 else {
1571 type_name = integral->ob_type->tp_name;
1572 }
1573 PyErr_Format(PyExc_TypeError, error_format, type_name);
1574 Py_DECREF(integral);
1575 return NULL;
1576}
1577
1578
1579PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001580PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001581{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001582 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001583 static PyObject *trunc_name = NULL;
1584 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001585 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001586 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001587
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001588 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001589 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001590 if (trunc_name == NULL)
1591 return NULL;
1592 }
1593
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001594 if (o == NULL)
1595 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001596 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001597 Py_INCREF(o);
1598 return o;
1599 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001600 m = o->ob_type->tp_as_number;
1601 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001602 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001603 PyObject *res = m->nb_int(o);
1604 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1605 PyErr_Format(PyExc_TypeError,
1606 "__int__ returned non-int (type %.200s)",
1607 res->ob_type->tp_name);
1608 Py_DECREF(res);
1609 return NULL;
1610 }
1611 return res;
1612 }
1613 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001614 PyIntObject *io = (PyIntObject*)o;
1615 return PyInt_FromLong(io->ob_ival);
1616 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001617 trunc_func = PyObject_GetAttr(o, trunc_name);
1618 if (trunc_func) {
1619 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1620 Py_DECREF(trunc_func);
1621 /* __trunc__ is specified to return an Integral type, but
1622 int() needs to return an int. */
1623 return _PyNumber_ConvertIntegralToInt(
1624 truncated,
1625 "__trunc__ returned non-Integral (type %.200s)");
1626 }
1627 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1628
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001629 if (PyString_Check(o))
1630 return int_from_string(PyString_AS_STRING(o),
1631 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001632#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001633 if (PyUnicode_Check(o))
1634 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1635 PyUnicode_GET_SIZE(o),
1636 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001637#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001638 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001639 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001640
Georg Brandlccff7852006-06-18 22:17:29 +00001641 return type_error("int() argument must be a string or a "
1642 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001643}
1644
Guido van Rossum9e896b32000-04-05 20:11:21 +00001645/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001646static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001647long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001648{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001649 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001650 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001651
Guido van Rossum4c08d552000-03-10 22:55:18 +00001652 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001653 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001654 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001655 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001656 PyErr_SetString(PyExc_ValueError,
1657 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001658 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001659 return NULL;
1660 }
1661 return x;
1662}
1663
Guido van Rossume15dee51995-07-18 14:12:02 +00001664PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001665PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001666{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001667 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001668 static PyObject *trunc_name = NULL;
1669 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001670 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001671 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001672
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001673 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001674 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001675 if (trunc_name == NULL)
1676 return NULL;
1677 }
1678
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001679 if (o == NULL)
1680 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001681 m = o->ob_type->tp_as_number;
1682 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001683 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001684 PyObject *res = m->nb_long(o);
1685 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1686 PyErr_Format(PyExc_TypeError,
1687 "__long__ returned non-long (type %.200s)",
1688 res->ob_type->tp_name);
1689 Py_DECREF(res);
1690 return NULL;
1691 }
1692 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001693 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001694 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001695 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001696 trunc_func = PyObject_GetAttr(o, trunc_name);
1697 if (trunc_func) {
1698 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1699 PyObject *int_instance;
1700 Py_DECREF(trunc_func);
1701 /* __trunc__ is specified to return an Integral type,
1702 but long() needs to return a long. */
1703 int_instance = _PyNumber_ConvertIntegralToInt(
1704 truncated,
1705 "__trunc__ returned non-Integral (type %.200s)");
1706 if (int_instance && PyInt_Check(int_instance)) {
1707 /* Make sure that long() returns a long instance. */
1708 long value = PyInt_AS_LONG(int_instance);
1709 Py_DECREF(int_instance);
1710 return PyLong_FromLong(value);
1711 }
1712 return int_instance;
1713 }
1714 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1715
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001716 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001717 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001718 * doesn't do. In particular long('9.5') must raise an
1719 * exception, not truncate the float.
1720 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001721 return long_from_string(PyString_AS_STRING(o),
1722 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001723#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001724 if (PyUnicode_Check(o))
1725 /* The above check is done in PyLong_FromUnicode(). */
1726 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1727 PyUnicode_GET_SIZE(o),
1728 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001729#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001730 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1731 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001732
Georg Brandlccff7852006-06-18 22:17:29 +00001733 return type_error("long() argument must be a string or a "
1734 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001735}
1736
1737PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001738PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001739{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001740 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001741
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001742 if (o == NULL)
1743 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001744 m = o->ob_type->tp_as_number;
1745 if (m && m->nb_float) { /* This should include subclasses of float */
1746 PyObject *res = m->nb_float(o);
1747 if (res && !PyFloat_Check(res)) {
1748 PyErr_Format(PyExc_TypeError,
1749 "__float__ returned non-float (type %.200s)",
1750 res->ob_type->tp_name);
1751 Py_DECREF(res);
1752 return NULL;
1753 }
1754 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001755 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001756 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001757 PyFloatObject *po = (PyFloatObject *)o;
1758 return PyFloat_FromDouble(po->ob_fval);
1759 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001760 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001761}
1762
Eric Smith5e527eb2008-02-10 01:36:53 +00001763PyObject *
1764PyNumber_ToBase(PyObject *n, int base)
1765{
1766 PyObject *res = NULL;
1767 PyObject *index = PyNumber_Index(n);
1768
1769 if (!index)
1770 return NULL;
1771 if (PyLong_Check(index))
1772 res = _PyLong_Format(index, base, 0, 1);
1773 else if (PyInt_Check(index))
1774 res = _PyInt_Format((PyIntObject*)index, base, 1);
1775 else
Eric Smith3f914372008-02-15 12:14:32 +00001776 /* It should not be possible to get here, as
1777 PyNumber_Index already has a check for the same
1778 condition */
1779 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1780 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001781 Py_DECREF(index);
1782 return res;
1783}
1784
1785
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001786/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001787
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001788int
Fred Drake79912472000-07-09 04:06:11 +00001789PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001790{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001791 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001792 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001793 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001794 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001795 return s != NULL && s->ob_type->tp_as_sequence &&
1796 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001797}
1798
Martin v. Löwis18e16552006-02-15 17:27:45 +00001799Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001800PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001801{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001802 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001803
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001804 if (s == NULL) {
1805 null_error();
1806 return -1;
1807 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001808
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001809 m = s->ob_type->tp_as_sequence;
1810 if (m && m->sq_length)
1811 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001812
Georg Brandlb0061c82006-08-08 11:56:21 +00001813 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001814 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001815}
1816
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001817#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001818Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001819PySequence_Length(PyObject *s)
1820{
1821 return PySequence_Size(s);
1822}
1823#define PySequence_Length PySequence_Size
1824
Guido van Rossume15dee51995-07-18 14:12:02 +00001825PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001826PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001827{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001828 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001829
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001830 if (s == NULL || o == NULL)
1831 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001832
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001833 m = s->ob_type->tp_as_sequence;
1834 if (m && m->sq_concat)
1835 return m->sq_concat(s, o);
1836
Armin Rigofd163f92005-12-29 15:59:19 +00001837 /* Instances of user classes defining an __add__() method only
1838 have an nb_add slot, not an sq_concat slot. So we fall back
1839 to nb_add if both arguments appear to be sequences. */
1840 if (PySequence_Check(s) && PySequence_Check(o)) {
1841 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1842 if (result != Py_NotImplemented)
1843 return result;
1844 Py_DECREF(result);
1845 }
Georg Brandlccff7852006-06-18 22:17:29 +00001846 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001847}
1848
1849PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001850PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001851{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001852 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001853
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001854 if (o == NULL)
1855 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001856
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001857 m = o->ob_type->tp_as_sequence;
1858 if (m && m->sq_repeat)
1859 return m->sq_repeat(o, count);
1860
Armin Rigofd163f92005-12-29 15:59:19 +00001861 /* Instances of user classes defining a __mul__() method only
1862 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1863 to nb_multiply if o appears to be a sequence. */
1864 if (PySequence_Check(o)) {
1865 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001866 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001867 if (n == NULL)
1868 return NULL;
1869 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1870 Py_DECREF(n);
1871 if (result != Py_NotImplemented)
1872 return result;
1873 Py_DECREF(result);
1874 }
Georg Brandlccff7852006-06-18 22:17:29 +00001875 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001876}
1877
1878PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001879PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1880{
1881 PySequenceMethods *m;
1882
1883 if (s == NULL || o == NULL)
1884 return null_error();
1885
1886 m = s->ob_type->tp_as_sequence;
1887 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1888 return m->sq_inplace_concat(s, o);
1889 if (m && m->sq_concat)
1890 return m->sq_concat(s, o);
1891
Armin Rigofd163f92005-12-29 15:59:19 +00001892 if (PySequence_Check(s) && PySequence_Check(o)) {
1893 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1894 NB_SLOT(nb_add));
1895 if (result != Py_NotImplemented)
1896 return result;
1897 Py_DECREF(result);
1898 }
Georg Brandlccff7852006-06-18 22:17:29 +00001899 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001900}
1901
1902PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001903PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001904{
1905 PySequenceMethods *m;
1906
1907 if (o == NULL)
1908 return null_error();
1909
1910 m = o->ob_type->tp_as_sequence;
1911 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1912 return m->sq_inplace_repeat(o, count);
1913 if (m && m->sq_repeat)
1914 return m->sq_repeat(o, count);
1915
Armin Rigofd163f92005-12-29 15:59:19 +00001916 if (PySequence_Check(o)) {
1917 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001918 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001919 if (n == NULL)
1920 return NULL;
1921 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1922 NB_SLOT(nb_multiply));
1923 Py_DECREF(n);
1924 if (result != Py_NotImplemented)
1925 return result;
1926 Py_DECREF(result);
1927 }
Georg Brandlccff7852006-06-18 22:17:29 +00001928 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001929}
1930
1931PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001932PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001933{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001934 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001935
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001936 if (s == NULL)
1937 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001938
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001939 m = s->ob_type->tp_as_sequence;
1940 if (m && m->sq_item) {
1941 if (i < 0) {
1942 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001943 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001944 if (l < 0)
1945 return NULL;
1946 i += l;
1947 }
1948 }
1949 return m->sq_item(s, i);
1950 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001951
Skip Montanaro2c7ca9b2008-07-07 11:16:14 +00001952 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001953}
1954
1955PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001956PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001957{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001958 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001959 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001960
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001961 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001962
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001963 m = s->ob_type->tp_as_sequence;
1964 if (m && m->sq_slice) {
1965 if (i1 < 0 || i2 < 0) {
1966 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001967 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001968 if (l < 0)
1969 return NULL;
1970 if (i1 < 0)
1971 i1 += l;
1972 if (i2 < 0)
1973 i2 += l;
1974 }
1975 }
1976 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001977 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1978 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001979 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001980 if (!slice)
1981 return NULL;
1982 res = mp->mp_subscript(s, slice);
1983 Py_DECREF(slice);
1984 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001985 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001986
Georg Brandlccff7852006-06-18 22:17:29 +00001987 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001988}
1989
1990int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001991PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001992{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001993 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001994
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001995 if (s == NULL) {
1996 null_error();
1997 return -1;
1998 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001999
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002000 m = s->ob_type->tp_as_sequence;
2001 if (m && m->sq_ass_item) {
2002 if (i < 0) {
2003 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002004 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002005 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002006 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002007 i += l;
2008 }
2009 }
2010 return m->sq_ass_item(s, i, o);
2011 }
2012
Georg Brandlccff7852006-06-18 22:17:29 +00002013 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002014 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002015}
2016
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002017int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002018PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002019{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002020 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002021
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002022 if (s == NULL) {
2023 null_error();
2024 return -1;
2025 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002026
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002027 m = s->ob_type->tp_as_sequence;
2028 if (m && m->sq_ass_item) {
2029 if (i < 0) {
2030 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002031 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002032 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002033 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002034 i += l;
2035 }
2036 }
2037 return m->sq_ass_item(s, i, (PyObject *)NULL);
2038 }
2039
Georg Brandlccff7852006-06-18 22:17:29 +00002040 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002041 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002042}
2043
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002044int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002045PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002046{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002047 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002048 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002049
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002050 if (s == NULL) {
2051 null_error();
2052 return -1;
2053 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002054
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002055 m = s->ob_type->tp_as_sequence;
2056 if (m && m->sq_ass_slice) {
2057 if (i1 < 0 || i2 < 0) {
2058 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002059 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002060 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002061 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002062 if (i1 < 0)
2063 i1 += l;
2064 if (i2 < 0)
2065 i2 += l;
2066 }
2067 }
2068 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002069 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2070 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002071 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002072 if (!slice)
2073 return -1;
2074 res = mp->mp_ass_subscript(s, slice, o);
2075 Py_DECREF(slice);
2076 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002077 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002078
Georg Brandlccff7852006-06-18 22:17:29 +00002079 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002080 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002081}
2082
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002083int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002084PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002085{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002086 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002087
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002088 if (s == NULL) {
2089 null_error();
2090 return -1;
2091 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002092
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002093 m = s->ob_type->tp_as_sequence;
2094 if (m && m->sq_ass_slice) {
2095 if (i1 < 0 || i2 < 0) {
2096 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002097 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002098 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002099 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002100 if (i1 < 0)
2101 i1 += l;
2102 if (i2 < 0)
2103 i2 += l;
2104 }
2105 }
2106 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2107 }
Georg Brandlccff7852006-06-18 22:17:29 +00002108 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002109 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002110}
2111
Guido van Rossume15dee51995-07-18 14:12:02 +00002112PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002113PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002114{
Tim Peters6912d4d2001-05-05 03:56:37 +00002115 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002116 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00002117 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002118 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002119
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002120 if (v == NULL)
2121 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002122
Tim Peters6912d4d2001-05-05 03:56:37 +00002123 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002124 if (PyTuple_CheckExact(v)) {
2125 /* Note that we can't know whether it's safe to return
2126 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002127 to exact tuples here. In contrast, lists always make
2128 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002129 Py_INCREF(v);
2130 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002131 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002132 if (PyList_Check(v))
2133 return PyList_AsTuple(v);
2134
Tim Peters6912d4d2001-05-05 03:56:37 +00002135 /* Get iterator. */
2136 it = PyObject_GetIter(v);
2137 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002138 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002139
Tim Peters6912d4d2001-05-05 03:56:37 +00002140 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002141 n = _PyObject_LengthHint(v, 10);
Tim Peters6912d4d2001-05-05 03:56:37 +00002142 result = PyTuple_New(n);
2143 if (result == NULL)
2144 goto Fail;
2145
2146 /* Fill the tuple. */
2147 for (j = 0; ; ++j) {
2148 PyObject *item = PyIter_Next(it);
2149 if (item == NULL) {
2150 if (PyErr_Occurred())
2151 goto Fail;
2152 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002153 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002154 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002155 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002156 /* The over-allocation strategy can grow a bit faster
2157 than for lists because unlike lists the
2158 over-allocation isn't permanent -- we reclaim
2159 the excess before the end of this routine.
2160 So, grow by ten and then add 25%.
2161 */
2162 n += 10;
2163 n += n >> 2;
2164 if (n < oldn) {
2165 /* Check for overflow */
2166 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002167 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002168 goto Fail;
2169 }
Tim Peters4324aa32001-05-28 22:30:08 +00002170 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002171 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002172 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002173 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002174 }
2175 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002176 }
2177
Tim Peters6912d4d2001-05-05 03:56:37 +00002178 /* Cut tuple back if guess was too large. */
2179 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002180 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002181 goto Fail;
2182
2183 Py_DECREF(it);
2184 return result;
2185
2186Fail:
2187 Py_XDECREF(result);
2188 Py_DECREF(it);
2189 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002190}
2191
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002192PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002193PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002194{
Tim Petersf553f892001-05-01 20:45:31 +00002195 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002196 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002197
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002198 if (v == NULL)
2199 return null_error();
2200
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002201 result = PyList_New(0);
2202 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002203 return NULL;
2204
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002205 rv = _PyList_Extend((PyListObject *)result, v);
2206 if (rv == NULL) {
2207 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002208 return NULL;
2209 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002210 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002211 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002212}
2213
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002214PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002215PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002216{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002217 PyObject *it;
2218
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002219 if (v == NULL)
2220 return null_error();
2221
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002222 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002223 Py_INCREF(v);
2224 return v;
2225 }
2226
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002227 it = PyObject_GetIter(v);
2228 if (it == NULL) {
2229 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002230 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002231 return NULL;
2232 }
2233
Raymond Hettinger193814c2004-12-18 19:00:59 +00002234 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002235 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002236
2237 return v;
2238}
2239
Tim Peters16a77ad2001-09-08 04:00:12 +00002240/* Iterate over seq. Result depends on the operation:
2241 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2242 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
2243 set ValueError and return -1 if none found; also return -1 on error.
2244 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2245*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002246Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002247_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002248{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002249 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002250 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2251 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002252
Tim Peters16a77ad2001-09-08 04:00:12 +00002253 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002254 null_error();
2255 return -1;
2256 }
Tim Peters75f8e352001-05-05 11:33:43 +00002257
Tim Peters16a77ad2001-09-08 04:00:12 +00002258 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002259 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002260 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002261 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002262 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002263
Tim Peters16a77ad2001-09-08 04:00:12 +00002264 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002265 for (;;) {
2266 int cmp;
2267 PyObject *item = PyIter_Next(it);
2268 if (item == NULL) {
2269 if (PyErr_Occurred())
2270 goto Fail;
2271 break;
2272 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002273
2274 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002275 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002276 if (cmp < 0)
2277 goto Fail;
2278 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002279 switch (operation) {
2280 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002281 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002282 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002283 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002284 goto Fail;
2285 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002286 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002287 break;
2288
2289 case PY_ITERSEARCH_INDEX:
2290 if (wrapped) {
2291 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002292 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002293 goto Fail;
2294 }
2295 goto Done;
2296
2297 case PY_ITERSEARCH_CONTAINS:
2298 n = 1;
2299 goto Done;
2300
2301 default:
2302 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002303 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002304 }
2305
2306 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002307 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002308 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002309 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002310 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002311 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002312
2313 if (operation != PY_ITERSEARCH_INDEX)
2314 goto Done;
2315
2316 PyErr_SetString(PyExc_ValueError,
2317 "sequence.index(x): x not in sequence");
2318 /* fall into failure code */
2319Fail:
2320 n = -1;
2321 /* fall through */
2322Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002323 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002324 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002325
Guido van Rossume15dee51995-07-18 14:12:02 +00002326}
2327
Tim Peters16a77ad2001-09-08 04:00:12 +00002328/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002329Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002330PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002331{
Tim Peters16a77ad2001-09-08 04:00:12 +00002332 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002333}
2334
Tim Peterscb8d3682001-05-05 21:05:01 +00002335/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002336 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002337 */
2338int
2339PySequence_Contains(PyObject *seq, PyObject *ob)
2340{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002341 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002342 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2343 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2344 if (sqm != NULL && sqm->sq_contains != NULL)
2345 return (*sqm->sq_contains)(seq, ob);
2346 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002347 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2348 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002349}
2350
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002351/* Backwards compatibility */
2352#undef PySequence_In
2353int
Fred Drake79912472000-07-09 04:06:11 +00002354PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002355{
2356 return PySequence_Contains(w, v);
2357}
2358
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002359Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002360PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002361{
Tim Peters16a77ad2001-09-08 04:00:12 +00002362 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002363}
2364
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002365/* Operations on mappings */
2366
2367int
Fred Drake79912472000-07-09 04:06:11 +00002368PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002369{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002370 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002371 return PyObject_HasAttrString(o, "__getitem__");
2372
2373 return o && o->ob_type->tp_as_mapping &&
2374 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002375 !(o->ob_type->tp_as_sequence &&
2376 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002377}
2378
Martin v. Löwis18e16552006-02-15 17:27:45 +00002379Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002380PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002381{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002382 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002383
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002384 if (o == NULL) {
2385 null_error();
2386 return -1;
2387 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002388
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002389 m = o->ob_type->tp_as_mapping;
2390 if (m && m->mp_length)
2391 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002392
Georg Brandlb0061c82006-08-08 11:56:21 +00002393 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002394 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002395}
2396
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002397#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002398Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002399PyMapping_Length(PyObject *o)
2400{
2401 return PyMapping_Size(o);
2402}
2403#define PyMapping_Length PyMapping_Size
2404
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002405PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002406PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002407{
2408 PyObject *okey, *r;
2409
2410 if (key == NULL)
2411 return null_error();
2412
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002413 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002414 if (okey == NULL)
2415 return NULL;
2416 r = PyObject_GetItem(o, okey);
2417 Py_DECREF(okey);
2418 return r;
2419}
2420
2421int
Fred Drake79912472000-07-09 04:06:11 +00002422PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002423{
2424 PyObject *okey;
2425 int r;
2426
2427 if (key == NULL) {
2428 null_error();
2429 return -1;
2430 }
2431
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002432 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002433 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002434 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002435 r = PyObject_SetItem(o, okey, value);
2436 Py_DECREF(okey);
2437 return r;
2438}
2439
2440int
Fred Drake79912472000-07-09 04:06:11 +00002441PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002442{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002443 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002444
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002445 v = PyMapping_GetItemString(o, key);
2446 if (v) {
2447 Py_DECREF(v);
2448 return 1;
2449 }
2450 PyErr_Clear();
2451 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002452}
2453
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002454int
Fred Drake79912472000-07-09 04:06:11 +00002455PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002456{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002457 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002458
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002459 v = PyObject_GetItem(o, key);
2460 if (v) {
2461 Py_DECREF(v);
2462 return 1;
2463 }
2464 PyErr_Clear();
2465 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002466}
2467
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002468/* Operations on callable objects */
2469
2470/* XXX PyCallable_Check() is in object.c */
2471
Guido van Rossume15dee51995-07-18 14:12:02 +00002472PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002473PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002474{
Guido van Rossum5560b742001-09-14 16:47:50 +00002475 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002476}
Guido van Rossume15dee51995-07-18 14:12:02 +00002477
2478PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002479PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2480{
2481 ternaryfunc call;
2482
2483 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002484 PyObject *result;
2485 if (Py_EnterRecursiveCall(" while calling a Python object"))
2486 return NULL;
2487 result = (*call)(func, arg, kw);
2488 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002489 if (result == NULL && !PyErr_Occurred())
2490 PyErr_SetString(
2491 PyExc_SystemError,
2492 "NULL result without error in PyObject_Call");
2493 return result;
2494 }
Georg Brandlccff7852006-06-18 22:17:29 +00002495 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002496 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002497 return NULL;
2498}
2499
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002500static PyObject*
2501call_function_tail(PyObject *callable, PyObject *args)
2502{
2503 PyObject *retval;
2504
2505 if (args == NULL)
2506 return NULL;
2507
2508 if (!PyTuple_Check(args)) {
2509 PyObject *a;
2510
2511 a = PyTuple_New(1);
2512 if (a == NULL) {
2513 Py_DECREF(args);
2514 return NULL;
2515 }
2516 PyTuple_SET_ITEM(a, 0, args);
2517 args = a;
2518 }
2519 retval = PyObject_Call(callable, args, NULL);
2520
2521 Py_DECREF(args);
2522
2523 return retval;
2524}
2525
Tim Peters6d6c1a32001-08-02 04:15:00 +00002526PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002527PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002528{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002529 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002530 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002531
Fred Drakeb92cf062001-10-27 06:16:31 +00002532 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002533 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002534
Fred Drakeb92cf062001-10-27 06:16:31 +00002535 if (format && *format) {
2536 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002537 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002538 va_end(va);
2539 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002540 else
2541 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002542
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002543 return call_function_tail(callable, args);
2544}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002545
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002546PyObject *
2547_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2548{
2549 va_list va;
2550 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002551
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002552 if (callable == NULL)
2553 return null_error();
2554
2555 if (format && *format) {
2556 va_start(va, format);
2557 args = _Py_VaBuildValue_SizeT(format, va);
2558 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002559 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002560 else
2561 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002562
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002563 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002564}
2565
2566PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002567PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002568{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002569 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002570 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002571 PyObject *func = NULL;
2572 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002573
Fred Drakeb92cf062001-10-27 06:16:31 +00002574 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002575 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002576
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002577 func = PyObject_GetAttrString(o, name);
2578 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002579 PyErr_SetString(PyExc_AttributeError, name);
2580 return 0;
2581 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002582
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002583 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002584 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002585 goto exit;
2586 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002587
Fred Drakeb92cf062001-10-27 06:16:31 +00002588 if (format && *format) {
2589 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002590 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002591 va_end(va);
2592 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002593 else
2594 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002595
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002596 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002597
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002598 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002599 /* args gets consumed in call_function_tail */
2600 Py_XDECREF(func);
2601
2602 return retval;
2603}
2604
2605PyObject *
2606_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2607{
2608 va_list va;
2609 PyObject *args;
2610 PyObject *func = NULL;
2611 PyObject *retval = NULL;
2612
2613 if (o == NULL || name == NULL)
2614 return null_error();
2615
2616 func = PyObject_GetAttrString(o, name);
2617 if (func == NULL) {
2618 PyErr_SetString(PyExc_AttributeError, name);
2619 return 0;
2620 }
2621
2622 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002623 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002624 goto exit;
2625 }
2626
2627 if (format && *format) {
2628 va_start(va, format);
2629 args = _Py_VaBuildValue_SizeT(format, va);
2630 va_end(va);
2631 }
2632 else
2633 args = PyTuple_New(0);
2634
2635 retval = call_function_tail(func, args);
2636
2637 exit:
2638 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002639 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002640
2641 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002642}
Guido van Rossum823649d2001-03-21 18:40:58 +00002643
2644
Fred Drakeb421b8c2001-10-26 16:21:32 +00002645static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002646objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002647{
2648 int i, n = 0;
2649 va_list countva;
2650 PyObject *result, *tmp;
2651
2652#ifdef VA_LIST_IS_ARRAY
2653 memcpy(countva, va, sizeof(va_list));
2654#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002655#ifdef __va_copy
2656 __va_copy(countva, va);
2657#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002658 countva = va;
2659#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002660#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002661
2662 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2663 ++n;
2664 result = PyTuple_New(n);
2665 if (result != NULL && n > 0) {
2666 for (i = 0; i < n; ++i) {
2667 tmp = (PyObject *)va_arg(va, PyObject *);
2668 PyTuple_SET_ITEM(result, i, tmp);
2669 Py_INCREF(tmp);
2670 }
2671 }
2672 return result;
2673}
2674
2675PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002676PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002677{
2678 PyObject *args, *tmp;
2679 va_list vargs;
2680
2681 if (callable == NULL || name == NULL)
2682 return null_error();
2683
2684 callable = PyObject_GetAttr(callable, name);
2685 if (callable == NULL)
2686 return NULL;
2687
2688 /* count the args */
2689 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002690 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002691 va_end(vargs);
2692 if (args == NULL) {
2693 Py_DECREF(callable);
2694 return NULL;
2695 }
2696 tmp = PyObject_Call(callable, args, NULL);
2697 Py_DECREF(args);
2698 Py_DECREF(callable);
2699
2700 return tmp;
2701}
2702
2703PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002704PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002705{
2706 PyObject *args, *tmp;
2707 va_list vargs;
2708
2709 if (callable == NULL)
2710 return null_error();
2711
2712 /* count the args */
2713 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002714 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002715 va_end(vargs);
2716 if (args == NULL)
2717 return NULL;
2718 tmp = PyObject_Call(callable, args, NULL);
2719 Py_DECREF(args);
2720
2721 return tmp;
2722}
2723
2724
Guido van Rossum823649d2001-03-21 18:40:58 +00002725/* isinstance(), issubclass() */
2726
Barry Warsawf16951c2002-04-23 22:45:44 +00002727/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2728 * state that will almost never happen.
2729 *
2730 * 0. creating the __bases__ static string could get a MemoryError
2731 * 1. getattr(cls, '__bases__') could raise an AttributeError
2732 * 2. getattr(cls, '__bases__') could raise some other exception
2733 * 3. getattr(cls, '__bases__') could return a tuple
2734 * 4. getattr(cls, '__bases__') could return something other than a tuple
2735 *
2736 * Only state #3 is a non-error state and only it returns a non-NULL object
2737 * (it returns the retrieved tuple).
2738 *
2739 * Any raised AttributeErrors are masked by clearing the exception and
2740 * returning NULL. If an object other than a tuple comes out of __bases__,
2741 * then again, the return value is NULL. So yes, these two situations
2742 * produce exactly the same results: NULL is returned and no error is set.
2743 *
2744 * If some exception other than AttributeError is raised, then NULL is also
2745 * returned, but the exception is not cleared. That's because we want the
2746 * exception to be propagated along.
2747 *
2748 * Callers are expected to test for PyErr_Occurred() when the return value
2749 * is NULL to decide whether a valid exception should be propagated or not.
2750 * When there's no exception to propagate, it's customary for the caller to
2751 * set a TypeError.
2752 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002753static PyObject *
2754abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002755{
2756 static PyObject *__bases__ = NULL;
2757 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002758
2759 if (__bases__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002760 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002761 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002762 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002763 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002764 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002765 if (bases == NULL) {
2766 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2767 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002768 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002769 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002770 if (!PyTuple_Check(bases)) {
2771 Py_DECREF(bases);
2772 return NULL;
2773 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002774 return bases;
2775}
2776
2777
2778static int
2779abstract_issubclass(PyObject *derived, PyObject *cls)
2780{
2781 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002782 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002783 int r = 0;
2784
2785
Guido van Rossum823649d2001-03-21 18:40:58 +00002786 if (derived == cls)
2787 return 1;
2788
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002789 if (PyTuple_Check(cls)) {
2790 /* Not a general sequence -- that opens up the road to
2791 recursion and stack overflow. */
2792 n = PyTuple_GET_SIZE(cls);
2793 for (i = 0; i < n; i++) {
2794 if (derived == PyTuple_GET_ITEM(cls, i))
2795 return 1;
2796 }
2797 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002798 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002799 if (bases == NULL) {
2800 if (PyErr_Occurred())
2801 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002802 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002803 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002804 n = PyTuple_GET_SIZE(bases);
2805 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002806 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002807 if (r != 0)
2808 break;
2809 }
2810
2811 Py_DECREF(bases);
2812
2813 return r;
2814}
2815
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002816static int
2817check_class(PyObject *cls, const char *error)
2818{
2819 PyObject *bases = abstract_get_bases(cls);
2820 if (bases == NULL) {
2821 /* Do not mask errors. */
2822 if (!PyErr_Occurred())
2823 PyErr_SetString(PyExc_TypeError, error);
2824 return 0;
2825 }
2826 Py_DECREF(bases);
2827 return -1;
2828}
2829
Brett Cannon4f653312004-03-20 22:52:14 +00002830static int
2831recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002832{
2833 PyObject *icls;
2834 static PyObject *__class__ = NULL;
2835 int retval = 0;
2836
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002837 if (__class__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002838 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002839 if (__class__ == NULL)
2840 return -1;
2841 }
2842
Neil Schemenauer6b471292001-10-18 03:18:43 +00002843 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2844 PyObject *inclass =
2845 (PyObject*)((PyInstanceObject*)inst)->in_class;
2846 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002847 }
2848 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002849 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002850 if (retval == 0) {
2851 PyObject *c = PyObject_GetAttr(inst, __class__);
2852 if (c == NULL) {
2853 PyErr_Clear();
2854 }
2855 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002856 if (c != (PyObject *)(inst->ob_type) &&
2857 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002858 retval = PyType_IsSubtype(
2859 (PyTypeObject *)c,
2860 (PyTypeObject *)cls);
2861 Py_DECREF(c);
2862 }
2863 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002864 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002865 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002866 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002867
Brett Cannon4f653312004-03-20 22:52:14 +00002868 if (!recursion_depth) {
2869 PyErr_SetString(PyExc_RuntimeError,
2870 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002871 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002872 }
2873
Guido van Rossum03290ec2001-10-07 20:54:12 +00002874 n = PyTuple_GET_SIZE(cls);
2875 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002876 retval = recursive_isinstance(
2877 inst,
2878 PyTuple_GET_ITEM(cls, i),
2879 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002880 if (retval != 0)
2881 break;
2882 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002883 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002884 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002885 if (!check_class(cls,
2886 "isinstance() arg 2 must be a class, type,"
2887 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002888 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002889 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002890 if (icls == NULL) {
2891 PyErr_Clear();
2892 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002893 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002894 else {
2895 retval = abstract_issubclass(icls, cls);
2896 Py_DECREF(icls);
2897 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002898 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002899
Guido van Rossum823649d2001-03-21 18:40:58 +00002900 return retval;
2901}
2902
2903int
Brett Cannon4f653312004-03-20 22:52:14 +00002904PyObject_IsInstance(PyObject *inst, PyObject *cls)
2905{
Christian Heimese247f002008-02-14 22:40:11 +00002906 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002907 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002908
2909 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002910 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002911 return 1;
2912
Christian Heimese247f002008-02-14 22:40:11 +00002913 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002914 name = PyString_InternFromString("__instancecheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002915 if (name == NULL)
2916 return -1;
2917 }
2918 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002919 if (checker == NULL && PyErr_Occurred())
2920 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002921 if (checker != NULL) {
2922 PyObject *res;
2923 int ok = -1;
2924 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2925 Py_DECREF(checker);
2926 return ok;
2927 }
2928 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2929 Py_LeaveRecursiveCall();
2930 Py_DECREF(checker);
2931 if (res != NULL) {
2932 ok = PyObject_IsTrue(res);
2933 Py_DECREF(res);
2934 }
2935 return ok;
2936 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002937 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002938}
2939
2940static int
2941recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002942{
2943 int retval;
2944
2945 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002946 if (!check_class(derived,
2947 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002948 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002949
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002950 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002951 Py_ssize_t i;
2952 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002953
2954 if (!recursion_depth) {
2955 PyErr_SetString(PyExc_RuntimeError,
2956 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002957 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002958 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002959 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002960 retval = recursive_issubclass(
2961 derived,
2962 PyTuple_GET_ITEM(cls, i),
2963 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002964 if (retval != 0) {
2965 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002966 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002967 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002968 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002969 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002970 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002971 else {
2972 if (!check_class(cls,
2973 "issubclass() arg 2 must be a class"
2974 " or tuple of classes"))
2975 return -1;
2976 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002977
2978 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002979 }
2980 else {
2981 /* shortcut */
2982 if (!(retval = (derived == cls)))
2983 retval = PyClass_IsSubclass(derived, cls);
2984 }
2985
2986 return retval;
2987}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002988
Brett Cannon4f653312004-03-20 22:52:14 +00002989int
2990PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2991{
Christian Heimese247f002008-02-14 22:40:11 +00002992 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002993 PyObject *t, *v, *tb;
2994 PyObject *checker;
2995 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00002996
2997 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002998 name = PyString_InternFromString("__subclasscheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002999 if (name == NULL)
3000 return -1;
3001 }
3002 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003003 PyErr_Restore(t, v, tb);
3004 if (checker != NULL) {
3005 PyObject *res;
3006 int ok = -1;
3007 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3008 return ok;
3009 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3010 Py_LeaveRecursiveCall();
3011 Py_DECREF(checker);
3012 if (res != NULL) {
3013 ok = PyObject_IsTrue(res);
3014 Py_DECREF(res);
3015 }
3016 return ok;
3017 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00003018 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00003019}
3020
3021
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003022PyObject *
3023PyObject_GetIter(PyObject *o)
3024{
3025 PyTypeObject *t = o->ob_type;
3026 getiterfunc f = NULL;
3027 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3028 f = t->tp_iter;
3029 if (f == NULL) {
3030 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003031 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003032 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003033 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003034 else {
3035 PyObject *res = (*f)(o);
3036 if (res != NULL && !PyIter_Check(res)) {
3037 PyErr_Format(PyExc_TypeError,
3038 "iter() returned non-iterator "
3039 "of type '%.100s'",
3040 res->ob_type->tp_name);
3041 Py_DECREF(res);
3042 res = NULL;
3043 }
3044 return res;
3045 }
3046}
3047
Tim Petersf4848da2001-05-05 00:14:56 +00003048/* Return next item.
3049 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3050 * If the iteration terminates normally, return NULL and clear the
3051 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3052 * will be false.
3053 * Else return the next object. PyErr_Occurred() will be false.
3054 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003055PyObject *
3056PyIter_Next(PyObject *iter)
3057{
Tim Petersf4848da2001-05-05 00:14:56 +00003058 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00003059 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00003060 result = (*iter->ob_type->tp_iternext)(iter);
3061 if (result == NULL &&
3062 PyErr_Occurred() &&
3063 PyErr_ExceptionMatches(PyExc_StopIteration))
3064 PyErr_Clear();
3065 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003066}