blob: 93d73bb148990cba97cf4242715ed332d7d78b97 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Guido van Rossume15dee51995-07-18 14:12:02 +00003#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00004#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00005#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00006#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00007
8#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +00009 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000010
Martin v. Löwis5cb69362006-04-14 09:08:42 +000011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000013
14static PyObject *
Georg Brandlccff7852006-06-18 22:17:29 +000015type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000016{
Georg Brandlccff7852006-06-18 22:17:29 +000017 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000018 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000019}
20
Guido van Rossum052b7e11996-11-11 15:08:19 +000021static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000022null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000023{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000024 if (!PyErr_Occurred())
25 PyErr_SetString(PyExc_SystemError,
26 "null argument to internal routine");
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000030/* Operations on any object */
31
32int
Fred Drake79912472000-07-09 04:06:11 +000033PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034{
35 int r;
36
37 if (o1 == NULL || o2 == NULL) {
38 null_error();
39 return -1;
40 }
41 r = PyObject_Compare(o1, o2);
42 if (PyErr_Occurred())
43 return -1;
44 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000045 return 0;
46}
Guido van Rossume15dee51995-07-18 14:12:02 +000047
48PyObject *
Fred Drake79912472000-07-09 04:06:11 +000049PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000050{
51 PyObject *v;
52
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000053 if (o == NULL)
54 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000055 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
58}
59
Martin v. Löwis18e16552006-02-15 17:27:45 +000060Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000061PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 m = o->ob_type->tp_as_sequence;
71 if (m && m->sq_length)
72 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Jeremy Hylton6253f832000-07-12 12:56:19 +000074 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075}
76
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000077#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000078Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000079PyObject_Length(PyObject *o)
80{
81 return PyObject_Size(o);
82}
83#define PyObject_Length PyObject_Size
84
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000085
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000086/* The length hint function returns a non-negative value from o.__len__()
87 or o.__length_hint__(). If those methods aren't found or return a negative
88 value, then the defaultvalue is returned. This function never fails.
89 Accordingly, it will mask exceptions raised in either method.
90*/
91
92Py_ssize_t
93_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
94{
95 static PyObject *hintstrobj = NULL;
96 PyObject *ro;
97 Py_ssize_t rv;
98
99 /* try o.__len__() */
100 rv = PyObject_Size(o);
101 if (rv >= 0)
102 return rv;
103 if (PyErr_Occurred())
104 PyErr_Clear();
105
106 /* cache a hashed version of the attribute string */
107 if (hintstrobj == NULL) {
108 hintstrobj = PyString_InternFromString("__length_hint__");
109 if (hintstrobj == NULL)
110 goto defaultcase;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000111 }
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000112
113 /* try o.__length_hint__() */
114 ro = PyObject_CallMethodObjArgs(o, hintstrobj, NULL);
115 if (ro == NULL)
116 goto defaultcase;
117 rv = PyInt_AsLong(ro);
118 Py_DECREF(ro);
119 if (rv >= 0)
120 return rv;
121
122defaultcase:
123 if (PyErr_Occurred())
124 PyErr_Clear();
125 return defaultvalue;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000126}
127
Guido van Rossume15dee51995-07-18 14:12:02 +0000128PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000129PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000130{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000131 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000132
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133 if (o == NULL || key == NULL)
134 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000136 m = o->ob_type->tp_as_mapping;
137 if (m && m->mp_subscript)
138 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000139
Guido van Rossum21308241998-08-13 16:44:44 +0000140 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000141 if (PyIndex_Check(key)) {
142 Py_ssize_t key_value;
143 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000144 if (key_value == -1 && PyErr_Occurred())
145 return NULL;
146 return PySequence_GetItem(o, key_value);
147 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000148 else if (o->ob_type->tp_as_sequence->sq_item)
Georg Brandlccff7852006-06-18 22:17:29 +0000149 return type_error("sequence index must "
150 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000151 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000152
Georg Brandlccff7852006-06-18 22:17:29 +0000153 return type_error("'%.200s' object is unsubscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000154}
155
156int
Fred Drake79912472000-07-09 04:06:11 +0000157PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000158{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000159 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000161 if (o == NULL || key == NULL || value == NULL) {
162 null_error();
163 return -1;
164 }
165 m = o->ob_type->tp_as_mapping;
166 if (m && m->mp_ass_subscript)
167 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000168
Guido van Rossum21308241998-08-13 16:44:44 +0000169 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000170 if (PyIndex_Check(key)) {
171 Py_ssize_t key_value;
172 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000173 if (key_value == -1 && PyErr_Occurred())
174 return -1;
175 return PySequence_SetItem(o, key_value, value);
176 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000177 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000178 type_error("sequence index must be "
179 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000180 return -1;
181 }
Guido van Rossum21308241998-08-13 16:44:44 +0000182 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000183
Georg Brandlccff7852006-06-18 22:17:29 +0000184 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000185 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000186}
187
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000188int
Fred Drake79912472000-07-09 04:06:11 +0000189PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000190{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000191 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000193 if (o == NULL || key == NULL) {
194 null_error();
195 return -1;
196 }
197 m = o->ob_type->tp_as_mapping;
198 if (m && m->mp_ass_subscript)
199 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000200
Guido van Rossum21308241998-08-13 16:44:44 +0000201 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000202 if (PyIndex_Check(key)) {
203 Py_ssize_t key_value;
204 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000205 if (key_value == -1 && PyErr_Occurred())
206 return -1;
207 return PySequence_DelItem(o, key_value);
208 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000209 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000210 type_error("sequence index must be "
211 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000212 return -1;
213 }
Guido van Rossum21308241998-08-13 16:44:44 +0000214 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000215
Georg Brandlccff7852006-06-18 22:17:29 +0000216 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000217 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000218}
219
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000220int
221PyObject_DelItemString(PyObject *o, char *key)
222{
223 PyObject *okey;
224 int ret;
225
226 if (o == NULL || key == NULL) {
227 null_error();
228 return -1;
229 }
230 okey = PyString_FromString(key);
231 if (okey == NULL)
232 return -1;
233 ret = PyObject_DelItem(o, okey);
234 Py_DECREF(okey);
235 return ret;
236}
237
Brett Cannonea229bd2006-06-06 18:08:16 +0000238int
239PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000241 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242{
243 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000244 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000245 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246
247 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
248 null_error();
249 return -1;
250 }
251 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000253 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000255 PyErr_SetString(PyExc_TypeError,
256 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000257 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000258 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000260 PyErr_SetString(PyExc_TypeError,
261 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000262 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000266 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267 *buffer = pp;
268 *buffer_len = len;
269 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000270}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000272int
273PyObject_CheckReadBuffer(PyObject *obj)
274{
275 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
276
277 if (pb == NULL ||
278 pb->bf_getreadbuffer == NULL ||
279 pb->bf_getsegcount == NULL ||
280 (*pb->bf_getsegcount)(obj, NULL) != 1)
281 return 0;
282 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283}
284
285int PyObject_AsReadBuffer(PyObject *obj,
286 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288{
289 PyBufferProcs *pb;
290 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000291 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292
293 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
294 null_error();
295 return -1;
296 }
297 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000298 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000299 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000300 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 PyErr_SetString(PyExc_TypeError,
302 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000303 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000305 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000306 PyErr_SetString(PyExc_TypeError,
307 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000308 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000309 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000310 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 *buffer = pp;
314 *buffer_len = len;
315 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316}
317
318int PyObject_AsWriteBuffer(PyObject *obj,
319 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321{
322 PyBufferProcs *pb;
323 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000325
326 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
327 null_error();
328 return -1;
329 }
330 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000331 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000332 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000333 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000334 PyErr_SetString(PyExc_TypeError,
335 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000336 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000337 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000338 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000339 PyErr_SetString(PyExc_TypeError,
340 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000341 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000342 }
343 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
344 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000345 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000346 *buffer = pp;
347 *buffer_len = len;
348 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000349}
350
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000351/* Operations on numbers */
352
353int
Fred Drake79912472000-07-09 04:06:11 +0000354PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000355{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000356 return o && o->ob_type->tp_as_number &&
357 (o->ob_type->tp_as_number->nb_int ||
358 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000359}
360
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000361/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000362
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000363/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000364
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000365#define NB_SLOT(x) offsetof(PyNumberMethods, x)
366#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000367 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000368#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000369 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000370
371/*
372 Calling scheme used for binary operations:
373
374 v w Action
375 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000376 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000377 new old v.op(v,w), coerce(v,w), v.op(v,w)
378 old new w.op(v,w), coerce(v,w), v.op(v,w)
379 old old coerce(v,w), v.op(v,w)
380
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000381 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
382 v->ob_type
383
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000384 Legend:
385 -------
386 * new == new style number
387 * old == old style number
388 * Action indicates the order in which operations are tried until either
389 a valid result is produced or an error occurs.
390
391 */
392
393static PyObject *
394binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000395{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000396 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000397 binaryfunc slotv = NULL;
398 binaryfunc slotw = NULL;
399
400 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000401 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000402 if (w->ob_type != v->ob_type &&
403 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000404 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000405 if (slotw == slotv)
406 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000407 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000408 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000409 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
410 x = slotw(v, w);
411 if (x != Py_NotImplemented)
412 return x;
413 Py_DECREF(x); /* can't do it */
414 slotw = NULL;
415 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000416 x = slotv(v, w);
417 if (x != Py_NotImplemented)
418 return x;
419 Py_DECREF(x); /* can't do it */
420 }
421 if (slotw) {
422 x = slotw(v, w);
423 if (x != Py_NotImplemented)
424 return x;
425 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000426 }
427 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
428 int err = PyNumber_CoerceEx(&v, &w);
429 if (err < 0) {
430 return NULL;
431 }
432 if (err == 0) {
433 PyNumberMethods *mv = v->ob_type->tp_as_number;
434 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000435 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000436 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000437 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000438 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000439 Py_DECREF(v);
440 Py_DECREF(w);
441 return x;
442 }
443 }
444 /* CoerceEx incremented the reference counts */
445 Py_DECREF(v);
446 Py_DECREF(w);
447 }
448 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000449 Py_INCREF(Py_NotImplemented);
450 return Py_NotImplemented;
451}
Guido van Rossum77660912002-04-16 16:32:50 +0000452
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000453static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000454binop_type_error(PyObject *v, PyObject *w, const char *op_name)
455{
456 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000457 "unsupported operand type(s) for %.100s: "
458 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000459 op_name,
460 v->ob_type->tp_name,
461 w->ob_type->tp_name);
462 return NULL;
463}
464
465static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000466binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
467{
468 PyObject *result = binary_op1(v, w, op_slot);
469 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000470 Py_DECREF(result);
471 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000472 }
473 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000474}
475
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000476
477/*
478 Calling scheme used for ternary operations:
479
Guido van Rossum84675ac2001-09-29 01:05:03 +0000480 *** In some cases, w.op is called before v.op; see binary_op1. ***
481
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000482 v w z Action
483 -------------------------------------------------------------------
484 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
485 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
486 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
487 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
488 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
489 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
490 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
491 old old old coerce(v,w,z), v.op(v,w,z)
492
493 Legend:
494 -------
495 * new == new style number
496 * old == old style number
497 * Action indicates the order in which operations are tried until either
498 a valid result is produced or an error occurs.
499 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
500 only if z != Py_None; if z == Py_None, then it is treated as absent
501 variable and only coerce(v,w) is tried.
502
503 */
504
505static PyObject *
506ternary_op(PyObject *v,
507 PyObject *w,
508 PyObject *z,
509 const int op_slot,
510 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000511{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000512 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000513 PyObject *x = NULL;
514 ternaryfunc slotv = NULL;
515 ternaryfunc slotw = NULL;
516 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000517
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000518 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000519 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000520 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000521 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000522 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000523 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000524 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000525 if (slotw == slotv)
526 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000527 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000528 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000529 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
530 x = slotw(v, w, z);
531 if (x != Py_NotImplemented)
532 return x;
533 Py_DECREF(x); /* can't do it */
534 slotw = NULL;
535 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000536 x = slotv(v, w, z);
537 if (x != Py_NotImplemented)
538 return x;
539 Py_DECREF(x); /* can't do it */
540 }
541 if (slotw) {
542 x = slotw(v, w, z);
543 if (x != Py_NotImplemented)
544 return x;
545 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000546 }
547 mz = z->ob_type->tp_as_number;
548 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000549 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000550 if (slotz == slotv || slotz == slotw)
551 slotz = NULL;
552 if (slotz) {
553 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000554 if (x != Py_NotImplemented)
555 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000556 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000557 }
558 }
559
560 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
561 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
562 /* we have an old style operand, coerce */
563 PyObject *v1, *z1, *w2, *z2;
564 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000565
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000566 c = PyNumber_Coerce(&v, &w);
567 if (c != 0)
568 goto error3;
569
570 /* Special case: if the third argument is None, it is
571 treated as absent argument and not coerced. */
572 if (z == Py_None) {
573 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000574 slotz = NB_TERNOP(v->ob_type->tp_as_number,
575 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000576 if (slotz)
577 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000578 else
579 c = -1;
580 }
581 else
582 c = -1;
583 goto error2;
584 }
585 v1 = v;
586 z1 = z;
587 c = PyNumber_Coerce(&v1, &z1);
588 if (c != 0)
589 goto error2;
590 w2 = w;
591 z2 = z1;
592 c = PyNumber_Coerce(&w2, &z2);
593 if (c != 0)
594 goto error1;
595
596 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000597 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
598 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000599 if (slotv)
600 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000601 else
602 c = -1;
603 }
604 else
605 c = -1;
606
607 Py_DECREF(w2);
608 Py_DECREF(z2);
609 error1:
610 Py_DECREF(v1);
611 Py_DECREF(z1);
612 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000613 Py_DECREF(v);
614 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000615 error3:
616 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000617 return x;
618 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000619
620 if (z == Py_None)
621 PyErr_Format(
622 PyExc_TypeError,
623 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000624 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000625 v->ob_type->tp_name,
626 w->ob_type->tp_name);
627 else
628 PyErr_Format(
629 PyExc_TypeError,
630 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000631 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000632 v->ob_type->tp_name,
633 w->ob_type->tp_name,
634 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000635 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000636}
637
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000638#define BINARY_FUNC(func, op, op_name) \
639 PyObject * \
640 func(PyObject *v, PyObject *w) { \
641 return binary_op(v, w, NB_SLOT(op), op_name); \
642 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000643
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000644BINARY_FUNC(PyNumber_Or, nb_or, "|")
645BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
646BINARY_FUNC(PyNumber_And, nb_and, "&")
647BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
648BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
649BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000650BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
651BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000652
653PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000654PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000655{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000656 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
657 if (result == Py_NotImplemented) {
658 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000659 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000660 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000661 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000662 }
Armin Rigofd163f92005-12-29 15:59:19 +0000663 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000664 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000665 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000666}
667
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000668static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000669sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000670{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000671 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000672 if (PyIndex_Check(n)) {
673 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000674 if (count == -1 && PyErr_Occurred())
675 return NULL;
676 }
677 else {
Georg Brandlccff7852006-06-18 22:17:29 +0000678 return type_error("can't multiply sequence by "
679 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000680 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000681 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000682}
683
684PyObject *
685PyNumber_Multiply(PyObject *v, PyObject *w)
686{
687 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
688 if (result == Py_NotImplemented) {
689 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
690 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000691 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000692 if (mv && mv->sq_repeat) {
693 return sequence_repeat(mv->sq_repeat, v, w);
694 }
695 else if (mw && mw->sq_repeat) {
696 return sequence_repeat(mw->sq_repeat, w, v);
697 }
698 result = binop_type_error(v, w, "*");
699 }
700 return result;
701}
702
Guido van Rossume15dee51995-07-18 14:12:02 +0000703PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000704PyNumber_FloorDivide(PyObject *v, PyObject *w)
705{
706 /* XXX tp_flags test */
707 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
708}
709
710PyObject *
711PyNumber_TrueDivide(PyObject *v, PyObject *w)
712{
713 /* XXX tp_flags test */
714 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
715}
716
717PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000718PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000719{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000720 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000721}
722
723PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000724PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000725{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000727}
728
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729/* Binary in-place operators */
730
731/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000732 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000733
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000734 - If the left hand object has the appropriate struct members, and
735 they are filled, call the appropriate function and return the
736 result. No coercion is done on the arguments; the left-hand object
737 is the one the operation is performed on, and it's up to the
738 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000739
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000740 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000741 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000742
743 */
744
Guido van Rossum77660912002-04-16 16:32:50 +0000745#define HASINPLACE(t) \
746 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000747
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000748static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000749binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000750{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000751 PyNumberMethods *mv = v->ob_type->tp_as_number;
752 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000753 binaryfunc slot = NB_BINOP(mv, iop_slot);
754 if (slot) {
755 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000756 if (x != Py_NotImplemented) {
757 return x;
758 }
759 Py_DECREF(x);
760 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000761 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000762 return binary_op1(v, w, op_slot);
763}
764
765static PyObject *
766binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
767 const char *op_name)
768{
769 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
770 if (result == Py_NotImplemented) {
771 Py_DECREF(result);
772 return binop_type_error(v, w, op_name);
773 }
774 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000775}
776
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000777#define INPLACE_BINOP(func, iop, op, op_name) \
778 PyObject * \
779 func(PyObject *v, PyObject *w) { \
780 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000781 }
782
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000783INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
784INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
785INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
786INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
787INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
788INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
789INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000790
791PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000792PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
793{
794 /* XXX tp_flags test */
795 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
796 NB_SLOT(nb_floor_divide), "//=");
797}
798
799PyObject *
800PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
801{
802 /* XXX tp_flags test */
803 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
804 NB_SLOT(nb_true_divide), "/=");
805}
806
807PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000808PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
809{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000810 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
811 NB_SLOT(nb_add));
812 if (result == Py_NotImplemented) {
813 PySequenceMethods *m = v->ob_type->tp_as_sequence;
814 Py_DECREF(result);
815 if (m != NULL) {
816 binaryfunc f = NULL;
817 if (HASINPLACE(v))
818 f = m->sq_inplace_concat;
819 if (f == NULL)
820 f = m->sq_concat;
821 if (f != NULL)
822 return (*f)(v, w);
823 }
824 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000825 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000826 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000827}
828
829PyObject *
830PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
831{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000832 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
833 NB_SLOT(nb_multiply));
834 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000835 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000836 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
837 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
838 Py_DECREF(result);
839 if (mv != NULL) {
840 if (HASINPLACE(v))
841 f = mv->sq_inplace_repeat;
842 if (f == NULL)
843 f = mv->sq_repeat;
844 if (f != NULL)
845 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000846 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000847 else if (mw != NULL) {
848 /* Note that the right hand operand should not be
849 * mutated in this case so sq_inplace_repeat is not
850 * used. */
851 if (mw->sq_repeat)
852 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000853 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000854 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000855 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000856 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000857}
858
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000859PyObject *
860PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
861{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000862 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
863 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000864}
865
866PyObject *
867PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
868{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000869 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
870 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
871 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000872 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000873 else {
874 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
875 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000876}
877
878
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000879/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000880
881PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000882PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000883{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000884 PyNumberMethods *m;
885
886 if (o == NULL)
887 return null_error();
888 m = o->ob_type->tp_as_number;
889 if (m && m->nb_negative)
890 return (*m->nb_negative)(o);
891
Georg Brandlccff7852006-06-18 22:17:29 +0000892 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000893}
894
895PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000896PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000897{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000898 PyNumberMethods *m;
899
900 if (o == NULL)
901 return null_error();
902 m = o->ob_type->tp_as_number;
903 if (m && m->nb_positive)
904 return (*m->nb_positive)(o);
905
Georg Brandlccff7852006-06-18 22:17:29 +0000906 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000907}
908
909PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000910PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000911{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000912 PyNumberMethods *m;
913
914 if (o == NULL)
915 return null_error();
916 m = o->ob_type->tp_as_number;
917 if (m && m->nb_invert)
918 return (*m->nb_invert)(o);
919
Georg Brandlccff7852006-06-18 22:17:29 +0000920 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000921}
922
923PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000924PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000925{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000926 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000927
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 if (o == NULL)
929 return null_error();
930 m = o->ob_type->tp_as_number;
931 if (m && m->nb_absolute)
932 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000933
Georg Brandlccff7852006-06-18 22:17:29 +0000934 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000935}
936
Guido van Rossum9e896b32000-04-05 20:11:21 +0000937/* Add a check for embedded NULL-bytes in the argument. */
938static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000939int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000940{
941 char *end;
942 PyObject *x;
943
944 x = PyInt_FromString((char*)s, &end, 10);
945 if (x == NULL)
946 return NULL;
947 if (end != s + len) {
948 PyErr_SetString(PyExc_ValueError,
949 "null byte in argument for int()");
950 Py_DECREF(x);
951 return NULL;
952 }
953 return x;
954}
955
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000956/* Return a Python Int or Long from the object item
957 Raise TypeError if the result is not an int-or-long
958 or if the object cannot be interpreted as an index.
959*/
960PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000961PyNumber_Index(PyObject *item)
962{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000963 PyObject *result = NULL;
964 if (item == NULL)
965 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +0000966 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000967 Py_INCREF(item);
968 return item;
969 }
970 if (PyIndex_Check(item)) {
971 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000972 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +0000973 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000974 PyErr_Format(PyExc_TypeError,
975 "__index__ returned non-(int,long) " \
976 "(type %.200s)",
977 result->ob_type->tp_name);
978 Py_DECREF(result);
979 return NULL;
980 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000981 }
982 else {
Armin Rigo314861c2006-03-30 14:04:02 +0000983 PyErr_Format(PyExc_TypeError,
984 "'%.200s' object cannot be interpreted "
985 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000986 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000987 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000988}
989
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000990/* Return an error on Overflow only if err is not NULL*/
991
992Py_ssize_t
993PyNumber_AsSsize_t(PyObject *item, PyObject *err)
994{
995 Py_ssize_t result;
996 PyObject *runerr;
997 PyObject *value = PyNumber_Index(item);
998 if (value == NULL)
999 return -1;
1000
1001 /* We're done if PyInt_AsSsize_t() returns without error. */
1002 result = PyInt_AsSsize_t(value);
1003 if (result != -1 || !(runerr = PyErr_Occurred()))
1004 goto finish;
1005
1006 /* Error handling code -- only manage OverflowError differently */
1007 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1008 goto finish;
1009
1010 PyErr_Clear();
1011 /* If no error-handling desired then the default clipping
1012 is sufficient.
1013 */
1014 if (!err) {
1015 assert(PyLong_Check(value));
1016 /* Whether or not it is less than or equal to
1017 zero is determined by the sign of ob_size
1018 */
1019 if (_PyLong_Sign(value) < 0)
1020 result = PY_SSIZE_T_MIN;
1021 else
1022 result = PY_SSIZE_T_MAX;
1023 }
1024 else {
1025 /* Otherwise replace the error with caller's error object. */
1026 PyErr_Format(err,
1027 "cannot fit '%.200s' into an index-sized integer",
1028 item->ob_type->tp_name);
1029 }
1030
1031 finish:
1032 Py_DECREF(value);
1033 return result;
1034}
1035
1036
Guido van Rossume15dee51995-07-18 14:12:02 +00001037PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001038_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1039{
1040 const char *type_name;
1041 static PyObject *int_name = NULL;
1042 if (int_name == NULL) {
1043 int_name = PyString_InternFromString("__int__");
1044 if (int_name == NULL)
1045 return NULL;
1046 }
1047
1048 if (integral && (!PyInt_Check(integral) &&
1049 !PyLong_Check(integral))) {
1050 /* Don't go through tp_as_number->nb_int to avoid
1051 hitting the classic class fallback to __trunc__. */
1052 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1053 if (int_func == NULL) {
1054 PyErr_Clear(); /* Raise a different error. */
1055 goto non_integral_error;
1056 }
1057 Py_DECREF(integral);
1058 integral = PyEval_CallObject(int_func, NULL);
1059 Py_DECREF(int_func);
1060 if (integral && (!PyInt_Check(integral) &&
1061 !PyLong_Check(integral))) {
1062 goto non_integral_error;
1063 }
1064 }
1065 return integral;
1066
1067non_integral_error:
1068 if (PyInstance_Check(integral)) {
1069 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
1070 ->in_class->cl_name);
1071 }
1072 else {
1073 type_name = integral->ob_type->tp_name;
1074 }
1075 PyErr_Format(PyExc_TypeError, error_format, type_name);
1076 Py_DECREF(integral);
1077 return NULL;
1078}
1079
1080
1081PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001082PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001083{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001084 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001085 static PyObject *trunc_name = NULL;
1086 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001087 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001088 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001089
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001090 if (trunc_name == NULL) {
1091 trunc_name = PyString_InternFromString("__trunc__");
1092 if (trunc_name == NULL)
1093 return NULL;
1094 }
1095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001096 if (o == NULL)
1097 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001098 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001099 Py_INCREF(o);
1100 return o;
1101 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001102 m = o->ob_type->tp_as_number;
1103 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001104 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001105 PyObject *res = m->nb_int(o);
1106 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1107 PyErr_Format(PyExc_TypeError,
1108 "__int__ returned non-int (type %.200s)",
1109 res->ob_type->tp_name);
1110 Py_DECREF(res);
1111 return NULL;
1112 }
1113 return res;
1114 }
1115 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001116 PyIntObject *io = (PyIntObject*)o;
1117 return PyInt_FromLong(io->ob_ival);
1118 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001119 trunc_func = PyObject_GetAttr(o, trunc_name);
1120 if (trunc_func) {
1121 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1122 Py_DECREF(trunc_func);
1123 /* __trunc__ is specified to return an Integral type, but
1124 int() needs to return an int. */
1125 return _PyNumber_ConvertIntegralToInt(
1126 truncated,
1127 "__trunc__ returned non-Integral (type %.200s)");
1128 }
1129 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1130
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001131 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001132 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +00001133 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001134#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001135 if (PyUnicode_Check(o))
1136 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1137 PyUnicode_GET_SIZE(o),
1138 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001139#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001140 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001141 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001142
Georg Brandlccff7852006-06-18 22:17:29 +00001143 return type_error("int() argument must be a string or a "
1144 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001145}
1146
Guido van Rossum9e896b32000-04-05 20:11:21 +00001147/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001148static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001149long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001150{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001151 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001152 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001153
Guido van Rossum4c08d552000-03-10 22:55:18 +00001154 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001155 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001156 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001157 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001158 PyErr_SetString(PyExc_ValueError,
1159 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001160 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001161 return NULL;
1162 }
1163 return x;
1164}
1165
Guido van Rossume15dee51995-07-18 14:12:02 +00001166PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001167PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001168{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001169 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001170 static PyObject *trunc_name = NULL;
1171 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001172 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001173 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001174
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001175 if (trunc_name == NULL) {
1176 trunc_name = PyString_InternFromString("__trunc__");
1177 if (trunc_name == NULL)
1178 return NULL;
1179 }
1180
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001181 if (o == NULL)
1182 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001183 m = o->ob_type->tp_as_number;
1184 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001185 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001186 PyObject *res = m->nb_long(o);
1187 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1188 PyErr_Format(PyExc_TypeError,
1189 "__long__ returned non-long (type %.200s)",
1190 res->ob_type->tp_name);
1191 Py_DECREF(res);
1192 return NULL;
1193 }
1194 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001195 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001196 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001197 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001198 trunc_func = PyObject_GetAttr(o, trunc_name);
1199 if (trunc_func) {
1200 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1201 PyObject *int_instance;
1202 Py_DECREF(trunc_func);
1203 /* __trunc__ is specified to return an Integral type,
1204 but long() needs to return a long. */
1205 int_instance = _PyNumber_ConvertIntegralToInt(
1206 truncated,
1207 "__trunc__ returned non-Integral (type %.200s)");
1208 if (int_instance && PyInt_Check(int_instance)) {
1209 /* Make sure that long() returns a long instance. */
1210 long value = PyInt_AS_LONG(int_instance);
1211 Py_DECREF(int_instance);
1212 return PyLong_FromLong(value);
1213 }
1214 return int_instance;
1215 }
1216 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1217
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001218 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001219 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001220 * doesn't do. In particular long('9.5') must raise an
1221 * exception, not truncate the float.
1222 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001223 return long_from_string(PyString_AS_STRING(o),
1224 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001225#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001226 if (PyUnicode_Check(o))
1227 /* The above check is done in PyLong_FromUnicode(). */
1228 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1229 PyUnicode_GET_SIZE(o),
1230 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001231#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001232 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1233 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001234
Georg Brandlccff7852006-06-18 22:17:29 +00001235 return type_error("long() argument must be a string or a "
1236 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001237}
1238
1239PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001240PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001241{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001243
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001244 if (o == NULL)
1245 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001246 m = o->ob_type->tp_as_number;
1247 if (m && m->nb_float) { /* This should include subclasses of float */
1248 PyObject *res = m->nb_float(o);
1249 if (res && !PyFloat_Check(res)) {
1250 PyErr_Format(PyExc_TypeError,
1251 "__float__ returned non-float (type %.200s)",
1252 res->ob_type->tp_name);
1253 Py_DECREF(res);
1254 return NULL;
1255 }
1256 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001257 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001258 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001259 PyFloatObject *po = (PyFloatObject *)o;
1260 return PyFloat_FromDouble(po->ob_fval);
1261 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001262 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001263}
1264
Eric Smith5e527eb2008-02-10 01:36:53 +00001265PyObject *
1266PyNumber_ToBase(PyObject *n, int base)
1267{
1268 PyObject *res = NULL;
1269 PyObject *index = PyNumber_Index(n);
1270
1271 if (!index)
1272 return NULL;
1273 if (PyLong_Check(index))
1274 res = _PyLong_Format(index, base, 0, 1);
1275 else if (PyInt_Check(index))
1276 res = _PyInt_Format((PyIntObject*)index, base, 1);
1277 else
1278 assert("PyNumber_ToBase: not long or int");
1279 Py_DECREF(index);
1280 return res;
1281}
1282
1283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001284/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001285
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001286int
Fred Drake79912472000-07-09 04:06:11 +00001287PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001288{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001289 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001290 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001291 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001292 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001293 return s != NULL && s->ob_type->tp_as_sequence &&
1294 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001295}
1296
Martin v. Löwis18e16552006-02-15 17:27:45 +00001297Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001298PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001299{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001300 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001301
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001302 if (s == NULL) {
1303 null_error();
1304 return -1;
1305 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001306
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307 m = s->ob_type->tp_as_sequence;
1308 if (m && m->sq_length)
1309 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001310
Georg Brandlb0061c82006-08-08 11:56:21 +00001311 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001313}
1314
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001315#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001316Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001317PySequence_Length(PyObject *s)
1318{
1319 return PySequence_Size(s);
1320}
1321#define PySequence_Length PySequence_Size
1322
Guido van Rossume15dee51995-07-18 14:12:02 +00001323PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001324PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001325{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 if (s == NULL || o == NULL)
1329 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 m = s->ob_type->tp_as_sequence;
1332 if (m && m->sq_concat)
1333 return m->sq_concat(s, o);
1334
Armin Rigofd163f92005-12-29 15:59:19 +00001335 /* Instances of user classes defining an __add__() method only
1336 have an nb_add slot, not an sq_concat slot. So we fall back
1337 to nb_add if both arguments appear to be sequences. */
1338 if (PySequence_Check(s) && PySequence_Check(o)) {
1339 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1340 if (result != Py_NotImplemented)
1341 return result;
1342 Py_DECREF(result);
1343 }
Georg Brandlccff7852006-06-18 22:17:29 +00001344 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001345}
1346
1347PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001348PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001349{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001350 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001351
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001352 if (o == NULL)
1353 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001354
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001355 m = o->ob_type->tp_as_sequence;
1356 if (m && m->sq_repeat)
1357 return m->sq_repeat(o, count);
1358
Armin Rigofd163f92005-12-29 15:59:19 +00001359 /* Instances of user classes defining a __mul__() method only
1360 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1361 to nb_multiply if o appears to be a sequence. */
1362 if (PySequence_Check(o)) {
1363 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001364 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001365 if (n == NULL)
1366 return NULL;
1367 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1368 Py_DECREF(n);
1369 if (result != Py_NotImplemented)
1370 return result;
1371 Py_DECREF(result);
1372 }
Georg Brandlccff7852006-06-18 22:17:29 +00001373 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001374}
1375
1376PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001377PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1378{
1379 PySequenceMethods *m;
1380
1381 if (s == NULL || o == NULL)
1382 return null_error();
1383
1384 m = s->ob_type->tp_as_sequence;
1385 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1386 return m->sq_inplace_concat(s, o);
1387 if (m && m->sq_concat)
1388 return m->sq_concat(s, o);
1389
Armin Rigofd163f92005-12-29 15:59:19 +00001390 if (PySequence_Check(s) && PySequence_Check(o)) {
1391 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1392 NB_SLOT(nb_add));
1393 if (result != Py_NotImplemented)
1394 return result;
1395 Py_DECREF(result);
1396 }
Georg Brandlccff7852006-06-18 22:17:29 +00001397 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001398}
1399
1400PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001401PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001402{
1403 PySequenceMethods *m;
1404
1405 if (o == NULL)
1406 return null_error();
1407
1408 m = o->ob_type->tp_as_sequence;
1409 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1410 return m->sq_inplace_repeat(o, count);
1411 if (m && m->sq_repeat)
1412 return m->sq_repeat(o, count);
1413
Armin Rigofd163f92005-12-29 15:59:19 +00001414 if (PySequence_Check(o)) {
1415 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001416 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001417 if (n == NULL)
1418 return NULL;
1419 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1420 NB_SLOT(nb_multiply));
1421 Py_DECREF(n);
1422 if (result != Py_NotImplemented)
1423 return result;
1424 Py_DECREF(result);
1425 }
Georg Brandlccff7852006-06-18 22:17:29 +00001426 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001427}
1428
1429PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001430PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001431{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001432 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001433
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001434 if (s == NULL)
1435 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001436
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 m = s->ob_type->tp_as_sequence;
1438 if (m && m->sq_item) {
1439 if (i < 0) {
1440 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001441 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442 if (l < 0)
1443 return NULL;
1444 i += l;
1445 }
1446 }
1447 return m->sq_item(s, i);
1448 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001449
Georg Brandlccff7852006-06-18 22:17:29 +00001450 return type_error("'%.200s' object is unindexable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001451}
1452
1453PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001454PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001455{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001456 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001457 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001458
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001459 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001460
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001461 m = s->ob_type->tp_as_sequence;
1462 if (m && m->sq_slice) {
1463 if (i1 < 0 || i2 < 0) {
1464 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001465 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 if (l < 0)
1467 return NULL;
1468 if (i1 < 0)
1469 i1 += l;
1470 if (i2 < 0)
1471 i2 += l;
1472 }
1473 }
1474 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001475 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1476 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001477 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001478 if (!slice)
1479 return NULL;
1480 res = mp->mp_subscript(s, slice);
1481 Py_DECREF(slice);
1482 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001483 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001484
Georg Brandlccff7852006-06-18 22:17:29 +00001485 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001486}
1487
1488int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001489PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001490{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001491 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001492
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001493 if (s == NULL) {
1494 null_error();
1495 return -1;
1496 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001497
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001498 m = s->ob_type->tp_as_sequence;
1499 if (m && m->sq_ass_item) {
1500 if (i < 0) {
1501 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001502 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001503 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001504 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001505 i += l;
1506 }
1507 }
1508 return m->sq_ass_item(s, i, o);
1509 }
1510
Georg Brandlccff7852006-06-18 22:17:29 +00001511 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001512 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001513}
1514
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001515int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001516PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001517{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001518 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001519
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001520 if (s == NULL) {
1521 null_error();
1522 return -1;
1523 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001524
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001525 m = s->ob_type->tp_as_sequence;
1526 if (m && m->sq_ass_item) {
1527 if (i < 0) {
1528 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001529 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001530 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001531 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001532 i += l;
1533 }
1534 }
1535 return m->sq_ass_item(s, i, (PyObject *)NULL);
1536 }
1537
Georg Brandlccff7852006-06-18 22:17:29 +00001538 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001539 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001540}
1541
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001542int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001543PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001544{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001545 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001546 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001547
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001548 if (s == NULL) {
1549 null_error();
1550 return -1;
1551 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001552
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001553 m = s->ob_type->tp_as_sequence;
1554 if (m && m->sq_ass_slice) {
1555 if (i1 < 0 || i2 < 0) {
1556 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001557 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001558 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001559 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001560 if (i1 < 0)
1561 i1 += l;
1562 if (i2 < 0)
1563 i2 += l;
1564 }
1565 }
1566 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001567 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1568 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001569 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001570 if (!slice)
1571 return -1;
1572 res = mp->mp_ass_subscript(s, slice, o);
1573 Py_DECREF(slice);
1574 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001575 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001576
Georg Brandlccff7852006-06-18 22:17:29 +00001577 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001578 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001579}
1580
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001581int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001582PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001583{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001584 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001585
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001586 if (s == NULL) {
1587 null_error();
1588 return -1;
1589 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001590
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001591 m = s->ob_type->tp_as_sequence;
1592 if (m && m->sq_ass_slice) {
1593 if (i1 < 0 || i2 < 0) {
1594 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001595 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001596 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001597 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001598 if (i1 < 0)
1599 i1 += l;
1600 if (i2 < 0)
1601 i2 += l;
1602 }
1603 }
1604 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1605 }
Georg Brandlccff7852006-06-18 22:17:29 +00001606 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001607 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001608}
1609
Guido van Rossume15dee51995-07-18 14:12:02 +00001610PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001611PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001612{
Tim Peters6912d4d2001-05-05 03:56:37 +00001613 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001614 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001615 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001616 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001617
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001618 if (v == NULL)
1619 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001620
Tim Peters6912d4d2001-05-05 03:56:37 +00001621 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001622 if (PyTuple_CheckExact(v)) {
1623 /* Note that we can't know whether it's safe to return
1624 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001625 to exact tuples here. In contrast, lists always make
1626 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001627 Py_INCREF(v);
1628 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001629 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001630 if (PyList_Check(v))
1631 return PyList_AsTuple(v);
1632
Tim Peters6912d4d2001-05-05 03:56:37 +00001633 /* Get iterator. */
1634 it = PyObject_GetIter(v);
1635 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001636 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001637
Tim Peters6912d4d2001-05-05 03:56:37 +00001638 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00001639 n = _PyObject_LengthHint(v, 10);
Tim Peters6912d4d2001-05-05 03:56:37 +00001640 result = PyTuple_New(n);
1641 if (result == NULL)
1642 goto Fail;
1643
1644 /* Fill the tuple. */
1645 for (j = 0; ; ++j) {
1646 PyObject *item = PyIter_Next(it);
1647 if (item == NULL) {
1648 if (PyErr_Occurred())
1649 goto Fail;
1650 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001651 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001652 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001653 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001654 /* The over-allocation strategy can grow a bit faster
1655 than for lists because unlike lists the
1656 over-allocation isn't permanent -- we reclaim
1657 the excess before the end of this routine.
1658 So, grow by ten and then add 25%.
1659 */
1660 n += 10;
1661 n += n >> 2;
1662 if (n < oldn) {
1663 /* Check for overflow */
1664 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001665 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001666 goto Fail;
1667 }
Tim Peters4324aa32001-05-28 22:30:08 +00001668 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001669 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001670 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001671 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001672 }
1673 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001674 }
1675
Tim Peters6912d4d2001-05-05 03:56:37 +00001676 /* Cut tuple back if guess was too large. */
1677 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001678 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001679 goto Fail;
1680
1681 Py_DECREF(it);
1682 return result;
1683
1684Fail:
1685 Py_XDECREF(result);
1686 Py_DECREF(it);
1687 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001688}
1689
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001690PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001691PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001692{
Tim Petersf553f892001-05-01 20:45:31 +00001693 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001694 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001695
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001696 if (v == NULL)
1697 return null_error();
1698
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001699 result = PyList_New(0);
1700 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001701 return NULL;
1702
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001703 rv = _PyList_Extend((PyListObject *)result, v);
1704 if (rv == NULL) {
1705 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001706 return NULL;
1707 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001708 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001709 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001710}
1711
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001712PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001713PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001714{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001715 PyObject *it;
1716
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001717 if (v == NULL)
1718 return null_error();
1719
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001720 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001721 Py_INCREF(v);
1722 return v;
1723 }
1724
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001725 it = PyObject_GetIter(v);
1726 if (it == NULL) {
1727 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00001728 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001729 return NULL;
1730 }
1731
Raymond Hettinger193814c2004-12-18 19:00:59 +00001732 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001733 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001734
1735 return v;
1736}
1737
Tim Peters16a77ad2001-09-08 04:00:12 +00001738/* Iterate over seq. Result depends on the operation:
1739 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1740 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1741 set ValueError and return -1 if none found; also return -1 on error.
1742 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1743*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001744Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001745_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001746{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001747 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001748 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1749 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001750
Tim Peters16a77ad2001-09-08 04:00:12 +00001751 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001752 null_error();
1753 return -1;
1754 }
Tim Peters75f8e352001-05-05 11:33:43 +00001755
Tim Peters16a77ad2001-09-08 04:00:12 +00001756 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001757 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00001758 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001759 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001760 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001761
Tim Peters16a77ad2001-09-08 04:00:12 +00001762 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001763 for (;;) {
1764 int cmp;
1765 PyObject *item = PyIter_Next(it);
1766 if (item == NULL) {
1767 if (PyErr_Occurred())
1768 goto Fail;
1769 break;
1770 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001771
1772 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001773 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001774 if (cmp < 0)
1775 goto Fail;
1776 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001777 switch (operation) {
1778 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00001779 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001780 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00001781 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001782 goto Fail;
1783 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001784 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001785 break;
1786
1787 case PY_ITERSEARCH_INDEX:
1788 if (wrapped) {
1789 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00001790 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001791 goto Fail;
1792 }
1793 goto Done;
1794
1795 case PY_ITERSEARCH_CONTAINS:
1796 n = 1;
1797 goto Done;
1798
1799 default:
1800 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001801 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001802 }
1803
1804 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00001805 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00001806 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001807 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00001808 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001809 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001810
1811 if (operation != PY_ITERSEARCH_INDEX)
1812 goto Done;
1813
1814 PyErr_SetString(PyExc_ValueError,
1815 "sequence.index(x): x not in sequence");
1816 /* fall into failure code */
1817Fail:
1818 n = -1;
1819 /* fall through */
1820Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001821 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001822 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001823
Guido van Rossume15dee51995-07-18 14:12:02 +00001824}
1825
Tim Peters16a77ad2001-09-08 04:00:12 +00001826/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001827Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001828PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001829{
Tim Peters16a77ad2001-09-08 04:00:12 +00001830 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001831}
1832
Tim Peterscb8d3682001-05-05 21:05:01 +00001833/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001834 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001835 */
1836int
1837PySequence_Contains(PyObject *seq, PyObject *ob)
1838{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001839 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001840 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1841 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1842 if (sqm != NULL && sqm->sq_contains != NULL)
1843 return (*sqm->sq_contains)(seq, ob);
1844 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001845 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1846 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001847}
1848
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001849/* Backwards compatibility */
1850#undef PySequence_In
1851int
Fred Drake79912472000-07-09 04:06:11 +00001852PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001853{
1854 return PySequence_Contains(w, v);
1855}
1856
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001857Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001858PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001859{
Tim Peters16a77ad2001-09-08 04:00:12 +00001860 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001861}
1862
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001863/* Operations on mappings */
1864
1865int
Fred Drake79912472000-07-09 04:06:11 +00001866PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001867{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001868 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001869 return PyObject_HasAttrString(o, "__getitem__");
1870
1871 return o && o->ob_type->tp_as_mapping &&
1872 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001873 !(o->ob_type->tp_as_sequence &&
1874 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001875}
1876
Martin v. Löwis18e16552006-02-15 17:27:45 +00001877Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001878PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001879{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001880 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001881
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001882 if (o == NULL) {
1883 null_error();
1884 return -1;
1885 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001886
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001887 m = o->ob_type->tp_as_mapping;
1888 if (m && m->mp_length)
1889 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001890
Georg Brandlb0061c82006-08-08 11:56:21 +00001891 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001892 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001893}
1894
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001895#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001896Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001897PyMapping_Length(PyObject *o)
1898{
1899 return PyMapping_Size(o);
1900}
1901#define PyMapping_Length PyMapping_Size
1902
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001903PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001904PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001905{
1906 PyObject *okey, *r;
1907
1908 if (key == NULL)
1909 return null_error();
1910
1911 okey = PyString_FromString(key);
1912 if (okey == NULL)
1913 return NULL;
1914 r = PyObject_GetItem(o, okey);
1915 Py_DECREF(okey);
1916 return r;
1917}
1918
1919int
Fred Drake79912472000-07-09 04:06:11 +00001920PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001921{
1922 PyObject *okey;
1923 int r;
1924
1925 if (key == NULL) {
1926 null_error();
1927 return -1;
1928 }
1929
1930 okey = PyString_FromString(key);
1931 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001932 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001933 r = PyObject_SetItem(o, okey, value);
1934 Py_DECREF(okey);
1935 return r;
1936}
1937
1938int
Fred Drake79912472000-07-09 04:06:11 +00001939PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001940{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001941 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001942
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001943 v = PyMapping_GetItemString(o, key);
1944 if (v) {
1945 Py_DECREF(v);
1946 return 1;
1947 }
1948 PyErr_Clear();
1949 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001950}
1951
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001952int
Fred Drake79912472000-07-09 04:06:11 +00001953PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001954{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001955 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001956
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001957 v = PyObject_GetItem(o, key);
1958 if (v) {
1959 Py_DECREF(v);
1960 return 1;
1961 }
1962 PyErr_Clear();
1963 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001964}
1965
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001966/* Operations on callable objects */
1967
1968/* XXX PyCallable_Check() is in object.c */
1969
Guido van Rossume15dee51995-07-18 14:12:02 +00001970PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001971PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001972{
Guido van Rossum5560b742001-09-14 16:47:50 +00001973 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001974}
Guido van Rossume15dee51995-07-18 14:12:02 +00001975
1976PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001977PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1978{
1979 ternaryfunc call;
1980
1981 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00001982 PyObject *result;
1983 if (Py_EnterRecursiveCall(" while calling a Python object"))
1984 return NULL;
1985 result = (*call)(func, arg, kw);
1986 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001987 if (result == NULL && !PyErr_Occurred())
1988 PyErr_SetString(
1989 PyExc_SystemError,
1990 "NULL result without error in PyObject_Call");
1991 return result;
1992 }
Georg Brandlccff7852006-06-18 22:17:29 +00001993 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00001994 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001995 return NULL;
1996}
1997
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001998static PyObject*
1999call_function_tail(PyObject *callable, PyObject *args)
2000{
2001 PyObject *retval;
2002
2003 if (args == NULL)
2004 return NULL;
2005
2006 if (!PyTuple_Check(args)) {
2007 PyObject *a;
2008
2009 a = PyTuple_New(1);
2010 if (a == NULL) {
2011 Py_DECREF(args);
2012 return NULL;
2013 }
2014 PyTuple_SET_ITEM(a, 0, args);
2015 args = a;
2016 }
2017 retval = PyObject_Call(callable, args, NULL);
2018
2019 Py_DECREF(args);
2020
2021 return retval;
2022}
2023
Tim Peters6d6c1a32001-08-02 04:15:00 +00002024PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002025PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002026{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002027 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002028 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002029
Fred Drakeb92cf062001-10-27 06:16:31 +00002030 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002031 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002032
Fred Drakeb92cf062001-10-27 06:16:31 +00002033 if (format && *format) {
2034 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002035 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002036 va_end(va);
2037 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002038 else
2039 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002040
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002041 return call_function_tail(callable, args);
2042}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002043
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002044PyObject *
2045_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2046{
2047 va_list va;
2048 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002049
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002050 if (callable == NULL)
2051 return null_error();
2052
2053 if (format && *format) {
2054 va_start(va, format);
2055 args = _Py_VaBuildValue_SizeT(format, va);
2056 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002057 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002058 else
2059 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002060
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002061 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002062}
2063
2064PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002065PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002066{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002067 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002068 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002069 PyObject *func = NULL;
2070 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002071
Fred Drakeb92cf062001-10-27 06:16:31 +00002072 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002073 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002074
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002075 func = PyObject_GetAttrString(o, name);
2076 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002077 PyErr_SetString(PyExc_AttributeError, name);
2078 return 0;
2079 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002080
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002081 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002082 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002083 goto exit;
2084 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002085
Fred Drakeb92cf062001-10-27 06:16:31 +00002086 if (format && *format) {
2087 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002088 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002089 va_end(va);
2090 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002091 else
2092 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002093
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002094 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002095
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002096 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002097 /* args gets consumed in call_function_tail */
2098 Py_XDECREF(func);
2099
2100 return retval;
2101}
2102
2103PyObject *
2104_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2105{
2106 va_list va;
2107 PyObject *args;
2108 PyObject *func = NULL;
2109 PyObject *retval = NULL;
2110
2111 if (o == NULL || name == NULL)
2112 return null_error();
2113
2114 func = PyObject_GetAttrString(o, name);
2115 if (func == NULL) {
2116 PyErr_SetString(PyExc_AttributeError, name);
2117 return 0;
2118 }
2119
2120 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002121 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002122 goto exit;
2123 }
2124
2125 if (format && *format) {
2126 va_start(va, format);
2127 args = _Py_VaBuildValue_SizeT(format, va);
2128 va_end(va);
2129 }
2130 else
2131 args = PyTuple_New(0);
2132
2133 retval = call_function_tail(func, args);
2134
2135 exit:
2136 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002137 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002138
2139 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002140}
Guido van Rossum823649d2001-03-21 18:40:58 +00002141
2142
Fred Drakeb421b8c2001-10-26 16:21:32 +00002143static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002144objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002145{
2146 int i, n = 0;
2147 va_list countva;
2148 PyObject *result, *tmp;
2149
2150#ifdef VA_LIST_IS_ARRAY
2151 memcpy(countva, va, sizeof(va_list));
2152#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002153#ifdef __va_copy
2154 __va_copy(countva, va);
2155#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002156 countva = va;
2157#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002158#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002159
2160 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2161 ++n;
2162 result = PyTuple_New(n);
2163 if (result != NULL && n > 0) {
2164 for (i = 0; i < n; ++i) {
2165 tmp = (PyObject *)va_arg(va, PyObject *);
2166 PyTuple_SET_ITEM(result, i, tmp);
2167 Py_INCREF(tmp);
2168 }
2169 }
2170 return result;
2171}
2172
2173PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002174PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002175{
2176 PyObject *args, *tmp;
2177 va_list vargs;
2178
2179 if (callable == NULL || name == NULL)
2180 return null_error();
2181
2182 callable = PyObject_GetAttr(callable, name);
2183 if (callable == NULL)
2184 return NULL;
2185
2186 /* count the args */
2187 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002188 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002189 va_end(vargs);
2190 if (args == NULL) {
2191 Py_DECREF(callable);
2192 return NULL;
2193 }
2194 tmp = PyObject_Call(callable, args, NULL);
2195 Py_DECREF(args);
2196 Py_DECREF(callable);
2197
2198 return tmp;
2199}
2200
2201PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002202PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002203{
2204 PyObject *args, *tmp;
2205 va_list vargs;
2206
2207 if (callable == NULL)
2208 return null_error();
2209
2210 /* count the args */
2211 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002212 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002213 va_end(vargs);
2214 if (args == NULL)
2215 return NULL;
2216 tmp = PyObject_Call(callable, args, NULL);
2217 Py_DECREF(args);
2218
2219 return tmp;
2220}
2221
2222
Guido van Rossum823649d2001-03-21 18:40:58 +00002223/* isinstance(), issubclass() */
2224
Barry Warsawf16951c2002-04-23 22:45:44 +00002225/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2226 * state that will almost never happen.
2227 *
2228 * 0. creating the __bases__ static string could get a MemoryError
2229 * 1. getattr(cls, '__bases__') could raise an AttributeError
2230 * 2. getattr(cls, '__bases__') could raise some other exception
2231 * 3. getattr(cls, '__bases__') could return a tuple
2232 * 4. getattr(cls, '__bases__') could return something other than a tuple
2233 *
2234 * Only state #3 is a non-error state and only it returns a non-NULL object
2235 * (it returns the retrieved tuple).
2236 *
2237 * Any raised AttributeErrors are masked by clearing the exception and
2238 * returning NULL. If an object other than a tuple comes out of __bases__,
2239 * then again, the return value is NULL. So yes, these two situations
2240 * produce exactly the same results: NULL is returned and no error is set.
2241 *
2242 * If some exception other than AttributeError is raised, then NULL is also
2243 * returned, but the exception is not cleared. That's because we want the
2244 * exception to be propagated along.
2245 *
2246 * Callers are expected to test for PyErr_Occurred() when the return value
2247 * is NULL to decide whether a valid exception should be propagated or not.
2248 * When there's no exception to propagate, it's customary for the caller to
2249 * set a TypeError.
2250 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002251static PyObject *
2252abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002253{
2254 static PyObject *__bases__ = NULL;
2255 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002256
2257 if (__bases__ == NULL) {
Christian Heimesd7e1b2b2008-01-28 02:07:53 +00002258 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002259 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002260 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002261 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002262 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002263 if (bases == NULL) {
2264 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2265 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002266 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002267 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002268 if (!PyTuple_Check(bases)) {
2269 Py_DECREF(bases);
2270 return NULL;
2271 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002272 return bases;
2273}
2274
2275
2276static int
2277abstract_issubclass(PyObject *derived, PyObject *cls)
2278{
2279 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002280 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002281 int r = 0;
2282
2283
Guido van Rossum823649d2001-03-21 18:40:58 +00002284 if (derived == cls)
2285 return 1;
2286
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002287 if (PyTuple_Check(cls)) {
2288 /* Not a general sequence -- that opens up the road to
2289 recursion and stack overflow. */
2290 n = PyTuple_GET_SIZE(cls);
2291 for (i = 0; i < n; i++) {
2292 if (derived == PyTuple_GET_ITEM(cls, i))
2293 return 1;
2294 }
2295 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002296 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002297 if (bases == NULL) {
2298 if (PyErr_Occurred())
2299 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002300 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002301 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002302 n = PyTuple_GET_SIZE(bases);
2303 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002304 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002305 if (r != 0)
2306 break;
2307 }
2308
2309 Py_DECREF(bases);
2310
2311 return r;
2312}
2313
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002314static int
2315check_class(PyObject *cls, const char *error)
2316{
2317 PyObject *bases = abstract_get_bases(cls);
2318 if (bases == NULL) {
2319 /* Do not mask errors. */
2320 if (!PyErr_Occurred())
2321 PyErr_SetString(PyExc_TypeError, error);
2322 return 0;
2323 }
2324 Py_DECREF(bases);
2325 return -1;
2326}
2327
Brett Cannon4f653312004-03-20 22:52:14 +00002328static int
2329recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002330{
2331 PyObject *icls;
2332 static PyObject *__class__ = NULL;
2333 int retval = 0;
2334
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002335 if (__class__ == NULL) {
Christian Heimesd7e1b2b2008-01-28 02:07:53 +00002336 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002337 if (__class__ == NULL)
2338 return -1;
2339 }
2340
Neil Schemenauer6b471292001-10-18 03:18:43 +00002341 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2342 PyObject *inclass =
2343 (PyObject*)((PyInstanceObject*)inst)->in_class;
2344 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002345 }
2346 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002347 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002348 if (retval == 0) {
2349 PyObject *c = PyObject_GetAttr(inst, __class__);
2350 if (c == NULL) {
2351 PyErr_Clear();
2352 }
2353 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002354 if (c != (PyObject *)(inst->ob_type) &&
2355 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002356 retval = PyType_IsSubtype(
2357 (PyTypeObject *)c,
2358 (PyTypeObject *)cls);
2359 Py_DECREF(c);
2360 }
2361 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002362 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002363 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002364 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002365
Brett Cannon4f653312004-03-20 22:52:14 +00002366 if (!recursion_depth) {
2367 PyErr_SetString(PyExc_RuntimeError,
2368 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002369 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002370 }
2371
Guido van Rossum03290ec2001-10-07 20:54:12 +00002372 n = PyTuple_GET_SIZE(cls);
2373 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002374 retval = recursive_isinstance(
2375 inst,
2376 PyTuple_GET_ITEM(cls, i),
2377 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002378 if (retval != 0)
2379 break;
2380 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002381 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002382 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002383 if (!check_class(cls,
2384 "isinstance() arg 2 must be a class, type,"
2385 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002386 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002387 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002388 if (icls == NULL) {
2389 PyErr_Clear();
2390 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002391 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002392 else {
2393 retval = abstract_issubclass(icls, cls);
2394 Py_DECREF(icls);
2395 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002396 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002397
Guido van Rossum823649d2001-03-21 18:40:58 +00002398 return retval;
2399}
2400
2401int
Brett Cannon4f653312004-03-20 22:52:14 +00002402PyObject_IsInstance(PyObject *inst, PyObject *cls)
2403{
Christian Heimese247f002008-02-14 22:40:11 +00002404 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002405 PyObject *t, *v, *tb;
2406 PyObject *checker;
2407 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00002408
2409 if (name == NULL) {
2410 name = PyString_InternFromString("__instancecheck__");
2411 if (name == NULL)
2412 return -1;
2413 }
2414 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00002415 PyErr_Restore(t, v, tb);
2416 if (checker != NULL) {
2417 PyObject *res;
2418 int ok = -1;
2419 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2420 Py_DECREF(checker);
2421 return ok;
2422 }
2423 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2424 Py_LeaveRecursiveCall();
2425 Py_DECREF(checker);
2426 if (res != NULL) {
2427 ok = PyObject_IsTrue(res);
2428 Py_DECREF(res);
2429 }
2430 return ok;
2431 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002432 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002433}
2434
2435static int
2436recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002437{
2438 int retval;
2439
2440 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002441 if (!check_class(derived,
2442 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002443 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002444
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002445 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002446 Py_ssize_t i;
2447 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002448
2449 if (!recursion_depth) {
2450 PyErr_SetString(PyExc_RuntimeError,
2451 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002452 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002453 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002454 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002455 retval = recursive_issubclass(
2456 derived,
2457 PyTuple_GET_ITEM(cls, i),
2458 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002459 if (retval != 0) {
2460 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002461 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002462 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002463 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002464 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002465 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002466 else {
2467 if (!check_class(cls,
2468 "issubclass() arg 2 must be a class"
2469 " or tuple of classes"))
2470 return -1;
2471 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002472
2473 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002474 }
2475 else {
2476 /* shortcut */
2477 if (!(retval = (derived == cls)))
2478 retval = PyClass_IsSubclass(derived, cls);
2479 }
2480
2481 return retval;
2482}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002483
Brett Cannon4f653312004-03-20 22:52:14 +00002484int
2485PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2486{
Christian Heimese247f002008-02-14 22:40:11 +00002487 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002488 PyObject *t, *v, *tb;
2489 PyObject *checker;
2490 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00002491
2492 if (name == NULL) {
2493 name = PyString_InternFromString("__subclasscheck__");
2494 if (name == NULL)
2495 return -1;
2496 }
2497 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00002498 PyErr_Restore(t, v, tb);
2499 if (checker != NULL) {
2500 PyObject *res;
2501 int ok = -1;
2502 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2503 return ok;
2504 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
2505 Py_LeaveRecursiveCall();
2506 Py_DECREF(checker);
2507 if (res != NULL) {
2508 ok = PyObject_IsTrue(res);
2509 Py_DECREF(res);
2510 }
2511 return ok;
2512 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002513 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002514}
2515
2516
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002517PyObject *
2518PyObject_GetIter(PyObject *o)
2519{
2520 PyTypeObject *t = o->ob_type;
2521 getiterfunc f = NULL;
2522 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2523 f = t->tp_iter;
2524 if (f == NULL) {
2525 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002526 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00002527 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002528 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002529 else {
2530 PyObject *res = (*f)(o);
2531 if (res != NULL && !PyIter_Check(res)) {
2532 PyErr_Format(PyExc_TypeError,
2533 "iter() returned non-iterator "
2534 "of type '%.100s'",
2535 res->ob_type->tp_name);
2536 Py_DECREF(res);
2537 res = NULL;
2538 }
2539 return res;
2540 }
2541}
2542
Tim Petersf4848da2001-05-05 00:14:56 +00002543/* Return next item.
2544 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2545 * If the iteration terminates normally, return NULL and clear the
2546 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2547 * will be false.
2548 * Else return the next object. PyErr_Occurred() will be false.
2549 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002550PyObject *
2551PyIter_Next(PyObject *iter)
2552{
Tim Petersf4848da2001-05-05 00:14:56 +00002553 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002554 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002555 result = (*iter->ob_type->tp_iternext)(iter);
2556 if (result == NULL &&
2557 PyErr_Occurred() &&
2558 PyErr_ExceptionMatches(PyExc_StopIteration))
2559 PyErr_Clear();
2560 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002561}