blob: 0d6aa4adb3b476c81d704d572d38615ce3fe6891 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Guido van Rossume15dee51995-07-18 14:12:02 +00003#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00004#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00005#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00006#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00007
8#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +00009 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000010
Martin v. Löwis5cb69362006-04-14 09:08:42 +000011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000013
14static PyObject *
Georg Brandlccff7852006-06-18 22:17:29 +000015type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000016{
Georg Brandlccff7852006-06-18 22:17:29 +000017 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000018 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000019}
20
Guido van Rossum052b7e11996-11-11 15:08:19 +000021static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000022null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000023{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000024 if (!PyErr_Occurred())
25 PyErr_SetString(PyExc_SystemError,
26 "null argument to internal routine");
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000030/* Operations on any object */
31
32int
Fred Drake79912472000-07-09 04:06:11 +000033PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034{
35 int r;
36
37 if (o1 == NULL || o2 == NULL) {
38 null_error();
39 return -1;
40 }
41 r = PyObject_Compare(o1, o2);
42 if (PyErr_Occurred())
43 return -1;
44 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000045 return 0;
46}
Guido van Rossume15dee51995-07-18 14:12:02 +000047
48PyObject *
Fred Drake79912472000-07-09 04:06:11 +000049PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000050{
51 PyObject *v;
52
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000053 if (o == NULL)
54 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000055 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
58}
59
Martin v. Löwis18e16552006-02-15 17:27:45 +000060Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000061PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 m = o->ob_type->tp_as_sequence;
71 if (m && m->sq_length)
72 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Jeremy Hylton6253f832000-07-12 12:56:19 +000074 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075}
76
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000077#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000078Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000079PyObject_Length(PyObject *o)
80{
81 return PyObject_Size(o);
82}
83#define PyObject_Length PyObject_Size
84
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000085
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000086/* The length hint function returns a non-negative value from o.__len__()
87 or o.__length_hint__(). If those methods aren't found or return a negative
88 value, then the defaultvalue is returned. This function never fails.
89 Accordingly, it will mask exceptions raised in either method.
90*/
91
92Py_ssize_t
93_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
94{
95 static PyObject *hintstrobj = NULL;
96 PyObject *ro;
97 Py_ssize_t rv;
98
99 /* try o.__len__() */
100 rv = PyObject_Size(o);
101 if (rv >= 0)
102 return rv;
103 if (PyErr_Occurred())
104 PyErr_Clear();
105
106 /* cache a hashed version of the attribute string */
107 if (hintstrobj == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000108 hintstrobj = PyString_InternFromString("__length_hint__");
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000109 if (hintstrobj == NULL)
110 goto defaultcase;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000111 }
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000112
113 /* try o.__length_hint__() */
114 ro = PyObject_CallMethodObjArgs(o, hintstrobj, NULL);
115 if (ro == NULL)
116 goto defaultcase;
117 rv = PyInt_AsLong(ro);
118 Py_DECREF(ro);
119 if (rv >= 0)
120 return rv;
121
122defaultcase:
123 if (PyErr_Occurred())
124 PyErr_Clear();
125 return defaultvalue;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000126}
127
Guido van Rossume15dee51995-07-18 14:12:02 +0000128PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000129PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000130{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000131 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000132
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133 if (o == NULL || key == NULL)
134 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000136 m = o->ob_type->tp_as_mapping;
137 if (m && m->mp_subscript)
138 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000139
Guido van Rossum21308241998-08-13 16:44:44 +0000140 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000141 if (PyIndex_Check(key)) {
142 Py_ssize_t key_value;
143 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000144 if (key_value == -1 && PyErr_Occurred())
145 return NULL;
146 return PySequence_GetItem(o, key_value);
147 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000148 else if (o->ob_type->tp_as_sequence->sq_item)
Georg Brandlccff7852006-06-18 22:17:29 +0000149 return type_error("sequence index must "
150 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000151 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000152
Georg Brandlccff7852006-06-18 22:17:29 +0000153 return type_error("'%.200s' object is unsubscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000154}
155
156int
Fred Drake79912472000-07-09 04:06:11 +0000157PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000158{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000159 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000161 if (o == NULL || key == NULL || value == NULL) {
162 null_error();
163 return -1;
164 }
165 m = o->ob_type->tp_as_mapping;
166 if (m && m->mp_ass_subscript)
167 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000168
Guido van Rossum21308241998-08-13 16:44:44 +0000169 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000170 if (PyIndex_Check(key)) {
171 Py_ssize_t key_value;
172 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000173 if (key_value == -1 && PyErr_Occurred())
174 return -1;
175 return PySequence_SetItem(o, key_value, value);
176 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000177 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000178 type_error("sequence index must be "
179 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000180 return -1;
181 }
Guido van Rossum21308241998-08-13 16:44:44 +0000182 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000183
Georg Brandlccff7852006-06-18 22:17:29 +0000184 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000185 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000186}
187
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000188int
Fred Drake79912472000-07-09 04:06:11 +0000189PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000190{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000191 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000193 if (o == NULL || key == NULL) {
194 null_error();
195 return -1;
196 }
197 m = o->ob_type->tp_as_mapping;
198 if (m && m->mp_ass_subscript)
199 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000200
Guido van Rossum21308241998-08-13 16:44:44 +0000201 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000202 if (PyIndex_Check(key)) {
203 Py_ssize_t key_value;
204 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000205 if (key_value == -1 && PyErr_Occurred())
206 return -1;
207 return PySequence_DelItem(o, key_value);
208 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000209 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000210 type_error("sequence index must be "
211 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000212 return -1;
213 }
Guido van Rossum21308241998-08-13 16:44:44 +0000214 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000215
Georg Brandlccff7852006-06-18 22:17:29 +0000216 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000217 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000218}
219
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000220int
221PyObject_DelItemString(PyObject *o, char *key)
222{
223 PyObject *okey;
224 int ret;
225
226 if (o == NULL || key == NULL) {
227 null_error();
228 return -1;
229 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000230 okey = PyString_FromString(key);
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000231 if (okey == NULL)
232 return -1;
233 ret = PyObject_DelItem(o, okey);
234 Py_DECREF(okey);
235 return ret;
236}
237
Brett Cannonea229bd2006-06-06 18:08:16 +0000238int
239PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000241 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242{
243 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000244 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000245 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246
247 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
248 null_error();
249 return -1;
250 }
251 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000253 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000255 PyErr_SetString(PyExc_TypeError,
256 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000257 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000258 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000260 PyErr_SetString(PyExc_TypeError,
261 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000262 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000266 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267 *buffer = pp;
268 *buffer_len = len;
269 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000270}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000272int
273PyObject_CheckReadBuffer(PyObject *obj)
274{
275 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
276
277 if (pb == NULL ||
278 pb->bf_getreadbuffer == NULL ||
279 pb->bf_getsegcount == NULL ||
280 (*pb->bf_getsegcount)(obj, NULL) != 1)
281 return 0;
282 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283}
284
285int PyObject_AsReadBuffer(PyObject *obj,
286 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288{
289 PyBufferProcs *pb;
290 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000291 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292
293 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
294 null_error();
295 return -1;
296 }
297 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000298 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000299 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000300 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 PyErr_SetString(PyExc_TypeError,
302 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000303 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000305 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000306 PyErr_SetString(PyExc_TypeError,
307 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000308 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000309 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000310 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 *buffer = pp;
314 *buffer_len = len;
315 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316}
317
318int PyObject_AsWriteBuffer(PyObject *obj,
319 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321{
322 PyBufferProcs *pb;
323 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000325
326 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
327 null_error();
328 return -1;
329 }
330 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000331 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000332 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000333 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000334 PyErr_SetString(PyExc_TypeError,
335 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000336 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000337 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000338 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000339 PyErr_SetString(PyExc_TypeError,
340 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000341 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000342 }
343 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
344 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000345 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000346 *buffer = pp;
347 *buffer_len = len;
348 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000349}
350
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000351/* Buffer C-API for Python 3.0 */
352
353int
354PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
355{
356 if (!PyObject_CheckBuffer(obj)) {
357 PyErr_Format(PyExc_TypeError,
358 "'%100s' does not have the buffer interface",
359 Py_TYPE(obj)->tp_name);
360 return -1;
361 }
362 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
363}
364
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000365static int
366_IsFortranContiguous(Py_buffer *view)
367{
368 Py_ssize_t sd, dim;
369 int i;
370
371 if (view->ndim == 0) return 1;
372 if (view->strides == NULL) return (view->ndim == 1);
373
374 sd = view->itemsize;
375 if (view->ndim == 1) return (view->shape[0] == 1 ||
376 sd == view->strides[0]);
377 for (i=0; i<view->ndim; i++) {
378 dim = view->shape[i];
379 if (dim == 0) return 1;
380 if (view->strides[i] != sd) return 0;
381 sd *= dim;
382 }
383 return 1;
384}
385
386static int
387_IsCContiguous(Py_buffer *view)
388{
389 Py_ssize_t sd, dim;
390 int i;
391
392 if (view->ndim == 0) return 1;
393 if (view->strides == NULL) return 1;
394
395 sd = view->itemsize;
396 if (view->ndim == 1) return (view->shape[0] == 1 ||
397 sd == view->strides[0]);
398 for (i=view->ndim-1; i>=0; i--) {
399 dim = view->shape[i];
400 if (dim == 0) return 1;
401 if (view->strides[i] != sd) return 0;
402 sd *= dim;
403 }
404 return 1;
405}
406
407int
408PyBuffer_IsContiguous(Py_buffer *view, char fort)
409{
410
411 if (view->suboffsets != NULL) return 0;
412
413 if (fort == 'C')
414 return _IsCContiguous(view);
415 else if (fort == 'F')
416 return _IsFortranContiguous(view);
417 else if (fort == 'A')
418 return (_IsCContiguous(view) || _IsFortranContiguous(view));
419 return 0;
420}
421
422
423void*
424PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
425{
426 char* pointer;
427 int i;
428 pointer = (char *)view->buf;
429 for (i = 0; i < view->ndim; i++) {
430 pointer += view->strides[i]*indices[i];
431 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
432 pointer = *((char**)pointer) + view->suboffsets[i];
433 }
434 }
435 return (void*)pointer;
436}
437
438
Neal Norwitzfddc4692008-04-15 03:46:21 +0000439static void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000440_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape)
441{
442 int k;
443
444 for (k=0; k<nd; k++) {
445 if (index[k] < shape[k]-1) {
446 index[k]++;
447 break;
448 }
449 else {
450 index[k] = 0;
451 }
452 }
453}
454
Neal Norwitzfddc4692008-04-15 03:46:21 +0000455static void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000456_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape)
457{
458 int k;
459
460 for (k=nd-1; k>=0; k--) {
461 if (index[k] < shape[k]-1) {
462 index[k]++;
463 break;
464 }
465 else {
466 index[k] = 0;
467 }
468 }
469}
470
471 /* view is not checked for consistency in either of these. It is
472 assumed that the size of the buffer is view->len in
473 view->len / view->itemsize elements.
474 */
475
476int
477PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
478{
479 int k;
480 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
481 Py_ssize_t *indices, elements;
482 char *dest, *ptr;
483
484 if (len > view->len) {
485 len = view->len;
486 }
487
488 if (PyBuffer_IsContiguous(view, fort)) {
489 /* simplest copy is all that is needed */
490 memcpy(buf, view->buf, len);
491 return 0;
492 }
493
494 /* Otherwise a more elaborate scheme is needed */
495
496 /* XXX(nnorwitz): need to check for overflow! */
497 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
498 if (indices == NULL) {
499 PyErr_NoMemory();
500 return -1;
501 }
502 for (k=0; k<view->ndim;k++) {
503 indices[k] = 0;
504 }
505
506 if (fort == 'F') {
507 addone = _add_one_to_index_F;
508 }
509 else {
510 addone = _add_one_to_index_C;
511 }
512 dest = buf;
513 /* XXX : This is not going to be the fastest code in the world
514 several optimizations are possible.
515 */
516 elements = len / view->itemsize;
517 while (elements--) {
518 addone(view->ndim, indices, view->shape);
519 ptr = PyBuffer_GetPointer(view, indices);
520 memcpy(dest, ptr, view->itemsize);
521 dest += view->itemsize;
522 }
523 PyMem_Free(indices);
524 return 0;
525}
526
527int
528PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
529{
530 int k;
531 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
532 Py_ssize_t *indices, elements;
533 char *src, *ptr;
534
535 if (len > view->len) {
536 len = view->len;
537 }
538
539 if (PyBuffer_IsContiguous(view, fort)) {
540 /* simplest copy is all that is needed */
541 memcpy(view->buf, buf, len);
542 return 0;
543 }
544
545 /* Otherwise a more elaborate scheme is needed */
546
547 /* XXX(nnorwitz): need to check for overflow! */
548 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
549 if (indices == NULL) {
550 PyErr_NoMemory();
551 return -1;
552 }
553 for (k=0; k<view->ndim;k++) {
554 indices[k] = 0;
555 }
556
557 if (fort == 'F') {
558 addone = _add_one_to_index_F;
559 }
560 else {
561 addone = _add_one_to_index_C;
562 }
563 src = buf;
564 /* XXX : This is not going to be the fastest code in the world
565 several optimizations are possible.
566 */
567 elements = len / view->itemsize;
568 while (elements--) {
569 addone(view->ndim, indices, view->shape);
570 ptr = PyBuffer_GetPointer(view, indices);
571 memcpy(ptr, src, view->itemsize);
572 src += view->itemsize;
573 }
574
575 PyMem_Free(indices);
576 return 0;
577}
578
579int PyObject_CopyData(PyObject *dest, PyObject *src)
580{
581 Py_buffer view_dest, view_src;
582 int k;
583 Py_ssize_t *indices, elements;
584 char *dptr, *sptr;
585
586 if (!PyObject_CheckBuffer(dest) ||
587 !PyObject_CheckBuffer(src)) {
588 PyErr_SetString(PyExc_TypeError,
589 "both destination and source must have the "\
590 "buffer interface");
591 return -1;
592 }
593
594 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
595 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000596 PyBuffer_Release(&view_dest);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000597 return -1;
598 }
599
600 if (view_dest.len < view_src.len) {
601 PyErr_SetString(PyExc_BufferError,
602 "destination is too small to receive data from source");
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000603 PyBuffer_Release(&view_dest);
604 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000605 return -1;
606 }
607
608 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
609 PyBuffer_IsContiguous(&view_src, 'C')) ||
610 (PyBuffer_IsContiguous(&view_dest, 'F') &&
611 PyBuffer_IsContiguous(&view_src, 'F'))) {
612 /* simplest copy is all that is needed */
613 memcpy(view_dest.buf, view_src.buf, view_src.len);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000614 PyBuffer_Release(&view_dest);
615 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000616 return 0;
617 }
618
619 /* Otherwise a more elaborate copy scheme is needed */
620
621 /* XXX(nnorwitz): need to check for overflow! */
622 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
623 if (indices == NULL) {
624 PyErr_NoMemory();
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000625 PyBuffer_Release(&view_dest);
626 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000627 return -1;
628 }
629 for (k=0; k<view_src.ndim;k++) {
630 indices[k] = 0;
631 }
632 elements = 1;
633 for (k=0; k<view_src.ndim; k++) {
634 /* XXX(nnorwitz): can this overflow? */
635 elements *= view_src.shape[k];
636 }
637 while (elements--) {
638 _add_one_to_index_C(view_src.ndim, indices, view_src.shape);
639 dptr = PyBuffer_GetPointer(&view_dest, indices);
640 sptr = PyBuffer_GetPointer(&view_src, indices);
641 memcpy(dptr, sptr, view_src.itemsize);
642 }
643 PyMem_Free(indices);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000644 PyBuffer_Release(&view_dest);
645 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000646 return 0;
647}
648
649void
650PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
651 Py_ssize_t *strides, int itemsize,
652 char fort)
653{
654 int k;
655 Py_ssize_t sd;
656
657 sd = itemsize;
658 if (fort == 'F') {
659 for (k=0; k<nd; k++) {
660 strides[k] = sd;
661 sd *= shape[k];
662 }
663 }
664 else {
665 for (k=nd-1; k>=0; k--) {
666 strides[k] = sd;
667 sd *= shape[k];
668 }
669 }
670 return;
671}
672
673int
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000674PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000675 int readonly, int flags)
676{
677 if (view == NULL) return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000678 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
679 (readonly == 1)) {
680 PyErr_SetString(PyExc_BufferError,
681 "Object is not writable.");
682 return -1;
683 }
684
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000685 view->obj = obj;
Martin v. Löwis241b8342008-08-14 15:54:27 +0000686 if (obj)
687 Py_INCREF(obj);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000688 view->buf = buf;
689 view->len = len;
690 view->readonly = readonly;
691 view->itemsize = 1;
692 view->format = NULL;
693 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
694 view->format = "B";
695 view->ndim = 1;
696 view->shape = NULL;
697 if ((flags & PyBUF_ND) == PyBUF_ND)
698 view->shape = &(view->len);
699 view->strides = NULL;
700 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
701 view->strides = &(view->itemsize);
702 view->suboffsets = NULL;
703 view->internal = NULL;
704 return 0;
705}
706
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000707void
708PyBuffer_Release(Py_buffer *view)
709{
710 PyObject *obj = view->obj;
Martin v. Löwis64034f92008-08-14 20:12:06 +0000711 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
712 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
713 Py_XDECREF(obj);
Martin v. Löwis241b8342008-08-14 15:54:27 +0000714 view->obj = NULL;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000715}
716
Eric Smitha9f7d622008-02-17 19:46:49 +0000717PyObject *
718PyObject_Format(PyObject* obj, PyObject *format_spec)
719{
720 static PyObject * str__format__ = NULL;
721 PyObject *empty = NULL;
722 PyObject *result = NULL;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000723#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000724 int spec_is_unicode;
725 int result_is_unicode;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000726#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000727
728 /* Initialize cached value */
729 if (str__format__ == NULL) {
730 /* Initialize static variable needed by _PyType_Lookup */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000731 str__format__ = PyString_InternFromString("__format__");
Eric Smitha9f7d622008-02-17 19:46:49 +0000732 if (str__format__ == NULL)
733 goto done;
734 }
735
736 /* If no format_spec is provided, use an empty string */
737 if (format_spec == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000738 empty = PyString_FromStringAndSize(NULL, 0);
Eric Smitha9f7d622008-02-17 19:46:49 +0000739 format_spec = empty;
740 }
741
742 /* Check the format_spec type, and make sure it's str or unicode */
Hirokazu Yamamoto1e234e82009-01-25 17:46:48 +0000743#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000744 if (PyUnicode_Check(format_spec))
745 spec_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000746 else if (PyString_Check(format_spec))
Eric Smitha9f7d622008-02-17 19:46:49 +0000747 spec_is_unicode = 0;
748 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000749#else
750 if (!PyString_Check(format_spec)) {
751#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000752 PyErr_Format(PyExc_TypeError,
753 "format expects arg 2 to be string "
754 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
755 goto done;
756 }
757
758 /* Make sure the type is initialized. float gets initialized late */
759 if (Py_TYPE(obj)->tp_dict == NULL)
760 if (PyType_Ready(Py_TYPE(obj)) < 0)
761 goto done;
762
763 /* Check for a __format__ method and call it. */
764 if (PyInstance_Check(obj)) {
765 /* We're an instance of a classic class */
766 PyObject *bound_method = PyObject_GetAttr(obj,
767 str__format__);
768 if (bound_method != NULL) {
769 result = PyObject_CallFunctionObjArgs(bound_method,
770 format_spec,
771 NULL);
772 Py_DECREF(bound_method);
773 } else {
774 PyObject *self_as_str;
775 PyObject *format_method;
776
777 PyErr_Clear();
778 /* Per the PEP, convert to str (or unicode,
779 depending on the type of the format
780 specifier). For new-style classes, this
781 logic is done by object.__format__(). */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000782#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000783 if (spec_is_unicode)
784 self_as_str = PyObject_Unicode(obj);
785 else
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000786#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000787 self_as_str = PyObject_Str(obj);
788 if (self_as_str == NULL)
789 goto done;
790
791 /* Then call str.__format__ on that result */
792 format_method = PyObject_GetAttr(self_as_str,
793 str__format__);
794 if (format_method == NULL) {
795 Py_DECREF(self_as_str);
796 goto done;
797 }
798 result = PyObject_CallFunctionObjArgs(format_method,
799 format_spec,
800 NULL);
801 Py_DECREF(self_as_str);
802 Py_DECREF(format_method);
803 if (result == NULL)
804 goto done;
805 }
806 } else {
807 /* Not an instance of a classic class, use the code
808 from py3k */
809
810 /* Find the (unbound!) __format__ method (a borrowed
811 reference) */
812 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
813 str__format__);
814 if (method == NULL) {
815 PyErr_Format(PyExc_TypeError,
816 "Type %.100s doesn't define __format__",
817 Py_TYPE(obj)->tp_name);
818 goto done;
819 }
820 /* And call it, binding it to the value */
821 result = PyObject_CallFunctionObjArgs(method, obj,
822 format_spec, NULL);
823 }
824
825 if (result == NULL)
826 goto done;
827
828 /* Check the result type, and make sure it's str or unicode */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000829#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000830 if (PyUnicode_Check(result))
831 result_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000832 else if (PyString_Check(result))
Eric Smitha9f7d622008-02-17 19:46:49 +0000833 result_is_unicode = 0;
834 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000835#else
836 if (!PyString_Check(result)) {
837#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000838 PyErr_Format(PyExc_TypeError,
839 "%.100s.__format__ must return string or "
840 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
841 Py_TYPE(result)->tp_name);
842 Py_DECREF(result);
843 result = NULL;
844 goto done;
845 }
846
847 /* Convert to unicode, if needed. Required if spec is unicode
848 and result is str */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000849#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000850 if (spec_is_unicode && !result_is_unicode) {
851 PyObject *tmp = PyObject_Unicode(result);
852 /* This logic works whether or not tmp is NULL */
853 Py_DECREF(result);
854 result = tmp;
855 }
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000856#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000857
858done:
859 Py_XDECREF(empty);
860 return result;
861}
862
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863/* Operations on numbers */
864
865int
Fred Drake79912472000-07-09 04:06:11 +0000866PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000867{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000868 return o && o->ob_type->tp_as_number &&
869 (o->ob_type->tp_as_number->nb_int ||
870 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000871}
872
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000873/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000874
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000875/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000876
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000877#define NB_SLOT(x) offsetof(PyNumberMethods, x)
878#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000879 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000880#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000881 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000882
883/*
884 Calling scheme used for binary operations:
885
886 v w Action
887 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000888 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000889 new old v.op(v,w), coerce(v,w), v.op(v,w)
890 old new w.op(v,w), coerce(v,w), v.op(v,w)
891 old old coerce(v,w), v.op(v,w)
892
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000893 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
894 v->ob_type
895
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000896 Legend:
897 -------
898 * new == new style number
899 * old == old style number
900 * Action indicates the order in which operations are tried until either
901 a valid result is produced or an error occurs.
902
903 */
904
905static PyObject *
906binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000907{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000908 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000909 binaryfunc slotv = NULL;
910 binaryfunc slotw = NULL;
911
912 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000913 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000914 if (w->ob_type != v->ob_type &&
915 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000916 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000917 if (slotw == slotv)
918 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000919 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000920 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000921 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
922 x = slotw(v, w);
923 if (x != Py_NotImplemented)
924 return x;
925 Py_DECREF(x); /* can't do it */
926 slotw = NULL;
927 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000928 x = slotv(v, w);
929 if (x != Py_NotImplemented)
930 return x;
931 Py_DECREF(x); /* can't do it */
932 }
933 if (slotw) {
934 x = slotw(v, w);
935 if (x != Py_NotImplemented)
936 return x;
937 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000938 }
939 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
940 int err = PyNumber_CoerceEx(&v, &w);
941 if (err < 0) {
942 return NULL;
943 }
944 if (err == 0) {
945 PyNumberMethods *mv = v->ob_type->tp_as_number;
946 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000947 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000948 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000949 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000950 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000951 Py_DECREF(v);
952 Py_DECREF(w);
953 return x;
954 }
955 }
956 /* CoerceEx incremented the reference counts */
957 Py_DECREF(v);
958 Py_DECREF(w);
959 }
960 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000961 Py_INCREF(Py_NotImplemented);
962 return Py_NotImplemented;
963}
Guido van Rossum77660912002-04-16 16:32:50 +0000964
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000965static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000966binop_type_error(PyObject *v, PyObject *w, const char *op_name)
967{
968 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000969 "unsupported operand type(s) for %.100s: "
970 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000971 op_name,
972 v->ob_type->tp_name,
973 w->ob_type->tp_name);
974 return NULL;
975}
976
977static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000978binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
979{
980 PyObject *result = binary_op1(v, w, op_slot);
981 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000982 Py_DECREF(result);
983 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000984 }
985 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000986}
987
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000988
989/*
990 Calling scheme used for ternary operations:
991
Guido van Rossum84675ac2001-09-29 01:05:03 +0000992 *** In some cases, w.op is called before v.op; see binary_op1. ***
993
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000994 v w z Action
995 -------------------------------------------------------------------
996 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
997 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
998 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
999 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1000 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1001 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1002 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1003 old old old coerce(v,w,z), v.op(v,w,z)
1004
1005 Legend:
1006 -------
1007 * new == new style number
1008 * old == old style number
1009 * Action indicates the order in which operations are tried until either
1010 a valid result is produced or an error occurs.
1011 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
1012 only if z != Py_None; if z == Py_None, then it is treated as absent
1013 variable and only coerce(v,w) is tried.
1014
1015 */
1016
1017static PyObject *
1018ternary_op(PyObject *v,
1019 PyObject *w,
1020 PyObject *z,
1021 const int op_slot,
1022 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001023{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001024 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001025 PyObject *x = NULL;
1026 ternaryfunc slotv = NULL;
1027 ternaryfunc slotw = NULL;
1028 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001029
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001030 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001031 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001032 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001033 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001034 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001035 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001036 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001037 if (slotw == slotv)
1038 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001039 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001040 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001041 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1042 x = slotw(v, w, z);
1043 if (x != Py_NotImplemented)
1044 return x;
1045 Py_DECREF(x); /* can't do it */
1046 slotw = NULL;
1047 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001048 x = slotv(v, w, z);
1049 if (x != Py_NotImplemented)
1050 return x;
1051 Py_DECREF(x); /* can't do it */
1052 }
1053 if (slotw) {
1054 x = slotw(v, w, z);
1055 if (x != Py_NotImplemented)
1056 return x;
1057 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001058 }
1059 mz = z->ob_type->tp_as_number;
1060 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001061 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001062 if (slotz == slotv || slotz == slotw)
1063 slotz = NULL;
1064 if (slotz) {
1065 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001066 if (x != Py_NotImplemented)
1067 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001068 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001069 }
1070 }
1071
1072 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1073 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1074 /* we have an old style operand, coerce */
1075 PyObject *v1, *z1, *w2, *z2;
1076 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001077
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001078 c = PyNumber_Coerce(&v, &w);
1079 if (c != 0)
1080 goto error3;
1081
1082 /* Special case: if the third argument is None, it is
1083 treated as absent argument and not coerced. */
1084 if (z == Py_None) {
1085 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001086 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1087 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001088 if (slotz)
1089 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001090 else
1091 c = -1;
1092 }
1093 else
1094 c = -1;
1095 goto error2;
1096 }
1097 v1 = v;
1098 z1 = z;
1099 c = PyNumber_Coerce(&v1, &z1);
1100 if (c != 0)
1101 goto error2;
1102 w2 = w;
1103 z2 = z1;
1104 c = PyNumber_Coerce(&w2, &z2);
1105 if (c != 0)
1106 goto error1;
1107
1108 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001109 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1110 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001111 if (slotv)
1112 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001113 else
1114 c = -1;
1115 }
1116 else
1117 c = -1;
1118
1119 Py_DECREF(w2);
1120 Py_DECREF(z2);
1121 error1:
1122 Py_DECREF(v1);
1123 Py_DECREF(z1);
1124 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001125 Py_DECREF(v);
1126 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001127 error3:
1128 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001129 return x;
1130 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001131
1132 if (z == Py_None)
1133 PyErr_Format(
1134 PyExc_TypeError,
1135 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001136 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001137 v->ob_type->tp_name,
1138 w->ob_type->tp_name);
1139 else
1140 PyErr_Format(
1141 PyExc_TypeError,
1142 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001143 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001144 v->ob_type->tp_name,
1145 w->ob_type->tp_name,
1146 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001147 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001148}
1149
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001150#define BINARY_FUNC(func, op, op_name) \
1151 PyObject * \
1152 func(PyObject *v, PyObject *w) { \
1153 return binary_op(v, w, NB_SLOT(op), op_name); \
1154 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001155
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001156BINARY_FUNC(PyNumber_Or, nb_or, "|")
1157BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1158BINARY_FUNC(PyNumber_And, nb_and, "&")
1159BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1160BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1161BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001162BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1163BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001164
1165PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001166PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001167{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001168 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1169 if (result == Py_NotImplemented) {
1170 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001171 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001172 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001173 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001174 }
Armin Rigofd163f92005-12-29 15:59:19 +00001175 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001176 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001177 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001178}
1179
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001180static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001181sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001182{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001183 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001184 if (PyIndex_Check(n)) {
1185 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001186 if (count == -1 && PyErr_Occurred())
1187 return NULL;
1188 }
1189 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001190 return type_error("can't multiply sequence by "
1191 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001192 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001193 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001194}
1195
1196PyObject *
1197PyNumber_Multiply(PyObject *v, PyObject *w)
1198{
1199 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1200 if (result == Py_NotImplemented) {
1201 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1202 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001203 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001204 if (mv && mv->sq_repeat) {
1205 return sequence_repeat(mv->sq_repeat, v, w);
1206 }
1207 else if (mw && mw->sq_repeat) {
1208 return sequence_repeat(mw->sq_repeat, w, v);
1209 }
1210 result = binop_type_error(v, w, "*");
1211 }
1212 return result;
1213}
1214
Guido van Rossume15dee51995-07-18 14:12:02 +00001215PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001216PyNumber_FloorDivide(PyObject *v, PyObject *w)
1217{
1218 /* XXX tp_flags test */
1219 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1220}
1221
1222PyObject *
1223PyNumber_TrueDivide(PyObject *v, PyObject *w)
1224{
1225 /* XXX tp_flags test */
1226 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1227}
1228
1229PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001230PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001231{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001232 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001233}
1234
1235PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001236PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001237{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001238 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001239}
1240
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001241/* Binary in-place operators */
1242
1243/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001244 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001245
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001246 - If the left hand object has the appropriate struct members, and
1247 they are filled, call the appropriate function and return the
1248 result. No coercion is done on the arguments; the left-hand object
1249 is the one the operation is performed on, and it's up to the
1250 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001251
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001252 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001253 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001254
1255 */
1256
Guido van Rossum77660912002-04-16 16:32:50 +00001257#define HASINPLACE(t) \
1258 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001259
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001260static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001261binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001262{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001263 PyNumberMethods *mv = v->ob_type->tp_as_number;
1264 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001265 binaryfunc slot = NB_BINOP(mv, iop_slot);
1266 if (slot) {
1267 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001268 if (x != Py_NotImplemented) {
1269 return x;
1270 }
1271 Py_DECREF(x);
1272 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001273 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001274 return binary_op1(v, w, op_slot);
1275}
1276
1277static PyObject *
1278binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1279 const char *op_name)
1280{
1281 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1282 if (result == Py_NotImplemented) {
1283 Py_DECREF(result);
1284 return binop_type_error(v, w, op_name);
1285 }
1286 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001287}
1288
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001289#define INPLACE_BINOP(func, iop, op, op_name) \
1290 PyObject * \
1291 func(PyObject *v, PyObject *w) { \
1292 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001293 }
1294
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001295INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1296INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1297INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1298INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1299INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1300INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1301INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001302
1303PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001304PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1305{
1306 /* XXX tp_flags test */
1307 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1308 NB_SLOT(nb_floor_divide), "//=");
1309}
1310
1311PyObject *
1312PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1313{
1314 /* XXX tp_flags test */
1315 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1316 NB_SLOT(nb_true_divide), "/=");
1317}
1318
1319PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001320PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1321{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001322 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1323 NB_SLOT(nb_add));
1324 if (result == Py_NotImplemented) {
1325 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1326 Py_DECREF(result);
1327 if (m != NULL) {
1328 binaryfunc f = NULL;
1329 if (HASINPLACE(v))
1330 f = m->sq_inplace_concat;
1331 if (f == NULL)
1332 f = m->sq_concat;
1333 if (f != NULL)
1334 return (*f)(v, w);
1335 }
1336 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001337 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001338 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001339}
1340
1341PyObject *
1342PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1343{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001344 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1345 NB_SLOT(nb_multiply));
1346 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001347 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001348 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1349 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1350 Py_DECREF(result);
1351 if (mv != NULL) {
1352 if (HASINPLACE(v))
1353 f = mv->sq_inplace_repeat;
1354 if (f == NULL)
1355 f = mv->sq_repeat;
1356 if (f != NULL)
1357 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001358 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001359 else if (mw != NULL) {
1360 /* Note that the right hand operand should not be
1361 * mutated in this case so sq_inplace_repeat is not
1362 * used. */
1363 if (mw->sq_repeat)
1364 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001365 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001366 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001367 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001368 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001369}
1370
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001371PyObject *
1372PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1373{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001374 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1375 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001376}
1377
1378PyObject *
1379PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1380{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001381 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1382 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1383 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001384 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001385 else {
1386 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1387 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001388}
1389
1390
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001392
1393PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001394PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001395{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 PyNumberMethods *m;
1397
1398 if (o == NULL)
1399 return null_error();
1400 m = o->ob_type->tp_as_number;
1401 if (m && m->nb_negative)
1402 return (*m->nb_negative)(o);
1403
Georg Brandlccff7852006-06-18 22:17:29 +00001404 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001405}
1406
1407PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001408PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001409{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001410 PyNumberMethods *m;
1411
1412 if (o == NULL)
1413 return null_error();
1414 m = o->ob_type->tp_as_number;
1415 if (m && m->nb_positive)
1416 return (*m->nb_positive)(o);
1417
Georg Brandlccff7852006-06-18 22:17:29 +00001418 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001419}
1420
1421PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001422PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001423{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 PyNumberMethods *m;
1425
1426 if (o == NULL)
1427 return null_error();
1428 m = o->ob_type->tp_as_number;
1429 if (m && m->nb_invert)
1430 return (*m->nb_invert)(o);
1431
Georg Brandlccff7852006-06-18 22:17:29 +00001432 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001433}
1434
1435PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001436PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001437{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001438 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001439
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 if (o == NULL)
1441 return null_error();
1442 m = o->ob_type->tp_as_number;
1443 if (m && m->nb_absolute)
1444 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001445
Georg Brandlccff7852006-06-18 22:17:29 +00001446 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001447}
1448
Guido van Rossum9e896b32000-04-05 20:11:21 +00001449/* Add a check for embedded NULL-bytes in the argument. */
1450static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001451int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001452{
1453 char *end;
1454 PyObject *x;
1455
1456 x = PyInt_FromString((char*)s, &end, 10);
1457 if (x == NULL)
1458 return NULL;
1459 if (end != s + len) {
1460 PyErr_SetString(PyExc_ValueError,
1461 "null byte in argument for int()");
1462 Py_DECREF(x);
1463 return NULL;
1464 }
1465 return x;
1466}
1467
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001468/* Return a Python Int or Long from the object item
1469 Raise TypeError if the result is not an int-or-long
1470 or if the object cannot be interpreted as an index.
1471*/
1472PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001473PyNumber_Index(PyObject *item)
1474{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001475 PyObject *result = NULL;
1476 if (item == NULL)
1477 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001478 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001479 Py_INCREF(item);
1480 return item;
1481 }
1482 if (PyIndex_Check(item)) {
1483 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001484 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001485 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001486 PyErr_Format(PyExc_TypeError,
1487 "__index__ returned non-(int,long) " \
1488 "(type %.200s)",
1489 result->ob_type->tp_name);
1490 Py_DECREF(result);
1491 return NULL;
1492 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001493 }
1494 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001495 PyErr_Format(PyExc_TypeError,
1496 "'%.200s' object cannot be interpreted "
1497 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001498 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001499 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001500}
1501
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001502/* Return an error on Overflow only if err is not NULL*/
1503
1504Py_ssize_t
1505PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1506{
1507 Py_ssize_t result;
1508 PyObject *runerr;
1509 PyObject *value = PyNumber_Index(item);
1510 if (value == NULL)
1511 return -1;
1512
1513 /* We're done if PyInt_AsSsize_t() returns without error. */
1514 result = PyInt_AsSsize_t(value);
1515 if (result != -1 || !(runerr = PyErr_Occurred()))
1516 goto finish;
1517
1518 /* Error handling code -- only manage OverflowError differently */
1519 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1520 goto finish;
1521
1522 PyErr_Clear();
1523 /* If no error-handling desired then the default clipping
1524 is sufficient.
1525 */
1526 if (!err) {
1527 assert(PyLong_Check(value));
1528 /* Whether or not it is less than or equal to
1529 zero is determined by the sign of ob_size
1530 */
1531 if (_PyLong_Sign(value) < 0)
1532 result = PY_SSIZE_T_MIN;
1533 else
1534 result = PY_SSIZE_T_MAX;
1535 }
1536 else {
1537 /* Otherwise replace the error with caller's error object. */
1538 PyErr_Format(err,
1539 "cannot fit '%.200s' into an index-sized integer",
1540 item->ob_type->tp_name);
1541 }
1542
1543 finish:
1544 Py_DECREF(value);
1545 return result;
1546}
1547
1548
Guido van Rossume15dee51995-07-18 14:12:02 +00001549PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001550_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1551{
1552 const char *type_name;
1553 static PyObject *int_name = NULL;
1554 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001555 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001556 if (int_name == NULL)
1557 return NULL;
1558 }
1559
1560 if (integral && (!PyInt_Check(integral) &&
1561 !PyLong_Check(integral))) {
1562 /* Don't go through tp_as_number->nb_int to avoid
1563 hitting the classic class fallback to __trunc__. */
1564 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1565 if (int_func == NULL) {
1566 PyErr_Clear(); /* Raise a different error. */
1567 goto non_integral_error;
1568 }
1569 Py_DECREF(integral);
1570 integral = PyEval_CallObject(int_func, NULL);
1571 Py_DECREF(int_func);
1572 if (integral && (!PyInt_Check(integral) &&
1573 !PyLong_Check(integral))) {
1574 goto non_integral_error;
1575 }
1576 }
1577 return integral;
1578
1579non_integral_error:
1580 if (PyInstance_Check(integral)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001581 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001582 ->in_class->cl_name);
1583 }
1584 else {
1585 type_name = integral->ob_type->tp_name;
1586 }
1587 PyErr_Format(PyExc_TypeError, error_format, type_name);
1588 Py_DECREF(integral);
1589 return NULL;
1590}
1591
1592
1593PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001594PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001595{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001596 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001597 static PyObject *trunc_name = NULL;
1598 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001599 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001600 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001601
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001602 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001603 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001604 if (trunc_name == NULL)
1605 return NULL;
1606 }
1607
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001608 if (o == NULL)
1609 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001610 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001611 Py_INCREF(o);
1612 return o;
1613 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001614 m = o->ob_type->tp_as_number;
1615 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001616 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001617 PyObject *res = m->nb_int(o);
1618 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1619 PyErr_Format(PyExc_TypeError,
1620 "__int__ returned non-int (type %.200s)",
1621 res->ob_type->tp_name);
1622 Py_DECREF(res);
1623 return NULL;
1624 }
1625 return res;
1626 }
1627 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001628 PyIntObject *io = (PyIntObject*)o;
1629 return PyInt_FromLong(io->ob_ival);
1630 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001631 trunc_func = PyObject_GetAttr(o, trunc_name);
1632 if (trunc_func) {
1633 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1634 Py_DECREF(trunc_func);
1635 /* __trunc__ is specified to return an Integral type, but
1636 int() needs to return an int. */
1637 return _PyNumber_ConvertIntegralToInt(
1638 truncated,
1639 "__trunc__ returned non-Integral (type %.200s)");
1640 }
1641 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1642
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001643 if (PyString_Check(o))
1644 return int_from_string(PyString_AS_STRING(o),
1645 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001646#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001647 if (PyUnicode_Check(o))
1648 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1649 PyUnicode_GET_SIZE(o),
1650 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001651#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001652 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001653 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001654
Georg Brandlccff7852006-06-18 22:17:29 +00001655 return type_error("int() argument must be a string or a "
1656 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001657}
1658
Guido van Rossum9e896b32000-04-05 20:11:21 +00001659/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001660static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001661long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001662{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001663 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001664 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001665
Guido van Rossum4c08d552000-03-10 22:55:18 +00001666 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001667 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001668 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001669 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001670 PyErr_SetString(PyExc_ValueError,
1671 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001672 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001673 return NULL;
1674 }
1675 return x;
1676}
1677
Guido van Rossume15dee51995-07-18 14:12:02 +00001678PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001679PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001680{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001681 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001682 static PyObject *trunc_name = NULL;
1683 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001684 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001685 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001686
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001687 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001688 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001689 if (trunc_name == NULL)
1690 return NULL;
1691 }
1692
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001693 if (o == NULL)
1694 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001695 m = o->ob_type->tp_as_number;
1696 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001697 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001698 PyObject *res = m->nb_long(o);
1699 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1700 PyErr_Format(PyExc_TypeError,
1701 "__long__ returned non-long (type %.200s)",
1702 res->ob_type->tp_name);
1703 Py_DECREF(res);
1704 return NULL;
1705 }
1706 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001707 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001708 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001709 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001710 trunc_func = PyObject_GetAttr(o, trunc_name);
1711 if (trunc_func) {
1712 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1713 PyObject *int_instance;
1714 Py_DECREF(trunc_func);
1715 /* __trunc__ is specified to return an Integral type,
1716 but long() needs to return a long. */
1717 int_instance = _PyNumber_ConvertIntegralToInt(
1718 truncated,
1719 "__trunc__ returned non-Integral (type %.200s)");
1720 if (int_instance && PyInt_Check(int_instance)) {
1721 /* Make sure that long() returns a long instance. */
1722 long value = PyInt_AS_LONG(int_instance);
1723 Py_DECREF(int_instance);
1724 return PyLong_FromLong(value);
1725 }
1726 return int_instance;
1727 }
1728 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1729
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001730 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001731 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001732 * doesn't do. In particular long('9.5') must raise an
1733 * exception, not truncate the float.
1734 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001735 return long_from_string(PyString_AS_STRING(o),
1736 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001737#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001738 if (PyUnicode_Check(o))
1739 /* The above check is done in PyLong_FromUnicode(). */
1740 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1741 PyUnicode_GET_SIZE(o),
1742 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001743#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001744 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1745 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001746
Georg Brandlccff7852006-06-18 22:17:29 +00001747 return type_error("long() argument must be a string or a "
1748 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001749}
1750
1751PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001752PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001753{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001754 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001755
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001756 if (o == NULL)
1757 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001758 m = o->ob_type->tp_as_number;
1759 if (m && m->nb_float) { /* This should include subclasses of float */
1760 PyObject *res = m->nb_float(o);
1761 if (res && !PyFloat_Check(res)) {
1762 PyErr_Format(PyExc_TypeError,
1763 "__float__ returned non-float (type %.200s)",
1764 res->ob_type->tp_name);
1765 Py_DECREF(res);
1766 return NULL;
1767 }
1768 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001769 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001770 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001771 PyFloatObject *po = (PyFloatObject *)o;
1772 return PyFloat_FromDouble(po->ob_fval);
1773 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001774 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001775}
1776
Eric Smith5e527eb2008-02-10 01:36:53 +00001777PyObject *
1778PyNumber_ToBase(PyObject *n, int base)
1779{
1780 PyObject *res = NULL;
1781 PyObject *index = PyNumber_Index(n);
1782
1783 if (!index)
1784 return NULL;
1785 if (PyLong_Check(index))
1786 res = _PyLong_Format(index, base, 0, 1);
1787 else if (PyInt_Check(index))
1788 res = _PyInt_Format((PyIntObject*)index, base, 1);
1789 else
Eric Smith3f914372008-02-15 12:14:32 +00001790 /* It should not be possible to get here, as
1791 PyNumber_Index already has a check for the same
1792 condition */
1793 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1794 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001795 Py_DECREF(index);
1796 return res;
1797}
1798
1799
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001800/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001801
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001802int
Fred Drake79912472000-07-09 04:06:11 +00001803PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001804{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001805 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001806 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001807 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001808 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001809 return s != NULL && s->ob_type->tp_as_sequence &&
1810 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001811}
1812
Martin v. Löwis18e16552006-02-15 17:27:45 +00001813Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001814PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001815{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001816 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001817
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001818 if (s == NULL) {
1819 null_error();
1820 return -1;
1821 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001822
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001823 m = s->ob_type->tp_as_sequence;
1824 if (m && m->sq_length)
1825 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001826
Georg Brandlb0061c82006-08-08 11:56:21 +00001827 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001828 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001829}
1830
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001831#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001832Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001833PySequence_Length(PyObject *s)
1834{
1835 return PySequence_Size(s);
1836}
1837#define PySequence_Length PySequence_Size
1838
Guido van Rossume15dee51995-07-18 14:12:02 +00001839PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001840PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001841{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001842 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001843
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 if (s == NULL || o == NULL)
1845 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001846
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001847 m = s->ob_type->tp_as_sequence;
1848 if (m && m->sq_concat)
1849 return m->sq_concat(s, o);
1850
Armin Rigofd163f92005-12-29 15:59:19 +00001851 /* Instances of user classes defining an __add__() method only
1852 have an nb_add slot, not an sq_concat slot. So we fall back
1853 to nb_add if both arguments appear to be sequences. */
1854 if (PySequence_Check(s) && PySequence_Check(o)) {
1855 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1856 if (result != Py_NotImplemented)
1857 return result;
1858 Py_DECREF(result);
1859 }
Georg Brandlccff7852006-06-18 22:17:29 +00001860 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001861}
1862
1863PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001864PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001865{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001866 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001867
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001868 if (o == NULL)
1869 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001870
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001871 m = o->ob_type->tp_as_sequence;
1872 if (m && m->sq_repeat)
1873 return m->sq_repeat(o, count);
1874
Armin Rigofd163f92005-12-29 15:59:19 +00001875 /* Instances of user classes defining a __mul__() method only
1876 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1877 to nb_multiply if o appears to be a sequence. */
1878 if (PySequence_Check(o)) {
1879 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001880 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001881 if (n == NULL)
1882 return NULL;
1883 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1884 Py_DECREF(n);
1885 if (result != Py_NotImplemented)
1886 return result;
1887 Py_DECREF(result);
1888 }
Georg Brandlccff7852006-06-18 22:17:29 +00001889 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001890}
1891
1892PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001893PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1894{
1895 PySequenceMethods *m;
1896
1897 if (s == NULL || o == NULL)
1898 return null_error();
1899
1900 m = s->ob_type->tp_as_sequence;
1901 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1902 return m->sq_inplace_concat(s, o);
1903 if (m && m->sq_concat)
1904 return m->sq_concat(s, o);
1905
Armin Rigofd163f92005-12-29 15:59:19 +00001906 if (PySequence_Check(s) && PySequence_Check(o)) {
1907 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1908 NB_SLOT(nb_add));
1909 if (result != Py_NotImplemented)
1910 return result;
1911 Py_DECREF(result);
1912 }
Georg Brandlccff7852006-06-18 22:17:29 +00001913 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001914}
1915
1916PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001917PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001918{
1919 PySequenceMethods *m;
1920
1921 if (o == NULL)
1922 return null_error();
1923
1924 m = o->ob_type->tp_as_sequence;
1925 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1926 return m->sq_inplace_repeat(o, count);
1927 if (m && m->sq_repeat)
1928 return m->sq_repeat(o, count);
1929
Armin Rigofd163f92005-12-29 15:59:19 +00001930 if (PySequence_Check(o)) {
1931 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001932 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001933 if (n == NULL)
1934 return NULL;
1935 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1936 NB_SLOT(nb_multiply));
1937 Py_DECREF(n);
1938 if (result != Py_NotImplemented)
1939 return result;
1940 Py_DECREF(result);
1941 }
Georg Brandlccff7852006-06-18 22:17:29 +00001942 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001943}
1944
1945PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001946PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001947{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001948 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001949
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001950 if (s == NULL)
1951 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001952
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001953 m = s->ob_type->tp_as_sequence;
1954 if (m && m->sq_item) {
1955 if (i < 0) {
1956 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001957 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001958 if (l < 0)
1959 return NULL;
1960 i += l;
1961 }
1962 }
1963 return m->sq_item(s, i);
1964 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001965
Skip Montanaro2c7ca9b2008-07-07 11:16:14 +00001966 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001967}
1968
1969PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001970PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001971{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001972 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001973 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001974
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001975 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001976
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001977 m = s->ob_type->tp_as_sequence;
1978 if (m && m->sq_slice) {
1979 if (i1 < 0 || i2 < 0) {
1980 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001981 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001982 if (l < 0)
1983 return NULL;
1984 if (i1 < 0)
1985 i1 += l;
1986 if (i2 < 0)
1987 i2 += l;
1988 }
1989 }
1990 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001991 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1992 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001993 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001994 if (!slice)
1995 return NULL;
1996 res = mp->mp_subscript(s, slice);
1997 Py_DECREF(slice);
1998 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001999 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002000
Georg Brandlccff7852006-06-18 22:17:29 +00002001 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00002002}
2003
2004int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002005PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002006{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002007 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002008
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002009 if (s == NULL) {
2010 null_error();
2011 return -1;
2012 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002013
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002014 m = s->ob_type->tp_as_sequence;
2015 if (m && m->sq_ass_item) {
2016 if (i < 0) {
2017 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002018 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002019 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002020 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002021 i += l;
2022 }
2023 }
2024 return m->sq_ass_item(s, i, o);
2025 }
2026
Georg Brandlccff7852006-06-18 22:17:29 +00002027 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002028 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002029}
2030
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002031int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002032PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002033{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002034 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002035
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002036 if (s == NULL) {
2037 null_error();
2038 return -1;
2039 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002040
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002041 m = s->ob_type->tp_as_sequence;
2042 if (m && m->sq_ass_item) {
2043 if (i < 0) {
2044 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002045 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002046 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002047 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002048 i += l;
2049 }
2050 }
2051 return m->sq_ass_item(s, i, (PyObject *)NULL);
2052 }
2053
Georg Brandlccff7852006-06-18 22:17:29 +00002054 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002055 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002056}
2057
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002058int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002059PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002060{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002061 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002062 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002064 if (s == NULL) {
2065 null_error();
2066 return -1;
2067 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002068
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002069 m = s->ob_type->tp_as_sequence;
2070 if (m && m->sq_ass_slice) {
2071 if (i1 < 0 || i2 < 0) {
2072 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002073 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002074 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002075 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002076 if (i1 < 0)
2077 i1 += l;
2078 if (i2 < 0)
2079 i2 += l;
2080 }
2081 }
2082 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002083 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2084 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002085 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002086 if (!slice)
2087 return -1;
2088 res = mp->mp_ass_subscript(s, slice, o);
2089 Py_DECREF(slice);
2090 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002091 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002092
Georg Brandlccff7852006-06-18 22:17:29 +00002093 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002094 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002095}
2096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002097int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002098PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002099{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002100 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002101
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002102 if (s == NULL) {
2103 null_error();
2104 return -1;
2105 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002106
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002107 m = s->ob_type->tp_as_sequence;
2108 if (m && m->sq_ass_slice) {
2109 if (i1 < 0 || i2 < 0) {
2110 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002111 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002112 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002113 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002114 if (i1 < 0)
2115 i1 += l;
2116 if (i2 < 0)
2117 i2 += l;
2118 }
2119 }
2120 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2121 }
Georg Brandlccff7852006-06-18 22:17:29 +00002122 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002123 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002124}
2125
Guido van Rossume15dee51995-07-18 14:12:02 +00002126PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002127PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002128{
Tim Peters6912d4d2001-05-05 03:56:37 +00002129 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002130 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00002131 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002132 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002134 if (v == NULL)
2135 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002136
Tim Peters6912d4d2001-05-05 03:56:37 +00002137 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002138 if (PyTuple_CheckExact(v)) {
2139 /* Note that we can't know whether it's safe to return
2140 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002141 to exact tuples here. In contrast, lists always make
2142 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002143 Py_INCREF(v);
2144 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002145 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002146 if (PyList_Check(v))
2147 return PyList_AsTuple(v);
2148
Tim Peters6912d4d2001-05-05 03:56:37 +00002149 /* Get iterator. */
2150 it = PyObject_GetIter(v);
2151 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002152 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002153
Tim Peters6912d4d2001-05-05 03:56:37 +00002154 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002155 n = _PyObject_LengthHint(v, 10);
Tim Peters6912d4d2001-05-05 03:56:37 +00002156 result = PyTuple_New(n);
2157 if (result == NULL)
2158 goto Fail;
2159
2160 /* Fill the tuple. */
2161 for (j = 0; ; ++j) {
2162 PyObject *item = PyIter_Next(it);
2163 if (item == NULL) {
2164 if (PyErr_Occurred())
2165 goto Fail;
2166 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002167 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002168 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002169 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002170 /* The over-allocation strategy can grow a bit faster
2171 than for lists because unlike lists the
2172 over-allocation isn't permanent -- we reclaim
2173 the excess before the end of this routine.
2174 So, grow by ten and then add 25%.
2175 */
2176 n += 10;
2177 n += n >> 2;
2178 if (n < oldn) {
2179 /* Check for overflow */
2180 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002181 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002182 goto Fail;
2183 }
Tim Peters4324aa32001-05-28 22:30:08 +00002184 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002185 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002186 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002187 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002188 }
2189 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002190 }
2191
Tim Peters6912d4d2001-05-05 03:56:37 +00002192 /* Cut tuple back if guess was too large. */
2193 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002194 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002195 goto Fail;
2196
2197 Py_DECREF(it);
2198 return result;
2199
2200Fail:
2201 Py_XDECREF(result);
2202 Py_DECREF(it);
2203 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002204}
2205
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002206PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002207PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002208{
Tim Petersf553f892001-05-01 20:45:31 +00002209 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002210 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002211
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002212 if (v == NULL)
2213 return null_error();
2214
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002215 result = PyList_New(0);
2216 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002217 return NULL;
2218
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002219 rv = _PyList_Extend((PyListObject *)result, v);
2220 if (rv == NULL) {
2221 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002222 return NULL;
2223 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002224 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002225 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002226}
2227
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002228PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002229PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002230{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002231 PyObject *it;
2232
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002233 if (v == NULL)
2234 return null_error();
2235
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002236 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002237 Py_INCREF(v);
2238 return v;
2239 }
2240
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002241 it = PyObject_GetIter(v);
2242 if (it == NULL) {
2243 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002244 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002245 return NULL;
2246 }
2247
Raymond Hettinger193814c2004-12-18 19:00:59 +00002248 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002249 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002250
2251 return v;
2252}
2253
Tim Peters16a77ad2001-09-08 04:00:12 +00002254/* Iterate over seq. Result depends on the operation:
2255 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2256 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
2257 set ValueError and return -1 if none found; also return -1 on error.
2258 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2259*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002260Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002261_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002262{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002263 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002264 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2265 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002266
Tim Peters16a77ad2001-09-08 04:00:12 +00002267 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002268 null_error();
2269 return -1;
2270 }
Tim Peters75f8e352001-05-05 11:33:43 +00002271
Tim Peters16a77ad2001-09-08 04:00:12 +00002272 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002273 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002274 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002275 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002276 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002277
Tim Peters16a77ad2001-09-08 04:00:12 +00002278 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002279 for (;;) {
2280 int cmp;
2281 PyObject *item = PyIter_Next(it);
2282 if (item == NULL) {
2283 if (PyErr_Occurred())
2284 goto Fail;
2285 break;
2286 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002287
2288 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002289 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002290 if (cmp < 0)
2291 goto Fail;
2292 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002293 switch (operation) {
2294 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002295 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002296 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002297 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002298 goto Fail;
2299 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002300 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002301 break;
2302
2303 case PY_ITERSEARCH_INDEX:
2304 if (wrapped) {
2305 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002306 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002307 goto Fail;
2308 }
2309 goto Done;
2310
2311 case PY_ITERSEARCH_CONTAINS:
2312 n = 1;
2313 goto Done;
2314
2315 default:
2316 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002317 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002318 }
2319
2320 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002321 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002322 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002323 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002324 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002325 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002326
2327 if (operation != PY_ITERSEARCH_INDEX)
2328 goto Done;
2329
2330 PyErr_SetString(PyExc_ValueError,
2331 "sequence.index(x): x not in sequence");
2332 /* fall into failure code */
2333Fail:
2334 n = -1;
2335 /* fall through */
2336Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002337 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002338 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002339
Guido van Rossume15dee51995-07-18 14:12:02 +00002340}
2341
Tim Peters16a77ad2001-09-08 04:00:12 +00002342/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002343Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002344PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002345{
Tim Peters16a77ad2001-09-08 04:00:12 +00002346 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002347}
2348
Tim Peterscb8d3682001-05-05 21:05:01 +00002349/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002350 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002351 */
2352int
2353PySequence_Contains(PyObject *seq, PyObject *ob)
2354{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002355 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002356 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2357 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2358 if (sqm != NULL && sqm->sq_contains != NULL)
2359 return (*sqm->sq_contains)(seq, ob);
2360 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002361 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2362 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002363}
2364
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002365/* Backwards compatibility */
2366#undef PySequence_In
2367int
Fred Drake79912472000-07-09 04:06:11 +00002368PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002369{
2370 return PySequence_Contains(w, v);
2371}
2372
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002373Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002374PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002375{
Tim Peters16a77ad2001-09-08 04:00:12 +00002376 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002377}
2378
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002379/* Operations on mappings */
2380
2381int
Fred Drake79912472000-07-09 04:06:11 +00002382PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002383{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002384 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002385 return PyObject_HasAttrString(o, "__getitem__");
2386
2387 return o && o->ob_type->tp_as_mapping &&
2388 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002389 !(o->ob_type->tp_as_sequence &&
2390 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002391}
2392
Martin v. Löwis18e16552006-02-15 17:27:45 +00002393Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002394PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002395{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002396 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002397
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002398 if (o == NULL) {
2399 null_error();
2400 return -1;
2401 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002402
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002403 m = o->ob_type->tp_as_mapping;
2404 if (m && m->mp_length)
2405 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002406
Georg Brandlb0061c82006-08-08 11:56:21 +00002407 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002408 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002409}
2410
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002411#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002412Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002413PyMapping_Length(PyObject *o)
2414{
2415 return PyMapping_Size(o);
2416}
2417#define PyMapping_Length PyMapping_Size
2418
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002419PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002420PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002421{
2422 PyObject *okey, *r;
2423
2424 if (key == NULL)
2425 return null_error();
2426
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002427 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002428 if (okey == NULL)
2429 return NULL;
2430 r = PyObject_GetItem(o, okey);
2431 Py_DECREF(okey);
2432 return r;
2433}
2434
2435int
Fred Drake79912472000-07-09 04:06:11 +00002436PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002437{
2438 PyObject *okey;
2439 int r;
2440
2441 if (key == NULL) {
2442 null_error();
2443 return -1;
2444 }
2445
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002446 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002447 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002448 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002449 r = PyObject_SetItem(o, okey, value);
2450 Py_DECREF(okey);
2451 return r;
2452}
2453
2454int
Fred Drake79912472000-07-09 04:06:11 +00002455PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002456{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002457 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002458
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002459 v = PyMapping_GetItemString(o, key);
2460 if (v) {
2461 Py_DECREF(v);
2462 return 1;
2463 }
2464 PyErr_Clear();
2465 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002466}
2467
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002468int
Fred Drake79912472000-07-09 04:06:11 +00002469PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002470{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002471 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002472
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002473 v = PyObject_GetItem(o, key);
2474 if (v) {
2475 Py_DECREF(v);
2476 return 1;
2477 }
2478 PyErr_Clear();
2479 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002480}
2481
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002482/* Operations on callable objects */
2483
2484/* XXX PyCallable_Check() is in object.c */
2485
Guido van Rossume15dee51995-07-18 14:12:02 +00002486PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002487PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002488{
Guido van Rossum5560b742001-09-14 16:47:50 +00002489 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002490}
Guido van Rossume15dee51995-07-18 14:12:02 +00002491
2492PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002493PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2494{
2495 ternaryfunc call;
2496
2497 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002498 PyObject *result;
2499 if (Py_EnterRecursiveCall(" while calling a Python object"))
2500 return NULL;
2501 result = (*call)(func, arg, kw);
2502 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002503 if (result == NULL && !PyErr_Occurred())
2504 PyErr_SetString(
2505 PyExc_SystemError,
2506 "NULL result without error in PyObject_Call");
2507 return result;
2508 }
Georg Brandlccff7852006-06-18 22:17:29 +00002509 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002510 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002511 return NULL;
2512}
2513
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002514static PyObject*
2515call_function_tail(PyObject *callable, PyObject *args)
2516{
2517 PyObject *retval;
2518
2519 if (args == NULL)
2520 return NULL;
2521
2522 if (!PyTuple_Check(args)) {
2523 PyObject *a;
2524
2525 a = PyTuple_New(1);
2526 if (a == NULL) {
2527 Py_DECREF(args);
2528 return NULL;
2529 }
2530 PyTuple_SET_ITEM(a, 0, args);
2531 args = a;
2532 }
2533 retval = PyObject_Call(callable, args, NULL);
2534
2535 Py_DECREF(args);
2536
2537 return retval;
2538}
2539
Tim Peters6d6c1a32001-08-02 04:15:00 +00002540PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002541PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002542{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002543 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002544 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002545
Fred Drakeb92cf062001-10-27 06:16:31 +00002546 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002547 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002548
Fred Drakeb92cf062001-10-27 06:16:31 +00002549 if (format && *format) {
2550 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002551 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002552 va_end(va);
2553 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002554 else
2555 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002556
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002557 return call_function_tail(callable, args);
2558}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002559
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002560PyObject *
2561_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2562{
2563 va_list va;
2564 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002565
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002566 if (callable == NULL)
2567 return null_error();
2568
2569 if (format && *format) {
2570 va_start(va, format);
2571 args = _Py_VaBuildValue_SizeT(format, va);
2572 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002573 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002574 else
2575 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002576
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002577 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002578}
2579
2580PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002581PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002582{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002583 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002584 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002585 PyObject *func = NULL;
2586 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002587
Fred Drakeb92cf062001-10-27 06:16:31 +00002588 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002589 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002590
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002591 func = PyObject_GetAttrString(o, name);
2592 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002593 PyErr_SetString(PyExc_AttributeError, name);
2594 return 0;
2595 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002596
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002597 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002598 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002599 goto exit;
2600 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002601
Fred Drakeb92cf062001-10-27 06:16:31 +00002602 if (format && *format) {
2603 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002604 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002605 va_end(va);
2606 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002607 else
2608 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002609
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002610 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002611
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002612 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002613 /* args gets consumed in call_function_tail */
2614 Py_XDECREF(func);
2615
2616 return retval;
2617}
2618
2619PyObject *
2620_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2621{
2622 va_list va;
2623 PyObject *args;
2624 PyObject *func = NULL;
2625 PyObject *retval = NULL;
2626
2627 if (o == NULL || name == NULL)
2628 return null_error();
2629
2630 func = PyObject_GetAttrString(o, name);
2631 if (func == NULL) {
2632 PyErr_SetString(PyExc_AttributeError, name);
2633 return 0;
2634 }
2635
2636 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002637 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002638 goto exit;
2639 }
2640
2641 if (format && *format) {
2642 va_start(va, format);
2643 args = _Py_VaBuildValue_SizeT(format, va);
2644 va_end(va);
2645 }
2646 else
2647 args = PyTuple_New(0);
2648
2649 retval = call_function_tail(func, args);
2650
2651 exit:
2652 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002653 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002654
2655 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002656}
Guido van Rossum823649d2001-03-21 18:40:58 +00002657
2658
Fred Drakeb421b8c2001-10-26 16:21:32 +00002659static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002660objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002661{
2662 int i, n = 0;
2663 va_list countva;
2664 PyObject *result, *tmp;
2665
2666#ifdef VA_LIST_IS_ARRAY
2667 memcpy(countva, va, sizeof(va_list));
2668#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002669#ifdef __va_copy
2670 __va_copy(countva, va);
2671#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002672 countva = va;
2673#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002674#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002675
2676 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2677 ++n;
2678 result = PyTuple_New(n);
2679 if (result != NULL && n > 0) {
2680 for (i = 0; i < n; ++i) {
2681 tmp = (PyObject *)va_arg(va, PyObject *);
2682 PyTuple_SET_ITEM(result, i, tmp);
2683 Py_INCREF(tmp);
2684 }
2685 }
2686 return result;
2687}
2688
2689PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002690PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002691{
2692 PyObject *args, *tmp;
2693 va_list vargs;
2694
2695 if (callable == NULL || name == NULL)
2696 return null_error();
2697
2698 callable = PyObject_GetAttr(callable, name);
2699 if (callable == NULL)
2700 return NULL;
2701
2702 /* count the args */
2703 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002704 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002705 va_end(vargs);
2706 if (args == NULL) {
2707 Py_DECREF(callable);
2708 return NULL;
2709 }
2710 tmp = PyObject_Call(callable, args, NULL);
2711 Py_DECREF(args);
2712 Py_DECREF(callable);
2713
2714 return tmp;
2715}
2716
2717PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002718PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002719{
2720 PyObject *args, *tmp;
2721 va_list vargs;
2722
2723 if (callable == NULL)
2724 return null_error();
2725
2726 /* count the args */
2727 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002728 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002729 va_end(vargs);
2730 if (args == NULL)
2731 return NULL;
2732 tmp = PyObject_Call(callable, args, NULL);
2733 Py_DECREF(args);
2734
2735 return tmp;
2736}
2737
2738
Guido van Rossum823649d2001-03-21 18:40:58 +00002739/* isinstance(), issubclass() */
2740
Barry Warsawf16951c2002-04-23 22:45:44 +00002741/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2742 * state that will almost never happen.
2743 *
2744 * 0. creating the __bases__ static string could get a MemoryError
2745 * 1. getattr(cls, '__bases__') could raise an AttributeError
2746 * 2. getattr(cls, '__bases__') could raise some other exception
2747 * 3. getattr(cls, '__bases__') could return a tuple
2748 * 4. getattr(cls, '__bases__') could return something other than a tuple
2749 *
2750 * Only state #3 is a non-error state and only it returns a non-NULL object
2751 * (it returns the retrieved tuple).
2752 *
2753 * Any raised AttributeErrors are masked by clearing the exception and
2754 * returning NULL. If an object other than a tuple comes out of __bases__,
2755 * then again, the return value is NULL. So yes, these two situations
2756 * produce exactly the same results: NULL is returned and no error is set.
2757 *
2758 * If some exception other than AttributeError is raised, then NULL is also
2759 * returned, but the exception is not cleared. That's because we want the
2760 * exception to be propagated along.
2761 *
2762 * Callers are expected to test for PyErr_Occurred() when the return value
2763 * is NULL to decide whether a valid exception should be propagated or not.
2764 * When there's no exception to propagate, it's customary for the caller to
2765 * set a TypeError.
2766 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002767static PyObject *
2768abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002769{
2770 static PyObject *__bases__ = NULL;
2771 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002772
2773 if (__bases__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002774 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002775 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002776 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002777 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002778 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002779 if (bases == NULL) {
2780 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2781 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002782 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002783 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002784 if (!PyTuple_Check(bases)) {
2785 Py_DECREF(bases);
2786 return NULL;
2787 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002788 return bases;
2789}
2790
2791
2792static int
2793abstract_issubclass(PyObject *derived, PyObject *cls)
2794{
Antoine Pitrou0668c622008-08-26 22:42:08 +00002795 PyObject *bases = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002796 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002797 int r = 0;
2798
Antoine Pitrou0668c622008-08-26 22:42:08 +00002799 while (1) {
2800 if (derived == cls)
2801 return 1;
2802 bases = abstract_get_bases(derived);
2803 if (bases == NULL) {
2804 if (PyErr_Occurred())
2805 return -1;
2806 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002807 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002808 n = PyTuple_GET_SIZE(bases);
2809 if (n == 0) {
2810 Py_DECREF(bases);
2811 return 0;
2812 }
2813 /* Avoid recursivity in the single inheritance case */
2814 if (n == 1) {
2815 derived = PyTuple_GET_ITEM(bases, 0);
2816 Py_DECREF(bases);
2817 continue;
2818 }
2819 for (i = 0; i < n; i++) {
2820 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2821 if (r != 0)
2822 break;
2823 }
2824 Py_DECREF(bases);
2825 return r;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002826 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002827}
2828
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002829static int
2830check_class(PyObject *cls, const char *error)
2831{
2832 PyObject *bases = abstract_get_bases(cls);
2833 if (bases == NULL) {
2834 /* Do not mask errors. */
2835 if (!PyErr_Occurred())
2836 PyErr_SetString(PyExc_TypeError, error);
2837 return 0;
2838 }
2839 Py_DECREF(bases);
2840 return -1;
2841}
2842
Brett Cannon4f653312004-03-20 22:52:14 +00002843static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002844recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002845{
2846 PyObject *icls;
2847 static PyObject *__class__ = NULL;
2848 int retval = 0;
2849
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002850 if (__class__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002851 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002852 if (__class__ == NULL)
2853 return -1;
2854 }
2855
Neil Schemenauer6b471292001-10-18 03:18:43 +00002856 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2857 PyObject *inclass =
2858 (PyObject*)((PyInstanceObject*)inst)->in_class;
2859 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002860 }
2861 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002862 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002863 if (retval == 0) {
2864 PyObject *c = PyObject_GetAttr(inst, __class__);
2865 if (c == NULL) {
2866 PyErr_Clear();
2867 }
2868 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002869 if (c != (PyObject *)(inst->ob_type) &&
2870 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002871 retval = PyType_IsSubtype(
2872 (PyTypeObject *)c,
2873 (PyTypeObject *)cls);
2874 Py_DECREF(c);
2875 }
2876 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002877 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002878 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002879 if (!check_class(cls,
2880 "isinstance() arg 2 must be a class, type,"
2881 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002882 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002883 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002884 if (icls == NULL) {
2885 PyErr_Clear();
2886 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002887 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002888 else {
2889 retval = abstract_issubclass(icls, cls);
2890 Py_DECREF(icls);
2891 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002892 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002893
Guido van Rossum823649d2001-03-21 18:40:58 +00002894 return retval;
2895}
2896
2897int
Brett Cannon4f653312004-03-20 22:52:14 +00002898PyObject_IsInstance(PyObject *inst, PyObject *cls)
2899{
Christian Heimese247f002008-02-14 22:40:11 +00002900 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002901 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002902
2903 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002904 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002905 return 1;
2906
Antoine Pitrou0668c622008-08-26 22:42:08 +00002907 if (PyTuple_Check(cls)) {
2908 Py_ssize_t i;
2909 Py_ssize_t n;
2910 int r = 0;
2911
2912 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2913 return -1;
2914 n = PyTuple_GET_SIZE(cls);
2915 for (i = 0; i < n; ++i) {
2916 PyObject *item = PyTuple_GET_ITEM(cls, i);
2917 r = PyObject_IsInstance(inst, item);
2918 if (r != 0)
2919 /* either found it, or got an error */
2920 break;
2921 }
2922 Py_LeaveRecursiveCall();
2923 return r;
2924 }
Christian Heimese247f002008-02-14 22:40:11 +00002925 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002926 name = PyString_InternFromString("__instancecheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002927 if (name == NULL)
2928 return -1;
2929 }
2930 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002931 if (checker == NULL && PyErr_Occurred())
2932 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002933 if (checker != NULL) {
2934 PyObject *res;
2935 int ok = -1;
2936 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2937 Py_DECREF(checker);
2938 return ok;
2939 }
2940 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2941 Py_LeaveRecursiveCall();
2942 Py_DECREF(checker);
2943 if (res != NULL) {
2944 ok = PyObject_IsTrue(res);
2945 Py_DECREF(res);
2946 }
2947 return ok;
2948 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002949 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002950}
2951
2952static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002953recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002954{
2955 int retval;
2956
Antoine Pitrou0668c622008-08-26 22:42:08 +00002957 if (PyType_Check(cls) && PyType_Check(derived)) {
2958 /* Fast path (non-recursive) */
2959 return PyType_IsSubtype(
2960 (PyTypeObject *)derived, (PyTypeObject *)cls);
2961 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002962 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002963 if (!check_class(derived,
2964 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002965 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002966
Antoine Pitrou0668c622008-08-26 22:42:08 +00002967 if (!check_class(cls,
2968 "issubclass() arg 2 must be a class"
2969 " or tuple of classes"))
2970 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002971 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002972 }
2973 else {
2974 /* shortcut */
2975 if (!(retval = (derived == cls)))
2976 retval = PyClass_IsSubclass(derived, cls);
2977 }
2978
2979 return retval;
2980}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002981
Brett Cannon4f653312004-03-20 22:52:14 +00002982int
2983PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2984{
Christian Heimese247f002008-02-14 22:40:11 +00002985 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002986 PyObject *t, *v, *tb;
2987 PyObject *checker;
Christian Heimese247f002008-02-14 22:40:11 +00002988
Antoine Pitrou0668c622008-08-26 22:42:08 +00002989 if (PyTuple_Check(cls)) {
2990 Py_ssize_t i;
2991 Py_ssize_t n;
2992 int r = 0;
2993
2994 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2995 return -1;
2996 n = PyTuple_GET_SIZE(cls);
2997 for (i = 0; i < n; ++i) {
2998 PyObject *item = PyTuple_GET_ITEM(cls, i);
2999 r = PyObject_IsSubclass(derived, item);
3000 if (r != 0)
3001 /* either found it, or got an error */
3002 break;
3003 }
3004 Py_LeaveRecursiveCall();
3005 return r;
3006 }
Christian Heimese247f002008-02-14 22:40:11 +00003007 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003008 name = PyString_InternFromString("__subclasscheck__");
Christian Heimese247f002008-02-14 22:40:11 +00003009 if (name == NULL)
3010 return -1;
3011 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003012 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00003013 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003014 PyErr_Restore(t, v, tb);
3015 if (checker != NULL) {
3016 PyObject *res;
3017 int ok = -1;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003018 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
3019 Py_DECREF(checker);
Guido van Rossumb5591132007-09-10 22:36:02 +00003020 return ok;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003021 }
Guido van Rossumb5591132007-09-10 22:36:02 +00003022 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3023 Py_LeaveRecursiveCall();
3024 Py_DECREF(checker);
3025 if (res != NULL) {
3026 ok = PyObject_IsTrue(res);
3027 Py_DECREF(res);
3028 }
3029 return ok;
3030 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003031 return recursive_issubclass(derived, cls);
3032}
3033
3034int
3035_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
3036{
3037 return recursive_isinstance(inst, cls);
3038}
3039
3040int
3041_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
3042{
3043 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00003044}
3045
3046
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003047PyObject *
3048PyObject_GetIter(PyObject *o)
3049{
3050 PyTypeObject *t = o->ob_type;
3051 getiterfunc f = NULL;
3052 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3053 f = t->tp_iter;
3054 if (f == NULL) {
3055 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003056 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003057 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003058 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003059 else {
3060 PyObject *res = (*f)(o);
3061 if (res != NULL && !PyIter_Check(res)) {
3062 PyErr_Format(PyExc_TypeError,
3063 "iter() returned non-iterator "
3064 "of type '%.100s'",
3065 res->ob_type->tp_name);
3066 Py_DECREF(res);
3067 res = NULL;
3068 }
3069 return res;
3070 }
3071}
3072
Tim Petersf4848da2001-05-05 00:14:56 +00003073/* Return next item.
3074 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3075 * If the iteration terminates normally, return NULL and clear the
3076 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3077 * will be false.
3078 * Else return the next object. PyErr_Occurred() will be false.
3079 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003080PyObject *
3081PyIter_Next(PyObject *iter)
3082{
Tim Petersf4848da2001-05-05 00:14:56 +00003083 PyObject *result;
Tim Petersf4848da2001-05-05 00:14:56 +00003084 result = (*iter->ob_type->tp_iternext)(iter);
3085 if (result == NULL &&
3086 PyErr_Occurred() &&
3087 PyErr_ExceptionMatches(PyExc_StopIteration))
3088 PyErr_Clear();
3089 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003090}