blob: b794974b021238a5dea0f40424f331869760e2c5 [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
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000011/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000012
13static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000014type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000015{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000016 PyErr_SetString(PyExc_TypeError, msg);
17 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000018}
19
Guido van Rossum052b7e11996-11-11 15:08:19 +000020static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000021null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000022{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000023 if (!PyErr_Occurred())
24 PyErr_SetString(PyExc_SystemError,
25 "null argument to internal routine");
26 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000027}
28
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000029/* Operations on any object */
30
31int
Fred Drake79912472000-07-09 04:06:11 +000032PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000033{
34 int r;
35
36 if (o1 == NULL || o2 == NULL) {
37 null_error();
38 return -1;
39 }
40 r = PyObject_Compare(o1, o2);
41 if (PyErr_Occurred())
42 return -1;
43 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000044 return 0;
45}
Guido van Rossume15dee51995-07-18 14:12:02 +000046
47PyObject *
Fred Drake79912472000-07-09 04:06:11 +000048PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000049{
50 PyObject *v;
51
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000052 if (o == NULL)
53 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000054 v = (PyObject *)o->ob_type;
55 Py_INCREF(v);
56 return v;
57}
58
59int
Jeremy Hylton6253f832000-07-12 12:56:19 +000060PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000064 if (o == NULL) {
65 null_error();
66 return -1;
67 }
Guido van Rossume15dee51995-07-18 14:12:02 +000068
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000069 m = o->ob_type->tp_as_sequence;
70 if (m && m->sq_length)
71 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000072
Jeremy Hylton6253f832000-07-12 12:56:19 +000073 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000074}
75
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000076#undef PyObject_Length
77int
78PyObject_Length(PyObject *o)
79{
80 return PyObject_Size(o);
81}
82#define PyObject_Length PyObject_Size
83
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000084int
Armin Rigof5b3e362006-02-11 21:32:43 +000085_PyObject_LengthHint(PyObject *o)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000086{
87 int rv = PyObject_Size(o);
88 if (rv != -1)
89 return rv;
90 if (PyErr_ExceptionMatches(PyExc_TypeError) ||
91 PyErr_ExceptionMatches(PyExc_AttributeError)) {
92 PyObject *err_type, *err_value, *err_tb, *ro;
93
94 PyErr_Fetch(&err_type, &err_value, &err_tb);
Armin Rigof5b3e362006-02-11 21:32:43 +000095 ro = PyObject_CallMethod(o, "__length_hint__", NULL);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000096 if (ro != NULL) {
97 rv = (int)PyInt_AsLong(ro);
98 Py_DECREF(ro);
99 Py_XDECREF(err_type);
100 Py_XDECREF(err_value);
101 Py_XDECREF(err_tb);
102 return rv;
103 }
104 PyErr_Restore(err_type, err_value, err_tb);
105 }
106 return -1;
107}
108
Guido van Rossume15dee51995-07-18 14:12:02 +0000109PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000110PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000111{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000112 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000113
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000114 if (o == NULL || key == NULL)
115 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000117 m = o->ob_type->tp_as_mapping;
118 if (m && m->mp_subscript)
119 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000120
Guido van Rossum21308241998-08-13 16:44:44 +0000121 if (o->ob_type->tp_as_sequence) {
122 if (PyInt_Check(key))
123 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000124 else if (PyLong_Check(key)) {
125 long key_value = PyLong_AsLong(key);
126 if (key_value == -1 && PyErr_Occurred())
127 return NULL;
128 return PySequence_GetItem(o, key_value);
129 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000130 else if (o->ob_type->tp_as_sequence->sq_item)
131 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000132 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133
134 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000135}
136
137int
Fred Drake79912472000-07-09 04:06:11 +0000138PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000139{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000140 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000141
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000142 if (o == NULL || key == NULL || value == NULL) {
143 null_error();
144 return -1;
145 }
146 m = o->ob_type->tp_as_mapping;
147 if (m && m->mp_ass_subscript)
148 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000149
Guido van Rossum21308241998-08-13 16:44:44 +0000150 if (o->ob_type->tp_as_sequence) {
151 if (PyInt_Check(key))
152 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000153 else if (PyLong_Check(key)) {
154 long key_value = PyLong_AsLong(key);
155 if (key_value == -1 && PyErr_Occurred())
156 return -1;
157 return PySequence_SetItem(o, key_value, value);
158 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000159 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
160 type_error("sequence index must be integer");
161 return -1;
162 }
Guido van Rossum21308241998-08-13 16:44:44 +0000163 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000164
165 type_error("object does not support item assignment");
166 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000167}
168
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000169int
Fred Drake79912472000-07-09 04:06:11 +0000170PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000171{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000172 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000173
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000174 if (o == NULL || key == NULL) {
175 null_error();
176 return -1;
177 }
178 m = o->ob_type->tp_as_mapping;
179 if (m && m->mp_ass_subscript)
180 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000181
Guido van Rossum21308241998-08-13 16:44:44 +0000182 if (o->ob_type->tp_as_sequence) {
183 if (PyInt_Check(key))
184 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000185 else if (PyLong_Check(key)) {
186 long key_value = PyLong_AsLong(key);
187 if (key_value == -1 && PyErr_Occurred())
188 return -1;
189 return PySequence_DelItem(o, key_value);
190 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000191 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
192 type_error("sequence index must be integer");
193 return -1;
194 }
Guido van Rossum21308241998-08-13 16:44:44 +0000195 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000196
197 type_error("object does not support item deletion");
198 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000199}
200
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000201int
202PyObject_DelItemString(PyObject *o, char *key)
203{
204 PyObject *okey;
205 int ret;
206
207 if (o == NULL || key == NULL) {
208 null_error();
209 return -1;
210 }
211 okey = PyString_FromString(key);
212 if (okey == NULL)
213 return -1;
214 ret = PyObject_DelItem(o, okey);
215 Py_DECREF(okey);
216 return ret;
217}
218
Guido van Rossum4c08d552000-03-10 22:55:18 +0000219int PyObject_AsCharBuffer(PyObject *obj,
220 const char **buffer,
221 int *buffer_len)
222{
223 PyBufferProcs *pb;
224 const char *pp;
225 int len;
226
227 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
228 null_error();
229 return -1;
230 }
231 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000232 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000233 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000234 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000235 PyErr_SetString(PyExc_TypeError,
236 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000237 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000238 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000239 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 PyErr_SetString(PyExc_TypeError,
241 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000242 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000243 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000244 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000245 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000246 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000247 *buffer = pp;
248 *buffer_len = len;
249 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000250}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000251
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252int
253PyObject_CheckReadBuffer(PyObject *obj)
254{
255 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
256
257 if (pb == NULL ||
258 pb->bf_getreadbuffer == NULL ||
259 pb->bf_getsegcount == NULL ||
260 (*pb->bf_getsegcount)(obj, NULL) != 1)
261 return 0;
262 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263}
264
265int PyObject_AsReadBuffer(PyObject *obj,
266 const void **buffer,
267 int *buffer_len)
268{
269 PyBufferProcs *pb;
270 void *pp;
271 int len;
272
273 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
274 null_error();
275 return -1;
276 }
277 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000278 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000279 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000280 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000281 PyErr_SetString(PyExc_TypeError,
282 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000283 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000284 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000285 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000286 PyErr_SetString(PyExc_TypeError,
287 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000288 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000289 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000290 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000291 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000292 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000293 *buffer = pp;
294 *buffer_len = len;
295 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000296}
297
298int PyObject_AsWriteBuffer(PyObject *obj,
299 void **buffer,
300 int *buffer_len)
301{
302 PyBufferProcs *pb;
303 void*pp;
304 int len;
305
306 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
307 null_error();
308 return -1;
309 }
310 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000311 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000312 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000313 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000314 PyErr_SetString(PyExc_TypeError,
315 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000316 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000317 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000318 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000319 PyErr_SetString(PyExc_TypeError,
320 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000321 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000322 }
323 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
324 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000325 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000326 *buffer = pp;
327 *buffer_len = len;
328 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000329}
330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000331/* Operations on numbers */
332
333int
Fred Drake79912472000-07-09 04:06:11 +0000334PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000335{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000336 return o && o->ob_type->tp_as_number &&
337 (o->ob_type->tp_as_number->nb_int ||
338 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000339}
340
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000341/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000342
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000343/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000344
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000345#define NB_SLOT(x) offsetof(PyNumberMethods, x)
346#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000347 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000348#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000349 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000350
351/*
352 Calling scheme used for binary operations:
353
354 v w Action
355 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000356 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000357 new old v.op(v,w), coerce(v,w), v.op(v,w)
358 old new w.op(v,w), coerce(v,w), v.op(v,w)
359 old old coerce(v,w), v.op(v,w)
360
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000361 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
362 v->ob_type
363
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000364 Legend:
365 -------
366 * new == new style number
367 * old == old style number
368 * Action indicates the order in which operations are tried until either
369 a valid result is produced or an error occurs.
370
371 */
372
373static PyObject *
374binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000375{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000376 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000377 binaryfunc slotv = NULL;
378 binaryfunc slotw = NULL;
379
380 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000381 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000382 if (w->ob_type != v->ob_type &&
383 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000384 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000385 if (slotw == slotv)
386 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000387 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000388 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000389 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
390 x = slotw(v, w);
391 if (x != Py_NotImplemented)
392 return x;
393 Py_DECREF(x); /* can't do it */
394 slotw = NULL;
395 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000396 x = slotv(v, w);
397 if (x != Py_NotImplemented)
398 return x;
399 Py_DECREF(x); /* can't do it */
400 }
401 if (slotw) {
402 x = slotw(v, w);
403 if (x != Py_NotImplemented)
404 return x;
405 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000406 }
407 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
408 int err = PyNumber_CoerceEx(&v, &w);
409 if (err < 0) {
410 return NULL;
411 }
412 if (err == 0) {
413 PyNumberMethods *mv = v->ob_type->tp_as_number;
414 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000415 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000416 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000417 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000418 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000419 Py_DECREF(v);
420 Py_DECREF(w);
421 return x;
422 }
423 }
424 /* CoerceEx incremented the reference counts */
425 Py_DECREF(v);
426 Py_DECREF(w);
427 }
428 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000429 Py_INCREF(Py_NotImplemented);
430 return Py_NotImplemented;
431}
Guido van Rossum77660912002-04-16 16:32:50 +0000432
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000433static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000434binop_type_error(PyObject *v, PyObject *w, const char *op_name)
435{
436 PyErr_Format(PyExc_TypeError,
437 "unsupported operand type(s) for %s: '%s' and '%s'",
438 op_name,
439 v->ob_type->tp_name,
440 w->ob_type->tp_name);
441 return NULL;
442}
443
444static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000445binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
446{
447 PyObject *result = binary_op1(v, w, op_slot);
448 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000449 Py_DECREF(result);
450 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000451 }
452 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000453}
454
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000455
456/*
457 Calling scheme used for ternary operations:
458
Guido van Rossum84675ac2001-09-29 01:05:03 +0000459 *** In some cases, w.op is called before v.op; see binary_op1. ***
460
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000461 v w z Action
462 -------------------------------------------------------------------
463 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
464 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
465 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
466 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
467 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
468 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
469 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
470 old old old coerce(v,w,z), v.op(v,w,z)
471
472 Legend:
473 -------
474 * new == new style number
475 * old == old style number
476 * Action indicates the order in which operations are tried until either
477 a valid result is produced or an error occurs.
478 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
479 only if z != Py_None; if z == Py_None, then it is treated as absent
480 variable and only coerce(v,w) is tried.
481
482 */
483
484static PyObject *
485ternary_op(PyObject *v,
486 PyObject *w,
487 PyObject *z,
488 const int op_slot,
489 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000490{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000491 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000492 PyObject *x = NULL;
493 ternaryfunc slotv = NULL;
494 ternaryfunc slotw = NULL;
495 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000496
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000497 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000498 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000499 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000500 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000501 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000502 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000503 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000504 if (slotw == slotv)
505 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000506 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000507 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000508 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
509 x = slotw(v, w, z);
510 if (x != Py_NotImplemented)
511 return x;
512 Py_DECREF(x); /* can't do it */
513 slotw = NULL;
514 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000515 x = slotv(v, w, z);
516 if (x != Py_NotImplemented)
517 return x;
518 Py_DECREF(x); /* can't do it */
519 }
520 if (slotw) {
521 x = slotw(v, w, z);
522 if (x != Py_NotImplemented)
523 return x;
524 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000525 }
526 mz = z->ob_type->tp_as_number;
527 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000528 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000529 if (slotz == slotv || slotz == slotw)
530 slotz = NULL;
531 if (slotz) {
532 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000533 if (x != Py_NotImplemented)
534 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000535 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000536 }
537 }
538
539 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
540 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
541 /* we have an old style operand, coerce */
542 PyObject *v1, *z1, *w2, *z2;
543 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000544
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000545 c = PyNumber_Coerce(&v, &w);
546 if (c != 0)
547 goto error3;
548
549 /* Special case: if the third argument is None, it is
550 treated as absent argument and not coerced. */
551 if (z == Py_None) {
552 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000553 slotz = NB_TERNOP(v->ob_type->tp_as_number,
554 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000555 if (slotz)
556 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000557 else
558 c = -1;
559 }
560 else
561 c = -1;
562 goto error2;
563 }
564 v1 = v;
565 z1 = z;
566 c = PyNumber_Coerce(&v1, &z1);
567 if (c != 0)
568 goto error2;
569 w2 = w;
570 z2 = z1;
571 c = PyNumber_Coerce(&w2, &z2);
572 if (c != 0)
573 goto error1;
574
575 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000576 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
577 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000578 if (slotv)
579 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000580 else
581 c = -1;
582 }
583 else
584 c = -1;
585
586 Py_DECREF(w2);
587 Py_DECREF(z2);
588 error1:
589 Py_DECREF(v1);
590 Py_DECREF(z1);
591 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000592 Py_DECREF(v);
593 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000594 error3:
595 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000596 return x;
597 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000598
599 if (z == Py_None)
600 PyErr_Format(
601 PyExc_TypeError,
602 "unsupported operand type(s) for ** or pow(): "
603 "'%s' and '%s'",
604 v->ob_type->tp_name,
605 w->ob_type->tp_name);
606 else
607 PyErr_Format(
608 PyExc_TypeError,
609 "unsupported operand type(s) for pow(): "
610 "'%s', '%s', '%s'",
611 v->ob_type->tp_name,
612 w->ob_type->tp_name,
613 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000614 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000615}
616
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000617#define BINARY_FUNC(func, op, op_name) \
618 PyObject * \
619 func(PyObject *v, PyObject *w) { \
620 return binary_op(v, w, NB_SLOT(op), op_name); \
621 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000622
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000623BINARY_FUNC(PyNumber_Or, nb_or, "|")
624BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
625BINARY_FUNC(PyNumber_And, nb_and, "&")
626BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
627BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
628BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000629BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
630BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000631
632PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000633PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000634{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000635 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
636 if (result == Py_NotImplemented) {
637 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000638 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000639 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000640 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000641 }
Armin Rigofd163f92005-12-29 15:59:19 +0000642 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000643 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000644 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000645}
646
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000647static PyObject *
648sequence_repeat(intargfunc repeatfunc, PyObject *seq, PyObject *n)
649{
650 long count;
651 if (PyInt_Check(n)) {
652 count = PyInt_AsLong(n);
653 }
654 else if (PyLong_Check(n)) {
655 count = PyLong_AsLong(n);
656 if (count == -1 && PyErr_Occurred())
657 return NULL;
658 }
659 else {
660 return type_error(
Raymond Hettinger10c66062004-05-12 21:35:06 +0000661 "can't multiply sequence by non-int");
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000662 }
663#if LONG_MAX != INT_MAX
664 if (count > INT_MAX) {
665 PyErr_SetString(PyExc_ValueError,
666 "sequence repeat count too large");
667 return NULL;
668 }
669 else if (count < INT_MIN)
670 count = INT_MIN;
671 /* XXX Why don't I either
672
673 - set count to -1 whenever it's negative (after all,
674 sequence repeat usually treats negative numbers
675 as zero(); or
676
677 - raise an exception when it's less than INT_MIN?
678
679 I'm thinking about a hypothetical use case where some
680 sequence type might use a negative value as a flag of
681 some kind. In those cases I don't want to break the
682 code by mapping all negative values to -1. But I also
683 don't want to break e.g. []*(-sys.maxint), which is
684 perfectly safe, returning []. As a compromise, I do
685 map out-of-range negative values.
686 */
687#endif
688 return (*repeatfunc)(seq, (int)count);
689}
690
691PyObject *
692PyNumber_Multiply(PyObject *v, PyObject *w)
693{
694 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
695 if (result == Py_NotImplemented) {
696 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
697 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000698 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000699 if (mv && mv->sq_repeat) {
700 return sequence_repeat(mv->sq_repeat, v, w);
701 }
702 else if (mw && mw->sq_repeat) {
703 return sequence_repeat(mw->sq_repeat, w, v);
704 }
705 result = binop_type_error(v, w, "*");
706 }
707 return result;
708}
709
Guido van Rossume15dee51995-07-18 14:12:02 +0000710PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000711PyNumber_FloorDivide(PyObject *v, PyObject *w)
712{
713 /* XXX tp_flags test */
714 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
715}
716
717PyObject *
718PyNumber_TrueDivide(PyObject *v, PyObject *w)
719{
720 /* XXX tp_flags test */
721 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
722}
723
724PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000725PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000726{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000727 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000728}
729
730PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000731PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000732{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000733 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000734}
735
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000736/* Binary in-place operators */
737
738/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000739 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000740
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000741 - If the left hand object has the appropriate struct members, and
742 they are filled, call the appropriate function and return the
743 result. No coercion is done on the arguments; the left-hand object
744 is the one the operation is performed on, and it's up to the
745 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000746
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000747 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000748 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000749
750 */
751
Guido van Rossum77660912002-04-16 16:32:50 +0000752#define HASINPLACE(t) \
753 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000754
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000755static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000756binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000757{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000758 PyNumberMethods *mv = v->ob_type->tp_as_number;
759 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000760 binaryfunc slot = NB_BINOP(mv, iop_slot);
761 if (slot) {
762 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000763 if (x != Py_NotImplemented) {
764 return x;
765 }
766 Py_DECREF(x);
767 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000768 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000769 return binary_op1(v, w, op_slot);
770}
771
772static PyObject *
773binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
774 const char *op_name)
775{
776 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
777 if (result == Py_NotImplemented) {
778 Py_DECREF(result);
779 return binop_type_error(v, w, op_name);
780 }
781 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000782}
783
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000784#define INPLACE_BINOP(func, iop, op, op_name) \
785 PyObject * \
786 func(PyObject *v, PyObject *w) { \
787 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000788 }
789
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000790INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
791INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
792INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
793INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
794INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
795INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
796INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000797
798PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000799PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
800{
801 /* XXX tp_flags test */
802 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
803 NB_SLOT(nb_floor_divide), "//=");
804}
805
806PyObject *
807PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
808{
809 /* XXX tp_flags test */
810 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
811 NB_SLOT(nb_true_divide), "/=");
812}
813
814PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000815PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
816{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000817 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
818 NB_SLOT(nb_add));
819 if (result == Py_NotImplemented) {
820 PySequenceMethods *m = v->ob_type->tp_as_sequence;
821 Py_DECREF(result);
822 if (m != NULL) {
823 binaryfunc f = NULL;
824 if (HASINPLACE(v))
825 f = m->sq_inplace_concat;
826 if (f == NULL)
827 f = m->sq_concat;
828 if (f != NULL)
829 return (*f)(v, w);
830 }
831 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000832 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000833 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000834}
835
836PyObject *
837PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
838{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000839 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
840 NB_SLOT(nb_multiply));
841 if (result == Py_NotImplemented) {
842 intargfunc f = NULL;
843 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
844 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
845 Py_DECREF(result);
846 if (mv != NULL) {
847 if (HASINPLACE(v))
848 f = mv->sq_inplace_repeat;
849 if (f == NULL)
850 f = mv->sq_repeat;
851 if (f != NULL)
852 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000853 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000854 else if (mw != NULL) {
855 /* Note that the right hand operand should not be
856 * mutated in this case so sq_inplace_repeat is not
857 * used. */
858 if (mw->sq_repeat)
859 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000860 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000861 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000862 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000863 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000864}
865
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000866PyObject *
867PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
868{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000869 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
870 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000871}
872
873PyObject *
874PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
875{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000876 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
877 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
878 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000879 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000880 else {
881 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
882 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000883}
884
885
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000886/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000887
888PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000889PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000890{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000891 PyNumberMethods *m;
892
893 if (o == NULL)
894 return null_error();
895 m = o->ob_type->tp_as_number;
896 if (m && m->nb_negative)
897 return (*m->nb_negative)(o);
898
899 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000900}
901
902PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000903PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000904{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000905 PyNumberMethods *m;
906
907 if (o == NULL)
908 return null_error();
909 m = o->ob_type->tp_as_number;
910 if (m && m->nb_positive)
911 return (*m->nb_positive)(o);
912
913 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000914}
915
916PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000917PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000918{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000919 PyNumberMethods *m;
920
921 if (o == NULL)
922 return null_error();
923 m = o->ob_type->tp_as_number;
924 if (m && m->nb_invert)
925 return (*m->nb_invert)(o);
926
927 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000928}
929
930PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000931PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000932{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000933 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000934
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 if (o == NULL)
936 return null_error();
937 m = o->ob_type->tp_as_number;
938 if (m && m->nb_absolute)
939 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000940
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000941 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000942}
943
Guido van Rossum9e896b32000-04-05 20:11:21 +0000944/* Add a check for embedded NULL-bytes in the argument. */
945static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000946int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000947{
948 char *end;
949 PyObject *x;
950
951 x = PyInt_FromString((char*)s, &end, 10);
952 if (x == NULL)
953 return NULL;
954 if (end != s + len) {
955 PyErr_SetString(PyExc_ValueError,
956 "null byte in argument for int()");
957 Py_DECREF(x);
958 return NULL;
959 }
960 return x;
961}
962
Guido van Rossume15dee51995-07-18 14:12:02 +0000963PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000964PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000965{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000966 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000967 const char *buffer;
968 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000969
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000970 if (o == NULL)
971 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000972 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000973 Py_INCREF(o);
974 return o;
975 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000976 m = o->ob_type->tp_as_number;
977 if (m && m->nb_int) { /* This should include subclasses of int */
978 PyObject *res = m->nb_int(o);
979 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
980 PyErr_Format(PyExc_TypeError,
981 "__int__ returned non-int (type %.200s)",
982 res->ob_type->tp_name);
983 Py_DECREF(res);
984 return NULL;
985 }
986 return res;
987 }
988 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000989 PyIntObject *io = (PyIntObject*)o;
990 return PyInt_FromLong(io->ob_ival);
991 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000992 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000993 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000994 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000995#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000996 if (PyUnicode_Check(o))
997 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
998 PyUnicode_GET_SIZE(o),
999 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001000#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001001 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001002 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001003
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001004 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001005}
1006
Guido van Rossum9e896b32000-04-05 20:11:21 +00001007/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001008static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001009long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001010{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001011 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001012 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001013
Guido van Rossum4c08d552000-03-10 22:55:18 +00001014 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001015 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001016 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001017 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001018 PyErr_SetString(PyExc_ValueError,
1019 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001020 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001021 return NULL;
1022 }
1023 return x;
1024}
1025
Guido van Rossume15dee51995-07-18 14:12:02 +00001026PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001027PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001028{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001029 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001030 const char *buffer;
1031 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001032
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001033 if (o == NULL)
1034 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001035 m = o->ob_type->tp_as_number;
1036 if (m && m->nb_long) { /* This should include subclasses of long */
1037 PyObject *res = m->nb_long(o);
1038 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1039 PyErr_Format(PyExc_TypeError,
1040 "__long__ returned non-long (type %.200s)",
1041 res->ob_type->tp_name);
1042 Py_DECREF(res);
1043 return NULL;
1044 }
1045 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001046 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001047 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001048 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001049 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001050 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001051 * doesn't do. In particular long('9.5') must raise an
1052 * exception, not truncate the float.
1053 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001054 return long_from_string(PyString_AS_STRING(o),
1055 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001056#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001057 if (PyUnicode_Check(o))
1058 /* The above check is done in PyLong_FromUnicode(). */
1059 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1060 PyUnicode_GET_SIZE(o),
1061 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001062#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001063 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1064 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001065
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001066 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001067}
1068
1069PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001070PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001071{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001072 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001073
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001074 if (o == NULL)
1075 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001076 m = o->ob_type->tp_as_number;
1077 if (m && m->nb_float) { /* This should include subclasses of float */
1078 PyObject *res = m->nb_float(o);
1079 if (res && !PyFloat_Check(res)) {
1080 PyErr_Format(PyExc_TypeError,
1081 "__float__ returned non-float (type %.200s)",
1082 res->ob_type->tp_name);
1083 Py_DECREF(res);
1084 return NULL;
1085 }
1086 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001087 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001088 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001089 PyFloatObject *po = (PyFloatObject *)o;
1090 return PyFloat_FromDouble(po->ob_fval);
1091 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001092 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001093}
1094
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001095/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097int
Fred Drake79912472000-07-09 04:06:11 +00001098PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001099{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001100 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001101 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001102 return s != NULL && s->ob_type->tp_as_sequence &&
1103 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001104}
1105
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001107PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001108{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001110
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001111 if (s == NULL) {
1112 null_error();
1113 return -1;
1114 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001115
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001116 m = s->ob_type->tp_as_sequence;
1117 if (m && m->sq_length)
1118 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001119
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001120 type_error("len() of unsized object");
1121 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001122}
1123
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001124#undef PySequence_Length
1125int
1126PySequence_Length(PyObject *s)
1127{
1128 return PySequence_Size(s);
1129}
1130#define PySequence_Length PySequence_Size
1131
Guido van Rossume15dee51995-07-18 14:12:02 +00001132PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001133PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001134{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001135 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001136
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001137 if (s == NULL || o == NULL)
1138 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001139
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001140 m = s->ob_type->tp_as_sequence;
1141 if (m && m->sq_concat)
1142 return m->sq_concat(s, o);
1143
Armin Rigofd163f92005-12-29 15:59:19 +00001144 /* Instances of user classes defining an __add__() method only
1145 have an nb_add slot, not an sq_concat slot. So we fall back
1146 to nb_add if both arguments appear to be sequences. */
1147 if (PySequence_Check(s) && PySequence_Check(o)) {
1148 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1149 if (result != Py_NotImplemented)
1150 return result;
1151 Py_DECREF(result);
1152 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001153 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001154}
1155
1156PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001157PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001158{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001161 if (o == NULL)
1162 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001163
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001164 m = o->ob_type->tp_as_sequence;
1165 if (m && m->sq_repeat)
1166 return m->sq_repeat(o, count);
1167
Armin Rigofd163f92005-12-29 15:59:19 +00001168 /* Instances of user classes defining a __mul__() method only
1169 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1170 to nb_multiply if o appears to be a sequence. */
1171 if (PySequence_Check(o)) {
1172 PyObject *n, *result;
1173 n = PyInt_FromLong(count);
1174 if (n == NULL)
1175 return NULL;
1176 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1177 Py_DECREF(n);
1178 if (result != Py_NotImplemented)
1179 return result;
1180 Py_DECREF(result);
1181 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001182 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001183}
1184
1185PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001186PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1187{
1188 PySequenceMethods *m;
1189
1190 if (s == NULL || o == NULL)
1191 return null_error();
1192
1193 m = s->ob_type->tp_as_sequence;
1194 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1195 return m->sq_inplace_concat(s, o);
1196 if (m && m->sq_concat)
1197 return m->sq_concat(s, o);
1198
Armin Rigofd163f92005-12-29 15:59:19 +00001199 if (PySequence_Check(s) && PySequence_Check(o)) {
1200 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1201 NB_SLOT(nb_add));
1202 if (result != Py_NotImplemented)
1203 return result;
1204 Py_DECREF(result);
1205 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001206 return type_error("object can't be concatenated");
1207}
1208
1209PyObject *
1210PySequence_InPlaceRepeat(PyObject *o, int count)
1211{
1212 PySequenceMethods *m;
1213
1214 if (o == NULL)
1215 return null_error();
1216
1217 m = o->ob_type->tp_as_sequence;
1218 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1219 return m->sq_inplace_repeat(o, count);
1220 if (m && m->sq_repeat)
1221 return m->sq_repeat(o, count);
1222
Armin Rigofd163f92005-12-29 15:59:19 +00001223 if (PySequence_Check(o)) {
1224 PyObject *n, *result;
1225 n = PyInt_FromLong(count);
1226 if (n == NULL)
1227 return NULL;
1228 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1229 NB_SLOT(nb_multiply));
1230 Py_DECREF(n);
1231 if (result != Py_NotImplemented)
1232 return result;
1233 Py_DECREF(result);
1234 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001235 return type_error("object can't be repeated");
1236}
1237
1238PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001239PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001240{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001242
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 if (s == NULL)
1244 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001245
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001246 m = s->ob_type->tp_as_sequence;
1247 if (m && m->sq_item) {
1248 if (i < 0) {
1249 if (m->sq_length) {
1250 int l = (*m->sq_length)(s);
1251 if (l < 0)
1252 return NULL;
1253 i += l;
1254 }
1255 }
1256 return m->sq_item(s, i);
1257 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001258
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001260}
1261
Thomas Wouters1d75a792000-08-17 22:37:32 +00001262static PyObject *
1263sliceobj_from_intint(int i, int j)
1264{
1265 PyObject *start, *end, *slice;
1266 start = PyInt_FromLong((long)i);
1267 if (!start)
1268 return NULL;
1269 end = PyInt_FromLong((long)j);
1270 if (!end) {
1271 Py_DECREF(start);
1272 return NULL;
1273 }
1274 slice = PySlice_New(start, end, NULL);
1275 Py_DECREF(start);
1276 Py_DECREF(end);
1277 return slice;
1278}
1279
Guido van Rossume15dee51995-07-18 14:12:02 +00001280PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001281PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001282{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001284 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001285
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001286 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001287
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001288 m = s->ob_type->tp_as_sequence;
1289 if (m && m->sq_slice) {
1290 if (i1 < 0 || i2 < 0) {
1291 if (m->sq_length) {
1292 int l = (*m->sq_length)(s);
1293 if (l < 0)
1294 return NULL;
1295 if (i1 < 0)
1296 i1 += l;
1297 if (i2 < 0)
1298 i2 += l;
1299 }
1300 }
1301 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001302 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1303 PyObject *res;
1304 PyObject *slice = sliceobj_from_intint(i1, i2);
1305 if (!slice)
1306 return NULL;
1307 res = mp->mp_subscript(s, slice);
1308 Py_DECREF(slice);
1309 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001310 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001311
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001313}
1314
1315int
Fred Drake79912472000-07-09 04:06:11 +00001316PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001317{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001319
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001320 if (s == NULL) {
1321 null_error();
1322 return -1;
1323 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001324
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001325 m = s->ob_type->tp_as_sequence;
1326 if (m && m->sq_ass_item) {
1327 if (i < 0) {
1328 if (m->sq_length) {
1329 int l = (*m->sq_length)(s);
1330 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001331 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001332 i += l;
1333 }
1334 }
1335 return m->sq_ass_item(s, i, o);
1336 }
1337
Raymond Hettinger98779e02003-10-27 09:22:16 +00001338 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001339 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001340}
1341
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001342int
Fred Drake79912472000-07-09 04:06:11 +00001343PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001344{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001345 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001346
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001347 if (s == NULL) {
1348 null_error();
1349 return -1;
1350 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001351
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001352 m = s->ob_type->tp_as_sequence;
1353 if (m && m->sq_ass_item) {
1354 if (i < 0) {
1355 if (m->sq_length) {
1356 int l = (*m->sq_length)(s);
1357 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001358 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359 i += l;
1360 }
1361 }
1362 return m->sq_ass_item(s, i, (PyObject *)NULL);
1363 }
1364
1365 type_error("object doesn't support item deletion");
1366 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001367}
1368
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001369int
Fred Drake79912472000-07-09 04:06:11 +00001370PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001371{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001373 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001374
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375 if (s == NULL) {
1376 null_error();
1377 return -1;
1378 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001379
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380 m = s->ob_type->tp_as_sequence;
1381 if (m && m->sq_ass_slice) {
1382 if (i1 < 0 || i2 < 0) {
1383 if (m->sq_length) {
1384 int l = (*m->sq_length)(s);
1385 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001386 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001387 if (i1 < 0)
1388 i1 += l;
1389 if (i2 < 0)
1390 i2 += l;
1391 }
1392 }
1393 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001394 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1395 int res;
1396 PyObject *slice = sliceobj_from_intint(i1, i2);
1397 if (!slice)
1398 return -1;
1399 res = mp->mp_ass_subscript(s, slice, o);
1400 Py_DECREF(slice);
1401 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001402 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001403
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001404 type_error("object doesn't support slice assignment");
1405 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001406}
1407
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001408int
Fred Drake79912472000-07-09 04:06:11 +00001409PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001410{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001412
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 if (s == NULL) {
1414 null_error();
1415 return -1;
1416 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001417
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001418 m = s->ob_type->tp_as_sequence;
1419 if (m && m->sq_ass_slice) {
1420 if (i1 < 0 || i2 < 0) {
1421 if (m->sq_length) {
1422 int l = (*m->sq_length)(s);
1423 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001424 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 if (i1 < 0)
1426 i1 += l;
1427 if (i2 < 0)
1428 i2 += l;
1429 }
1430 }
1431 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1432 }
1433 type_error("object doesn't support slice deletion");
1434 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001435}
1436
Guido van Rossume15dee51995-07-18 14:12:02 +00001437PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001438PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001439{
Tim Peters6912d4d2001-05-05 03:56:37 +00001440 PyObject *it; /* iter(v) */
1441 int n; /* guess for result tuple size */
1442 PyObject *result;
1443 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001444
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 if (v == NULL)
1446 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001447
Tim Peters6912d4d2001-05-05 03:56:37 +00001448 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001449 if (PyTuple_CheckExact(v)) {
1450 /* Note that we can't know whether it's safe to return
1451 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001452 to exact tuples here. In contrast, lists always make
1453 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001454 Py_INCREF(v);
1455 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001456 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457 if (PyList_Check(v))
1458 return PyList_AsTuple(v);
1459
Tim Peters6912d4d2001-05-05 03:56:37 +00001460 /* Get iterator. */
1461 it = PyObject_GetIter(v);
1462 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001463 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001464
Tim Peters6912d4d2001-05-05 03:56:37 +00001465 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001466 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001467 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001468 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1469 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1470 Py_DECREF(it);
1471 return NULL;
1472 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001473 PyErr_Clear();
1474 n = 10; /* arbitrary */
1475 }
1476 result = PyTuple_New(n);
1477 if (result == NULL)
1478 goto Fail;
1479
1480 /* Fill the tuple. */
1481 for (j = 0; ; ++j) {
1482 PyObject *item = PyIter_Next(it);
1483 if (item == NULL) {
1484 if (PyErr_Occurred())
1485 goto Fail;
1486 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001487 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001488 if (j >= n) {
Raymond Hettinger4d012592004-12-16 10:38:38 +00001489 int oldn = n;
1490 /* The over-allocation strategy can grow a bit faster
1491 than for lists because unlike lists the
1492 over-allocation isn't permanent -- we reclaim
1493 the excess before the end of this routine.
1494 So, grow by ten and then add 25%.
1495 */
1496 n += 10;
1497 n += n >> 2;
1498 if (n < oldn) {
1499 /* Check for overflow */
1500 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001501 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001502 goto Fail;
1503 }
Tim Peters4324aa32001-05-28 22:30:08 +00001504 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001505 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001506 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001507 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001508 }
1509 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001510 }
1511
Tim Peters6912d4d2001-05-05 03:56:37 +00001512 /* Cut tuple back if guess was too large. */
1513 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001514 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001515 goto Fail;
1516
1517 Py_DECREF(it);
1518 return result;
1519
1520Fail:
1521 Py_XDECREF(result);
1522 Py_DECREF(it);
1523 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001524}
1525
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001526PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001527PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001528{
Tim Petersf553f892001-05-01 20:45:31 +00001529 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001530 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001531
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001532 if (v == NULL)
1533 return null_error();
1534
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001535 result = PyList_New(0);
1536 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001537 return NULL;
1538
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001539 rv = _PyList_Extend((PyListObject *)result, v);
1540 if (rv == NULL) {
1541 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001542 return NULL;
1543 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001544 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001545 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001546}
1547
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001548PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001549PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001550{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001551 PyObject *it;
1552
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001553 if (v == NULL)
1554 return null_error();
1555
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001556 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001557 Py_INCREF(v);
1558 return v;
1559 }
1560
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001561 it = PyObject_GetIter(v);
1562 if (it == NULL) {
1563 if (PyErr_ExceptionMatches(PyExc_TypeError))
1564 return type_error(m);
1565 return NULL;
1566 }
1567
Raymond Hettinger193814c2004-12-18 19:00:59 +00001568 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001569 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001570
1571 return v;
1572}
1573
Tim Peters16a77ad2001-09-08 04:00:12 +00001574/* Iterate over seq. Result depends on the operation:
1575 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1576 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1577 set ValueError and return -1 if none found; also return -1 on error.
1578 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1579*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001580int
Tim Peters16a77ad2001-09-08 04:00:12 +00001581_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001582{
Tim Peters16a77ad2001-09-08 04:00:12 +00001583 int n;
1584 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1585 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001586
Tim Peters16a77ad2001-09-08 04:00:12 +00001587 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001588 null_error();
1589 return -1;
1590 }
Tim Peters75f8e352001-05-05 11:33:43 +00001591
Tim Peters16a77ad2001-09-08 04:00:12 +00001592 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001593 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001594 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001595 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001596 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001597
Tim Peters16a77ad2001-09-08 04:00:12 +00001598 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001599 for (;;) {
1600 int cmp;
1601 PyObject *item = PyIter_Next(it);
1602 if (item == NULL) {
1603 if (PyErr_Occurred())
1604 goto Fail;
1605 break;
1606 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001607
1608 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001609 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001610 if (cmp < 0)
1611 goto Fail;
1612 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001613 switch (operation) {
1614 case PY_ITERSEARCH_COUNT:
1615 ++n;
1616 if (n <= 0) {
1617 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001618 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001619 goto Fail;
1620 }
1621 break;
1622
1623 case PY_ITERSEARCH_INDEX:
1624 if (wrapped) {
1625 PyErr_SetString(PyExc_OverflowError,
1626 "index exceeds C int size");
1627 goto Fail;
1628 }
1629 goto Done;
1630
1631 case PY_ITERSEARCH_CONTAINS:
1632 n = 1;
1633 goto Done;
1634
1635 default:
1636 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001637 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001638 }
1639
1640 if (operation == PY_ITERSEARCH_INDEX) {
1641 ++n;
1642 if (n <= 0)
1643 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001644 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001645 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001646
1647 if (operation != PY_ITERSEARCH_INDEX)
1648 goto Done;
1649
1650 PyErr_SetString(PyExc_ValueError,
1651 "sequence.index(x): x not in sequence");
1652 /* fall into failure code */
1653Fail:
1654 n = -1;
1655 /* fall through */
1656Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001657 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001658 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001659
Guido van Rossume15dee51995-07-18 14:12:02 +00001660}
1661
Tim Peters16a77ad2001-09-08 04:00:12 +00001662/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001663int
Tim Peters16a77ad2001-09-08 04:00:12 +00001664PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001665{
Tim Peters16a77ad2001-09-08 04:00:12 +00001666 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001667}
1668
Tim Peterscb8d3682001-05-05 21:05:01 +00001669/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001670 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001671 */
1672int
1673PySequence_Contains(PyObject *seq, PyObject *ob)
1674{
1675 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1676 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1677 if (sqm != NULL && sqm->sq_contains != NULL)
1678 return (*sqm->sq_contains)(seq, ob);
1679 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001680 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001681}
1682
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001683/* Backwards compatibility */
1684#undef PySequence_In
1685int
Fred Drake79912472000-07-09 04:06:11 +00001686PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001687{
1688 return PySequence_Contains(w, v);
1689}
1690
1691int
Fred Drake79912472000-07-09 04:06:11 +00001692PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001693{
Tim Peters16a77ad2001-09-08 04:00:12 +00001694 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001695}
1696
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001697/* Operations on mappings */
1698
1699int
Fred Drake79912472000-07-09 04:06:11 +00001700PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001701{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001702 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001703 return PyObject_HasAttrString(o, "__getitem__");
1704
1705 return o && o->ob_type->tp_as_mapping &&
1706 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001707 !(o->ob_type->tp_as_sequence &&
1708 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001709}
1710
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001711int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001712PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001713{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001715
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001716 if (o == NULL) {
1717 null_error();
1718 return -1;
1719 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001720
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001721 m = o->ob_type->tp_as_mapping;
1722 if (m && m->mp_length)
1723 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001724
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001725 type_error("len() of unsized object");
1726 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001727}
1728
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001729#undef PyMapping_Length
1730int
1731PyMapping_Length(PyObject *o)
1732{
1733 return PyMapping_Size(o);
1734}
1735#define PyMapping_Length PyMapping_Size
1736
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001737PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001738PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001739{
1740 PyObject *okey, *r;
1741
1742 if (key == NULL)
1743 return null_error();
1744
1745 okey = PyString_FromString(key);
1746 if (okey == NULL)
1747 return NULL;
1748 r = PyObject_GetItem(o, okey);
1749 Py_DECREF(okey);
1750 return r;
1751}
1752
1753int
Fred Drake79912472000-07-09 04:06:11 +00001754PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001755{
1756 PyObject *okey;
1757 int r;
1758
1759 if (key == NULL) {
1760 null_error();
1761 return -1;
1762 }
1763
1764 okey = PyString_FromString(key);
1765 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001766 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001767 r = PyObject_SetItem(o, okey, value);
1768 Py_DECREF(okey);
1769 return r;
1770}
1771
1772int
Fred Drake79912472000-07-09 04:06:11 +00001773PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001774{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001775 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001776
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001777 v = PyMapping_GetItemString(o, key);
1778 if (v) {
1779 Py_DECREF(v);
1780 return 1;
1781 }
1782 PyErr_Clear();
1783 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001784}
1785
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001786int
Fred Drake79912472000-07-09 04:06:11 +00001787PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001788{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001789 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001790
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001791 v = PyObject_GetItem(o, key);
1792 if (v) {
1793 Py_DECREF(v);
1794 return 1;
1795 }
1796 PyErr_Clear();
1797 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001798}
1799
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001800/* Operations on callable objects */
1801
1802/* XXX PyCallable_Check() is in object.c */
1803
Guido van Rossume15dee51995-07-18 14:12:02 +00001804PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001805PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001806{
Guido van Rossum5560b742001-09-14 16:47:50 +00001807 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001808}
Guido van Rossume15dee51995-07-18 14:12:02 +00001809
1810PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001811PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1812{
1813 ternaryfunc call;
1814
1815 if ((call = func->ob_type->tp_call) != NULL) {
1816 PyObject *result = (*call)(func, arg, kw);
1817 if (result == NULL && !PyErr_Occurred())
1818 PyErr_SetString(
1819 PyExc_SystemError,
1820 "NULL result without error in PyObject_Call");
1821 return result;
1822 }
Fred Drake573395a2001-11-01 20:26:12 +00001823 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1824 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001825 return NULL;
1826}
1827
1828PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001829PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001830{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 va_list va;
1832 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001833
Fred Drakeb92cf062001-10-27 06:16:31 +00001834 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001835 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001836
Fred Drakeb92cf062001-10-27 06:16:31 +00001837 if (format && *format) {
1838 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001839 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001840 va_end(va);
1841 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001842 else
1843 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001844
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001845 if (args == NULL)
1846 return NULL;
1847
1848 if (!PyTuple_Check(args)) {
1849 PyObject *a;
1850
1851 a = PyTuple_New(1);
1852 if (a == NULL)
1853 return NULL;
1854 if (PyTuple_SetItem(a, 0, args) < 0)
1855 return NULL;
1856 args = a;
1857 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001858 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001859
1860 Py_DECREF(args);
1861
1862 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001863}
1864
1865PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001866PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001867{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001868 va_list va;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001869 PyObject *args = NULL;
1870 PyObject *func = NULL;
1871 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001872
Fred Drakeb92cf062001-10-27 06:16:31 +00001873 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001874 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001875
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001876 func = PyObject_GetAttrString(o, name);
1877 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001878 PyErr_SetString(PyExc_AttributeError, name);
1879 return 0;
1880 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001881
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001882 if (!PyCallable_Check(func)) {
1883 type_error("call of non-callable attribute");
1884 goto exit;
1885 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001886
Fred Drakeb92cf062001-10-27 06:16:31 +00001887 if (format && *format) {
1888 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001889 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001890 va_end(va);
1891 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001892 else
1893 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001894
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001895 if (!args)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001896 goto exit;
Guido van Rossume15dee51995-07-18 14:12:02 +00001897
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001898 if (!PyTuple_Check(args)) {
1899 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001900
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001901 a = PyTuple_New(1);
1902 if (a == NULL)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001903 goto exit;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001904 if (PyTuple_SetItem(a, 0, args) < 0)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001905 goto exit;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001906 args = a;
1907 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001908
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001909 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001910
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001911 exit:
1912 Py_XDECREF(args);
1913 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001914
1915 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001916}
Guido van Rossum823649d2001-03-21 18:40:58 +00001917
1918
Fred Drakeb421b8c2001-10-26 16:21:32 +00001919static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001920objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001921{
1922 int i, n = 0;
1923 va_list countva;
1924 PyObject *result, *tmp;
1925
1926#ifdef VA_LIST_IS_ARRAY
1927 memcpy(countva, va, sizeof(va_list));
1928#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001929#ifdef __va_copy
1930 __va_copy(countva, va);
1931#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001932 countva = va;
1933#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001934#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001935
1936 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1937 ++n;
1938 result = PyTuple_New(n);
1939 if (result != NULL && n > 0) {
1940 for (i = 0; i < n; ++i) {
1941 tmp = (PyObject *)va_arg(va, PyObject *);
1942 PyTuple_SET_ITEM(result, i, tmp);
1943 Py_INCREF(tmp);
1944 }
1945 }
1946 return result;
1947}
1948
1949PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001950PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001951{
1952 PyObject *args, *tmp;
1953 va_list vargs;
1954
1955 if (callable == NULL || name == NULL)
1956 return null_error();
1957
1958 callable = PyObject_GetAttr(callable, name);
1959 if (callable == NULL)
1960 return NULL;
1961
1962 /* count the args */
1963 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001964 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001965 va_end(vargs);
1966 if (args == NULL) {
1967 Py_DECREF(callable);
1968 return NULL;
1969 }
1970 tmp = PyObject_Call(callable, args, NULL);
1971 Py_DECREF(args);
1972 Py_DECREF(callable);
1973
1974 return tmp;
1975}
1976
1977PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001978PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001979{
1980 PyObject *args, *tmp;
1981 va_list vargs;
1982
1983 if (callable == NULL)
1984 return null_error();
1985
1986 /* count the args */
1987 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001988 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001989 va_end(vargs);
1990 if (args == NULL)
1991 return NULL;
1992 tmp = PyObject_Call(callable, args, NULL);
1993 Py_DECREF(args);
1994
1995 return tmp;
1996}
1997
1998
Guido van Rossum823649d2001-03-21 18:40:58 +00001999/* isinstance(), issubclass() */
2000
Barry Warsawf16951c2002-04-23 22:45:44 +00002001/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2002 * state that will almost never happen.
2003 *
2004 * 0. creating the __bases__ static string could get a MemoryError
2005 * 1. getattr(cls, '__bases__') could raise an AttributeError
2006 * 2. getattr(cls, '__bases__') could raise some other exception
2007 * 3. getattr(cls, '__bases__') could return a tuple
2008 * 4. getattr(cls, '__bases__') could return something other than a tuple
2009 *
2010 * Only state #3 is a non-error state and only it returns a non-NULL object
2011 * (it returns the retrieved tuple).
2012 *
2013 * Any raised AttributeErrors are masked by clearing the exception and
2014 * returning NULL. If an object other than a tuple comes out of __bases__,
2015 * then again, the return value is NULL. So yes, these two situations
2016 * produce exactly the same results: NULL is returned and no error is set.
2017 *
2018 * If some exception other than AttributeError is raised, then NULL is also
2019 * returned, but the exception is not cleared. That's because we want the
2020 * exception to be propagated along.
2021 *
2022 * Callers are expected to test for PyErr_Occurred() when the return value
2023 * is NULL to decide whether a valid exception should be propagated or not.
2024 * When there's no exception to propagate, it's customary for the caller to
2025 * set a TypeError.
2026 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002027static PyObject *
2028abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002029{
2030 static PyObject *__bases__ = NULL;
2031 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002032
2033 if (__bases__ == NULL) {
2034 __bases__ = PyString_FromString("__bases__");
2035 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002036 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002037 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002038 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002039 if (bases == NULL) {
2040 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2041 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002042 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002043 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002044 if (!PyTuple_Check(bases)) {
2045 Py_DECREF(bases);
2046 return NULL;
2047 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002048 return bases;
2049}
2050
2051
2052static int
2053abstract_issubclass(PyObject *derived, PyObject *cls)
2054{
2055 PyObject *bases;
2056 int i, n;
2057 int r = 0;
2058
2059
Guido van Rossum823649d2001-03-21 18:40:58 +00002060 if (derived == cls)
2061 return 1;
2062
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002063 if (PyTuple_Check(cls)) {
2064 /* Not a general sequence -- that opens up the road to
2065 recursion and stack overflow. */
2066 n = PyTuple_GET_SIZE(cls);
2067 for (i = 0; i < n; i++) {
2068 if (derived == PyTuple_GET_ITEM(cls, i))
2069 return 1;
2070 }
2071 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002072 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002073 if (bases == NULL) {
2074 if (PyErr_Occurred())
2075 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002076 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002077 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002078 n = PyTuple_GET_SIZE(bases);
2079 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002080 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002081 if (r != 0)
2082 break;
2083 }
2084
2085 Py_DECREF(bases);
2086
2087 return r;
2088}
2089
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002090static int
2091check_class(PyObject *cls, const char *error)
2092{
2093 PyObject *bases = abstract_get_bases(cls);
2094 if (bases == NULL) {
2095 /* Do not mask errors. */
2096 if (!PyErr_Occurred())
2097 PyErr_SetString(PyExc_TypeError, error);
2098 return 0;
2099 }
2100 Py_DECREF(bases);
2101 return -1;
2102}
2103
Brett Cannon4f653312004-03-20 22:52:14 +00002104static int
2105recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002106{
2107 PyObject *icls;
2108 static PyObject *__class__ = NULL;
2109 int retval = 0;
2110
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002111 if (__class__ == NULL) {
2112 __class__ = PyString_FromString("__class__");
2113 if (__class__ == NULL)
2114 return -1;
2115 }
2116
Neil Schemenauer6b471292001-10-18 03:18:43 +00002117 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2118 PyObject *inclass =
2119 (PyObject*)((PyInstanceObject*)inst)->in_class;
2120 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002121 }
2122 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002123 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002124 if (retval == 0) {
2125 PyObject *c = PyObject_GetAttr(inst, __class__);
2126 if (c == NULL) {
2127 PyErr_Clear();
2128 }
2129 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002130 if (c != (PyObject *)(inst->ob_type) &&
2131 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002132 retval = PyType_IsSubtype(
2133 (PyTypeObject *)c,
2134 (PyTypeObject *)cls);
2135 Py_DECREF(c);
2136 }
2137 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002138 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002139 else if (PyTuple_Check(cls)) {
Guido van Rossum03290ec2001-10-07 20:54:12 +00002140 int i, n;
2141
Brett Cannon4f653312004-03-20 22:52:14 +00002142 if (!recursion_depth) {
2143 PyErr_SetString(PyExc_RuntimeError,
2144 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002145 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002146 }
2147
Guido van Rossum03290ec2001-10-07 20:54:12 +00002148 n = PyTuple_GET_SIZE(cls);
2149 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002150 retval = recursive_isinstance(
2151 inst,
2152 PyTuple_GET_ITEM(cls, i),
2153 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002154 if (retval != 0)
2155 break;
2156 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002157 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002158 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002159 if (!check_class(cls,
2160 "isinstance() arg 2 must be a class, type,"
2161 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002162 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002163 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002164 if (icls == NULL) {
2165 PyErr_Clear();
2166 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002167 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002168 else {
2169 retval = abstract_issubclass(icls, cls);
2170 Py_DECREF(icls);
2171 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002172 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002173
Guido van Rossum823649d2001-03-21 18:40:58 +00002174 return retval;
2175}
2176
2177int
Brett Cannon4f653312004-03-20 22:52:14 +00002178PyObject_IsInstance(PyObject *inst, PyObject *cls)
2179{
2180 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2181}
2182
2183static int
2184recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002185{
2186 int retval;
2187
2188 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002189 if (!check_class(derived,
2190 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002191 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002192
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002193 if (PyTuple_Check(cls)) {
2194 int i;
2195 int n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002196
2197 if (!recursion_depth) {
2198 PyErr_SetString(PyExc_RuntimeError,
2199 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002200 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002201 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002202 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002203 retval = recursive_issubclass(
2204 derived,
2205 PyTuple_GET_ITEM(cls, i),
2206 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002207 if (retval != 0) {
2208 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002209 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002210 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002211 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002212 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002213 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002214 else {
2215 if (!check_class(cls,
2216 "issubclass() arg 2 must be a class"
2217 " or tuple of classes"))
2218 return -1;
2219 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002220
2221 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002222 }
2223 else {
2224 /* shortcut */
2225 if (!(retval = (derived == cls)))
2226 retval = PyClass_IsSubclass(derived, cls);
2227 }
2228
2229 return retval;
2230}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002231
Brett Cannon4f653312004-03-20 22:52:14 +00002232int
2233PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2234{
2235 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2236}
2237
2238
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002239PyObject *
2240PyObject_GetIter(PyObject *o)
2241{
2242 PyTypeObject *t = o->ob_type;
2243 getiterfunc f = NULL;
2244 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2245 f = t->tp_iter;
2246 if (f == NULL) {
2247 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002248 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002249 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002250 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002251 return NULL;
2252 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002253 else {
2254 PyObject *res = (*f)(o);
2255 if (res != NULL && !PyIter_Check(res)) {
2256 PyErr_Format(PyExc_TypeError,
2257 "iter() returned non-iterator "
2258 "of type '%.100s'",
2259 res->ob_type->tp_name);
2260 Py_DECREF(res);
2261 res = NULL;
2262 }
2263 return res;
2264 }
2265}
2266
Tim Petersf4848da2001-05-05 00:14:56 +00002267/* Return next item.
2268 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2269 * If the iteration terminates normally, return NULL and clear the
2270 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2271 * will be false.
2272 * Else return the next object. PyErr_Occurred() will be false.
2273 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002274PyObject *
2275PyIter_Next(PyObject *iter)
2276{
Tim Petersf4848da2001-05-05 00:14:56 +00002277 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002278 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002279 result = (*iter->ob_type->tp_iternext)(iter);
2280 if (result == NULL &&
2281 PyErr_Occurred() &&
2282 PyErr_ExceptionMatches(PyExc_StopIteration))
2283 PyErr_Clear();
2284 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002285}