blob: 1d5c4d548b7187e628eaf6a46c0efcdf00baa4d4 [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
365void
366PyObject_ReleaseBuffer(PyObject *obj, Py_buffer *view)
367{
368 if (obj->ob_type->tp_as_buffer != NULL &&
369 obj->ob_type->tp_as_buffer->bf_releasebuffer != NULL) {
370 (*(obj->ob_type->tp_as_buffer->bf_releasebuffer))(obj, view);
371 }
372}
373
374
375static int
376_IsFortranContiguous(Py_buffer *view)
377{
378 Py_ssize_t sd, dim;
379 int i;
380
381 if (view->ndim == 0) return 1;
382 if (view->strides == NULL) return (view->ndim == 1);
383
384 sd = view->itemsize;
385 if (view->ndim == 1) return (view->shape[0] == 1 ||
386 sd == view->strides[0]);
387 for (i=0; i<view->ndim; i++) {
388 dim = view->shape[i];
389 if (dim == 0) return 1;
390 if (view->strides[i] != sd) return 0;
391 sd *= dim;
392 }
393 return 1;
394}
395
396static int
397_IsCContiguous(Py_buffer *view)
398{
399 Py_ssize_t sd, dim;
400 int i;
401
402 if (view->ndim == 0) return 1;
403 if (view->strides == NULL) return 1;
404
405 sd = view->itemsize;
406 if (view->ndim == 1) return (view->shape[0] == 1 ||
407 sd == view->strides[0]);
408 for (i=view->ndim-1; i>=0; i--) {
409 dim = view->shape[i];
410 if (dim == 0) return 1;
411 if (view->strides[i] != sd) return 0;
412 sd *= dim;
413 }
414 return 1;
415}
416
417int
418PyBuffer_IsContiguous(Py_buffer *view, char fort)
419{
420
421 if (view->suboffsets != NULL) return 0;
422
423 if (fort == 'C')
424 return _IsCContiguous(view);
425 else if (fort == 'F')
426 return _IsFortranContiguous(view);
427 else if (fort == 'A')
428 return (_IsCContiguous(view) || _IsFortranContiguous(view));
429 return 0;
430}
431
432
433void*
434PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
435{
436 char* pointer;
437 int i;
438 pointer = (char *)view->buf;
439 for (i = 0; i < view->ndim; i++) {
440 pointer += view->strides[i]*indices[i];
441 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
442 pointer = *((char**)pointer) + view->suboffsets[i];
443 }
444 }
445 return (void*)pointer;
446}
447
448
Neal Norwitzfddc4692008-04-15 03:46:21 +0000449static void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000450_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape)
451{
452 int k;
453
454 for (k=0; k<nd; k++) {
455 if (index[k] < shape[k]-1) {
456 index[k]++;
457 break;
458 }
459 else {
460 index[k] = 0;
461 }
462 }
463}
464
Neal Norwitzfddc4692008-04-15 03:46:21 +0000465static void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000466_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape)
467{
468 int k;
469
470 for (k=nd-1; k>=0; k--) {
471 if (index[k] < shape[k]-1) {
472 index[k]++;
473 break;
474 }
475 else {
476 index[k] = 0;
477 }
478 }
479}
480
481 /* view is not checked for consistency in either of these. It is
482 assumed that the size of the buffer is view->len in
483 view->len / view->itemsize elements.
484 */
485
486int
487PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
488{
489 int k;
490 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
491 Py_ssize_t *indices, elements;
492 char *dest, *ptr;
493
494 if (len > view->len) {
495 len = view->len;
496 }
497
498 if (PyBuffer_IsContiguous(view, fort)) {
499 /* simplest copy is all that is needed */
500 memcpy(buf, view->buf, len);
501 return 0;
502 }
503
504 /* Otherwise a more elaborate scheme is needed */
505
506 /* XXX(nnorwitz): need to check for overflow! */
507 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
508 if (indices == NULL) {
509 PyErr_NoMemory();
510 return -1;
511 }
512 for (k=0; k<view->ndim;k++) {
513 indices[k] = 0;
514 }
515
516 if (fort == 'F') {
517 addone = _add_one_to_index_F;
518 }
519 else {
520 addone = _add_one_to_index_C;
521 }
522 dest = buf;
523 /* XXX : This is not going to be the fastest code in the world
524 several optimizations are possible.
525 */
526 elements = len / view->itemsize;
527 while (elements--) {
528 addone(view->ndim, indices, view->shape);
529 ptr = PyBuffer_GetPointer(view, indices);
530 memcpy(dest, ptr, view->itemsize);
531 dest += view->itemsize;
532 }
533 PyMem_Free(indices);
534 return 0;
535}
536
537int
538PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
539{
540 int k;
541 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
542 Py_ssize_t *indices, elements;
543 char *src, *ptr;
544
545 if (len > view->len) {
546 len = view->len;
547 }
548
549 if (PyBuffer_IsContiguous(view, fort)) {
550 /* simplest copy is all that is needed */
551 memcpy(view->buf, buf, len);
552 return 0;
553 }
554
555 /* Otherwise a more elaborate scheme is needed */
556
557 /* XXX(nnorwitz): need to check for overflow! */
558 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
559 if (indices == NULL) {
560 PyErr_NoMemory();
561 return -1;
562 }
563 for (k=0; k<view->ndim;k++) {
564 indices[k] = 0;
565 }
566
567 if (fort == 'F') {
568 addone = _add_one_to_index_F;
569 }
570 else {
571 addone = _add_one_to_index_C;
572 }
573 src = buf;
574 /* XXX : This is not going to be the fastest code in the world
575 several optimizations are possible.
576 */
577 elements = len / view->itemsize;
578 while (elements--) {
579 addone(view->ndim, indices, view->shape);
580 ptr = PyBuffer_GetPointer(view, indices);
581 memcpy(ptr, src, view->itemsize);
582 src += view->itemsize;
583 }
584
585 PyMem_Free(indices);
586 return 0;
587}
588
589int PyObject_CopyData(PyObject *dest, PyObject *src)
590{
591 Py_buffer view_dest, view_src;
592 int k;
593 Py_ssize_t *indices, elements;
594 char *dptr, *sptr;
595
596 if (!PyObject_CheckBuffer(dest) ||
597 !PyObject_CheckBuffer(src)) {
598 PyErr_SetString(PyExc_TypeError,
599 "both destination and source must have the "\
600 "buffer interface");
601 return -1;
602 }
603
604 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
605 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
606 PyObject_ReleaseBuffer(dest, &view_dest);
607 return -1;
608 }
609
610 if (view_dest.len < view_src.len) {
611 PyErr_SetString(PyExc_BufferError,
612 "destination is too small to receive data from source");
613 PyObject_ReleaseBuffer(dest, &view_dest);
614 PyObject_ReleaseBuffer(src, &view_src);
615 return -1;
616 }
617
618 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
619 PyBuffer_IsContiguous(&view_src, 'C')) ||
620 (PyBuffer_IsContiguous(&view_dest, 'F') &&
621 PyBuffer_IsContiguous(&view_src, 'F'))) {
622 /* simplest copy is all that is needed */
623 memcpy(view_dest.buf, view_src.buf, view_src.len);
624 PyObject_ReleaseBuffer(dest, &view_dest);
625 PyObject_ReleaseBuffer(src, &view_src);
626 return 0;
627 }
628
629 /* Otherwise a more elaborate copy scheme is needed */
630
631 /* XXX(nnorwitz): need to check for overflow! */
632 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
633 if (indices == NULL) {
634 PyErr_NoMemory();
635 PyObject_ReleaseBuffer(dest, &view_dest);
636 PyObject_ReleaseBuffer(src, &view_src);
637 return -1;
638 }
639 for (k=0; k<view_src.ndim;k++) {
640 indices[k] = 0;
641 }
642 elements = 1;
643 for (k=0; k<view_src.ndim; k++) {
644 /* XXX(nnorwitz): can this overflow? */
645 elements *= view_src.shape[k];
646 }
647 while (elements--) {
648 _add_one_to_index_C(view_src.ndim, indices, view_src.shape);
649 dptr = PyBuffer_GetPointer(&view_dest, indices);
650 sptr = PyBuffer_GetPointer(&view_src, indices);
651 memcpy(dptr, sptr, view_src.itemsize);
652 }
653 PyMem_Free(indices);
654 PyObject_ReleaseBuffer(dest, &view_dest);
655 PyObject_ReleaseBuffer(src, &view_src);
656 return 0;
657}
658
659void
660PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
661 Py_ssize_t *strides, int itemsize,
662 char fort)
663{
664 int k;
665 Py_ssize_t sd;
666
667 sd = itemsize;
668 if (fort == 'F') {
669 for (k=0; k<nd; k++) {
670 strides[k] = sd;
671 sd *= shape[k];
672 }
673 }
674 else {
675 for (k=nd-1; k>=0; k--) {
676 strides[k] = sd;
677 sd *= shape[k];
678 }
679 }
680 return;
681}
682
683int
684PyBuffer_FillInfo(Py_buffer *view, void *buf, Py_ssize_t len,
685 int readonly, int flags)
686{
687 if (view == NULL) return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000688 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
689 (readonly == 1)) {
690 PyErr_SetString(PyExc_BufferError,
691 "Object is not writable.");
692 return -1;
693 }
694
695 view->buf = buf;
696 view->len = len;
697 view->readonly = readonly;
698 view->itemsize = 1;
699 view->format = NULL;
700 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
701 view->format = "B";
702 view->ndim = 1;
703 view->shape = NULL;
704 if ((flags & PyBUF_ND) == PyBUF_ND)
705 view->shape = &(view->len);
706 view->strides = NULL;
707 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
708 view->strides = &(view->itemsize);
709 view->suboffsets = NULL;
710 view->internal = NULL;
711 return 0;
712}
713
Eric Smitha9f7d622008-02-17 19:46:49 +0000714PyObject *
715PyObject_Format(PyObject* obj, PyObject *format_spec)
716{
717 static PyObject * str__format__ = NULL;
718 PyObject *empty = NULL;
719 PyObject *result = NULL;
720 int spec_is_unicode;
721 int result_is_unicode;
722
723 /* Initialize cached value */
724 if (str__format__ == NULL) {
725 /* Initialize static variable needed by _PyType_Lookup */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000726 str__format__ = PyString_InternFromString("__format__");
Eric Smitha9f7d622008-02-17 19:46:49 +0000727 if (str__format__ == NULL)
728 goto done;
729 }
730
731 /* If no format_spec is provided, use an empty string */
732 if (format_spec == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000733 empty = PyString_FromStringAndSize(NULL, 0);
Eric Smitha9f7d622008-02-17 19:46:49 +0000734 format_spec = empty;
735 }
736
737 /* Check the format_spec type, and make sure it's str or unicode */
738 if (PyUnicode_Check(format_spec))
739 spec_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000740 else if (PyString_Check(format_spec))
Eric Smitha9f7d622008-02-17 19:46:49 +0000741 spec_is_unicode = 0;
742 else {
743 PyErr_Format(PyExc_TypeError,
744 "format expects arg 2 to be string "
745 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
746 goto done;
747 }
748
749 /* Make sure the type is initialized. float gets initialized late */
750 if (Py_TYPE(obj)->tp_dict == NULL)
751 if (PyType_Ready(Py_TYPE(obj)) < 0)
752 goto done;
753
754 /* Check for a __format__ method and call it. */
755 if (PyInstance_Check(obj)) {
756 /* We're an instance of a classic class */
757 PyObject *bound_method = PyObject_GetAttr(obj,
758 str__format__);
759 if (bound_method != NULL) {
760 result = PyObject_CallFunctionObjArgs(bound_method,
761 format_spec,
762 NULL);
763 Py_DECREF(bound_method);
764 } else {
765 PyObject *self_as_str;
766 PyObject *format_method;
767
768 PyErr_Clear();
769 /* Per the PEP, convert to str (or unicode,
770 depending on the type of the format
771 specifier). For new-style classes, this
772 logic is done by object.__format__(). */
773 if (spec_is_unicode)
774 self_as_str = PyObject_Unicode(obj);
775 else
776 self_as_str = PyObject_Str(obj);
777 if (self_as_str == NULL)
778 goto done;
779
780 /* Then call str.__format__ on that result */
781 format_method = PyObject_GetAttr(self_as_str,
782 str__format__);
783 if (format_method == NULL) {
784 Py_DECREF(self_as_str);
785 goto done;
786 }
787 result = PyObject_CallFunctionObjArgs(format_method,
788 format_spec,
789 NULL);
790 Py_DECREF(self_as_str);
791 Py_DECREF(format_method);
792 if (result == NULL)
793 goto done;
794 }
795 } else {
796 /* Not an instance of a classic class, use the code
797 from py3k */
798
799 /* Find the (unbound!) __format__ method (a borrowed
800 reference) */
801 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
802 str__format__);
803 if (method == NULL) {
804 PyErr_Format(PyExc_TypeError,
805 "Type %.100s doesn't define __format__",
806 Py_TYPE(obj)->tp_name);
807 goto done;
808 }
809 /* And call it, binding it to the value */
810 result = PyObject_CallFunctionObjArgs(method, obj,
811 format_spec, NULL);
812 }
813
814 if (result == NULL)
815 goto done;
816
817 /* Check the result type, and make sure it's str or unicode */
818 if (PyUnicode_Check(result))
819 result_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000820 else if (PyString_Check(result))
Eric Smitha9f7d622008-02-17 19:46:49 +0000821 result_is_unicode = 0;
822 else {
823 PyErr_Format(PyExc_TypeError,
824 "%.100s.__format__ must return string or "
825 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
826 Py_TYPE(result)->tp_name);
827 Py_DECREF(result);
828 result = NULL;
829 goto done;
830 }
831
832 /* Convert to unicode, if needed. Required if spec is unicode
833 and result is str */
834 if (spec_is_unicode && !result_is_unicode) {
835 PyObject *tmp = PyObject_Unicode(result);
836 /* This logic works whether or not tmp is NULL */
837 Py_DECREF(result);
838 result = tmp;
839 }
840
841done:
842 Py_XDECREF(empty);
843 return result;
844}
845
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000846/* Operations on numbers */
847
848int
Fred Drake79912472000-07-09 04:06:11 +0000849PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000850{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000851 return o && o->ob_type->tp_as_number &&
852 (o->ob_type->tp_as_number->nb_int ||
853 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000854}
855
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000856/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000857
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000858/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000859
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000860#define NB_SLOT(x) offsetof(PyNumberMethods, x)
861#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000862 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000863#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000864 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000865
866/*
867 Calling scheme used for binary operations:
868
869 v w Action
870 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000871 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000872 new old v.op(v,w), coerce(v,w), v.op(v,w)
873 old new w.op(v,w), coerce(v,w), v.op(v,w)
874 old old coerce(v,w), v.op(v,w)
875
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000876 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
877 v->ob_type
878
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000879 Legend:
880 -------
881 * new == new style number
882 * old == old style number
883 * Action indicates the order in which operations are tried until either
884 a valid result is produced or an error occurs.
885
886 */
887
888static PyObject *
889binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000890{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000891 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000892 binaryfunc slotv = NULL;
893 binaryfunc slotw = NULL;
894
895 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000896 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000897 if (w->ob_type != v->ob_type &&
898 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000899 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000900 if (slotw == slotv)
901 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000902 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000903 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000904 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
905 x = slotw(v, w);
906 if (x != Py_NotImplemented)
907 return x;
908 Py_DECREF(x); /* can't do it */
909 slotw = NULL;
910 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000911 x = slotv(v, w);
912 if (x != Py_NotImplemented)
913 return x;
914 Py_DECREF(x); /* can't do it */
915 }
916 if (slotw) {
917 x = slotw(v, w);
918 if (x != Py_NotImplemented)
919 return x;
920 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000921 }
922 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
923 int err = PyNumber_CoerceEx(&v, &w);
924 if (err < 0) {
925 return NULL;
926 }
927 if (err == 0) {
928 PyNumberMethods *mv = v->ob_type->tp_as_number;
929 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000930 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000931 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000932 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000933 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000934 Py_DECREF(v);
935 Py_DECREF(w);
936 return x;
937 }
938 }
939 /* CoerceEx incremented the reference counts */
940 Py_DECREF(v);
941 Py_DECREF(w);
942 }
943 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000944 Py_INCREF(Py_NotImplemented);
945 return Py_NotImplemented;
946}
Guido van Rossum77660912002-04-16 16:32:50 +0000947
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000948static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000949binop_type_error(PyObject *v, PyObject *w, const char *op_name)
950{
951 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000952 "unsupported operand type(s) for %.100s: "
953 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000954 op_name,
955 v->ob_type->tp_name,
956 w->ob_type->tp_name);
957 return NULL;
958}
959
960static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000961binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
962{
963 PyObject *result = binary_op1(v, w, op_slot);
964 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000965 Py_DECREF(result);
966 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000967 }
968 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000969}
970
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000971
972/*
973 Calling scheme used for ternary operations:
974
Guido van Rossum84675ac2001-09-29 01:05:03 +0000975 *** In some cases, w.op is called before v.op; see binary_op1. ***
976
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000977 v w z Action
978 -------------------------------------------------------------------
979 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
980 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
981 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
982 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
983 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
984 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
985 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
986 old old old coerce(v,w,z), v.op(v,w,z)
987
988 Legend:
989 -------
990 * new == new style number
991 * old == old style number
992 * Action indicates the order in which operations are tried until either
993 a valid result is produced or an error occurs.
994 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
995 only if z != Py_None; if z == Py_None, then it is treated as absent
996 variable and only coerce(v,w) is tried.
997
998 */
999
1000static PyObject *
1001ternary_op(PyObject *v,
1002 PyObject *w,
1003 PyObject *z,
1004 const int op_slot,
1005 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001006{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001007 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001008 PyObject *x = NULL;
1009 ternaryfunc slotv = NULL;
1010 ternaryfunc slotw = NULL;
1011 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001012
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001013 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001014 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001015 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001016 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001017 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001018 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001019 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001020 if (slotw == slotv)
1021 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001022 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001023 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001024 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1025 x = slotw(v, w, z);
1026 if (x != Py_NotImplemented)
1027 return x;
1028 Py_DECREF(x); /* can't do it */
1029 slotw = NULL;
1030 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001031 x = slotv(v, w, z);
1032 if (x != Py_NotImplemented)
1033 return x;
1034 Py_DECREF(x); /* can't do it */
1035 }
1036 if (slotw) {
1037 x = slotw(v, w, z);
1038 if (x != Py_NotImplemented)
1039 return x;
1040 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001041 }
1042 mz = z->ob_type->tp_as_number;
1043 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001044 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001045 if (slotz == slotv || slotz == slotw)
1046 slotz = NULL;
1047 if (slotz) {
1048 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001049 if (x != Py_NotImplemented)
1050 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001051 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001052 }
1053 }
1054
1055 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1056 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1057 /* we have an old style operand, coerce */
1058 PyObject *v1, *z1, *w2, *z2;
1059 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001060
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001061 c = PyNumber_Coerce(&v, &w);
1062 if (c != 0)
1063 goto error3;
1064
1065 /* Special case: if the third argument is None, it is
1066 treated as absent argument and not coerced. */
1067 if (z == Py_None) {
1068 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001069 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1070 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001071 if (slotz)
1072 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001073 else
1074 c = -1;
1075 }
1076 else
1077 c = -1;
1078 goto error2;
1079 }
1080 v1 = v;
1081 z1 = z;
1082 c = PyNumber_Coerce(&v1, &z1);
1083 if (c != 0)
1084 goto error2;
1085 w2 = w;
1086 z2 = z1;
1087 c = PyNumber_Coerce(&w2, &z2);
1088 if (c != 0)
1089 goto error1;
1090
1091 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001092 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1093 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001094 if (slotv)
1095 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001096 else
1097 c = -1;
1098 }
1099 else
1100 c = -1;
1101
1102 Py_DECREF(w2);
1103 Py_DECREF(z2);
1104 error1:
1105 Py_DECREF(v1);
1106 Py_DECREF(z1);
1107 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001108 Py_DECREF(v);
1109 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001110 error3:
1111 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001112 return x;
1113 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001114
1115 if (z == Py_None)
1116 PyErr_Format(
1117 PyExc_TypeError,
1118 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001119 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001120 v->ob_type->tp_name,
1121 w->ob_type->tp_name);
1122 else
1123 PyErr_Format(
1124 PyExc_TypeError,
1125 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001126 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001127 v->ob_type->tp_name,
1128 w->ob_type->tp_name,
1129 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001130 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001131}
1132
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001133#define BINARY_FUNC(func, op, op_name) \
1134 PyObject * \
1135 func(PyObject *v, PyObject *w) { \
1136 return binary_op(v, w, NB_SLOT(op), op_name); \
1137 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001138
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001139BINARY_FUNC(PyNumber_Or, nb_or, "|")
1140BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1141BINARY_FUNC(PyNumber_And, nb_and, "&")
1142BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1143BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1144BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001145BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1146BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001147
1148PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001149PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001150{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001151 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1152 if (result == Py_NotImplemented) {
1153 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001154 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001155 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001156 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001157 }
Armin Rigofd163f92005-12-29 15:59:19 +00001158 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001159 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001160 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001161}
1162
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001163static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001164sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001165{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001166 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001167 if (PyIndex_Check(n)) {
1168 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001169 if (count == -1 && PyErr_Occurred())
1170 return NULL;
1171 }
1172 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001173 return type_error("can't multiply sequence by "
1174 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001175 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001176 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001177}
1178
1179PyObject *
1180PyNumber_Multiply(PyObject *v, PyObject *w)
1181{
1182 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1183 if (result == Py_NotImplemented) {
1184 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1185 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001186 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001187 if (mv && mv->sq_repeat) {
1188 return sequence_repeat(mv->sq_repeat, v, w);
1189 }
1190 else if (mw && mw->sq_repeat) {
1191 return sequence_repeat(mw->sq_repeat, w, v);
1192 }
1193 result = binop_type_error(v, w, "*");
1194 }
1195 return result;
1196}
1197
Guido van Rossume15dee51995-07-18 14:12:02 +00001198PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001199PyNumber_FloorDivide(PyObject *v, PyObject *w)
1200{
1201 /* XXX tp_flags test */
1202 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1203}
1204
1205PyObject *
1206PyNumber_TrueDivide(PyObject *v, PyObject *w)
1207{
1208 /* XXX tp_flags test */
1209 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1210}
1211
1212PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001213PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001214{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001215 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001216}
1217
1218PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001219PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001220{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001221 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001222}
1223
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001224/* Binary in-place operators */
1225
1226/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001227 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001228
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001229 - If the left hand object has the appropriate struct members, and
1230 they are filled, call the appropriate function and return the
1231 result. No coercion is done on the arguments; the left-hand object
1232 is the one the operation is performed on, and it's up to the
1233 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001234
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001235 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001236 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001237
1238 */
1239
Guido van Rossum77660912002-04-16 16:32:50 +00001240#define HASINPLACE(t) \
1241 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001242
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001243static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001244binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001245{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001246 PyNumberMethods *mv = v->ob_type->tp_as_number;
1247 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001248 binaryfunc slot = NB_BINOP(mv, iop_slot);
1249 if (slot) {
1250 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001251 if (x != Py_NotImplemented) {
1252 return x;
1253 }
1254 Py_DECREF(x);
1255 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001256 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001257 return binary_op1(v, w, op_slot);
1258}
1259
1260static PyObject *
1261binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1262 const char *op_name)
1263{
1264 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1265 if (result == Py_NotImplemented) {
1266 Py_DECREF(result);
1267 return binop_type_error(v, w, op_name);
1268 }
1269 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001270}
1271
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001272#define INPLACE_BINOP(func, iop, op, op_name) \
1273 PyObject * \
1274 func(PyObject *v, PyObject *w) { \
1275 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001276 }
1277
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001278INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1279INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1280INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1281INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1282INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1283INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1284INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001285
1286PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001287PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1288{
1289 /* XXX tp_flags test */
1290 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1291 NB_SLOT(nb_floor_divide), "//=");
1292}
1293
1294PyObject *
1295PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1296{
1297 /* XXX tp_flags test */
1298 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1299 NB_SLOT(nb_true_divide), "/=");
1300}
1301
1302PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001303PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1304{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001305 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1306 NB_SLOT(nb_add));
1307 if (result == Py_NotImplemented) {
1308 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1309 Py_DECREF(result);
1310 if (m != NULL) {
1311 binaryfunc f = NULL;
1312 if (HASINPLACE(v))
1313 f = m->sq_inplace_concat;
1314 if (f == NULL)
1315 f = m->sq_concat;
1316 if (f != NULL)
1317 return (*f)(v, w);
1318 }
1319 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001320 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001321 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001322}
1323
1324PyObject *
1325PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1326{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001327 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1328 NB_SLOT(nb_multiply));
1329 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001330 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001331 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1332 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1333 Py_DECREF(result);
1334 if (mv != NULL) {
1335 if (HASINPLACE(v))
1336 f = mv->sq_inplace_repeat;
1337 if (f == NULL)
1338 f = mv->sq_repeat;
1339 if (f != NULL)
1340 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001341 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001342 else if (mw != NULL) {
1343 /* Note that the right hand operand should not be
1344 * mutated in this case so sq_inplace_repeat is not
1345 * used. */
1346 if (mw->sq_repeat)
1347 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001348 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001349 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001350 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001351 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001352}
1353
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001354PyObject *
1355PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1356{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001357 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1358 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001359}
1360
1361PyObject *
1362PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1363{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001364 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1365 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1366 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001367 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001368 else {
1369 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1370 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001371}
1372
1373
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001374/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001375
1376PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001377PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001378{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001379 PyNumberMethods *m;
1380
1381 if (o == NULL)
1382 return null_error();
1383 m = o->ob_type->tp_as_number;
1384 if (m && m->nb_negative)
1385 return (*m->nb_negative)(o);
1386
Georg Brandlccff7852006-06-18 22:17:29 +00001387 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001388}
1389
1390PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001391PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001392{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001393 PyNumberMethods *m;
1394
1395 if (o == NULL)
1396 return null_error();
1397 m = o->ob_type->tp_as_number;
1398 if (m && m->nb_positive)
1399 return (*m->nb_positive)(o);
1400
Georg Brandlccff7852006-06-18 22:17:29 +00001401 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001402}
1403
1404PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001405PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001406{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001407 PyNumberMethods *m;
1408
1409 if (o == NULL)
1410 return null_error();
1411 m = o->ob_type->tp_as_number;
1412 if (m && m->nb_invert)
1413 return (*m->nb_invert)(o);
1414
Georg Brandlccff7852006-06-18 22:17:29 +00001415 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001416}
1417
1418PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001419PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001420{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001421 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001422
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 if (o == NULL)
1424 return null_error();
1425 m = o->ob_type->tp_as_number;
1426 if (m && m->nb_absolute)
1427 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001428
Georg Brandlccff7852006-06-18 22:17:29 +00001429 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001430}
1431
Guido van Rossum9e896b32000-04-05 20:11:21 +00001432/* Add a check for embedded NULL-bytes in the argument. */
1433static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001434int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001435{
1436 char *end;
1437 PyObject *x;
1438
1439 x = PyInt_FromString((char*)s, &end, 10);
1440 if (x == NULL)
1441 return NULL;
1442 if (end != s + len) {
1443 PyErr_SetString(PyExc_ValueError,
1444 "null byte in argument for int()");
1445 Py_DECREF(x);
1446 return NULL;
1447 }
1448 return x;
1449}
1450
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001451/* Return a Python Int or Long from the object item
1452 Raise TypeError if the result is not an int-or-long
1453 or if the object cannot be interpreted as an index.
1454*/
1455PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001456PyNumber_Index(PyObject *item)
1457{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001458 PyObject *result = NULL;
1459 if (item == NULL)
1460 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001461 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001462 Py_INCREF(item);
1463 return item;
1464 }
1465 if (PyIndex_Check(item)) {
1466 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001467 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001468 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001469 PyErr_Format(PyExc_TypeError,
1470 "__index__ returned non-(int,long) " \
1471 "(type %.200s)",
1472 result->ob_type->tp_name);
1473 Py_DECREF(result);
1474 return NULL;
1475 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001476 }
1477 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001478 PyErr_Format(PyExc_TypeError,
1479 "'%.200s' object cannot be interpreted "
1480 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001481 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001482 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001483}
1484
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001485/* Return an error on Overflow only if err is not NULL*/
1486
1487Py_ssize_t
1488PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1489{
1490 Py_ssize_t result;
1491 PyObject *runerr;
1492 PyObject *value = PyNumber_Index(item);
1493 if (value == NULL)
1494 return -1;
1495
1496 /* We're done if PyInt_AsSsize_t() returns without error. */
1497 result = PyInt_AsSsize_t(value);
1498 if (result != -1 || !(runerr = PyErr_Occurred()))
1499 goto finish;
1500
1501 /* Error handling code -- only manage OverflowError differently */
1502 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1503 goto finish;
1504
1505 PyErr_Clear();
1506 /* If no error-handling desired then the default clipping
1507 is sufficient.
1508 */
1509 if (!err) {
1510 assert(PyLong_Check(value));
1511 /* Whether or not it is less than or equal to
1512 zero is determined by the sign of ob_size
1513 */
1514 if (_PyLong_Sign(value) < 0)
1515 result = PY_SSIZE_T_MIN;
1516 else
1517 result = PY_SSIZE_T_MAX;
1518 }
1519 else {
1520 /* Otherwise replace the error with caller's error object. */
1521 PyErr_Format(err,
1522 "cannot fit '%.200s' into an index-sized integer",
1523 item->ob_type->tp_name);
1524 }
1525
1526 finish:
1527 Py_DECREF(value);
1528 return result;
1529}
1530
1531
Guido van Rossume15dee51995-07-18 14:12:02 +00001532PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001533_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1534{
1535 const char *type_name;
1536 static PyObject *int_name = NULL;
1537 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001538 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001539 if (int_name == NULL)
1540 return NULL;
1541 }
1542
1543 if (integral && (!PyInt_Check(integral) &&
1544 !PyLong_Check(integral))) {
1545 /* Don't go through tp_as_number->nb_int to avoid
1546 hitting the classic class fallback to __trunc__. */
1547 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1548 if (int_func == NULL) {
1549 PyErr_Clear(); /* Raise a different error. */
1550 goto non_integral_error;
1551 }
1552 Py_DECREF(integral);
1553 integral = PyEval_CallObject(int_func, NULL);
1554 Py_DECREF(int_func);
1555 if (integral && (!PyInt_Check(integral) &&
1556 !PyLong_Check(integral))) {
1557 goto non_integral_error;
1558 }
1559 }
1560 return integral;
1561
1562non_integral_error:
1563 if (PyInstance_Check(integral)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001564 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001565 ->in_class->cl_name);
1566 }
1567 else {
1568 type_name = integral->ob_type->tp_name;
1569 }
1570 PyErr_Format(PyExc_TypeError, error_format, type_name);
1571 Py_DECREF(integral);
1572 return NULL;
1573}
1574
1575
1576PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001577PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001578{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001579 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001580 static PyObject *trunc_name = NULL;
1581 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001582 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001583 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001584
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001585 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001586 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001587 if (trunc_name == NULL)
1588 return NULL;
1589 }
1590
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001591 if (o == NULL)
1592 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001593 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001594 Py_INCREF(o);
1595 return o;
1596 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001597 m = o->ob_type->tp_as_number;
1598 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001599 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001600 PyObject *res = m->nb_int(o);
1601 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1602 PyErr_Format(PyExc_TypeError,
1603 "__int__ returned non-int (type %.200s)",
1604 res->ob_type->tp_name);
1605 Py_DECREF(res);
1606 return NULL;
1607 }
1608 return res;
1609 }
1610 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001611 PyIntObject *io = (PyIntObject*)o;
1612 return PyInt_FromLong(io->ob_ival);
1613 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001614 trunc_func = PyObject_GetAttr(o, trunc_name);
1615 if (trunc_func) {
1616 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1617 Py_DECREF(trunc_func);
1618 /* __trunc__ is specified to return an Integral type, but
1619 int() needs to return an int. */
1620 return _PyNumber_ConvertIntegralToInt(
1621 truncated,
1622 "__trunc__ returned non-Integral (type %.200s)");
1623 }
1624 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1625
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001626 if (PyString_Check(o))
1627 return int_from_string(PyString_AS_STRING(o),
1628 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001629#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001630 if (PyUnicode_Check(o))
1631 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1632 PyUnicode_GET_SIZE(o),
1633 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001634#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001635 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001636 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001637
Georg Brandlccff7852006-06-18 22:17:29 +00001638 return type_error("int() argument must be a string or a "
1639 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001640}
1641
Guido van Rossum9e896b32000-04-05 20:11:21 +00001642/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001643static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001644long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001645{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001646 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001647 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001648
Guido van Rossum4c08d552000-03-10 22:55:18 +00001649 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001650 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001651 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001652 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001653 PyErr_SetString(PyExc_ValueError,
1654 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001655 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001656 return NULL;
1657 }
1658 return x;
1659}
1660
Guido van Rossume15dee51995-07-18 14:12:02 +00001661PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001662PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001663{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001664 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001665 static PyObject *trunc_name = NULL;
1666 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001667 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001668 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001669
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001670 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001671 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001672 if (trunc_name == NULL)
1673 return NULL;
1674 }
1675
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001676 if (o == NULL)
1677 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001678 m = o->ob_type->tp_as_number;
1679 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001680 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001681 PyObject *res = m->nb_long(o);
1682 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1683 PyErr_Format(PyExc_TypeError,
1684 "__long__ returned non-long (type %.200s)",
1685 res->ob_type->tp_name);
1686 Py_DECREF(res);
1687 return NULL;
1688 }
1689 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001690 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001691 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001692 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001693 trunc_func = PyObject_GetAttr(o, trunc_name);
1694 if (trunc_func) {
1695 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1696 PyObject *int_instance;
1697 Py_DECREF(trunc_func);
1698 /* __trunc__ is specified to return an Integral type,
1699 but long() needs to return a long. */
1700 int_instance = _PyNumber_ConvertIntegralToInt(
1701 truncated,
1702 "__trunc__ returned non-Integral (type %.200s)");
1703 if (int_instance && PyInt_Check(int_instance)) {
1704 /* Make sure that long() returns a long instance. */
1705 long value = PyInt_AS_LONG(int_instance);
1706 Py_DECREF(int_instance);
1707 return PyLong_FromLong(value);
1708 }
1709 return int_instance;
1710 }
1711 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1712
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001713 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001714 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001715 * doesn't do. In particular long('9.5') must raise an
1716 * exception, not truncate the float.
1717 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001718 return long_from_string(PyString_AS_STRING(o),
1719 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001720#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001721 if (PyUnicode_Check(o))
1722 /* The above check is done in PyLong_FromUnicode(). */
1723 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1724 PyUnicode_GET_SIZE(o),
1725 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001726#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001727 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1728 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001729
Georg Brandlccff7852006-06-18 22:17:29 +00001730 return type_error("long() argument must be a string or a "
1731 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001732}
1733
1734PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001735PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001736{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001737 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001738
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001739 if (o == NULL)
1740 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001741 m = o->ob_type->tp_as_number;
1742 if (m && m->nb_float) { /* This should include subclasses of float */
1743 PyObject *res = m->nb_float(o);
1744 if (res && !PyFloat_Check(res)) {
1745 PyErr_Format(PyExc_TypeError,
1746 "__float__ returned non-float (type %.200s)",
1747 res->ob_type->tp_name);
1748 Py_DECREF(res);
1749 return NULL;
1750 }
1751 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001752 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001753 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001754 PyFloatObject *po = (PyFloatObject *)o;
1755 return PyFloat_FromDouble(po->ob_fval);
1756 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001757 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001758}
1759
Eric Smith5e527eb2008-02-10 01:36:53 +00001760PyObject *
1761PyNumber_ToBase(PyObject *n, int base)
1762{
1763 PyObject *res = NULL;
1764 PyObject *index = PyNumber_Index(n);
1765
1766 if (!index)
1767 return NULL;
1768 if (PyLong_Check(index))
1769 res = _PyLong_Format(index, base, 0, 1);
1770 else if (PyInt_Check(index))
1771 res = _PyInt_Format((PyIntObject*)index, base, 1);
1772 else
Eric Smith3f914372008-02-15 12:14:32 +00001773 /* It should not be possible to get here, as
1774 PyNumber_Index already has a check for the same
1775 condition */
1776 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1777 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001778 Py_DECREF(index);
1779 return res;
1780}
1781
1782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001783/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001784
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001785int
Fred Drake79912472000-07-09 04:06:11 +00001786PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001787{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001788 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001789 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001790 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001791 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001792 return s != NULL && s->ob_type->tp_as_sequence &&
1793 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001794}
1795
Martin v. Löwis18e16552006-02-15 17:27:45 +00001796Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001797PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001798{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001799 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001800
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001801 if (s == NULL) {
1802 null_error();
1803 return -1;
1804 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001805
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001806 m = s->ob_type->tp_as_sequence;
1807 if (m && m->sq_length)
1808 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001809
Georg Brandlb0061c82006-08-08 11:56:21 +00001810 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001811 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001812}
1813
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001814#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001815Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001816PySequence_Length(PyObject *s)
1817{
1818 return PySequence_Size(s);
1819}
1820#define PySequence_Length PySequence_Size
1821
Guido van Rossume15dee51995-07-18 14:12:02 +00001822PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001823PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001824{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001825 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001826
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001827 if (s == NULL || o == NULL)
1828 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001829
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001830 m = s->ob_type->tp_as_sequence;
1831 if (m && m->sq_concat)
1832 return m->sq_concat(s, o);
1833
Armin Rigofd163f92005-12-29 15:59:19 +00001834 /* Instances of user classes defining an __add__() method only
1835 have an nb_add slot, not an sq_concat slot. So we fall back
1836 to nb_add if both arguments appear to be sequences. */
1837 if (PySequence_Check(s) && PySequence_Check(o)) {
1838 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1839 if (result != Py_NotImplemented)
1840 return result;
1841 Py_DECREF(result);
1842 }
Georg Brandlccff7852006-06-18 22:17:29 +00001843 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001844}
1845
1846PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001847PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001848{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001849 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001850
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001851 if (o == NULL)
1852 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001853
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001854 m = o->ob_type->tp_as_sequence;
1855 if (m && m->sq_repeat)
1856 return m->sq_repeat(o, count);
1857
Armin Rigofd163f92005-12-29 15:59:19 +00001858 /* Instances of user classes defining a __mul__() method only
1859 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1860 to nb_multiply if o appears to be a sequence. */
1861 if (PySequence_Check(o)) {
1862 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001863 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001864 if (n == NULL)
1865 return NULL;
1866 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1867 Py_DECREF(n);
1868 if (result != Py_NotImplemented)
1869 return result;
1870 Py_DECREF(result);
1871 }
Georg Brandlccff7852006-06-18 22:17:29 +00001872 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001873}
1874
1875PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001876PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1877{
1878 PySequenceMethods *m;
1879
1880 if (s == NULL || o == NULL)
1881 return null_error();
1882
1883 m = s->ob_type->tp_as_sequence;
1884 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1885 return m->sq_inplace_concat(s, o);
1886 if (m && m->sq_concat)
1887 return m->sq_concat(s, o);
1888
Armin Rigofd163f92005-12-29 15:59:19 +00001889 if (PySequence_Check(s) && PySequence_Check(o)) {
1890 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1891 NB_SLOT(nb_add));
1892 if (result != Py_NotImplemented)
1893 return result;
1894 Py_DECREF(result);
1895 }
Georg Brandlccff7852006-06-18 22:17:29 +00001896 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001897}
1898
1899PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001900PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001901{
1902 PySequenceMethods *m;
1903
1904 if (o == NULL)
1905 return null_error();
1906
1907 m = o->ob_type->tp_as_sequence;
1908 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1909 return m->sq_inplace_repeat(o, count);
1910 if (m && m->sq_repeat)
1911 return m->sq_repeat(o, count);
1912
Armin Rigofd163f92005-12-29 15:59:19 +00001913 if (PySequence_Check(o)) {
1914 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001915 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001916 if (n == NULL)
1917 return NULL;
1918 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1919 NB_SLOT(nb_multiply));
1920 Py_DECREF(n);
1921 if (result != Py_NotImplemented)
1922 return result;
1923 Py_DECREF(result);
1924 }
Georg Brandlccff7852006-06-18 22:17:29 +00001925 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001926}
1927
1928PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001929PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001930{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001931 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001932
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001933 if (s == NULL)
1934 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001935
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001936 m = s->ob_type->tp_as_sequence;
1937 if (m && m->sq_item) {
1938 if (i < 0) {
1939 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001940 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001941 if (l < 0)
1942 return NULL;
1943 i += l;
1944 }
1945 }
1946 return m->sq_item(s, i);
1947 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001948
Georg Brandlccff7852006-06-18 22:17:29 +00001949 return type_error("'%.200s' object is unindexable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001950}
1951
1952PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001953PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001954{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001955 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001956 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001957
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001958 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001959
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001960 m = s->ob_type->tp_as_sequence;
1961 if (m && m->sq_slice) {
1962 if (i1 < 0 || i2 < 0) {
1963 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001964 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001965 if (l < 0)
1966 return NULL;
1967 if (i1 < 0)
1968 i1 += l;
1969 if (i2 < 0)
1970 i2 += l;
1971 }
1972 }
1973 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001974 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1975 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001976 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001977 if (!slice)
1978 return NULL;
1979 res = mp->mp_subscript(s, slice);
1980 Py_DECREF(slice);
1981 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001982 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001983
Georg Brandlccff7852006-06-18 22:17:29 +00001984 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001985}
1986
1987int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001988PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001989{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001990 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001991
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001992 if (s == NULL) {
1993 null_error();
1994 return -1;
1995 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001996
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001997 m = s->ob_type->tp_as_sequence;
1998 if (m && m->sq_ass_item) {
1999 if (i < 0) {
2000 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002001 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002002 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002003 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002004 i += l;
2005 }
2006 }
2007 return m->sq_ass_item(s, i, o);
2008 }
2009
Georg Brandlccff7852006-06-18 22:17:29 +00002010 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002011 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002012}
2013
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002014int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002015PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002016{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002017 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002018
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002019 if (s == NULL) {
2020 null_error();
2021 return -1;
2022 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002023
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002024 m = s->ob_type->tp_as_sequence;
2025 if (m && m->sq_ass_item) {
2026 if (i < 0) {
2027 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002028 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002029 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002030 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002031 i += l;
2032 }
2033 }
2034 return m->sq_ass_item(s, i, (PyObject *)NULL);
2035 }
2036
Georg Brandlccff7852006-06-18 22:17:29 +00002037 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002038 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002039}
2040
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002041int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002042PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002043{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002044 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002045 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002046
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002047 if (s == NULL) {
2048 null_error();
2049 return -1;
2050 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002051
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002052 m = s->ob_type->tp_as_sequence;
2053 if (m && m->sq_ass_slice) {
2054 if (i1 < 0 || i2 < 0) {
2055 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002056 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002057 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002058 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002059 if (i1 < 0)
2060 i1 += l;
2061 if (i2 < 0)
2062 i2 += l;
2063 }
2064 }
2065 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002066 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2067 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002068 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002069 if (!slice)
2070 return -1;
2071 res = mp->mp_ass_subscript(s, slice, o);
2072 Py_DECREF(slice);
2073 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002074 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002075
Georg Brandlccff7852006-06-18 22:17:29 +00002076 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002077 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002078}
2079
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002080int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002081PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002082{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002083 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002084
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002085 if (s == NULL) {
2086 null_error();
2087 return -1;
2088 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002089
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002090 m = s->ob_type->tp_as_sequence;
2091 if (m && m->sq_ass_slice) {
2092 if (i1 < 0 || i2 < 0) {
2093 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002094 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002095 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002096 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002097 if (i1 < 0)
2098 i1 += l;
2099 if (i2 < 0)
2100 i2 += l;
2101 }
2102 }
2103 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2104 }
Georg Brandlccff7852006-06-18 22:17:29 +00002105 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002106 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002107}
2108
Guido van Rossume15dee51995-07-18 14:12:02 +00002109PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002110PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002111{
Tim Peters6912d4d2001-05-05 03:56:37 +00002112 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002113 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00002114 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002115 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002117 if (v == NULL)
2118 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002119
Tim Peters6912d4d2001-05-05 03:56:37 +00002120 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002121 if (PyTuple_CheckExact(v)) {
2122 /* Note that we can't know whether it's safe to return
2123 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002124 to exact tuples here. In contrast, lists always make
2125 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002126 Py_INCREF(v);
2127 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002128 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002129 if (PyList_Check(v))
2130 return PyList_AsTuple(v);
2131
Tim Peters6912d4d2001-05-05 03:56:37 +00002132 /* Get iterator. */
2133 it = PyObject_GetIter(v);
2134 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002135 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002136
Tim Peters6912d4d2001-05-05 03:56:37 +00002137 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002138 n = _PyObject_LengthHint(v, 10);
Tim Peters6912d4d2001-05-05 03:56:37 +00002139 result = PyTuple_New(n);
2140 if (result == NULL)
2141 goto Fail;
2142
2143 /* Fill the tuple. */
2144 for (j = 0; ; ++j) {
2145 PyObject *item = PyIter_Next(it);
2146 if (item == NULL) {
2147 if (PyErr_Occurred())
2148 goto Fail;
2149 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002150 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002151 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002152 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002153 /* The over-allocation strategy can grow a bit faster
2154 than for lists because unlike lists the
2155 over-allocation isn't permanent -- we reclaim
2156 the excess before the end of this routine.
2157 So, grow by ten and then add 25%.
2158 */
2159 n += 10;
2160 n += n >> 2;
2161 if (n < oldn) {
2162 /* Check for overflow */
2163 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002164 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002165 goto Fail;
2166 }
Tim Peters4324aa32001-05-28 22:30:08 +00002167 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002168 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002169 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002170 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002171 }
2172 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002173 }
2174
Tim Peters6912d4d2001-05-05 03:56:37 +00002175 /* Cut tuple back if guess was too large. */
2176 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002177 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002178 goto Fail;
2179
2180 Py_DECREF(it);
2181 return result;
2182
2183Fail:
2184 Py_XDECREF(result);
2185 Py_DECREF(it);
2186 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002187}
2188
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002189PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002190PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002191{
Tim Petersf553f892001-05-01 20:45:31 +00002192 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002193 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002194
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002195 if (v == NULL)
2196 return null_error();
2197
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002198 result = PyList_New(0);
2199 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002200 return NULL;
2201
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002202 rv = _PyList_Extend((PyListObject *)result, v);
2203 if (rv == NULL) {
2204 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002205 return NULL;
2206 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002207 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002208 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002209}
2210
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002211PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002212PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002213{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002214 PyObject *it;
2215
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002216 if (v == NULL)
2217 return null_error();
2218
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002219 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002220 Py_INCREF(v);
2221 return v;
2222 }
2223
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002224 it = PyObject_GetIter(v);
2225 if (it == NULL) {
2226 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002227 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002228 return NULL;
2229 }
2230
Raymond Hettinger193814c2004-12-18 19:00:59 +00002231 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002232 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002233
2234 return v;
2235}
2236
Tim Peters16a77ad2001-09-08 04:00:12 +00002237/* Iterate over seq. Result depends on the operation:
2238 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2239 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
2240 set ValueError and return -1 if none found; also return -1 on error.
2241 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2242*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002243Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002244_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002245{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002246 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002247 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2248 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002249
Tim Peters16a77ad2001-09-08 04:00:12 +00002250 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002251 null_error();
2252 return -1;
2253 }
Tim Peters75f8e352001-05-05 11:33:43 +00002254
Tim Peters16a77ad2001-09-08 04:00:12 +00002255 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002256 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002257 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002258 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002259 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002260
Tim Peters16a77ad2001-09-08 04:00:12 +00002261 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002262 for (;;) {
2263 int cmp;
2264 PyObject *item = PyIter_Next(it);
2265 if (item == NULL) {
2266 if (PyErr_Occurred())
2267 goto Fail;
2268 break;
2269 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002270
2271 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002272 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002273 if (cmp < 0)
2274 goto Fail;
2275 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002276 switch (operation) {
2277 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002278 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002279 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002280 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002281 goto Fail;
2282 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002283 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002284 break;
2285
2286 case PY_ITERSEARCH_INDEX:
2287 if (wrapped) {
2288 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002289 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002290 goto Fail;
2291 }
2292 goto Done;
2293
2294 case PY_ITERSEARCH_CONTAINS:
2295 n = 1;
2296 goto Done;
2297
2298 default:
2299 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002300 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002301 }
2302
2303 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002304 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002305 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002306 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002307 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002308 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002309
2310 if (operation != PY_ITERSEARCH_INDEX)
2311 goto Done;
2312
2313 PyErr_SetString(PyExc_ValueError,
2314 "sequence.index(x): x not in sequence");
2315 /* fall into failure code */
2316Fail:
2317 n = -1;
2318 /* fall through */
2319Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002320 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002321 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002322
Guido van Rossume15dee51995-07-18 14:12:02 +00002323}
2324
Tim Peters16a77ad2001-09-08 04:00:12 +00002325/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002326Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002327PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002328{
Tim Peters16a77ad2001-09-08 04:00:12 +00002329 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002330}
2331
Tim Peterscb8d3682001-05-05 21:05:01 +00002332/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002333 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002334 */
2335int
2336PySequence_Contains(PyObject *seq, PyObject *ob)
2337{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002338 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002339 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2340 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2341 if (sqm != NULL && sqm->sq_contains != NULL)
2342 return (*sqm->sq_contains)(seq, ob);
2343 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002344 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2345 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002346}
2347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002348/* Backwards compatibility */
2349#undef PySequence_In
2350int
Fred Drake79912472000-07-09 04:06:11 +00002351PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002352{
2353 return PySequence_Contains(w, v);
2354}
2355
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002356Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002357PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002358{
Tim Peters16a77ad2001-09-08 04:00:12 +00002359 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002360}
2361
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002362/* Operations on mappings */
2363
2364int
Fred Drake79912472000-07-09 04:06:11 +00002365PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002366{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002367 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002368 return PyObject_HasAttrString(o, "__getitem__");
2369
2370 return o && o->ob_type->tp_as_mapping &&
2371 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002372 !(o->ob_type->tp_as_sequence &&
2373 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002374}
2375
Martin v. Löwis18e16552006-02-15 17:27:45 +00002376Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002377PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002378{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002379 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002380
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002381 if (o == NULL) {
2382 null_error();
2383 return -1;
2384 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002385
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002386 m = o->ob_type->tp_as_mapping;
2387 if (m && m->mp_length)
2388 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002389
Georg Brandlb0061c82006-08-08 11:56:21 +00002390 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002391 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002392}
2393
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002394#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002395Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002396PyMapping_Length(PyObject *o)
2397{
2398 return PyMapping_Size(o);
2399}
2400#define PyMapping_Length PyMapping_Size
2401
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002402PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002403PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002404{
2405 PyObject *okey, *r;
2406
2407 if (key == NULL)
2408 return null_error();
2409
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002410 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002411 if (okey == NULL)
2412 return NULL;
2413 r = PyObject_GetItem(o, okey);
2414 Py_DECREF(okey);
2415 return r;
2416}
2417
2418int
Fred Drake79912472000-07-09 04:06:11 +00002419PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002420{
2421 PyObject *okey;
2422 int r;
2423
2424 if (key == NULL) {
2425 null_error();
2426 return -1;
2427 }
2428
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002429 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002430 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002431 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002432 r = PyObject_SetItem(o, okey, value);
2433 Py_DECREF(okey);
2434 return r;
2435}
2436
2437int
Fred Drake79912472000-07-09 04:06:11 +00002438PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002439{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002440 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002441
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002442 v = PyMapping_GetItemString(o, key);
2443 if (v) {
2444 Py_DECREF(v);
2445 return 1;
2446 }
2447 PyErr_Clear();
2448 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002449}
2450
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002451int
Fred Drake79912472000-07-09 04:06:11 +00002452PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002453{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002454 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002455
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002456 v = PyObject_GetItem(o, key);
2457 if (v) {
2458 Py_DECREF(v);
2459 return 1;
2460 }
2461 PyErr_Clear();
2462 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002463}
2464
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002465/* Operations on callable objects */
2466
2467/* XXX PyCallable_Check() is in object.c */
2468
Guido van Rossume15dee51995-07-18 14:12:02 +00002469PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002470PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002471{
Guido van Rossum5560b742001-09-14 16:47:50 +00002472 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002473}
Guido van Rossume15dee51995-07-18 14:12:02 +00002474
2475PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002476PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2477{
2478 ternaryfunc call;
2479
2480 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002481 PyObject *result;
2482 if (Py_EnterRecursiveCall(" while calling a Python object"))
2483 return NULL;
2484 result = (*call)(func, arg, kw);
2485 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002486 if (result == NULL && !PyErr_Occurred())
2487 PyErr_SetString(
2488 PyExc_SystemError,
2489 "NULL result without error in PyObject_Call");
2490 return result;
2491 }
Georg Brandlccff7852006-06-18 22:17:29 +00002492 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002493 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002494 return NULL;
2495}
2496
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002497static PyObject*
2498call_function_tail(PyObject *callable, PyObject *args)
2499{
2500 PyObject *retval;
2501
2502 if (args == NULL)
2503 return NULL;
2504
2505 if (!PyTuple_Check(args)) {
2506 PyObject *a;
2507
2508 a = PyTuple_New(1);
2509 if (a == NULL) {
2510 Py_DECREF(args);
2511 return NULL;
2512 }
2513 PyTuple_SET_ITEM(a, 0, args);
2514 args = a;
2515 }
2516 retval = PyObject_Call(callable, args, NULL);
2517
2518 Py_DECREF(args);
2519
2520 return retval;
2521}
2522
Tim Peters6d6c1a32001-08-02 04:15:00 +00002523PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002524PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002525{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002526 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002527 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002528
Fred Drakeb92cf062001-10-27 06:16:31 +00002529 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002530 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002531
Fred Drakeb92cf062001-10-27 06:16:31 +00002532 if (format && *format) {
2533 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002534 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002535 va_end(va);
2536 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002537 else
2538 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002539
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002540 return call_function_tail(callable, args);
2541}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002542
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002543PyObject *
2544_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2545{
2546 va_list va;
2547 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002548
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002549 if (callable == NULL)
2550 return null_error();
2551
2552 if (format && *format) {
2553 va_start(va, format);
2554 args = _Py_VaBuildValue_SizeT(format, va);
2555 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002556 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002557 else
2558 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002559
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002560 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002561}
2562
2563PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002564PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002565{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002566 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002567 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002568 PyObject *func = NULL;
2569 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002570
Fred Drakeb92cf062001-10-27 06:16:31 +00002571 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002572 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002573
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002574 func = PyObject_GetAttrString(o, name);
2575 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002576 PyErr_SetString(PyExc_AttributeError, name);
2577 return 0;
2578 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002579
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002580 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002581 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002582 goto exit;
2583 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002584
Fred Drakeb92cf062001-10-27 06:16:31 +00002585 if (format && *format) {
2586 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002587 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002588 va_end(va);
2589 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002590 else
2591 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002592
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002593 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002594
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002595 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002596 /* args gets consumed in call_function_tail */
2597 Py_XDECREF(func);
2598
2599 return retval;
2600}
2601
2602PyObject *
2603_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2604{
2605 va_list va;
2606 PyObject *args;
2607 PyObject *func = NULL;
2608 PyObject *retval = NULL;
2609
2610 if (o == NULL || name == NULL)
2611 return null_error();
2612
2613 func = PyObject_GetAttrString(o, name);
2614 if (func == NULL) {
2615 PyErr_SetString(PyExc_AttributeError, name);
2616 return 0;
2617 }
2618
2619 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002620 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002621 goto exit;
2622 }
2623
2624 if (format && *format) {
2625 va_start(va, format);
2626 args = _Py_VaBuildValue_SizeT(format, va);
2627 va_end(va);
2628 }
2629 else
2630 args = PyTuple_New(0);
2631
2632 retval = call_function_tail(func, args);
2633
2634 exit:
2635 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002636 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002637
2638 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002639}
Guido van Rossum823649d2001-03-21 18:40:58 +00002640
2641
Fred Drakeb421b8c2001-10-26 16:21:32 +00002642static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002643objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002644{
2645 int i, n = 0;
2646 va_list countva;
2647 PyObject *result, *tmp;
2648
2649#ifdef VA_LIST_IS_ARRAY
2650 memcpy(countva, va, sizeof(va_list));
2651#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002652#ifdef __va_copy
2653 __va_copy(countva, va);
2654#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002655 countva = va;
2656#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002657#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002658
2659 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2660 ++n;
2661 result = PyTuple_New(n);
2662 if (result != NULL && n > 0) {
2663 for (i = 0; i < n; ++i) {
2664 tmp = (PyObject *)va_arg(va, PyObject *);
2665 PyTuple_SET_ITEM(result, i, tmp);
2666 Py_INCREF(tmp);
2667 }
2668 }
2669 return result;
2670}
2671
2672PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002673PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002674{
2675 PyObject *args, *tmp;
2676 va_list vargs;
2677
2678 if (callable == NULL || name == NULL)
2679 return null_error();
2680
2681 callable = PyObject_GetAttr(callable, name);
2682 if (callable == NULL)
2683 return NULL;
2684
2685 /* count the args */
2686 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002687 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002688 va_end(vargs);
2689 if (args == NULL) {
2690 Py_DECREF(callable);
2691 return NULL;
2692 }
2693 tmp = PyObject_Call(callable, args, NULL);
2694 Py_DECREF(args);
2695 Py_DECREF(callable);
2696
2697 return tmp;
2698}
2699
2700PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002701PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002702{
2703 PyObject *args, *tmp;
2704 va_list vargs;
2705
2706 if (callable == NULL)
2707 return null_error();
2708
2709 /* count the args */
2710 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002711 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002712 va_end(vargs);
2713 if (args == NULL)
2714 return NULL;
2715 tmp = PyObject_Call(callable, args, NULL);
2716 Py_DECREF(args);
2717
2718 return tmp;
2719}
2720
2721
Guido van Rossum823649d2001-03-21 18:40:58 +00002722/* isinstance(), issubclass() */
2723
Barry Warsawf16951c2002-04-23 22:45:44 +00002724/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2725 * state that will almost never happen.
2726 *
2727 * 0. creating the __bases__ static string could get a MemoryError
2728 * 1. getattr(cls, '__bases__') could raise an AttributeError
2729 * 2. getattr(cls, '__bases__') could raise some other exception
2730 * 3. getattr(cls, '__bases__') could return a tuple
2731 * 4. getattr(cls, '__bases__') could return something other than a tuple
2732 *
2733 * Only state #3 is a non-error state and only it returns a non-NULL object
2734 * (it returns the retrieved tuple).
2735 *
2736 * Any raised AttributeErrors are masked by clearing the exception and
2737 * returning NULL. If an object other than a tuple comes out of __bases__,
2738 * then again, the return value is NULL. So yes, these two situations
2739 * produce exactly the same results: NULL is returned and no error is set.
2740 *
2741 * If some exception other than AttributeError is raised, then NULL is also
2742 * returned, but the exception is not cleared. That's because we want the
2743 * exception to be propagated along.
2744 *
2745 * Callers are expected to test for PyErr_Occurred() when the return value
2746 * is NULL to decide whether a valid exception should be propagated or not.
2747 * When there's no exception to propagate, it's customary for the caller to
2748 * set a TypeError.
2749 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002750static PyObject *
2751abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002752{
2753 static PyObject *__bases__ = NULL;
2754 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002755
2756 if (__bases__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002757 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002758 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002759 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002760 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002761 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002762 if (bases == NULL) {
2763 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2764 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002765 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002766 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002767 if (!PyTuple_Check(bases)) {
2768 Py_DECREF(bases);
2769 return NULL;
2770 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002771 return bases;
2772}
2773
2774
2775static int
2776abstract_issubclass(PyObject *derived, PyObject *cls)
2777{
2778 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002779 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002780 int r = 0;
2781
2782
Guido van Rossum823649d2001-03-21 18:40:58 +00002783 if (derived == cls)
2784 return 1;
2785
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002786 if (PyTuple_Check(cls)) {
2787 /* Not a general sequence -- that opens up the road to
2788 recursion and stack overflow. */
2789 n = PyTuple_GET_SIZE(cls);
2790 for (i = 0; i < n; i++) {
2791 if (derived == PyTuple_GET_ITEM(cls, i))
2792 return 1;
2793 }
2794 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002795 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002796 if (bases == NULL) {
2797 if (PyErr_Occurred())
2798 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002799 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002800 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002801 n = PyTuple_GET_SIZE(bases);
2802 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002803 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002804 if (r != 0)
2805 break;
2806 }
2807
2808 Py_DECREF(bases);
2809
2810 return r;
2811}
2812
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002813static int
2814check_class(PyObject *cls, const char *error)
2815{
2816 PyObject *bases = abstract_get_bases(cls);
2817 if (bases == NULL) {
2818 /* Do not mask errors. */
2819 if (!PyErr_Occurred())
2820 PyErr_SetString(PyExc_TypeError, error);
2821 return 0;
2822 }
2823 Py_DECREF(bases);
2824 return -1;
2825}
2826
Brett Cannon4f653312004-03-20 22:52:14 +00002827static int
2828recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002829{
2830 PyObject *icls;
2831 static PyObject *__class__ = NULL;
2832 int retval = 0;
2833
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002834 if (__class__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002835 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002836 if (__class__ == NULL)
2837 return -1;
2838 }
2839
Neil Schemenauer6b471292001-10-18 03:18:43 +00002840 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2841 PyObject *inclass =
2842 (PyObject*)((PyInstanceObject*)inst)->in_class;
2843 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002844 }
2845 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002846 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002847 if (retval == 0) {
2848 PyObject *c = PyObject_GetAttr(inst, __class__);
2849 if (c == NULL) {
2850 PyErr_Clear();
2851 }
2852 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002853 if (c != (PyObject *)(inst->ob_type) &&
2854 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002855 retval = PyType_IsSubtype(
2856 (PyTypeObject *)c,
2857 (PyTypeObject *)cls);
2858 Py_DECREF(c);
2859 }
2860 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002861 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002862 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002863 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002864
Brett Cannon4f653312004-03-20 22:52:14 +00002865 if (!recursion_depth) {
2866 PyErr_SetString(PyExc_RuntimeError,
2867 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002868 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002869 }
2870
Guido van Rossum03290ec2001-10-07 20:54:12 +00002871 n = PyTuple_GET_SIZE(cls);
2872 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002873 retval = recursive_isinstance(
2874 inst,
2875 PyTuple_GET_ITEM(cls, i),
2876 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002877 if (retval != 0)
2878 break;
2879 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002880 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002881 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002882 if (!check_class(cls,
2883 "isinstance() arg 2 must be a class, type,"
2884 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002885 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002886 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002887 if (icls == NULL) {
2888 PyErr_Clear();
2889 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002890 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002891 else {
2892 retval = abstract_issubclass(icls, cls);
2893 Py_DECREF(icls);
2894 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002895 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002896
Guido van Rossum823649d2001-03-21 18:40:58 +00002897 return retval;
2898}
2899
2900int
Brett Cannon4f653312004-03-20 22:52:14 +00002901PyObject_IsInstance(PyObject *inst, PyObject *cls)
2902{
Christian Heimese247f002008-02-14 22:40:11 +00002903 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002904 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002905
2906 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002907 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002908 return 1;
2909
Christian Heimese247f002008-02-14 22:40:11 +00002910 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002911 name = PyString_InternFromString("__instancecheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002912 if (name == NULL)
2913 return -1;
2914 }
2915 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002916 if (checker == NULL && PyErr_Occurred())
2917 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002918 if (checker != NULL) {
2919 PyObject *res;
2920 int ok = -1;
2921 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2922 Py_DECREF(checker);
2923 return ok;
2924 }
2925 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2926 Py_LeaveRecursiveCall();
2927 Py_DECREF(checker);
2928 if (res != NULL) {
2929 ok = PyObject_IsTrue(res);
2930 Py_DECREF(res);
2931 }
2932 return ok;
2933 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002934 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002935}
2936
2937static int
2938recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002939{
2940 int retval;
2941
2942 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002943 if (!check_class(derived,
2944 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002945 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002946
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002947 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002948 Py_ssize_t i;
2949 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002950
2951 if (!recursion_depth) {
2952 PyErr_SetString(PyExc_RuntimeError,
2953 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002954 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002955 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002956 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002957 retval = recursive_issubclass(
2958 derived,
2959 PyTuple_GET_ITEM(cls, i),
2960 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002961 if (retval != 0) {
2962 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002963 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002964 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002965 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002966 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002967 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002968 else {
2969 if (!check_class(cls,
2970 "issubclass() arg 2 must be a class"
2971 " or tuple of classes"))
2972 return -1;
2973 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002974
2975 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002976 }
2977 else {
2978 /* shortcut */
2979 if (!(retval = (derived == cls)))
2980 retval = PyClass_IsSubclass(derived, cls);
2981 }
2982
2983 return retval;
2984}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002985
Brett Cannon4f653312004-03-20 22:52:14 +00002986int
2987PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2988{
Christian Heimese247f002008-02-14 22:40:11 +00002989 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002990 PyObject *t, *v, *tb;
2991 PyObject *checker;
2992 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00002993
2994 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002995 name = PyString_InternFromString("__subclasscheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002996 if (name == NULL)
2997 return -1;
2998 }
2999 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003000 PyErr_Restore(t, v, tb);
3001 if (checker != NULL) {
3002 PyObject *res;
3003 int ok = -1;
3004 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3005 return ok;
3006 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3007 Py_LeaveRecursiveCall();
3008 Py_DECREF(checker);
3009 if (res != NULL) {
3010 ok = PyObject_IsTrue(res);
3011 Py_DECREF(res);
3012 }
3013 return ok;
3014 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00003015 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00003016}
3017
3018
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003019PyObject *
3020PyObject_GetIter(PyObject *o)
3021{
3022 PyTypeObject *t = o->ob_type;
3023 getiterfunc f = NULL;
3024 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3025 f = t->tp_iter;
3026 if (f == NULL) {
3027 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003028 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003029 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003030 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003031 else {
3032 PyObject *res = (*f)(o);
3033 if (res != NULL && !PyIter_Check(res)) {
3034 PyErr_Format(PyExc_TypeError,
3035 "iter() returned non-iterator "
3036 "of type '%.100s'",
3037 res->ob_type->tp_name);
3038 Py_DECREF(res);
3039 res = NULL;
3040 }
3041 return res;
3042 }
3043}
3044
Tim Petersf4848da2001-05-05 00:14:56 +00003045/* Return next item.
3046 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3047 * If the iteration terminates normally, return NULL and clear the
3048 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3049 * will be false.
3050 * Else return the next object. PyErr_Occurred() will be false.
3051 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003052PyObject *
3053PyIter_Next(PyObject *iter)
3054{
Tim Petersf4848da2001-05-05 00:14:56 +00003055 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00003056 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00003057 result = (*iter->ob_type->tp_iternext)(iter);
3058 if (result == NULL &&
3059 PyErr_Occurred() &&
3060 PyErr_ExceptionMatches(PyExc_StopIteration))
3061 PyErr_Clear();
3062 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003063}