blob: 24b09f51d78f36e72cb631e1b139e7bb06ccd302 [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
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00003
Guido van Rossume15dee51995-07-18 14:12:02 +00004#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00005#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00006#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00007#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00008
9#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +000010 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000013
14static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000015type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000016{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000017 PyErr_SetString(PyExc_TypeError, msg);
18 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000019}
20
Guido van Rossum052b7e11996-11-11 15:08:19 +000021static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000022null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000023{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000024 if (!PyErr_Occurred())
25 PyErr_SetString(PyExc_SystemError,
26 "null argument to internal routine");
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000030/* Operations on any object */
31
32int
Fred Drake79912472000-07-09 04:06:11 +000033PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034{
35 int r;
36
37 if (o1 == NULL || o2 == NULL) {
38 null_error();
39 return -1;
40 }
41 r = PyObject_Compare(o1, o2);
42 if (PyErr_Occurred())
43 return -1;
44 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000045 return 0;
46}
Guido van Rossume15dee51995-07-18 14:12:02 +000047
48PyObject *
Fred Drake79912472000-07-09 04:06:11 +000049PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000050{
51 PyObject *v;
52
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000053 if (o == NULL)
54 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000055 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
58}
59
60int
Jeremy Hylton6253f832000-07-12 12:56:19 +000061PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 m = o->ob_type->tp_as_sequence;
71 if (m && m->sq_length)
72 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Jeremy Hylton6253f832000-07-12 12:56:19 +000074 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075}
76
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000077#undef PyObject_Length
78int
79PyObject_Length(PyObject *o)
80{
81 return PyObject_Size(o);
82}
83#define PyObject_Length PyObject_Size
84
Guido van Rossume15dee51995-07-18 14:12:02 +000085PyObject *
Fred Drake79912472000-07-09 04:06:11 +000086PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +000087{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000088 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000089
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000090 if (o == NULL || key == NULL)
91 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000092
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000093 m = o->ob_type->tp_as_mapping;
94 if (m && m->mp_subscript)
95 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +000096
Guido van Rossum21308241998-08-13 16:44:44 +000097 if (o->ob_type->tp_as_sequence) {
98 if (PyInt_Check(key))
99 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000100 else if (PyLong_Check(key)) {
101 long key_value = PyLong_AsLong(key);
102 if (key_value == -1 && PyErr_Occurred())
103 return NULL;
104 return PySequence_GetItem(o, key_value);
105 }
Guido van Rossum21308241998-08-13 16:44:44 +0000106 return type_error("sequence index must be integer");
107 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000108
109 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000110}
111
112int
Fred Drake79912472000-07-09 04:06:11 +0000113PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000114{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000117 if (o == NULL || key == NULL || value == NULL) {
118 null_error();
119 return -1;
120 }
121 m = o->ob_type->tp_as_mapping;
122 if (m && m->mp_ass_subscript)
123 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000124
Guido van Rossum21308241998-08-13 16:44:44 +0000125 if (o->ob_type->tp_as_sequence) {
126 if (PyInt_Check(key))
127 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000128 else if (PyLong_Check(key)) {
129 long key_value = PyLong_AsLong(key);
130 if (key_value == -1 && PyErr_Occurred())
131 return -1;
132 return PySequence_SetItem(o, key_value, value);
133 }
Guido van Rossum21308241998-08-13 16:44:44 +0000134 type_error("sequence index must be integer");
135 return -1;
136 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000137
138 type_error("object does not support item assignment");
139 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000140}
141
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000142int
Fred Drake79912472000-07-09 04:06:11 +0000143PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000144{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000145 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000146
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000147 if (o == NULL || key == NULL) {
148 null_error();
149 return -1;
150 }
151 m = o->ob_type->tp_as_mapping;
152 if (m && m->mp_ass_subscript)
153 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000154
Guido van Rossum21308241998-08-13 16:44:44 +0000155 if (o->ob_type->tp_as_sequence) {
156 if (PyInt_Check(key))
157 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000158 else if (PyLong_Check(key)) {
159 long key_value = PyLong_AsLong(key);
160 if (key_value == -1 && PyErr_Occurred())
161 return -1;
162 return PySequence_DelItem(o, key_value);
163 }
Guido van Rossum21308241998-08-13 16:44:44 +0000164 type_error("sequence index must be integer");
165 return -1;
166 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000167
168 type_error("object does not support item deletion");
169 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000170}
171
Guido van Rossum4c08d552000-03-10 22:55:18 +0000172int PyObject_AsCharBuffer(PyObject *obj,
173 const char **buffer,
174 int *buffer_len)
175{
176 PyBufferProcs *pb;
177 const char *pp;
178 int len;
179
180 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
181 null_error();
182 return -1;
183 }
184 pb = obj->ob_type->tp_as_buffer;
185 if ( pb == NULL ||
186 pb->bf_getcharbuffer == NULL ||
187 pb->bf_getsegcount == NULL ) {
188 PyErr_SetString(PyExc_TypeError,
189 "expected a character buffer object");
190 goto onError;
191 }
192 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
193 PyErr_SetString(PyExc_TypeError,
194 "expected a single-segment buffer object");
195 goto onError;
196 }
197 len = (*pb->bf_getcharbuffer)(obj,0,&pp);
198 if (len < 0)
199 goto onError;
200 *buffer = pp;
201 *buffer_len = len;
202 return 0;
203
204 onError:
205 return -1;
206}
207
208int PyObject_AsReadBuffer(PyObject *obj,
209 const void **buffer,
210 int *buffer_len)
211{
212 PyBufferProcs *pb;
213 void *pp;
214 int len;
215
216 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
217 null_error();
218 return -1;
219 }
220 pb = obj->ob_type->tp_as_buffer;
221 if ( pb == NULL ||
222 pb->bf_getreadbuffer == NULL ||
223 pb->bf_getsegcount == NULL ) {
224 PyErr_SetString(PyExc_TypeError,
225 "expected a readable buffer object");
226 goto onError;
227 }
228 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
229 PyErr_SetString(PyExc_TypeError,
230 "expected a single-segment buffer object");
231 goto onError;
232 }
233 len = (*pb->bf_getreadbuffer)(obj,0,&pp);
234 if (len < 0)
235 goto onError;
236 *buffer = pp;
237 *buffer_len = len;
238 return 0;
239
240 onError:
241 return -1;
242}
243
244int PyObject_AsWriteBuffer(PyObject *obj,
245 void **buffer,
246 int *buffer_len)
247{
248 PyBufferProcs *pb;
249 void*pp;
250 int len;
251
252 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
253 null_error();
254 return -1;
255 }
256 pb = obj->ob_type->tp_as_buffer;
257 if ( pb == NULL ||
258 pb->bf_getwritebuffer == NULL ||
259 pb->bf_getsegcount == NULL ) {
260 PyErr_SetString(PyExc_TypeError,
261 "expected a writeable buffer object");
262 goto onError;
263 }
264 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
265 PyErr_SetString(PyExc_TypeError,
266 "expected a single-segment buffer object");
267 goto onError;
268 }
269 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
270 if (len < 0)
271 goto onError;
272 *buffer = pp;
273 *buffer_len = len;
274 return 0;
275
276 onError:
277 return -1;
278}
279
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000280/* Operations on numbers */
281
282int
Fred Drake79912472000-07-09 04:06:11 +0000283PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000284{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000285 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000286}
287
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000288/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000289
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000290/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000291
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000292#define NB_SLOT(x) offsetof(PyNumberMethods, x)
293#define NB_BINOP(nb_methods, slot) \
294 ((binaryfunc*)(& ((char*)nb_methods)[slot] ))
295#define NB_TERNOP(nb_methods, slot) \
296 ((ternaryfunc*)(& ((char*)nb_methods)[slot] ))
297
298/*
299 Calling scheme used for binary operations:
300
301 v w Action
302 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000303 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000304 new old v.op(v,w), coerce(v,w), v.op(v,w)
305 old new w.op(v,w), coerce(v,w), v.op(v,w)
306 old old coerce(v,w), v.op(v,w)
307
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000308 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
309 v->ob_type
310
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000311 Legend:
312 -------
313 * new == new style number
314 * old == old style number
315 * Action indicates the order in which operations are tried until either
316 a valid result is produced or an error occurs.
317
318 */
319
320static PyObject *
321binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000322{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000323 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000324 binaryfunc slotv = NULL;
325 binaryfunc slotw = NULL;
326
327 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
328 slotv = *NB_BINOP(v->ob_type->tp_as_number, op_slot);
329 if (w->ob_type != v->ob_type &&
330 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
331 slotw = *NB_BINOP(w->ob_type->tp_as_number, op_slot);
332 if (slotw == slotv)
333 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000334 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000335 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000336 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
337 x = slotw(v, w);
338 if (x != Py_NotImplemented)
339 return x;
340 Py_DECREF(x); /* can't do it */
341 slotw = NULL;
342 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000343 x = slotv(v, w);
344 if (x != Py_NotImplemented)
345 return x;
346 Py_DECREF(x); /* can't do it */
347 }
348 if (slotw) {
349 x = slotw(v, w);
350 if (x != Py_NotImplemented)
351 return x;
352 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000353 }
354 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
355 int err = PyNumber_CoerceEx(&v, &w);
356 if (err < 0) {
357 return NULL;
358 }
359 if (err == 0) {
360 PyNumberMethods *mv = v->ob_type->tp_as_number;
361 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000362 binaryfunc slot;
363 slot = *NB_BINOP(mv, op_slot);
364 if (slot) {
365 PyObject *x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000366 Py_DECREF(v);
367 Py_DECREF(w);
368 return x;
369 }
370 }
371 /* CoerceEx incremented the reference counts */
372 Py_DECREF(v);
373 Py_DECREF(w);
374 }
375 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000376 Py_INCREF(Py_NotImplemented);
377 return Py_NotImplemented;
378}
379
380static PyObject *
381binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
382{
383 PyObject *result = binary_op1(v, w, op_slot);
384 if (result == Py_NotImplemented) {
385 Py_DECREF(Py_NotImplemented);
386 PyErr_Format(PyExc_TypeError,
387 "unsupported operand type(s) for %s", op_name);
388 return NULL;
389 }
390 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000391}
392
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000393
394/*
395 Calling scheme used for ternary operations:
396
Guido van Rossum84675ac2001-09-29 01:05:03 +0000397 *** In some cases, w.op is called before v.op; see binary_op1. ***
398
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000399 v w z Action
400 -------------------------------------------------------------------
401 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
402 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
403 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
404 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
405 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
406 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
407 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
408 old old old coerce(v,w,z), v.op(v,w,z)
409
410 Legend:
411 -------
412 * new == new style number
413 * old == old style number
414 * Action indicates the order in which operations are tried until either
415 a valid result is produced or an error occurs.
416 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
417 only if z != Py_None; if z == Py_None, then it is treated as absent
418 variable and only coerce(v,w) is tried.
419
420 */
421
422static PyObject *
423ternary_op(PyObject *v,
424 PyObject *w,
425 PyObject *z,
426 const int op_slot,
427 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000428{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000429 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000430 PyObject *x = NULL;
431 ternaryfunc slotv = NULL;
432 ternaryfunc slotw = NULL;
433 ternaryfunc slotz = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000434
435 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000436 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000437 if (mv != NULL && NEW_STYLE_NUMBER(v))
438 slotv = *NB_TERNOP(mv, op_slot);
439 if (w->ob_type != v->ob_type &&
440 mv != NULL && NEW_STYLE_NUMBER(w)) {
441 slotw = *NB_TERNOP(mw, op_slot);
442 if (slotw == slotv)
443 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000444 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000445 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000446 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
447 x = slotw(v, w, z);
448 if (x != Py_NotImplemented)
449 return x;
450 Py_DECREF(x); /* can't do it */
451 slotw = NULL;
452 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000453 x = slotv(v, w, z);
454 if (x != Py_NotImplemented)
455 return x;
456 Py_DECREF(x); /* can't do it */
457 }
458 if (slotw) {
459 x = slotw(v, w, z);
460 if (x != Py_NotImplemented)
461 return x;
462 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000463 }
464 mz = z->ob_type->tp_as_number;
465 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000466 slotz = *NB_TERNOP(mz, op_slot);
467 if (slotz == slotv || slotz == slotw)
468 slotz = NULL;
469 if (slotz) {
470 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000471 if (x != Py_NotImplemented)
472 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000473 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000474 }
475 }
476
477 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
478 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
479 /* we have an old style operand, coerce */
480 PyObject *v1, *z1, *w2, *z2;
481 int c;
482
483 c = PyNumber_Coerce(&v, &w);
484 if (c != 0)
485 goto error3;
486
487 /* Special case: if the third argument is None, it is
488 treated as absent argument and not coerced. */
489 if (z == Py_None) {
490 if (v->ob_type->tp_as_number) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000491 slotz = *NB_TERNOP(v->ob_type->tp_as_number,
492 op_slot);
493 if (slotz)
494 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000495 else
496 c = -1;
497 }
498 else
499 c = -1;
500 goto error2;
501 }
502 v1 = v;
503 z1 = z;
504 c = PyNumber_Coerce(&v1, &z1);
505 if (c != 0)
506 goto error2;
507 w2 = w;
508 z2 = z1;
509 c = PyNumber_Coerce(&w2, &z2);
510 if (c != 0)
511 goto error1;
512
513 if (v1->ob_type->tp_as_number != NULL) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000514 slotv = *NB_TERNOP(v1->ob_type->tp_as_number,
515 op_slot);
516 if (slotv)
517 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000518 else
519 c = -1;
520 }
521 else
522 c = -1;
523
524 Py_DECREF(w2);
525 Py_DECREF(z2);
526 error1:
527 Py_DECREF(v1);
528 Py_DECREF(z1);
529 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000530 Py_DECREF(v);
531 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000532 error3:
533 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000534 return x;
535 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000536
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000537 PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for %s",
538 op_name);
539 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000540}
541
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000542#define BINARY_FUNC(func, op, op_name) \
543 PyObject * \
544 func(PyObject *v, PyObject *w) { \
545 return binary_op(v, w, NB_SLOT(op), op_name); \
546 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000547
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000548BINARY_FUNC(PyNumber_Or, nb_or, "|")
549BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
550BINARY_FUNC(PyNumber_And, nb_and, "&")
551BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
552BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
553BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
554BINARY_FUNC(PyNumber_Multiply, nb_multiply, "*")
555BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
556BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000557
558PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000559PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000560{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000561 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
562 if (result == Py_NotImplemented) {
563 PySequenceMethods *m = v->ob_type->tp_as_sequence;
564 Py_DECREF(Py_NotImplemented);
565 if (m && m->sq_concat) {
566 result = (*m->sq_concat)(v, w);
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000567 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000568 else {
569 PyErr_SetString(PyExc_TypeError,
570 "unsupported operand types for +");
571 result = NULL;
572 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000573 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000574 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000575}
576
577PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000578PyNumber_FloorDivide(PyObject *v, PyObject *w)
579{
580 /* XXX tp_flags test */
581 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
582}
583
584PyObject *
585PyNumber_TrueDivide(PyObject *v, PyObject *w)
586{
587 /* XXX tp_flags test */
588 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
589}
590
591PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000592PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000593{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000594 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000595 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000596#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000597 else if (PyUnicode_Check(v))
598 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000599#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000600 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000601}
602
603PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000604PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000605{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000606 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000607}
608
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000609/* Binary in-place operators */
610
611/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000612 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000613
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000614 - If the left hand object has the appropriate struct members, and
615 they are filled, call the appropriate function and return the
616 result. No coercion is done on the arguments; the left-hand object
617 is the one the operation is performed on, and it's up to the
618 function to deal with the right-hand object.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000619
620 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000621 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000622
623 */
624
625#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
626
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000627static PyObject *
628binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
629 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000630{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000631 PyNumberMethods *mv = v->ob_type->tp_as_number;
632 if (mv != NULL && HASINPLACE(v)) {
633 binaryfunc *slot = NB_BINOP(mv, iop_slot);
634 if (*slot) {
635 PyObject *x = (*slot)(v, w);
636 if (x != Py_NotImplemented) {
637 return x;
638 }
639 Py_DECREF(x);
640 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000641 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000642 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000643}
644
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000645#define INPLACE_BINOP(func, iop, op, op_name) \
646 PyObject * \
647 func(PyObject *v, PyObject *w) { \
648 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000649 }
650
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000651INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
652INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
653INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
654INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
655INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
656INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
657INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000658
659PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000660PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
661{
662 /* XXX tp_flags test */
663 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
664 NB_SLOT(nb_floor_divide), "//=");
665}
666
667PyObject *
668PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
669{
670 /* XXX tp_flags test */
671 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
672 NB_SLOT(nb_true_divide), "/=");
673}
674
675PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000676PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
677{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000678 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000679
Guido van Rossumbb8be932000-09-01 23:27:32 +0000680 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000681 if (HASINPLACE(v))
682 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
683 if (f == NULL)
684 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000685 if (f != NULL)
686 return (*f)(v, w);
687 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000688 return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000689}
690
691PyObject *
692PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
693{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000694 PyObject * (*g)(PyObject *, int) = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000695 if (HASINPLACE(v) && v->ob_type->tp_as_sequence &&
696 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) {
697 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000698 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000699 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000700 }
701 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000702 n = PyLong_AsLong(w);
703 if (n == -1 && PyErr_Occurred())
704 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000705 }
706 else {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000707 return type_error("can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000708 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000709 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000710 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000711 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
712 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000713}
714
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000715
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000716
717PyObject *
718PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
719{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000720 if (PyString_Check(v))
721 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000722#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000723 else if (PyUnicode_Check(v))
724 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000725#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000726 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000727 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
728 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729}
730
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000731
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000732PyObject *
733PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
734{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000735 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
736 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
737 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000738 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000739 else {
740 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
741 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000742}
743
744
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000745/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000746
747PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000748PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000749{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000750 PyNumberMethods *m;
751
752 if (o == NULL)
753 return null_error();
754 m = o->ob_type->tp_as_number;
755 if (m && m->nb_negative)
756 return (*m->nb_negative)(o);
757
758 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000759}
760
761PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000762PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000763{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000764 PyNumberMethods *m;
765
766 if (o == NULL)
767 return null_error();
768 m = o->ob_type->tp_as_number;
769 if (m && m->nb_positive)
770 return (*m->nb_positive)(o);
771
772 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000773}
774
775PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000776PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000777{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000778 PyNumberMethods *m;
779
780 if (o == NULL)
781 return null_error();
782 m = o->ob_type->tp_as_number;
783 if (m && m->nb_invert)
784 return (*m->nb_invert)(o);
785
786 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000787}
788
789PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000790PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000791{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000792 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000793
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000794 if (o == NULL)
795 return null_error();
796 m = o->ob_type->tp_as_number;
797 if (m && m->nb_absolute)
798 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000799
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000800 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000801}
802
Guido van Rossum9e896b32000-04-05 20:11:21 +0000803/* Add a check for embedded NULL-bytes in the argument. */
804static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000805int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000806{
807 char *end;
808 PyObject *x;
809
810 x = PyInt_FromString((char*)s, &end, 10);
811 if (x == NULL)
812 return NULL;
813 if (end != s + len) {
814 PyErr_SetString(PyExc_ValueError,
815 "null byte in argument for int()");
816 Py_DECREF(x);
817 return NULL;
818 }
819 return x;
820}
821
Guido van Rossume15dee51995-07-18 14:12:02 +0000822PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000823PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000824{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000825 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000826 const char *buffer;
827 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000828
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000829 if (o == NULL)
830 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000831 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000832 Py_INCREF(o);
833 return o;
834 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000835 if (PyInt_Check(o)) {
836 PyIntObject *io = (PyIntObject*)o;
837 return PyInt_FromLong(io->ob_ival);
838 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000839 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000840 return int_from_string(PyString_AS_STRING(o),
841 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000842#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000843 if (PyUnicode_Check(o))
844 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
845 PyUnicode_GET_SIZE(o),
846 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000847#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848 m = o->ob_type->tp_as_number;
849 if (m && m->nb_int)
850 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000851 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000852 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000853
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000854 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000855}
856
Guido van Rossum9e896b32000-04-05 20:11:21 +0000857/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000858static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000859long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000860{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000861 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000862 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000863
Guido van Rossum4c08d552000-03-10 22:55:18 +0000864 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000865 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000866 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000867 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000868 PyErr_SetString(PyExc_ValueError,
869 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000870 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000871 return NULL;
872 }
873 return x;
874}
875
Guido van Rossume15dee51995-07-18 14:12:02 +0000876PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000877PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000878{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000879 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000880 const char *buffer;
881 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000882
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 if (o == NULL)
884 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000885 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000886 Py_INCREF(o);
887 return o;
888 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000889 if (PyLong_Check(o))
890 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000891 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000892 /* need to do extra error checking that PyLong_FromString()
893 * doesn't do. In particular long('9.5') must raise an
894 * exception, not truncate the float.
895 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000896 return long_from_string(PyString_AS_STRING(o),
897 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000898#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000899 if (PyUnicode_Check(o))
900 /* The above check is done in PyLong_FromUnicode(). */
901 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
902 PyUnicode_GET_SIZE(o),
903 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000904#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000905 m = o->ob_type->tp_as_number;
906 if (m && m->nb_long)
907 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000908 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
909 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000910
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000912}
913
914PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000915PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000916{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000917 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000918
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000919 if (o == NULL)
920 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000921 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000922 Py_INCREF(o);
923 return o;
924 }
Tim Peters7a50f252001-09-10 21:28:20 +0000925 if (PyFloat_Check(o)) {
926 PyFloatObject *po = (PyFloatObject *)o;
927 return PyFloat_FromDouble(po->ob_fval);
928 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000929 if (!PyString_Check(o)) {
930 m = o->ob_type->tp_as_number;
931 if (m && m->nb_float)
932 return m->nb_float(o);
933 }
934 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000935}
936
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000937/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000938
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000939int
Fred Drake79912472000-07-09 04:06:11 +0000940PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000941{
Guido van Rossum8700b422001-09-07 20:20:11 +0000942 return s != NULL && s->ob_type->tp_as_sequence &&
943 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000944}
945
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000947PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000948{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000949 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000950
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000951 if (s == NULL) {
952 null_error();
953 return -1;
954 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000955
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000956 m = s->ob_type->tp_as_sequence;
957 if (m && m->sq_length)
958 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000959
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000960 type_error("len() of unsized object");
961 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000962}
963
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000964#undef PySequence_Length
965int
966PySequence_Length(PyObject *s)
967{
968 return PySequence_Size(s);
969}
970#define PySequence_Length PySequence_Size
971
Guido van Rossume15dee51995-07-18 14:12:02 +0000972PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000973PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000974{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000976
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000977 if (s == NULL || o == NULL)
978 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000979
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000980 m = s->ob_type->tp_as_sequence;
981 if (m && m->sq_concat)
982 return m->sq_concat(s, o);
983
984 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000985}
986
987PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000988PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +0000989{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000990 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000991
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000992 if (o == NULL)
993 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000994
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000995 m = o->ob_type->tp_as_sequence;
996 if (m && m->sq_repeat)
997 return m->sq_repeat(o, count);
998
999 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001000}
1001
1002PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001003PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1004{
1005 PySequenceMethods *m;
1006
1007 if (s == NULL || o == NULL)
1008 return null_error();
1009
1010 m = s->ob_type->tp_as_sequence;
1011 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1012 return m->sq_inplace_concat(s, o);
1013 if (m && m->sq_concat)
1014 return m->sq_concat(s, o);
1015
1016 return type_error("object can't be concatenated");
1017}
1018
1019PyObject *
1020PySequence_InPlaceRepeat(PyObject *o, int count)
1021{
1022 PySequenceMethods *m;
1023
1024 if (o == NULL)
1025 return null_error();
1026
1027 m = o->ob_type->tp_as_sequence;
1028 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1029 return m->sq_inplace_repeat(o, count);
1030 if (m && m->sq_repeat)
1031 return m->sq_repeat(o, count);
1032
1033 return type_error("object can't be repeated");
1034}
1035
1036PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001037PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001038{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001040
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001041 if (s == NULL)
1042 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001043
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001044 m = s->ob_type->tp_as_sequence;
1045 if (m && m->sq_item) {
1046 if (i < 0) {
1047 if (m->sq_length) {
1048 int l = (*m->sq_length)(s);
1049 if (l < 0)
1050 return NULL;
1051 i += l;
1052 }
1053 }
1054 return m->sq_item(s, i);
1055 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001056
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001057 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001058}
1059
Thomas Wouters1d75a792000-08-17 22:37:32 +00001060static PyObject *
1061sliceobj_from_intint(int i, int j)
1062{
1063 PyObject *start, *end, *slice;
1064 start = PyInt_FromLong((long)i);
1065 if (!start)
1066 return NULL;
1067 end = PyInt_FromLong((long)j);
1068 if (!end) {
1069 Py_DECREF(start);
1070 return NULL;
1071 }
1072 slice = PySlice_New(start, end, NULL);
1073 Py_DECREF(start);
1074 Py_DECREF(end);
1075 return slice;
1076}
1077
Guido van Rossume15dee51995-07-18 14:12:02 +00001078PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001079PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001080{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001081 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001082 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001083
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001084 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001085
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001086 m = s->ob_type->tp_as_sequence;
1087 if (m && m->sq_slice) {
1088 if (i1 < 0 || i2 < 0) {
1089 if (m->sq_length) {
1090 int l = (*m->sq_length)(s);
1091 if (l < 0)
1092 return NULL;
1093 if (i1 < 0)
1094 i1 += l;
1095 if (i2 < 0)
1096 i2 += l;
1097 }
1098 }
1099 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001100 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1101 PyObject *res;
1102 PyObject *slice = sliceobj_from_intint(i1, i2);
1103 if (!slice)
1104 return NULL;
1105 res = mp->mp_subscript(s, slice);
1106 Py_DECREF(slice);
1107 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001109
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001110 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001111}
1112
1113int
Fred Drake79912472000-07-09 04:06:11 +00001114PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001115{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001116 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001118 if (s == NULL) {
1119 null_error();
1120 return -1;
1121 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001122
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001123 m = s->ob_type->tp_as_sequence;
1124 if (m && m->sq_ass_item) {
1125 if (i < 0) {
1126 if (m->sq_length) {
1127 int l = (*m->sq_length)(s);
1128 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001129 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 i += l;
1131 }
1132 }
1133 return m->sq_ass_item(s, i, o);
1134 }
1135
1136 type_error("object doesn't support item assignment");
1137 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001138}
1139
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001140int
Fred Drake79912472000-07-09 04:06:11 +00001141PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001142{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001143 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001144
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001145 if (s == NULL) {
1146 null_error();
1147 return -1;
1148 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001149
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150 m = s->ob_type->tp_as_sequence;
1151 if (m && m->sq_ass_item) {
1152 if (i < 0) {
1153 if (m->sq_length) {
1154 int l = (*m->sq_length)(s);
1155 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001156 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001157 i += l;
1158 }
1159 }
1160 return m->sq_ass_item(s, i, (PyObject *)NULL);
1161 }
1162
1163 type_error("object doesn't support item deletion");
1164 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001165}
1166
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001167int
Fred Drake79912472000-07-09 04:06:11 +00001168PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001169{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001171 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001172
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001173 if (s == NULL) {
1174 null_error();
1175 return -1;
1176 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001177
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178 m = s->ob_type->tp_as_sequence;
1179 if (m && m->sq_ass_slice) {
1180 if (i1 < 0 || i2 < 0) {
1181 if (m->sq_length) {
1182 int l = (*m->sq_length)(s);
1183 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001184 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001185 if (i1 < 0)
1186 i1 += l;
1187 if (i2 < 0)
1188 i2 += l;
1189 }
1190 }
1191 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001192 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1193 int res;
1194 PyObject *slice = sliceobj_from_intint(i1, i2);
1195 if (!slice)
1196 return -1;
1197 res = mp->mp_ass_subscript(s, slice, o);
1198 Py_DECREF(slice);
1199 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001200 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001201
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 type_error("object doesn't support slice assignment");
1203 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001204}
1205
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001206int
Fred Drake79912472000-07-09 04:06:11 +00001207PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001208{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001209 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001210
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001211 if (s == NULL) {
1212 null_error();
1213 return -1;
1214 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001215
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001216 m = s->ob_type->tp_as_sequence;
1217 if (m && m->sq_ass_slice) {
1218 if (i1 < 0 || i2 < 0) {
1219 if (m->sq_length) {
1220 int l = (*m->sq_length)(s);
1221 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001222 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001223 if (i1 < 0)
1224 i1 += l;
1225 if (i2 < 0)
1226 i2 += l;
1227 }
1228 }
1229 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1230 }
1231 type_error("object doesn't support slice deletion");
1232 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001233}
1234
Guido van Rossume15dee51995-07-18 14:12:02 +00001235PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001236PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001237{
Tim Peters6912d4d2001-05-05 03:56:37 +00001238 PyObject *it; /* iter(v) */
1239 int n; /* guess for result tuple size */
1240 PyObject *result;
1241 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001242
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 if (v == NULL)
1244 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001245
Tim Peters6912d4d2001-05-05 03:56:37 +00001246 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001247 if (PyTuple_CheckExact(v)) {
1248 /* Note that we can't know whether it's safe to return
1249 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001250 to exact tuples here. In contrast, lists always make
1251 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001252 Py_INCREF(v);
1253 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001254 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255 if (PyList_Check(v))
1256 return PyList_AsTuple(v);
1257
Tim Peters6912d4d2001-05-05 03:56:37 +00001258 /* Get iterator. */
1259 it = PyObject_GetIter(v);
1260 if (it == NULL)
1261 return type_error("tuple() argument must support iteration");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262
Tim Peters6912d4d2001-05-05 03:56:37 +00001263 /* Guess result size and allocate space. */
1264 n = PySequence_Size(v);
1265 if (n < 0) {
1266 PyErr_Clear();
1267 n = 10; /* arbitrary */
1268 }
1269 result = PyTuple_New(n);
1270 if (result == NULL)
1271 goto Fail;
1272
1273 /* Fill the tuple. */
1274 for (j = 0; ; ++j) {
1275 PyObject *item = PyIter_Next(it);
1276 if (item == NULL) {
1277 if (PyErr_Occurred())
1278 goto Fail;
1279 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001280 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001281 if (j >= n) {
1282 if (n < 500)
1283 n += 10;
1284 else
1285 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001286 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001287 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001288 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001289 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001290 }
1291 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001292 }
1293
Tim Peters6912d4d2001-05-05 03:56:37 +00001294 /* Cut tuple back if guess was too large. */
1295 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001296 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001297 goto Fail;
1298
1299 Py_DECREF(it);
1300 return result;
1301
1302Fail:
1303 Py_XDECREF(result);
1304 Py_DECREF(it);
1305 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001306}
1307
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001308PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001309PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001310{
Tim Petersf553f892001-05-01 20:45:31 +00001311 PyObject *it; /* iter(v) */
1312 PyObject *result; /* result list */
1313 int n; /* guess for result list size */
1314 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001315
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001316 if (v == NULL)
1317 return null_error();
1318
Tim Petersf553f892001-05-01 20:45:31 +00001319 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001320 if (PyList_Check(v))
1321 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1322
Tim Petersf553f892001-05-01 20:45:31 +00001323 /* Get iterator. There may be some low-level efficiency to be gained
1324 * by caching the tp_iternext slot instead of using PyIter_Next()
1325 * later, but premature optimization is the root etc.
1326 */
1327 it = PyObject_GetIter(v);
1328 if (it == NULL)
1329 return NULL;
1330
1331 /* Guess a result list size. */
1332 n = -1; /* unknown */
1333 if (PySequence_Check(v) &&
1334 v->ob_type->tp_as_sequence->sq_length) {
1335 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001336 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001337 PyErr_Clear();
1338 }
1339 if (n < 0)
1340 n = 8; /* arbitrary */
1341 result = PyList_New(n);
1342 if (result == NULL) {
1343 Py_DECREF(it);
1344 return NULL;
1345 }
1346
1347 /* Run iterator to exhaustion. */
1348 for (i = 0; ; i++) {
1349 PyObject *item = PyIter_Next(it);
1350 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001351 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001352 Py_DECREF(result);
1353 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001354 }
Tim Petersf553f892001-05-01 20:45:31 +00001355 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001356 }
Tim Petersf553f892001-05-01 20:45:31 +00001357 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001358 PyList_SET_ITEM(result, i, item); /* steals ref */
1359 else {
1360 int status = PyList_Append(result, item);
1361 Py_DECREF(item); /* append creates a new ref */
1362 if (status < 0) {
1363 Py_DECREF(result);
1364 result = NULL;
1365 break;
1366 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001367 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001368 }
Tim Petersf553f892001-05-01 20:45:31 +00001369
1370 /* Cut back result list if initial guess was too large. */
1371 if (i < n && result != NULL) {
1372 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1373 Py_DECREF(result);
1374 result = NULL;
1375 }
1376 }
1377 Py_DECREF(it);
1378 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001379}
1380
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001381PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001382PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001383{
1384 if (v == NULL)
1385 return null_error();
1386
1387 if (PyList_Check(v) || PyTuple_Check(v)) {
1388 Py_INCREF(v);
1389 return v;
1390 }
1391
1392 v = PySequence_Tuple(v);
1393 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1394 return type_error(m);
1395
1396 return v;
1397}
1398
Tim Peters16a77ad2001-09-08 04:00:12 +00001399/* Iterate over seq. Result depends on the operation:
1400 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1401 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1402 set ValueError and return -1 if none found; also return -1 on error.
1403 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1404*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001405int
Tim Peters16a77ad2001-09-08 04:00:12 +00001406_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001407{
Tim Peters16a77ad2001-09-08 04:00:12 +00001408 int n;
1409 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1410 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001411
Tim Peters16a77ad2001-09-08 04:00:12 +00001412 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 null_error();
1414 return -1;
1415 }
Tim Peters75f8e352001-05-05 11:33:43 +00001416
Tim Peters16a77ad2001-09-08 04:00:12 +00001417 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001418 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001419 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001420 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001421 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001422
Tim Peters16a77ad2001-09-08 04:00:12 +00001423 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001424 for (;;) {
1425 int cmp;
1426 PyObject *item = PyIter_Next(it);
1427 if (item == NULL) {
1428 if (PyErr_Occurred())
1429 goto Fail;
1430 break;
1431 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001432
1433 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001434 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001435 if (cmp < 0)
1436 goto Fail;
1437 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001438 switch (operation) {
1439 case PY_ITERSEARCH_COUNT:
1440 ++n;
1441 if (n <= 0) {
1442 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001443 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001444 goto Fail;
1445 }
1446 break;
1447
1448 case PY_ITERSEARCH_INDEX:
1449 if (wrapped) {
1450 PyErr_SetString(PyExc_OverflowError,
1451 "index exceeds C int size");
1452 goto Fail;
1453 }
1454 goto Done;
1455
1456 case PY_ITERSEARCH_CONTAINS:
1457 n = 1;
1458 goto Done;
1459
1460 default:
1461 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001462 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001463 }
1464
1465 if (operation == PY_ITERSEARCH_INDEX) {
1466 ++n;
1467 if (n <= 0)
1468 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001469 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001470 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001471
1472 if (operation != PY_ITERSEARCH_INDEX)
1473 goto Done;
1474
1475 PyErr_SetString(PyExc_ValueError,
1476 "sequence.index(x): x not in sequence");
1477 /* fall into failure code */
1478Fail:
1479 n = -1;
1480 /* fall through */
1481Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001482 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001483 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001484
Guido van Rossume15dee51995-07-18 14:12:02 +00001485}
1486
Tim Peters16a77ad2001-09-08 04:00:12 +00001487/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001488int
Tim Peters16a77ad2001-09-08 04:00:12 +00001489PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001490{
Tim Peters16a77ad2001-09-08 04:00:12 +00001491 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001492}
1493
Tim Peterscb8d3682001-05-05 21:05:01 +00001494/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001495 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001496 */
1497int
1498PySequence_Contains(PyObject *seq, PyObject *ob)
1499{
1500 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1501 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1502 if (sqm != NULL && sqm->sq_contains != NULL)
1503 return (*sqm->sq_contains)(seq, ob);
1504 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001505 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001506}
1507
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001508/* Backwards compatibility */
1509#undef PySequence_In
1510int
Fred Drake79912472000-07-09 04:06:11 +00001511PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001512{
1513 return PySequence_Contains(w, v);
1514}
1515
1516int
Fred Drake79912472000-07-09 04:06:11 +00001517PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001518{
Tim Peters16a77ad2001-09-08 04:00:12 +00001519 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001520}
1521
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001522/* Operations on mappings */
1523
1524int
Fred Drake79912472000-07-09 04:06:11 +00001525PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001526{
Guido van Rossum8700b422001-09-07 20:20:11 +00001527 return o && o->ob_type->tp_as_mapping &&
1528 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001529}
1530
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001531int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001532PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001533{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001534 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001535
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001536 if (o == NULL) {
1537 null_error();
1538 return -1;
1539 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001540
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001541 m = o->ob_type->tp_as_mapping;
1542 if (m && m->mp_length)
1543 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001544
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001545 type_error("len() of unsized object");
1546 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001547}
1548
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001549#undef PyMapping_Length
1550int
1551PyMapping_Length(PyObject *o)
1552{
1553 return PyMapping_Size(o);
1554}
1555#define PyMapping_Length PyMapping_Size
1556
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001557PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001558PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001559{
1560 PyObject *okey, *r;
1561
1562 if (key == NULL)
1563 return null_error();
1564
1565 okey = PyString_FromString(key);
1566 if (okey == NULL)
1567 return NULL;
1568 r = PyObject_GetItem(o, okey);
1569 Py_DECREF(okey);
1570 return r;
1571}
1572
1573int
Fred Drake79912472000-07-09 04:06:11 +00001574PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001575{
1576 PyObject *okey;
1577 int r;
1578
1579 if (key == NULL) {
1580 null_error();
1581 return -1;
1582 }
1583
1584 okey = PyString_FromString(key);
1585 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001586 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001587 r = PyObject_SetItem(o, okey, value);
1588 Py_DECREF(okey);
1589 return r;
1590}
1591
1592int
Fred Drake79912472000-07-09 04:06:11 +00001593PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001594{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001595 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001596
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001597 v = PyMapping_GetItemString(o, key);
1598 if (v) {
1599 Py_DECREF(v);
1600 return 1;
1601 }
1602 PyErr_Clear();
1603 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001604}
1605
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001606int
Fred Drake79912472000-07-09 04:06:11 +00001607PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001608{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001609 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001610
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611 v = PyObject_GetItem(o, key);
1612 if (v) {
1613 Py_DECREF(v);
1614 return 1;
1615 }
1616 PyErr_Clear();
1617 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001618}
1619
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001620/* Operations on callable objects */
1621
1622/* XXX PyCallable_Check() is in object.c */
1623
Guido van Rossume15dee51995-07-18 14:12:02 +00001624PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001625PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001626{
Guido van Rossum5560b742001-09-14 16:47:50 +00001627 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001628}
Guido van Rossume15dee51995-07-18 14:12:02 +00001629
1630PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001631PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1632{
1633 ternaryfunc call;
1634
1635 if ((call = func->ob_type->tp_call) != NULL) {
1636 PyObject *result = (*call)(func, arg, kw);
1637 if (result == NULL && !PyErr_Occurred())
1638 PyErr_SetString(
1639 PyExc_SystemError,
1640 "NULL result without error in PyObject_Call");
1641 return result;
1642 }
1643 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
1644 PyString_AS_STRING(PyObject_Repr(func)));
1645 return NULL;
1646}
1647
1648PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001649PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001650{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001651 va_list va;
1652 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001653 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001654
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001655 if (callable == NULL) {
1656 va_end(va);
1657 return null_error();
1658 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001659
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001660 if (format)
1661 args = Py_VaBuildValue(format, va);
1662 else
1663 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001664
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001665 va_end(va);
1666
1667 if (args == NULL)
1668 return NULL;
1669
1670 if (!PyTuple_Check(args)) {
1671 PyObject *a;
1672
1673 a = PyTuple_New(1);
1674 if (a == NULL)
1675 return NULL;
1676 if (PyTuple_SetItem(a, 0, args) < 0)
1677 return NULL;
1678 args = a;
1679 }
1680 retval = PyObject_CallObject(callable, args);
1681
1682 Py_DECREF(args);
1683
1684 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001685}
1686
1687PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001688PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001689{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001690 va_list va;
1691 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001692 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001693
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001694 if (o == NULL || name == NULL) {
1695 va_end(va);
1696 return null_error();
1697 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001698
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001699 func = PyObject_GetAttrString(o, name);
1700 if (func == NULL) {
1701 va_end(va);
1702 PyErr_SetString(PyExc_AttributeError, name);
1703 return 0;
1704 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001705
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001706 if (!PyCallable_Check(func)) {
1707 va_end(va);
1708 return type_error("call of non-callable attribute");
1709 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001710
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001711 if (format && *format)
1712 args = Py_VaBuildValue(format, va);
1713 else
1714 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001715
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001716 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001717
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001718 if (!args)
1719 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001720
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001721 if (!PyTuple_Check(args)) {
1722 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001723
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001724 a = PyTuple_New(1);
1725 if (a == NULL)
1726 return NULL;
1727 if (PyTuple_SetItem(a, 0, args) < 0)
1728 return NULL;
1729 args = a;
1730 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001731
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001732 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001733
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001734 Py_DECREF(args);
1735 Py_DECREF(func);
1736
1737 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001738}
Guido van Rossum823649d2001-03-21 18:40:58 +00001739
1740
1741/* isinstance(), issubclass() */
1742
Neil Schemenauer6b471292001-10-18 03:18:43 +00001743static PyObject *
1744abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001745{
1746 static PyObject *__bases__ = NULL;
1747 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001748
1749 if (__bases__ == NULL) {
1750 __bases__ = PyString_FromString("__bases__");
1751 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001752 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001753 }
1754
Neil Schemenauer6b471292001-10-18 03:18:43 +00001755 bases = PyObject_GetAttr(cls, __bases__);
1756 if (bases == NULL || !PyTuple_Check(bases)) {
1757 Py_XDECREF(bases);
1758 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001759 }
1760
Neil Schemenauer6b471292001-10-18 03:18:43 +00001761 return bases;
1762}
1763
1764
1765static int
1766abstract_issubclass(PyObject *derived, PyObject *cls)
1767{
1768 PyObject *bases;
1769 int i, n;
1770 int r = 0;
1771
1772
Guido van Rossum823649d2001-03-21 18:40:58 +00001773 if (derived == cls)
1774 return 1;
1775
Neil Schemenauer6b471292001-10-18 03:18:43 +00001776 bases = abstract_get_bases(derived);
1777 if (bases == NULL)
1778 return 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001779
1780 n = PyTuple_GET_SIZE(bases);
1781 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001782 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001783 if (r != 0)
1784 break;
1785 }
1786
1787 Py_DECREF(bases);
1788
1789 return r;
1790}
1791
1792int
1793PyObject_IsInstance(PyObject *inst, PyObject *cls)
1794{
1795 PyObject *icls;
1796 static PyObject *__class__ = NULL;
1797 int retval = 0;
1798
Neil Schemenauer6b471292001-10-18 03:18:43 +00001799 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1800 PyObject *inclass =
1801 (PyObject*)((PyInstanceObject*)inst)->in_class;
1802 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001803 }
1804 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001805 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001806 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001807 else if (PyTuple_Check(cls)) {
1808 /* Not a general sequence -- that opens up the road to
1809 recursion and stack overflow. */
1810 int i, n;
1811
1812 n = PyTuple_GET_SIZE(cls);
1813 for (i = 0; i < n; i++) {
1814 retval = PyObject_IsInstance(
1815 inst, PyTuple_GET_ITEM(cls, i));
1816 if (retval != 0)
1817 break;
1818 }
1819 return retval;
1820 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001821 else {
1822 PyObject *cls_bases = abstract_get_bases(cls);
1823 if (cls_bases == NULL) {
1824 PyErr_SetString(PyExc_TypeError,
1825 "isinstance() arg 2 must be a class or type");
1826 return -1;
1827 }
1828 Py_DECREF(cls_bases);
Guido van Rossum823649d2001-03-21 18:40:58 +00001829 if (__class__ == NULL) {
1830 __class__ = PyString_FromString("__class__");
1831 if (__class__ == NULL)
1832 return -1;
1833 }
1834 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001835 if (icls == NULL) {
1836 PyErr_Clear();
1837 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001838 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001839 else {
1840 retval = abstract_issubclass(icls, cls);
1841 Py_DECREF(icls);
1842 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001843 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001844
Guido van Rossum823649d2001-03-21 18:40:58 +00001845 return retval;
1846}
1847
1848int
1849PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1850{
1851 int retval;
1852
1853 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001854 PyObject *derived_bases;
1855 PyObject *cls_bases;
1856
1857 derived_bases = abstract_get_bases(derived);
1858 if (derived_bases == NULL) {
1859 PyErr_SetString(PyExc_TypeError,
1860 "issubclass() arg 1 must be a class");
1861 return -1;
1862 }
1863 Py_DECREF(derived_bases);
1864
1865 cls_bases = abstract_get_bases(cls);
1866 if (cls_bases == NULL) {
1867 PyErr_SetString(PyExc_TypeError,
1868 "issubclass() arg 2 must be a class");
1869 return -1;
1870 }
1871 Py_DECREF(cls_bases);
1872
1873 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001874 }
1875 else {
1876 /* shortcut */
1877 if (!(retval = (derived == cls)))
1878 retval = PyClass_IsSubclass(derived, cls);
1879 }
1880
1881 return retval;
1882}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001883
1884PyObject *
1885PyObject_GetIter(PyObject *o)
1886{
1887 PyTypeObject *t = o->ob_type;
1888 getiterfunc f = NULL;
1889 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
1890 f = t->tp_iter;
1891 if (f == NULL) {
1892 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00001893 return PySeqIter_New(o);
Tim Peters8b13b3e2001-09-30 05:58:42 +00001894 PyErr_SetString(PyExc_TypeError, "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001895 return NULL;
1896 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00001897 else {
1898 PyObject *res = (*f)(o);
1899 if (res != NULL && !PyIter_Check(res)) {
1900 PyErr_Format(PyExc_TypeError,
1901 "iter() returned non-iterator "
1902 "of type '%.100s'",
1903 res->ob_type->tp_name);
1904 Py_DECREF(res);
1905 res = NULL;
1906 }
1907 return res;
1908 }
1909}
1910
Tim Petersf4848da2001-05-05 00:14:56 +00001911/* Return next item.
1912 * If an error occurs, return NULL. PyErr_Occurred() will be true.
1913 * If the iteration terminates normally, return NULL and clear the
1914 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
1915 * will be false.
1916 * Else return the next object. PyErr_Occurred() will be false.
1917 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001918PyObject *
1919PyIter_Next(PyObject *iter)
1920{
Tim Petersf4848da2001-05-05 00:14:56 +00001921 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00001922 if (!PyIter_Check(iter)) {
1923 PyErr_Format(PyExc_TypeError,
1924 "'%.100s' object is not an iterator",
1925 iter->ob_type->tp_name);
1926 return NULL;
1927 }
Tim Petersf4848da2001-05-05 00:14:56 +00001928 result = (*iter->ob_type->tp_iternext)(iter);
1929 if (result == NULL &&
1930 PyErr_Occurred() &&
1931 PyErr_ExceptionMatches(PyExc_StopIteration))
1932 PyErr_Clear();
1933 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001934}