blob: 6d948d4b6b9b8ff865571255e3f529cbca074a87 [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) {
108 hintstrobj = PyString_InternFromString("__length_hint__");
109 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 }
230 okey = PyString_FromString(key);
231 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
449void
450_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
465void
466_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;
688 if (((flags & PyBUF_LOCK) == PyBUF_LOCK) &&
689 readonly != 0) {
690 PyErr_SetString(PyExc_BufferError,
691 "Cannot lock this object.");
692 return -1;
693 }
694 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
695 (readonly == 1)) {
696 PyErr_SetString(PyExc_BufferError,
697 "Object is not writable.");
698 return -1;
699 }
700
701 view->buf = buf;
702 view->len = len;
703 view->readonly = readonly;
704 view->itemsize = 1;
705 view->format = NULL;
706 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
707 view->format = "B";
708 view->ndim = 1;
709 view->shape = NULL;
710 if ((flags & PyBUF_ND) == PyBUF_ND)
711 view->shape = &(view->len);
712 view->strides = NULL;
713 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
714 view->strides = &(view->itemsize);
715 view->suboffsets = NULL;
716 view->internal = NULL;
717 return 0;
718}
719
Eric Smitha9f7d622008-02-17 19:46:49 +0000720PyObject *
721PyObject_Format(PyObject* obj, PyObject *format_spec)
722{
723 static PyObject * str__format__ = NULL;
724 PyObject *empty = NULL;
725 PyObject *result = NULL;
726 int spec_is_unicode;
727 int result_is_unicode;
728
729 /* Initialize cached value */
730 if (str__format__ == NULL) {
731 /* Initialize static variable needed by _PyType_Lookup */
732 str__format__ = PyString_InternFromString("__format__");
733 if (str__format__ == NULL)
734 goto done;
735 }
736
737 /* If no format_spec is provided, use an empty string */
738 if (format_spec == NULL) {
739 empty = PyString_FromStringAndSize(NULL, 0);
740 format_spec = empty;
741 }
742
743 /* Check the format_spec type, and make sure it's str or unicode */
744 if (PyUnicode_Check(format_spec))
745 spec_is_unicode = 1;
746 else if (PyString_Check(format_spec))
747 spec_is_unicode = 0;
748 else {
749 PyErr_Format(PyExc_TypeError,
750 "format expects arg 2 to be string "
751 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
752 goto done;
753 }
754
755 /* Make sure the type is initialized. float gets initialized late */
756 if (Py_TYPE(obj)->tp_dict == NULL)
757 if (PyType_Ready(Py_TYPE(obj)) < 0)
758 goto done;
759
760 /* Check for a __format__ method and call it. */
761 if (PyInstance_Check(obj)) {
762 /* We're an instance of a classic class */
763 PyObject *bound_method = PyObject_GetAttr(obj,
764 str__format__);
765 if (bound_method != NULL) {
766 result = PyObject_CallFunctionObjArgs(bound_method,
767 format_spec,
768 NULL);
769 Py_DECREF(bound_method);
770 } else {
771 PyObject *self_as_str;
772 PyObject *format_method;
773
774 PyErr_Clear();
775 /* Per the PEP, convert to str (or unicode,
776 depending on the type of the format
777 specifier). For new-style classes, this
778 logic is done by object.__format__(). */
779 if (spec_is_unicode)
780 self_as_str = PyObject_Unicode(obj);
781 else
782 self_as_str = PyObject_Str(obj);
783 if (self_as_str == NULL)
784 goto done;
785
786 /* Then call str.__format__ on that result */
787 format_method = PyObject_GetAttr(self_as_str,
788 str__format__);
789 if (format_method == NULL) {
790 Py_DECREF(self_as_str);
791 goto done;
792 }
793 result = PyObject_CallFunctionObjArgs(format_method,
794 format_spec,
795 NULL);
796 Py_DECREF(self_as_str);
797 Py_DECREF(format_method);
798 if (result == NULL)
799 goto done;
800 }
801 } else {
802 /* Not an instance of a classic class, use the code
803 from py3k */
804
805 /* Find the (unbound!) __format__ method (a borrowed
806 reference) */
807 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
808 str__format__);
809 if (method == NULL) {
810 PyErr_Format(PyExc_TypeError,
811 "Type %.100s doesn't define __format__",
812 Py_TYPE(obj)->tp_name);
813 goto done;
814 }
815 /* And call it, binding it to the value */
816 result = PyObject_CallFunctionObjArgs(method, obj,
817 format_spec, NULL);
818 }
819
820 if (result == NULL)
821 goto done;
822
823 /* Check the result type, and make sure it's str or unicode */
824 if (PyUnicode_Check(result))
825 result_is_unicode = 1;
826 else if (PyString_Check(result))
827 result_is_unicode = 0;
828 else {
829 PyErr_Format(PyExc_TypeError,
830 "%.100s.__format__ must return string or "
831 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
832 Py_TYPE(result)->tp_name);
833 Py_DECREF(result);
834 result = NULL;
835 goto done;
836 }
837
838 /* Convert to unicode, if needed. Required if spec is unicode
839 and result is str */
840 if (spec_is_unicode && !result_is_unicode) {
841 PyObject *tmp = PyObject_Unicode(result);
842 /* This logic works whether or not tmp is NULL */
843 Py_DECREF(result);
844 result = tmp;
845 }
846
847done:
848 Py_XDECREF(empty);
849 return result;
850}
851
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000852/* Operations on numbers */
853
854int
Fred Drake79912472000-07-09 04:06:11 +0000855PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000856{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000857 return o && o->ob_type->tp_as_number &&
858 (o->ob_type->tp_as_number->nb_int ||
859 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000860}
861
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000863
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000864/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000865
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000866#define NB_SLOT(x) offsetof(PyNumberMethods, x)
867#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000868 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000869#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000870 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000871
872/*
873 Calling scheme used for binary operations:
874
875 v w Action
876 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000877 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000878 new old v.op(v,w), coerce(v,w), v.op(v,w)
879 old new w.op(v,w), coerce(v,w), v.op(v,w)
880 old old coerce(v,w), v.op(v,w)
881
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000882 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
883 v->ob_type
884
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000885 Legend:
886 -------
887 * new == new style number
888 * old == old style number
889 * Action indicates the order in which operations are tried until either
890 a valid result is produced or an error occurs.
891
892 */
893
894static PyObject *
895binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000896{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000897 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000898 binaryfunc slotv = NULL;
899 binaryfunc slotw = NULL;
900
901 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000902 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000903 if (w->ob_type != v->ob_type &&
904 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000905 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000906 if (slotw == slotv)
907 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000908 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000909 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000910 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
911 x = slotw(v, w);
912 if (x != Py_NotImplemented)
913 return x;
914 Py_DECREF(x); /* can't do it */
915 slotw = NULL;
916 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000917 x = slotv(v, w);
918 if (x != Py_NotImplemented)
919 return x;
920 Py_DECREF(x); /* can't do it */
921 }
922 if (slotw) {
923 x = slotw(v, w);
924 if (x != Py_NotImplemented)
925 return x;
926 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000927 }
928 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
929 int err = PyNumber_CoerceEx(&v, &w);
930 if (err < 0) {
931 return NULL;
932 }
933 if (err == 0) {
934 PyNumberMethods *mv = v->ob_type->tp_as_number;
935 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000936 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000937 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000938 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000939 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000940 Py_DECREF(v);
941 Py_DECREF(w);
942 return x;
943 }
944 }
945 /* CoerceEx incremented the reference counts */
946 Py_DECREF(v);
947 Py_DECREF(w);
948 }
949 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000950 Py_INCREF(Py_NotImplemented);
951 return Py_NotImplemented;
952}
Guido van Rossum77660912002-04-16 16:32:50 +0000953
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000954static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000955binop_type_error(PyObject *v, PyObject *w, const char *op_name)
956{
957 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000958 "unsupported operand type(s) for %.100s: "
959 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000960 op_name,
961 v->ob_type->tp_name,
962 w->ob_type->tp_name);
963 return NULL;
964}
965
966static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000967binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
968{
969 PyObject *result = binary_op1(v, w, op_slot);
970 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000971 Py_DECREF(result);
972 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000973 }
974 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000975}
976
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000977
978/*
979 Calling scheme used for ternary operations:
980
Guido van Rossum84675ac2001-09-29 01:05:03 +0000981 *** In some cases, w.op is called before v.op; see binary_op1. ***
982
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000983 v w z Action
984 -------------------------------------------------------------------
985 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
986 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
987 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
988 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
989 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
990 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
991 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
992 old old old coerce(v,w,z), v.op(v,w,z)
993
994 Legend:
995 -------
996 * new == new style number
997 * old == old style number
998 * Action indicates the order in which operations are tried until either
999 a valid result is produced or an error occurs.
1000 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
1001 only if z != Py_None; if z == Py_None, then it is treated as absent
1002 variable and only coerce(v,w) is tried.
1003
1004 */
1005
1006static PyObject *
1007ternary_op(PyObject *v,
1008 PyObject *w,
1009 PyObject *z,
1010 const int op_slot,
1011 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001012{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001013 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001014 PyObject *x = NULL;
1015 ternaryfunc slotv = NULL;
1016 ternaryfunc slotw = NULL;
1017 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001018
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001019 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001020 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001021 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001022 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001023 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001024 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001025 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001026 if (slotw == slotv)
1027 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001028 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001029 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001030 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1031 x = slotw(v, w, z);
1032 if (x != Py_NotImplemented)
1033 return x;
1034 Py_DECREF(x); /* can't do it */
1035 slotw = NULL;
1036 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001037 x = slotv(v, w, z);
1038 if (x != Py_NotImplemented)
1039 return x;
1040 Py_DECREF(x); /* can't do it */
1041 }
1042 if (slotw) {
1043 x = slotw(v, w, z);
1044 if (x != Py_NotImplemented)
1045 return x;
1046 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001047 }
1048 mz = z->ob_type->tp_as_number;
1049 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001050 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001051 if (slotz == slotv || slotz == slotw)
1052 slotz = NULL;
1053 if (slotz) {
1054 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001055 if (x != Py_NotImplemented)
1056 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001057 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001058 }
1059 }
1060
1061 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1062 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1063 /* we have an old style operand, coerce */
1064 PyObject *v1, *z1, *w2, *z2;
1065 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001066
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001067 c = PyNumber_Coerce(&v, &w);
1068 if (c != 0)
1069 goto error3;
1070
1071 /* Special case: if the third argument is None, it is
1072 treated as absent argument and not coerced. */
1073 if (z == Py_None) {
1074 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001075 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1076 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001077 if (slotz)
1078 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001079 else
1080 c = -1;
1081 }
1082 else
1083 c = -1;
1084 goto error2;
1085 }
1086 v1 = v;
1087 z1 = z;
1088 c = PyNumber_Coerce(&v1, &z1);
1089 if (c != 0)
1090 goto error2;
1091 w2 = w;
1092 z2 = z1;
1093 c = PyNumber_Coerce(&w2, &z2);
1094 if (c != 0)
1095 goto error1;
1096
1097 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001098 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1099 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001100 if (slotv)
1101 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001102 else
1103 c = -1;
1104 }
1105 else
1106 c = -1;
1107
1108 Py_DECREF(w2);
1109 Py_DECREF(z2);
1110 error1:
1111 Py_DECREF(v1);
1112 Py_DECREF(z1);
1113 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001114 Py_DECREF(v);
1115 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001116 error3:
1117 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001118 return x;
1119 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001120
1121 if (z == Py_None)
1122 PyErr_Format(
1123 PyExc_TypeError,
1124 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001125 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001126 v->ob_type->tp_name,
1127 w->ob_type->tp_name);
1128 else
1129 PyErr_Format(
1130 PyExc_TypeError,
1131 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001132 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001133 v->ob_type->tp_name,
1134 w->ob_type->tp_name,
1135 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001136 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001137}
1138
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001139#define BINARY_FUNC(func, op, op_name) \
1140 PyObject * \
1141 func(PyObject *v, PyObject *w) { \
1142 return binary_op(v, w, NB_SLOT(op), op_name); \
1143 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001144
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001145BINARY_FUNC(PyNumber_Or, nb_or, "|")
1146BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1147BINARY_FUNC(PyNumber_And, nb_and, "&")
1148BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1149BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1150BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001151BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1152BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001153
1154PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001155PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001156{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001157 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1158 if (result == Py_NotImplemented) {
1159 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001160 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001161 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001162 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001163 }
Armin Rigofd163f92005-12-29 15:59:19 +00001164 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001165 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001166 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001167}
1168
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001169static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001170sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001171{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001172 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001173 if (PyIndex_Check(n)) {
1174 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001175 if (count == -1 && PyErr_Occurred())
1176 return NULL;
1177 }
1178 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001179 return type_error("can't multiply sequence by "
1180 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001181 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001182 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001183}
1184
1185PyObject *
1186PyNumber_Multiply(PyObject *v, PyObject *w)
1187{
1188 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1189 if (result == Py_NotImplemented) {
1190 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1191 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001192 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001193 if (mv && mv->sq_repeat) {
1194 return sequence_repeat(mv->sq_repeat, v, w);
1195 }
1196 else if (mw && mw->sq_repeat) {
1197 return sequence_repeat(mw->sq_repeat, w, v);
1198 }
1199 result = binop_type_error(v, w, "*");
1200 }
1201 return result;
1202}
1203
Guido van Rossume15dee51995-07-18 14:12:02 +00001204PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001205PyNumber_FloorDivide(PyObject *v, PyObject *w)
1206{
1207 /* XXX tp_flags test */
1208 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1209}
1210
1211PyObject *
1212PyNumber_TrueDivide(PyObject *v, PyObject *w)
1213{
1214 /* XXX tp_flags test */
1215 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1216}
1217
1218PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001219PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001220{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001221 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001222}
1223
1224PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001225PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001226{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001227 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001228}
1229
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001230/* Binary in-place operators */
1231
1232/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001233 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001234
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001235 - If the left hand object has the appropriate struct members, and
1236 they are filled, call the appropriate function and return the
1237 result. No coercion is done on the arguments; the left-hand object
1238 is the one the operation is performed on, and it's up to the
1239 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001240
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001241 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001242 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001243
1244 */
1245
Guido van Rossum77660912002-04-16 16:32:50 +00001246#define HASINPLACE(t) \
1247 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001248
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001249static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001250binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001251{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001252 PyNumberMethods *mv = v->ob_type->tp_as_number;
1253 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001254 binaryfunc slot = NB_BINOP(mv, iop_slot);
1255 if (slot) {
1256 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001257 if (x != Py_NotImplemented) {
1258 return x;
1259 }
1260 Py_DECREF(x);
1261 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001262 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001263 return binary_op1(v, w, op_slot);
1264}
1265
1266static PyObject *
1267binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1268 const char *op_name)
1269{
1270 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1271 if (result == Py_NotImplemented) {
1272 Py_DECREF(result);
1273 return binop_type_error(v, w, op_name);
1274 }
1275 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001276}
1277
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001278#define INPLACE_BINOP(func, iop, op, op_name) \
1279 PyObject * \
1280 func(PyObject *v, PyObject *w) { \
1281 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001282 }
1283
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001284INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1285INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1286INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1287INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1288INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1289INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1290INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001291
1292PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001293PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1294{
1295 /* XXX tp_flags test */
1296 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1297 NB_SLOT(nb_floor_divide), "//=");
1298}
1299
1300PyObject *
1301PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1302{
1303 /* XXX tp_flags test */
1304 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1305 NB_SLOT(nb_true_divide), "/=");
1306}
1307
1308PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001309PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1310{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001311 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1312 NB_SLOT(nb_add));
1313 if (result == Py_NotImplemented) {
1314 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1315 Py_DECREF(result);
1316 if (m != NULL) {
1317 binaryfunc f = NULL;
1318 if (HASINPLACE(v))
1319 f = m->sq_inplace_concat;
1320 if (f == NULL)
1321 f = m->sq_concat;
1322 if (f != NULL)
1323 return (*f)(v, w);
1324 }
1325 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001326 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001327 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001328}
1329
1330PyObject *
1331PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1332{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001333 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1334 NB_SLOT(nb_multiply));
1335 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001336 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001337 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1338 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1339 Py_DECREF(result);
1340 if (mv != NULL) {
1341 if (HASINPLACE(v))
1342 f = mv->sq_inplace_repeat;
1343 if (f == NULL)
1344 f = mv->sq_repeat;
1345 if (f != NULL)
1346 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001347 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001348 else if (mw != NULL) {
1349 /* Note that the right hand operand should not be
1350 * mutated in this case so sq_inplace_repeat is not
1351 * used. */
1352 if (mw->sq_repeat)
1353 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001354 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001355 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001356 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001357 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001358}
1359
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001360PyObject *
1361PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1362{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001363 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1364 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001365}
1366
1367PyObject *
1368PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1369{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001370 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1371 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1372 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001373 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001374 else {
1375 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1376 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001377}
1378
1379
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001381
1382PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001383PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001384{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001385 PyNumberMethods *m;
1386
1387 if (o == NULL)
1388 return null_error();
1389 m = o->ob_type->tp_as_number;
1390 if (m && m->nb_negative)
1391 return (*m->nb_negative)(o);
1392
Georg Brandlccff7852006-06-18 22:17:29 +00001393 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001394}
1395
1396PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001397PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001398{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 PyNumberMethods *m;
1400
1401 if (o == NULL)
1402 return null_error();
1403 m = o->ob_type->tp_as_number;
1404 if (m && m->nb_positive)
1405 return (*m->nb_positive)(o);
1406
Georg Brandlccff7852006-06-18 22:17:29 +00001407 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001408}
1409
1410PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001411PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001412{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 PyNumberMethods *m;
1414
1415 if (o == NULL)
1416 return null_error();
1417 m = o->ob_type->tp_as_number;
1418 if (m && m->nb_invert)
1419 return (*m->nb_invert)(o);
1420
Georg Brandlccff7852006-06-18 22:17:29 +00001421 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001422}
1423
1424PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001425PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001426{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001428
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001429 if (o == NULL)
1430 return null_error();
1431 m = o->ob_type->tp_as_number;
1432 if (m && m->nb_absolute)
1433 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001434
Georg Brandlccff7852006-06-18 22:17:29 +00001435 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001436}
1437
Guido van Rossum9e896b32000-04-05 20:11:21 +00001438/* Add a check for embedded NULL-bytes in the argument. */
1439static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001440int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001441{
1442 char *end;
1443 PyObject *x;
1444
1445 x = PyInt_FromString((char*)s, &end, 10);
1446 if (x == NULL)
1447 return NULL;
1448 if (end != s + len) {
1449 PyErr_SetString(PyExc_ValueError,
1450 "null byte in argument for int()");
1451 Py_DECREF(x);
1452 return NULL;
1453 }
1454 return x;
1455}
1456
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001457/* Return a Python Int or Long from the object item
1458 Raise TypeError if the result is not an int-or-long
1459 or if the object cannot be interpreted as an index.
1460*/
1461PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001462PyNumber_Index(PyObject *item)
1463{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001464 PyObject *result = NULL;
1465 if (item == NULL)
1466 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001467 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001468 Py_INCREF(item);
1469 return item;
1470 }
1471 if (PyIndex_Check(item)) {
1472 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001473 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001474 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001475 PyErr_Format(PyExc_TypeError,
1476 "__index__ returned non-(int,long) " \
1477 "(type %.200s)",
1478 result->ob_type->tp_name);
1479 Py_DECREF(result);
1480 return NULL;
1481 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001482 }
1483 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001484 PyErr_Format(PyExc_TypeError,
1485 "'%.200s' object cannot be interpreted "
1486 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001487 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001488 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001489}
1490
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001491/* Return an error on Overflow only if err is not NULL*/
1492
1493Py_ssize_t
1494PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1495{
1496 Py_ssize_t result;
1497 PyObject *runerr;
1498 PyObject *value = PyNumber_Index(item);
1499 if (value == NULL)
1500 return -1;
1501
1502 /* We're done if PyInt_AsSsize_t() returns without error. */
1503 result = PyInt_AsSsize_t(value);
1504 if (result != -1 || !(runerr = PyErr_Occurred()))
1505 goto finish;
1506
1507 /* Error handling code -- only manage OverflowError differently */
1508 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1509 goto finish;
1510
1511 PyErr_Clear();
1512 /* If no error-handling desired then the default clipping
1513 is sufficient.
1514 */
1515 if (!err) {
1516 assert(PyLong_Check(value));
1517 /* Whether or not it is less than or equal to
1518 zero is determined by the sign of ob_size
1519 */
1520 if (_PyLong_Sign(value) < 0)
1521 result = PY_SSIZE_T_MIN;
1522 else
1523 result = PY_SSIZE_T_MAX;
1524 }
1525 else {
1526 /* Otherwise replace the error with caller's error object. */
1527 PyErr_Format(err,
1528 "cannot fit '%.200s' into an index-sized integer",
1529 item->ob_type->tp_name);
1530 }
1531
1532 finish:
1533 Py_DECREF(value);
1534 return result;
1535}
1536
1537
Guido van Rossume15dee51995-07-18 14:12:02 +00001538PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001539_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1540{
1541 const char *type_name;
1542 static PyObject *int_name = NULL;
1543 if (int_name == NULL) {
1544 int_name = PyString_InternFromString("__int__");
1545 if (int_name == NULL)
1546 return NULL;
1547 }
1548
1549 if (integral && (!PyInt_Check(integral) &&
1550 !PyLong_Check(integral))) {
1551 /* Don't go through tp_as_number->nb_int to avoid
1552 hitting the classic class fallback to __trunc__. */
1553 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1554 if (int_func == NULL) {
1555 PyErr_Clear(); /* Raise a different error. */
1556 goto non_integral_error;
1557 }
1558 Py_DECREF(integral);
1559 integral = PyEval_CallObject(int_func, NULL);
1560 Py_DECREF(int_func);
1561 if (integral && (!PyInt_Check(integral) &&
1562 !PyLong_Check(integral))) {
1563 goto non_integral_error;
1564 }
1565 }
1566 return integral;
1567
1568non_integral_error:
1569 if (PyInstance_Check(integral)) {
1570 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
1571 ->in_class->cl_name);
1572 }
1573 else {
1574 type_name = integral->ob_type->tp_name;
1575 }
1576 PyErr_Format(PyExc_TypeError, error_format, type_name);
1577 Py_DECREF(integral);
1578 return NULL;
1579}
1580
1581
1582PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001583PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001584{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001585 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001586 static PyObject *trunc_name = NULL;
1587 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001588 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001589 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001590
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001591 if (trunc_name == NULL) {
1592 trunc_name = PyString_InternFromString("__trunc__");
1593 if (trunc_name == NULL)
1594 return NULL;
1595 }
1596
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001597 if (o == NULL)
1598 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001599 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001600 Py_INCREF(o);
1601 return o;
1602 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001603 m = o->ob_type->tp_as_number;
1604 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001605 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001606 PyObject *res = m->nb_int(o);
1607 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1608 PyErr_Format(PyExc_TypeError,
1609 "__int__ returned non-int (type %.200s)",
1610 res->ob_type->tp_name);
1611 Py_DECREF(res);
1612 return NULL;
1613 }
1614 return res;
1615 }
1616 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001617 PyIntObject *io = (PyIntObject*)o;
1618 return PyInt_FromLong(io->ob_ival);
1619 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001620 trunc_func = PyObject_GetAttr(o, trunc_name);
1621 if (trunc_func) {
1622 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1623 Py_DECREF(trunc_func);
1624 /* __trunc__ is specified to return an Integral type, but
1625 int() needs to return an int. */
1626 return _PyNumber_ConvertIntegralToInt(
1627 truncated,
1628 "__trunc__ returned non-Integral (type %.200s)");
1629 }
1630 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1631
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001632 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001633 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +00001634 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001635#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001636 if (PyUnicode_Check(o))
1637 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1638 PyUnicode_GET_SIZE(o),
1639 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001640#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001641 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001642 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001643
Georg Brandlccff7852006-06-18 22:17:29 +00001644 return type_error("int() argument must be a string or a "
1645 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001646}
1647
Guido van Rossum9e896b32000-04-05 20:11:21 +00001648/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001649static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001650long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001651{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001652 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001653 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001654
Guido van Rossum4c08d552000-03-10 22:55:18 +00001655 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001656 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001657 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001658 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001659 PyErr_SetString(PyExc_ValueError,
1660 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001661 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001662 return NULL;
1663 }
1664 return x;
1665}
1666
Guido van Rossume15dee51995-07-18 14:12:02 +00001667PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001668PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001669{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001670 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001671 static PyObject *trunc_name = NULL;
1672 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001673 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001674 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001675
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001676 if (trunc_name == NULL) {
1677 trunc_name = PyString_InternFromString("__trunc__");
1678 if (trunc_name == NULL)
1679 return NULL;
1680 }
1681
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001682 if (o == NULL)
1683 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001684 m = o->ob_type->tp_as_number;
1685 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001686 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001687 PyObject *res = m->nb_long(o);
1688 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1689 PyErr_Format(PyExc_TypeError,
1690 "__long__ returned non-long (type %.200s)",
1691 res->ob_type->tp_name);
1692 Py_DECREF(res);
1693 return NULL;
1694 }
1695 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001696 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001697 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001698 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001699 trunc_func = PyObject_GetAttr(o, trunc_name);
1700 if (trunc_func) {
1701 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1702 PyObject *int_instance;
1703 Py_DECREF(trunc_func);
1704 /* __trunc__ is specified to return an Integral type,
1705 but long() needs to return a long. */
1706 int_instance = _PyNumber_ConvertIntegralToInt(
1707 truncated,
1708 "__trunc__ returned non-Integral (type %.200s)");
1709 if (int_instance && PyInt_Check(int_instance)) {
1710 /* Make sure that long() returns a long instance. */
1711 long value = PyInt_AS_LONG(int_instance);
1712 Py_DECREF(int_instance);
1713 return PyLong_FromLong(value);
1714 }
1715 return int_instance;
1716 }
1717 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1718
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001719 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001720 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001721 * doesn't do. In particular long('9.5') must raise an
1722 * exception, not truncate the float.
1723 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001724 return long_from_string(PyString_AS_STRING(o),
1725 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001726#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001727 if (PyUnicode_Check(o))
1728 /* The above check is done in PyLong_FromUnicode(). */
1729 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1730 PyUnicode_GET_SIZE(o),
1731 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001732#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001733 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1734 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001735
Georg Brandlccff7852006-06-18 22:17:29 +00001736 return type_error("long() argument must be a string or a "
1737 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001738}
1739
1740PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001741PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001742{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001743 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001744
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001745 if (o == NULL)
1746 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001747 m = o->ob_type->tp_as_number;
1748 if (m && m->nb_float) { /* This should include subclasses of float */
1749 PyObject *res = m->nb_float(o);
1750 if (res && !PyFloat_Check(res)) {
1751 PyErr_Format(PyExc_TypeError,
1752 "__float__ returned non-float (type %.200s)",
1753 res->ob_type->tp_name);
1754 Py_DECREF(res);
1755 return NULL;
1756 }
1757 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001758 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001759 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001760 PyFloatObject *po = (PyFloatObject *)o;
1761 return PyFloat_FromDouble(po->ob_fval);
1762 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001763 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001764}
1765
Eric Smith5e527eb2008-02-10 01:36:53 +00001766PyObject *
1767PyNumber_ToBase(PyObject *n, int base)
1768{
1769 PyObject *res = NULL;
1770 PyObject *index = PyNumber_Index(n);
1771
1772 if (!index)
1773 return NULL;
1774 if (PyLong_Check(index))
1775 res = _PyLong_Format(index, base, 0, 1);
1776 else if (PyInt_Check(index))
1777 res = _PyInt_Format((PyIntObject*)index, base, 1);
1778 else
Eric Smith3f914372008-02-15 12:14:32 +00001779 /* It should not be possible to get here, as
1780 PyNumber_Index already has a check for the same
1781 condition */
1782 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1783 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001784 Py_DECREF(index);
1785 return res;
1786}
1787
1788
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001789/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001790
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001791int
Fred Drake79912472000-07-09 04:06:11 +00001792PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001793{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001794 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001795 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001796 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001797 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001798 return s != NULL && s->ob_type->tp_as_sequence &&
1799 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001800}
1801
Martin v. Löwis18e16552006-02-15 17:27:45 +00001802Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001803PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001804{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001805 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001806
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001807 if (s == NULL) {
1808 null_error();
1809 return -1;
1810 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001811
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001812 m = s->ob_type->tp_as_sequence;
1813 if (m && m->sq_length)
1814 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001815
Georg Brandlb0061c82006-08-08 11:56:21 +00001816 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001817 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001818}
1819
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001820#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001821Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001822PySequence_Length(PyObject *s)
1823{
1824 return PySequence_Size(s);
1825}
1826#define PySequence_Length PySequence_Size
1827
Guido van Rossume15dee51995-07-18 14:12:02 +00001828PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001829PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001830{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001832
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001833 if (s == NULL || o == NULL)
1834 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001835
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001836 m = s->ob_type->tp_as_sequence;
1837 if (m && m->sq_concat)
1838 return m->sq_concat(s, o);
1839
Armin Rigofd163f92005-12-29 15:59:19 +00001840 /* Instances of user classes defining an __add__() method only
1841 have an nb_add slot, not an sq_concat slot. So we fall back
1842 to nb_add if both arguments appear to be sequences. */
1843 if (PySequence_Check(s) && PySequence_Check(o)) {
1844 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1845 if (result != Py_NotImplemented)
1846 return result;
1847 Py_DECREF(result);
1848 }
Georg Brandlccff7852006-06-18 22:17:29 +00001849 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001850}
1851
1852PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001853PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001854{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001855 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001856
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001857 if (o == NULL)
1858 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001859
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001860 m = o->ob_type->tp_as_sequence;
1861 if (m && m->sq_repeat)
1862 return m->sq_repeat(o, count);
1863
Armin Rigofd163f92005-12-29 15:59:19 +00001864 /* Instances of user classes defining a __mul__() method only
1865 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1866 to nb_multiply if o appears to be a sequence. */
1867 if (PySequence_Check(o)) {
1868 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001869 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001870 if (n == NULL)
1871 return NULL;
1872 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1873 Py_DECREF(n);
1874 if (result != Py_NotImplemented)
1875 return result;
1876 Py_DECREF(result);
1877 }
Georg Brandlccff7852006-06-18 22:17:29 +00001878 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001879}
1880
1881PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001882PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1883{
1884 PySequenceMethods *m;
1885
1886 if (s == NULL || o == NULL)
1887 return null_error();
1888
1889 m = s->ob_type->tp_as_sequence;
1890 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1891 return m->sq_inplace_concat(s, o);
1892 if (m && m->sq_concat)
1893 return m->sq_concat(s, o);
1894
Armin Rigofd163f92005-12-29 15:59:19 +00001895 if (PySequence_Check(s) && PySequence_Check(o)) {
1896 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1897 NB_SLOT(nb_add));
1898 if (result != Py_NotImplemented)
1899 return result;
1900 Py_DECREF(result);
1901 }
Georg Brandlccff7852006-06-18 22:17:29 +00001902 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001903}
1904
1905PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001906PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001907{
1908 PySequenceMethods *m;
1909
1910 if (o == NULL)
1911 return null_error();
1912
1913 m = o->ob_type->tp_as_sequence;
1914 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1915 return m->sq_inplace_repeat(o, count);
1916 if (m && m->sq_repeat)
1917 return m->sq_repeat(o, count);
1918
Armin Rigofd163f92005-12-29 15:59:19 +00001919 if (PySequence_Check(o)) {
1920 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001921 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001922 if (n == NULL)
1923 return NULL;
1924 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1925 NB_SLOT(nb_multiply));
1926 Py_DECREF(n);
1927 if (result != Py_NotImplemented)
1928 return result;
1929 Py_DECREF(result);
1930 }
Georg Brandlccff7852006-06-18 22:17:29 +00001931 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001932}
1933
1934PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001935PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001936{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001937 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001938
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001939 if (s == NULL)
1940 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001941
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001942 m = s->ob_type->tp_as_sequence;
1943 if (m && m->sq_item) {
1944 if (i < 0) {
1945 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001946 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001947 if (l < 0)
1948 return NULL;
1949 i += l;
1950 }
1951 }
1952 return m->sq_item(s, i);
1953 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001954
Georg Brandlccff7852006-06-18 22:17:29 +00001955 return type_error("'%.200s' object is unindexable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001956}
1957
1958PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001959PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001960{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001961 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001962 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001963
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001964 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001965
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001966 m = s->ob_type->tp_as_sequence;
1967 if (m && m->sq_slice) {
1968 if (i1 < 0 || i2 < 0) {
1969 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001970 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001971 if (l < 0)
1972 return NULL;
1973 if (i1 < 0)
1974 i1 += l;
1975 if (i2 < 0)
1976 i2 += l;
1977 }
1978 }
1979 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001980 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1981 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001982 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001983 if (!slice)
1984 return NULL;
1985 res = mp->mp_subscript(s, slice);
1986 Py_DECREF(slice);
1987 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001988 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001989
Georg Brandlccff7852006-06-18 22:17:29 +00001990 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001991}
1992
1993int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001994PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001995{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001996 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001997
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001998 if (s == NULL) {
1999 null_error();
2000 return -1;
2001 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002002
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002003 m = s->ob_type->tp_as_sequence;
2004 if (m && m->sq_ass_item) {
2005 if (i < 0) {
2006 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002007 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002008 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002009 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002010 i += l;
2011 }
2012 }
2013 return m->sq_ass_item(s, i, o);
2014 }
2015
Georg Brandlccff7852006-06-18 22:17:29 +00002016 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002017 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002018}
2019
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002020int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002021PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002022{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002023 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002024
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002025 if (s == NULL) {
2026 null_error();
2027 return -1;
2028 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002029
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002030 m = s->ob_type->tp_as_sequence;
2031 if (m && m->sq_ass_item) {
2032 if (i < 0) {
2033 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002034 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002035 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002036 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002037 i += l;
2038 }
2039 }
2040 return m->sq_ass_item(s, i, (PyObject *)NULL);
2041 }
2042
Georg Brandlccff7852006-06-18 22:17:29 +00002043 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002044 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002045}
2046
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002047int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002048PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002049{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002050 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002051 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002052
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002053 if (s == NULL) {
2054 null_error();
2055 return -1;
2056 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002057
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002058 m = s->ob_type->tp_as_sequence;
2059 if (m && m->sq_ass_slice) {
2060 if (i1 < 0 || i2 < 0) {
2061 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002062 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002063 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002064 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002065 if (i1 < 0)
2066 i1 += l;
2067 if (i2 < 0)
2068 i2 += l;
2069 }
2070 }
2071 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002072 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2073 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002074 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002075 if (!slice)
2076 return -1;
2077 res = mp->mp_ass_subscript(s, slice, o);
2078 Py_DECREF(slice);
2079 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002080 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002081
Georg Brandlccff7852006-06-18 22:17:29 +00002082 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002083 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002084}
2085
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002086int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002087PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002088{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002089 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002090
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002091 if (s == NULL) {
2092 null_error();
2093 return -1;
2094 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002096 m = s->ob_type->tp_as_sequence;
2097 if (m && m->sq_ass_slice) {
2098 if (i1 < 0 || i2 < 0) {
2099 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002100 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002101 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002102 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002103 if (i1 < 0)
2104 i1 += l;
2105 if (i2 < 0)
2106 i2 += l;
2107 }
2108 }
2109 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2110 }
Georg Brandlccff7852006-06-18 22:17:29 +00002111 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002112 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002113}
2114
Guido van Rossume15dee51995-07-18 14:12:02 +00002115PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002116PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002117{
Tim Peters6912d4d2001-05-05 03:56:37 +00002118 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002119 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00002120 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002121 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002122
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002123 if (v == NULL)
2124 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002125
Tim Peters6912d4d2001-05-05 03:56:37 +00002126 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002127 if (PyTuple_CheckExact(v)) {
2128 /* Note that we can't know whether it's safe to return
2129 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002130 to exact tuples here. In contrast, lists always make
2131 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002132 Py_INCREF(v);
2133 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002134 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002135 if (PyList_Check(v))
2136 return PyList_AsTuple(v);
2137
Tim Peters6912d4d2001-05-05 03:56:37 +00002138 /* Get iterator. */
2139 it = PyObject_GetIter(v);
2140 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002141 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002142
Tim Peters6912d4d2001-05-05 03:56:37 +00002143 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002144 n = _PyObject_LengthHint(v, 10);
Tim Peters6912d4d2001-05-05 03:56:37 +00002145 result = PyTuple_New(n);
2146 if (result == NULL)
2147 goto Fail;
2148
2149 /* Fill the tuple. */
2150 for (j = 0; ; ++j) {
2151 PyObject *item = PyIter_Next(it);
2152 if (item == NULL) {
2153 if (PyErr_Occurred())
2154 goto Fail;
2155 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002156 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002157 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002158 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002159 /* The over-allocation strategy can grow a bit faster
2160 than for lists because unlike lists the
2161 over-allocation isn't permanent -- we reclaim
2162 the excess before the end of this routine.
2163 So, grow by ten and then add 25%.
2164 */
2165 n += 10;
2166 n += n >> 2;
2167 if (n < oldn) {
2168 /* Check for overflow */
2169 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002170 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002171 goto Fail;
2172 }
Tim Peters4324aa32001-05-28 22:30:08 +00002173 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002174 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002175 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002176 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002177 }
2178 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002179 }
2180
Tim Peters6912d4d2001-05-05 03:56:37 +00002181 /* Cut tuple back if guess was too large. */
2182 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002183 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002184 goto Fail;
2185
2186 Py_DECREF(it);
2187 return result;
2188
2189Fail:
2190 Py_XDECREF(result);
2191 Py_DECREF(it);
2192 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002193}
2194
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002195PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002196PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002197{
Tim Petersf553f892001-05-01 20:45:31 +00002198 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002199 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002200
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002201 if (v == NULL)
2202 return null_error();
2203
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002204 result = PyList_New(0);
2205 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002206 return NULL;
2207
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002208 rv = _PyList_Extend((PyListObject *)result, v);
2209 if (rv == NULL) {
2210 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002211 return NULL;
2212 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002213 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002214 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002215}
2216
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002217PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002218PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002219{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002220 PyObject *it;
2221
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002222 if (v == NULL)
2223 return null_error();
2224
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002225 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002226 Py_INCREF(v);
2227 return v;
2228 }
2229
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002230 it = PyObject_GetIter(v);
2231 if (it == NULL) {
2232 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002233 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002234 return NULL;
2235 }
2236
Raymond Hettinger193814c2004-12-18 19:00:59 +00002237 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002238 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002239
2240 return v;
2241}
2242
Tim Peters16a77ad2001-09-08 04:00:12 +00002243/* Iterate over seq. Result depends on the operation:
2244 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2245 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
2246 set ValueError and return -1 if none found; also return -1 on error.
2247 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2248*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002249Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002250_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002251{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002252 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002253 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2254 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002255
Tim Peters16a77ad2001-09-08 04:00:12 +00002256 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002257 null_error();
2258 return -1;
2259 }
Tim Peters75f8e352001-05-05 11:33:43 +00002260
Tim Peters16a77ad2001-09-08 04:00:12 +00002261 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002262 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002263 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002264 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002265 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002266
Tim Peters16a77ad2001-09-08 04:00:12 +00002267 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002268 for (;;) {
2269 int cmp;
2270 PyObject *item = PyIter_Next(it);
2271 if (item == NULL) {
2272 if (PyErr_Occurred())
2273 goto Fail;
2274 break;
2275 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002276
2277 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002278 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002279 if (cmp < 0)
2280 goto Fail;
2281 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002282 switch (operation) {
2283 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002284 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002285 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002286 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002287 goto Fail;
2288 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002289 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002290 break;
2291
2292 case PY_ITERSEARCH_INDEX:
2293 if (wrapped) {
2294 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002295 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002296 goto Fail;
2297 }
2298 goto Done;
2299
2300 case PY_ITERSEARCH_CONTAINS:
2301 n = 1;
2302 goto Done;
2303
2304 default:
2305 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002306 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002307 }
2308
2309 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002310 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002311 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002312 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002313 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002314 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002315
2316 if (operation != PY_ITERSEARCH_INDEX)
2317 goto Done;
2318
2319 PyErr_SetString(PyExc_ValueError,
2320 "sequence.index(x): x not in sequence");
2321 /* fall into failure code */
2322Fail:
2323 n = -1;
2324 /* fall through */
2325Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002326 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002327 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002328
Guido van Rossume15dee51995-07-18 14:12:02 +00002329}
2330
Tim Peters16a77ad2001-09-08 04:00:12 +00002331/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002332Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002333PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002334{
Tim Peters16a77ad2001-09-08 04:00:12 +00002335 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002336}
2337
Tim Peterscb8d3682001-05-05 21:05:01 +00002338/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002339 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002340 */
2341int
2342PySequence_Contains(PyObject *seq, PyObject *ob)
2343{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002344 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002345 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2346 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2347 if (sqm != NULL && sqm->sq_contains != NULL)
2348 return (*sqm->sq_contains)(seq, ob);
2349 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002350 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2351 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002352}
2353
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002354/* Backwards compatibility */
2355#undef PySequence_In
2356int
Fred Drake79912472000-07-09 04:06:11 +00002357PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002358{
2359 return PySequence_Contains(w, v);
2360}
2361
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002362Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002363PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002364{
Tim Peters16a77ad2001-09-08 04:00:12 +00002365 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002366}
2367
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002368/* Operations on mappings */
2369
2370int
Fred Drake79912472000-07-09 04:06:11 +00002371PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002372{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002373 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002374 return PyObject_HasAttrString(o, "__getitem__");
2375
2376 return o && o->ob_type->tp_as_mapping &&
2377 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002378 !(o->ob_type->tp_as_sequence &&
2379 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002380}
2381
Martin v. Löwis18e16552006-02-15 17:27:45 +00002382Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002383PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002384{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002385 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002386
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002387 if (o == NULL) {
2388 null_error();
2389 return -1;
2390 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002391
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002392 m = o->ob_type->tp_as_mapping;
2393 if (m && m->mp_length)
2394 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002395
Georg Brandlb0061c82006-08-08 11:56:21 +00002396 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002397 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002398}
2399
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002400#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002401Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002402PyMapping_Length(PyObject *o)
2403{
2404 return PyMapping_Size(o);
2405}
2406#define PyMapping_Length PyMapping_Size
2407
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002408PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002409PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002410{
2411 PyObject *okey, *r;
2412
2413 if (key == NULL)
2414 return null_error();
2415
2416 okey = PyString_FromString(key);
2417 if (okey == NULL)
2418 return NULL;
2419 r = PyObject_GetItem(o, okey);
2420 Py_DECREF(okey);
2421 return r;
2422}
2423
2424int
Fred Drake79912472000-07-09 04:06:11 +00002425PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002426{
2427 PyObject *okey;
2428 int r;
2429
2430 if (key == NULL) {
2431 null_error();
2432 return -1;
2433 }
2434
2435 okey = PyString_FromString(key);
2436 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002437 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002438 r = PyObject_SetItem(o, okey, value);
2439 Py_DECREF(okey);
2440 return r;
2441}
2442
2443int
Fred Drake79912472000-07-09 04:06:11 +00002444PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002445{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002446 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002447
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002448 v = PyMapping_GetItemString(o, key);
2449 if (v) {
2450 Py_DECREF(v);
2451 return 1;
2452 }
2453 PyErr_Clear();
2454 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002455}
2456
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002457int
Fred Drake79912472000-07-09 04:06:11 +00002458PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002459{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002460 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002461
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002462 v = PyObject_GetItem(o, key);
2463 if (v) {
2464 Py_DECREF(v);
2465 return 1;
2466 }
2467 PyErr_Clear();
2468 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002469}
2470
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002471/* Operations on callable objects */
2472
2473/* XXX PyCallable_Check() is in object.c */
2474
Guido van Rossume15dee51995-07-18 14:12:02 +00002475PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002476PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002477{
Guido van Rossum5560b742001-09-14 16:47:50 +00002478 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002479}
Guido van Rossume15dee51995-07-18 14:12:02 +00002480
2481PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002482PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2483{
2484 ternaryfunc call;
2485
2486 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002487 PyObject *result;
2488 if (Py_EnterRecursiveCall(" while calling a Python object"))
2489 return NULL;
2490 result = (*call)(func, arg, kw);
2491 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002492 if (result == NULL && !PyErr_Occurred())
2493 PyErr_SetString(
2494 PyExc_SystemError,
2495 "NULL result without error in PyObject_Call");
2496 return result;
2497 }
Georg Brandlccff7852006-06-18 22:17:29 +00002498 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002499 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002500 return NULL;
2501}
2502
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002503static PyObject*
2504call_function_tail(PyObject *callable, PyObject *args)
2505{
2506 PyObject *retval;
2507
2508 if (args == NULL)
2509 return NULL;
2510
2511 if (!PyTuple_Check(args)) {
2512 PyObject *a;
2513
2514 a = PyTuple_New(1);
2515 if (a == NULL) {
2516 Py_DECREF(args);
2517 return NULL;
2518 }
2519 PyTuple_SET_ITEM(a, 0, args);
2520 args = a;
2521 }
2522 retval = PyObject_Call(callable, args, NULL);
2523
2524 Py_DECREF(args);
2525
2526 return retval;
2527}
2528
Tim Peters6d6c1a32001-08-02 04:15:00 +00002529PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002530PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002531{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002532 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002533 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002534
Fred Drakeb92cf062001-10-27 06:16:31 +00002535 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002536 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002537
Fred Drakeb92cf062001-10-27 06:16:31 +00002538 if (format && *format) {
2539 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002540 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002541 va_end(va);
2542 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002543 else
2544 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002545
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002546 return call_function_tail(callable, args);
2547}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002548
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002549PyObject *
2550_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2551{
2552 va_list va;
2553 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002554
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002555 if (callable == NULL)
2556 return null_error();
2557
2558 if (format && *format) {
2559 va_start(va, format);
2560 args = _Py_VaBuildValue_SizeT(format, va);
2561 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002562 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002563 else
2564 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002565
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002566 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002567}
2568
2569PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002570PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002571{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002572 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002573 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002574 PyObject *func = NULL;
2575 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002576
Fred Drakeb92cf062001-10-27 06:16:31 +00002577 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002578 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002579
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002580 func = PyObject_GetAttrString(o, name);
2581 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002582 PyErr_SetString(PyExc_AttributeError, name);
2583 return 0;
2584 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002585
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002586 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002587 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002588 goto exit;
2589 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002590
Fred Drakeb92cf062001-10-27 06:16:31 +00002591 if (format && *format) {
2592 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002593 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002594 va_end(va);
2595 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002596 else
2597 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002598
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002599 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002600
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002601 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002602 /* args gets consumed in call_function_tail */
2603 Py_XDECREF(func);
2604
2605 return retval;
2606}
2607
2608PyObject *
2609_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2610{
2611 va_list va;
2612 PyObject *args;
2613 PyObject *func = NULL;
2614 PyObject *retval = NULL;
2615
2616 if (o == NULL || name == NULL)
2617 return null_error();
2618
2619 func = PyObject_GetAttrString(o, name);
2620 if (func == NULL) {
2621 PyErr_SetString(PyExc_AttributeError, name);
2622 return 0;
2623 }
2624
2625 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002626 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002627 goto exit;
2628 }
2629
2630 if (format && *format) {
2631 va_start(va, format);
2632 args = _Py_VaBuildValue_SizeT(format, va);
2633 va_end(va);
2634 }
2635 else
2636 args = PyTuple_New(0);
2637
2638 retval = call_function_tail(func, args);
2639
2640 exit:
2641 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002642 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002643
2644 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002645}
Guido van Rossum823649d2001-03-21 18:40:58 +00002646
2647
Fred Drakeb421b8c2001-10-26 16:21:32 +00002648static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002649objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002650{
2651 int i, n = 0;
2652 va_list countva;
2653 PyObject *result, *tmp;
2654
2655#ifdef VA_LIST_IS_ARRAY
2656 memcpy(countva, va, sizeof(va_list));
2657#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002658#ifdef __va_copy
2659 __va_copy(countva, va);
2660#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002661 countva = va;
2662#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002663#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002664
2665 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2666 ++n;
2667 result = PyTuple_New(n);
2668 if (result != NULL && n > 0) {
2669 for (i = 0; i < n; ++i) {
2670 tmp = (PyObject *)va_arg(va, PyObject *);
2671 PyTuple_SET_ITEM(result, i, tmp);
2672 Py_INCREF(tmp);
2673 }
2674 }
2675 return result;
2676}
2677
2678PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002679PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002680{
2681 PyObject *args, *tmp;
2682 va_list vargs;
2683
2684 if (callable == NULL || name == NULL)
2685 return null_error();
2686
2687 callable = PyObject_GetAttr(callable, name);
2688 if (callable == NULL)
2689 return NULL;
2690
2691 /* count the args */
2692 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002693 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002694 va_end(vargs);
2695 if (args == NULL) {
2696 Py_DECREF(callable);
2697 return NULL;
2698 }
2699 tmp = PyObject_Call(callable, args, NULL);
2700 Py_DECREF(args);
2701 Py_DECREF(callable);
2702
2703 return tmp;
2704}
2705
2706PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002707PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002708{
2709 PyObject *args, *tmp;
2710 va_list vargs;
2711
2712 if (callable == NULL)
2713 return null_error();
2714
2715 /* count the args */
2716 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002717 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002718 va_end(vargs);
2719 if (args == NULL)
2720 return NULL;
2721 tmp = PyObject_Call(callable, args, NULL);
2722 Py_DECREF(args);
2723
2724 return tmp;
2725}
2726
2727
Guido van Rossum823649d2001-03-21 18:40:58 +00002728/* isinstance(), issubclass() */
2729
Barry Warsawf16951c2002-04-23 22:45:44 +00002730/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2731 * state that will almost never happen.
2732 *
2733 * 0. creating the __bases__ static string could get a MemoryError
2734 * 1. getattr(cls, '__bases__') could raise an AttributeError
2735 * 2. getattr(cls, '__bases__') could raise some other exception
2736 * 3. getattr(cls, '__bases__') could return a tuple
2737 * 4. getattr(cls, '__bases__') could return something other than a tuple
2738 *
2739 * Only state #3 is a non-error state and only it returns a non-NULL object
2740 * (it returns the retrieved tuple).
2741 *
2742 * Any raised AttributeErrors are masked by clearing the exception and
2743 * returning NULL. If an object other than a tuple comes out of __bases__,
2744 * then again, the return value is NULL. So yes, these two situations
2745 * produce exactly the same results: NULL is returned and no error is set.
2746 *
2747 * If some exception other than AttributeError is raised, then NULL is also
2748 * returned, but the exception is not cleared. That's because we want the
2749 * exception to be propagated along.
2750 *
2751 * Callers are expected to test for PyErr_Occurred() when the return value
2752 * is NULL to decide whether a valid exception should be propagated or not.
2753 * When there's no exception to propagate, it's customary for the caller to
2754 * set a TypeError.
2755 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002756static PyObject *
2757abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002758{
2759 static PyObject *__bases__ = NULL;
2760 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002761
2762 if (__bases__ == NULL) {
Christian Heimesd7e1b2b2008-01-28 02:07:53 +00002763 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002764 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002765 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002766 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002767 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002768 if (bases == NULL) {
2769 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2770 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002771 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002772 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002773 if (!PyTuple_Check(bases)) {
2774 Py_DECREF(bases);
2775 return NULL;
2776 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002777 return bases;
2778}
2779
2780
2781static int
2782abstract_issubclass(PyObject *derived, PyObject *cls)
2783{
2784 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002785 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002786 int r = 0;
2787
2788
Guido van Rossum823649d2001-03-21 18:40:58 +00002789 if (derived == cls)
2790 return 1;
2791
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002792 if (PyTuple_Check(cls)) {
2793 /* Not a general sequence -- that opens up the road to
2794 recursion and stack overflow. */
2795 n = PyTuple_GET_SIZE(cls);
2796 for (i = 0; i < n; i++) {
2797 if (derived == PyTuple_GET_ITEM(cls, i))
2798 return 1;
2799 }
2800 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002801 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002802 if (bases == NULL) {
2803 if (PyErr_Occurred())
2804 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002805 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002806 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002807 n = PyTuple_GET_SIZE(bases);
2808 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002809 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002810 if (r != 0)
2811 break;
2812 }
2813
2814 Py_DECREF(bases);
2815
2816 return r;
2817}
2818
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002819static int
2820check_class(PyObject *cls, const char *error)
2821{
2822 PyObject *bases = abstract_get_bases(cls);
2823 if (bases == NULL) {
2824 /* Do not mask errors. */
2825 if (!PyErr_Occurred())
2826 PyErr_SetString(PyExc_TypeError, error);
2827 return 0;
2828 }
2829 Py_DECREF(bases);
2830 return -1;
2831}
2832
Brett Cannon4f653312004-03-20 22:52:14 +00002833static int
2834recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002835{
2836 PyObject *icls;
2837 static PyObject *__class__ = NULL;
2838 int retval = 0;
2839
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002840 if (__class__ == NULL) {
Christian Heimesd7e1b2b2008-01-28 02:07:53 +00002841 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002842 if (__class__ == NULL)
2843 return -1;
2844 }
2845
Neil Schemenauer6b471292001-10-18 03:18:43 +00002846 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2847 PyObject *inclass =
2848 (PyObject*)((PyInstanceObject*)inst)->in_class;
2849 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002850 }
2851 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002852 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002853 if (retval == 0) {
2854 PyObject *c = PyObject_GetAttr(inst, __class__);
2855 if (c == NULL) {
2856 PyErr_Clear();
2857 }
2858 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002859 if (c != (PyObject *)(inst->ob_type) &&
2860 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002861 retval = PyType_IsSubtype(
2862 (PyTypeObject *)c,
2863 (PyTypeObject *)cls);
2864 Py_DECREF(c);
2865 }
2866 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002867 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002868 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002869 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002870
Brett Cannon4f653312004-03-20 22:52:14 +00002871 if (!recursion_depth) {
2872 PyErr_SetString(PyExc_RuntimeError,
2873 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002874 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002875 }
2876
Guido van Rossum03290ec2001-10-07 20:54:12 +00002877 n = PyTuple_GET_SIZE(cls);
2878 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002879 retval = recursive_isinstance(
2880 inst,
2881 PyTuple_GET_ITEM(cls, i),
2882 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002883 if (retval != 0)
2884 break;
2885 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002886 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002887 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002888 if (!check_class(cls,
2889 "isinstance() arg 2 must be a class, type,"
2890 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002891 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002892 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002893 if (icls == NULL) {
2894 PyErr_Clear();
2895 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002896 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002897 else {
2898 retval = abstract_issubclass(icls, cls);
2899 Py_DECREF(icls);
2900 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002901 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002902
Guido van Rossum823649d2001-03-21 18:40:58 +00002903 return retval;
2904}
2905
2906int
Brett Cannon4f653312004-03-20 22:52:14 +00002907PyObject_IsInstance(PyObject *inst, PyObject *cls)
2908{
Christian Heimese247f002008-02-14 22:40:11 +00002909 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002910 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002911
2912 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002913 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002914 return 1;
2915
Christian Heimese247f002008-02-14 22:40:11 +00002916 if (name == NULL) {
2917 name = PyString_InternFromString("__instancecheck__");
2918 if (name == NULL)
2919 return -1;
2920 }
2921 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002922 if (checker == NULL && PyErr_Occurred())
2923 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002924 if (checker != NULL) {
2925 PyObject *res;
2926 int ok = -1;
2927 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2928 Py_DECREF(checker);
2929 return ok;
2930 }
2931 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2932 Py_LeaveRecursiveCall();
2933 Py_DECREF(checker);
2934 if (res != NULL) {
2935 ok = PyObject_IsTrue(res);
2936 Py_DECREF(res);
2937 }
2938 return ok;
2939 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002940 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002941}
2942
2943static int
2944recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002945{
2946 int retval;
2947
2948 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002949 if (!check_class(derived,
2950 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002951 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002952
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002953 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002954 Py_ssize_t i;
2955 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002956
2957 if (!recursion_depth) {
2958 PyErr_SetString(PyExc_RuntimeError,
2959 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002960 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002961 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002962 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002963 retval = recursive_issubclass(
2964 derived,
2965 PyTuple_GET_ITEM(cls, i),
2966 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002967 if (retval != 0) {
2968 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002969 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002970 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002971 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002972 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002973 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002974 else {
2975 if (!check_class(cls,
2976 "issubclass() arg 2 must be a class"
2977 " or tuple of classes"))
2978 return -1;
2979 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002980
2981 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002982 }
2983 else {
2984 /* shortcut */
2985 if (!(retval = (derived == cls)))
2986 retval = PyClass_IsSubclass(derived, cls);
2987 }
2988
2989 return retval;
2990}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002991
Brett Cannon4f653312004-03-20 22:52:14 +00002992int
2993PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2994{
Christian Heimese247f002008-02-14 22:40:11 +00002995 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002996 PyObject *t, *v, *tb;
2997 PyObject *checker;
2998 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00002999
3000 if (name == NULL) {
3001 name = PyString_InternFromString("__subclasscheck__");
3002 if (name == NULL)
3003 return -1;
3004 }
3005 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003006 PyErr_Restore(t, v, tb);
3007 if (checker != NULL) {
3008 PyObject *res;
3009 int ok = -1;
3010 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3011 return ok;
3012 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3013 Py_LeaveRecursiveCall();
3014 Py_DECREF(checker);
3015 if (res != NULL) {
3016 ok = PyObject_IsTrue(res);
3017 Py_DECREF(res);
3018 }
3019 return ok;
3020 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00003021 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00003022}
3023
3024
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003025PyObject *
3026PyObject_GetIter(PyObject *o)
3027{
3028 PyTypeObject *t = o->ob_type;
3029 getiterfunc f = NULL;
3030 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3031 f = t->tp_iter;
3032 if (f == NULL) {
3033 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003034 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003035 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003036 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003037 else {
3038 PyObject *res = (*f)(o);
3039 if (res != NULL && !PyIter_Check(res)) {
3040 PyErr_Format(PyExc_TypeError,
3041 "iter() returned non-iterator "
3042 "of type '%.100s'",
3043 res->ob_type->tp_name);
3044 Py_DECREF(res);
3045 res = NULL;
3046 }
3047 return res;
3048 }
3049}
3050
Tim Petersf4848da2001-05-05 00:14:56 +00003051/* Return next item.
3052 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3053 * If the iteration terminates normally, return NULL and clear the
3054 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3055 * will be false.
3056 * Else return the next object. PyErr_Occurred() will be false.
3057 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003058PyObject *
3059PyIter_Next(PyObject *iter)
3060{
Tim Petersf4848da2001-05-05 00:14:56 +00003061 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00003062 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00003063 result = (*iter->ob_type->tp_iternext)(iter);
3064 if (result == NULL &&
3065 PyErr_Occurred() &&
3066 PyErr_ExceptionMatches(PyExc_StopIteration))
3067 PyErr_Clear();
3068 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003069}