blob: fdf1a4483fc9ca17631d7c4ecc3f66682d737ec6 [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 -------------------------------------------------------------------
303 new new v.op(v,w), w.op(v,w)
304 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
308 Legend:
309 -------
310 * new == new style number
311 * old == old style number
312 * Action indicates the order in which operations are tried until either
313 a valid result is produced or an error occurs.
314
315 */
316
317static PyObject *
318binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000319{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000320 PyObject *x;
321 binaryfunc *slot;
322 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v)) {
323 slot = NB_BINOP(v->ob_type->tp_as_number, op_slot);
324 if (*slot) {
325 x = (*slot)(v, w);
326 if (x != Py_NotImplemented) {
327 return x;
328 }
329 Py_DECREF(x); /* can't do it */
330 }
331 if (v->ob_type == w->ob_type) {
332 goto binop_error;
333 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000334 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000335 if (w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
336 slot = NB_BINOP(w->ob_type->tp_as_number, op_slot);
337 if (*slot) {
338 x = (*slot)(v, w);
339 if (x != Py_NotImplemented) {
340 return x;
341 }
342 Py_DECREF(x); /* can't do it */
343 }
344 }
345 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
346 int err = PyNumber_CoerceEx(&v, &w);
347 if (err < 0) {
348 return NULL;
349 }
350 if (err == 0) {
351 PyNumberMethods *mv = v->ob_type->tp_as_number;
352 if (mv) {
353 slot = NB_BINOP(mv, op_slot);
354 if (*slot) {
355 PyObject *x = (*slot)(v, w);
356 Py_DECREF(v);
357 Py_DECREF(w);
358 return x;
359 }
360 }
361 /* CoerceEx incremented the reference counts */
362 Py_DECREF(v);
363 Py_DECREF(w);
364 }
365 }
366binop_error:
367 Py_INCREF(Py_NotImplemented);
368 return Py_NotImplemented;
369}
370
371static PyObject *
372binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
373{
374 PyObject *result = binary_op1(v, w, op_slot);
375 if (result == Py_NotImplemented) {
376 Py_DECREF(Py_NotImplemented);
377 PyErr_Format(PyExc_TypeError,
378 "unsupported operand type(s) for %s", op_name);
379 return NULL;
380 }
381 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000382}
383
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000384
385/*
386 Calling scheme used for ternary operations:
387
388 v w z Action
389 -------------------------------------------------------------------
390 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
391 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
392 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
393 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
394 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
395 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
396 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
397 old old old coerce(v,w,z), v.op(v,w,z)
398
399 Legend:
400 -------
401 * new == new style number
402 * old == old style number
403 * Action indicates the order in which operations are tried until either
404 a valid result is produced or an error occurs.
405 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
406 only if z != Py_None; if z == Py_None, then it is treated as absent
407 variable and only coerce(v,w) is tried.
408
409 */
410
411static PyObject *
412ternary_op(PyObject *v,
413 PyObject *w,
414 PyObject *z,
415 const int op_slot,
416 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000417{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000418 PyNumberMethods *mv, *mw, *mz;
419 register PyObject *x = NULL;
420 register ternaryfunc *slot;
421
422 mv = v->ob_type->tp_as_number;
423 if (mv != NULL && NEW_STYLE_NUMBER(v)) {
424 /* try v.op(v,w,z) */
425 slot = NB_TERNOP(mv, op_slot);
426 if (*slot) {
427 x = (*slot)(v, w, z);
428 if (x != Py_NotImplemented)
429 return x;
430 /* Can't do it... fall through */
431 Py_DECREF(x);
432 }
433 if (v->ob_type == w->ob_type &&
434 (z == Py_None || z->ob_type == v->ob_type)) {
435 goto ternary_error;
436 }
437 }
438 mw = w->ob_type->tp_as_number;
439 if (mw != NULL && NEW_STYLE_NUMBER(w)) {
440 /* try w.op(v,w,z) */
441 slot = NB_TERNOP(mw,op_slot);
442 if (*slot) {
443 x = (*slot)(v, w, z);
444 if (x != Py_NotImplemented)
445 return x;
446 /* Can't do it... fall through */
447 Py_DECREF(x);
448 }
449 if (NEW_STYLE_NUMBER(v) &&
450 (z == Py_None || z->ob_type == v->ob_type)) {
451 goto ternary_error;
452 }
453 }
454 mz = z->ob_type->tp_as_number;
455 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
456 /* try: z.op(v,w,z) */
457 slot = NB_TERNOP(mz, op_slot);
458 if (*slot) {
459 x = (*slot)(v, w, z);
460 if (x != Py_NotImplemented)
461 return x;
462 /* Can't do it... fall through */
463 Py_DECREF(x);
464 }
465 }
466
467 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
468 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
469 /* we have an old style operand, coerce */
470 PyObject *v1, *z1, *w2, *z2;
471 int c;
472
473 c = PyNumber_Coerce(&v, &w);
474 if (c != 0)
475 goto error3;
476
477 /* Special case: if the third argument is None, it is
478 treated as absent argument and not coerced. */
479 if (z == Py_None) {
480 if (v->ob_type->tp_as_number) {
481 slot = NB_TERNOP(v->ob_type->tp_as_number,
482 op_slot);
483 if (*slot)
484 x = (*slot)(v, w, z);
485 else
486 c = -1;
487 }
488 else
489 c = -1;
490 goto error2;
491 }
492 v1 = v;
493 z1 = z;
494 c = PyNumber_Coerce(&v1, &z1);
495 if (c != 0)
496 goto error2;
497 w2 = w;
498 z2 = z1;
499 c = PyNumber_Coerce(&w2, &z2);
500 if (c != 0)
501 goto error1;
502
503 if (v1->ob_type->tp_as_number != NULL) {
504 slot = NB_TERNOP(v1->ob_type->tp_as_number,
505 op_slot);
506 if (*slot)
507 x = (*slot)(v1, w2, z2);
508 else
509 c = -1;
510 }
511 else
512 c = -1;
513
514 Py_DECREF(w2);
515 Py_DECREF(z2);
516 error1:
517 Py_DECREF(v1);
518 Py_DECREF(z1);
519 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000520 Py_DECREF(v);
521 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000522 error3:
523 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000524 return x;
525 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000526
527ternary_error:
528 PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for %s",
529 op_name);
530 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000531}
532
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000533#define BINARY_FUNC(func, op, op_name) \
534 PyObject * \
535 func(PyObject *v, PyObject *w) { \
536 return binary_op(v, w, NB_SLOT(op), op_name); \
537 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000538
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000539BINARY_FUNC(PyNumber_Or, nb_or, "|")
540BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
541BINARY_FUNC(PyNumber_And, nb_and, "&")
542BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
543BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
544BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
545BINARY_FUNC(PyNumber_Multiply, nb_multiply, "*")
546BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
547BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000548
549PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000550PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000551{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000552 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
553 if (result == Py_NotImplemented) {
554 PySequenceMethods *m = v->ob_type->tp_as_sequence;
555 Py_DECREF(Py_NotImplemented);
556 if (m && m->sq_concat) {
557 result = (*m->sq_concat)(v, w);
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000558 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000559 else {
560 PyErr_SetString(PyExc_TypeError,
561 "unsupported operand types for +");
562 result = NULL;
563 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000564 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000565 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000566}
567
568PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000569PyNumber_FloorDivide(PyObject *v, PyObject *w)
570{
571 /* XXX tp_flags test */
572 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
573}
574
575PyObject *
576PyNumber_TrueDivide(PyObject *v, PyObject *w)
577{
578 /* XXX tp_flags test */
579 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
580}
581
582PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000583PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000584{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000585 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000586 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000587#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000588 else if (PyUnicode_Check(v))
589 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000590#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000591 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000592}
593
594PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000595PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000596{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000597 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000598}
599
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000600/* Binary in-place operators */
601
602/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000603 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000604
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000605 - If the left hand object has the appropriate struct members, and
606 they are filled, call the appropriate function and return the
607 result. No coercion is done on the arguments; the left-hand object
608 is the one the operation is performed on, and it's up to the
609 function to deal with the right-hand object.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000610
611 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000612 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000613
614 */
615
616#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
617
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000618static PyObject *
619binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
620 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000621{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000622 PyNumberMethods *mv = v->ob_type->tp_as_number;
623 if (mv != NULL && HASINPLACE(v)) {
624 binaryfunc *slot = NB_BINOP(mv, iop_slot);
625 if (*slot) {
626 PyObject *x = (*slot)(v, w);
627 if (x != Py_NotImplemented) {
628 return x;
629 }
630 Py_DECREF(x);
631 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000632 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000633 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000634}
635
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000636#define INPLACE_BINOP(func, iop, op, op_name) \
637 PyObject * \
638 func(PyObject *v, PyObject *w) { \
639 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000640 }
641
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000642INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
643INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
644INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
645INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
646INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
647INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
648INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000649
650PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000651PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
652{
653 /* XXX tp_flags test */
654 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
655 NB_SLOT(nb_floor_divide), "//=");
656}
657
658PyObject *
659PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
660{
661 /* XXX tp_flags test */
662 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
663 NB_SLOT(nb_true_divide), "/=");
664}
665
666PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000667PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
668{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000669 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000670
Guido van Rossumbb8be932000-09-01 23:27:32 +0000671 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000672 if (HASINPLACE(v))
673 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
674 if (f == NULL)
675 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000676 if (f != NULL)
677 return (*f)(v, w);
678 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000679 return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000680}
681
682PyObject *
683PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
684{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000685 PyObject * (*g)(PyObject *, int) = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000686 if (HASINPLACE(v) && v->ob_type->tp_as_sequence &&
687 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) {
688 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000689 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000690 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000691 }
692 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000693 n = PyLong_AsLong(w);
694 if (n == -1 && PyErr_Occurred())
695 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000696 }
697 else {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000698 return type_error("can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000699 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000700 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000701 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000702 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
703 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000704}
705
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000706
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000707
708PyObject *
709PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
710{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000711 if (PyString_Check(v))
712 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000713#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000714 else if (PyUnicode_Check(v))
715 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000716#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000717 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000718 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
719 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000720}
721
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000722
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000723PyObject *
724PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
725{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
727 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
728 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000730 else {
731 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
732 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000733}
734
735
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000736/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000737
738PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000739PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000740{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000741 PyNumberMethods *m;
742
743 if (o == NULL)
744 return null_error();
745 m = o->ob_type->tp_as_number;
746 if (m && m->nb_negative)
747 return (*m->nb_negative)(o);
748
749 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000750}
751
752PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000753PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000754{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755 PyNumberMethods *m;
756
757 if (o == NULL)
758 return null_error();
759 m = o->ob_type->tp_as_number;
760 if (m && m->nb_positive)
761 return (*m->nb_positive)(o);
762
763 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000764}
765
766PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000767PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000768{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000769 PyNumberMethods *m;
770
771 if (o == NULL)
772 return null_error();
773 m = o->ob_type->tp_as_number;
774 if (m && m->nb_invert)
775 return (*m->nb_invert)(o);
776
777 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000778}
779
780PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000781PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000782{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000783 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000784
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000785 if (o == NULL)
786 return null_error();
787 m = o->ob_type->tp_as_number;
788 if (m && m->nb_absolute)
789 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000790
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000791 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000792}
793
Guido van Rossum9e896b32000-04-05 20:11:21 +0000794/* Add a check for embedded NULL-bytes in the argument. */
795static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000796int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000797{
798 char *end;
799 PyObject *x;
800
801 x = PyInt_FromString((char*)s, &end, 10);
802 if (x == NULL)
803 return NULL;
804 if (end != s + len) {
805 PyErr_SetString(PyExc_ValueError,
806 "null byte in argument for int()");
807 Py_DECREF(x);
808 return NULL;
809 }
810 return x;
811}
812
Guido van Rossume15dee51995-07-18 14:12:02 +0000813PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000814PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000815{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000816 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000817 const char *buffer;
818 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000819
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000820 if (o == NULL)
821 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000822 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000823 Py_INCREF(o);
824 return o;
825 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000826 if (PyInt_Check(o)) {
827 PyIntObject *io = (PyIntObject*)o;
828 return PyInt_FromLong(io->ob_ival);
829 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000830 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000831 return int_from_string(PyString_AS_STRING(o),
832 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000833#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000834 if (PyUnicode_Check(o))
835 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
836 PyUnicode_GET_SIZE(o),
837 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000838#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000839 m = o->ob_type->tp_as_number;
840 if (m && m->nb_int)
841 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000842 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000843 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000844
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000845 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000846}
847
Guido van Rossum9e896b32000-04-05 20:11:21 +0000848/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000849static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000850long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000851{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000852 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000853 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000854
Guido van Rossum4c08d552000-03-10 22:55:18 +0000855 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000856 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000857 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000858 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000859 PyErr_SetString(PyExc_ValueError,
860 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000861 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000862 return NULL;
863 }
864 return x;
865}
866
Guido van Rossume15dee51995-07-18 14:12:02 +0000867PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000868PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000869{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000870 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000871 const char *buffer;
872 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000873
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000874 if (o == NULL)
875 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000876 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000877 Py_INCREF(o);
878 return o;
879 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000880 if (PyLong_Check(o))
881 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000882 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000883 /* need to do extra error checking that PyLong_FromString()
884 * doesn't do. In particular long('9.5') must raise an
885 * exception, not truncate the float.
886 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000887 return long_from_string(PyString_AS_STRING(o),
888 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000889#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000890 if (PyUnicode_Check(o))
891 /* The above check is done in PyLong_FromUnicode(). */
892 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
893 PyUnicode_GET_SIZE(o),
894 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000895#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000896 m = o->ob_type->tp_as_number;
897 if (m && m->nb_long)
898 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000899 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
900 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000901
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000902 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000903}
904
905PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000906PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000907{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000909
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000910 if (o == NULL)
911 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000912 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000913 Py_INCREF(o);
914 return o;
915 }
Tim Peters7a50f252001-09-10 21:28:20 +0000916 if (PyFloat_Check(o)) {
917 PyFloatObject *po = (PyFloatObject *)o;
918 return PyFloat_FromDouble(po->ob_fval);
919 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000920 if (!PyString_Check(o)) {
921 m = o->ob_type->tp_as_number;
922 if (m && m->nb_float)
923 return m->nb_float(o);
924 }
925 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000926}
927
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000929
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000930int
Fred Drake79912472000-07-09 04:06:11 +0000931PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000932{
Guido van Rossum8700b422001-09-07 20:20:11 +0000933 return s != NULL && s->ob_type->tp_as_sequence &&
934 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000935}
936
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000937int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000938PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000939{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000940 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000941
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000942 if (s == NULL) {
943 null_error();
944 return -1;
945 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000946
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 m = s->ob_type->tp_as_sequence;
948 if (m && m->sq_length)
949 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000950
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000951 type_error("len() of unsized object");
952 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000953}
954
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000955#undef PySequence_Length
956int
957PySequence_Length(PyObject *s)
958{
959 return PySequence_Size(s);
960}
961#define PySequence_Length PySequence_Size
962
Guido van Rossume15dee51995-07-18 14:12:02 +0000963PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000964PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000965{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000966 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000967
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000968 if (s == NULL || o == NULL)
969 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000970
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000971 m = s->ob_type->tp_as_sequence;
972 if (m && m->sq_concat)
973 return m->sq_concat(s, o);
974
975 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000976}
977
978PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000979PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +0000980{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000981 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000982
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000983 if (o == NULL)
984 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000985
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986 m = o->ob_type->tp_as_sequence;
987 if (m && m->sq_repeat)
988 return m->sq_repeat(o, count);
989
990 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000991}
992
993PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000994PySequence_InPlaceConcat(PyObject *s, PyObject *o)
995{
996 PySequenceMethods *m;
997
998 if (s == NULL || o == NULL)
999 return null_error();
1000
1001 m = s->ob_type->tp_as_sequence;
1002 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1003 return m->sq_inplace_concat(s, o);
1004 if (m && m->sq_concat)
1005 return m->sq_concat(s, o);
1006
1007 return type_error("object can't be concatenated");
1008}
1009
1010PyObject *
1011PySequence_InPlaceRepeat(PyObject *o, int count)
1012{
1013 PySequenceMethods *m;
1014
1015 if (o == NULL)
1016 return null_error();
1017
1018 m = o->ob_type->tp_as_sequence;
1019 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1020 return m->sq_inplace_repeat(o, count);
1021 if (m && m->sq_repeat)
1022 return m->sq_repeat(o, count);
1023
1024 return type_error("object can't be repeated");
1025}
1026
1027PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001028PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001029{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001030 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001031
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032 if (s == NULL)
1033 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001034
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001035 m = s->ob_type->tp_as_sequence;
1036 if (m && m->sq_item) {
1037 if (i < 0) {
1038 if (m->sq_length) {
1039 int l = (*m->sq_length)(s);
1040 if (l < 0)
1041 return NULL;
1042 i += l;
1043 }
1044 }
1045 return m->sq_item(s, i);
1046 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001047
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001048 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001049}
1050
Thomas Wouters1d75a792000-08-17 22:37:32 +00001051static PyObject *
1052sliceobj_from_intint(int i, int j)
1053{
1054 PyObject *start, *end, *slice;
1055 start = PyInt_FromLong((long)i);
1056 if (!start)
1057 return NULL;
1058 end = PyInt_FromLong((long)j);
1059 if (!end) {
1060 Py_DECREF(start);
1061 return NULL;
1062 }
1063 slice = PySlice_New(start, end, NULL);
1064 Py_DECREF(start);
1065 Py_DECREF(end);
1066 return slice;
1067}
1068
Guido van Rossume15dee51995-07-18 14:12:02 +00001069PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001070PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001071{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001072 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001073 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001074
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001075 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001076
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001077 m = s->ob_type->tp_as_sequence;
1078 if (m && m->sq_slice) {
1079 if (i1 < 0 || i2 < 0) {
1080 if (m->sq_length) {
1081 int l = (*m->sq_length)(s);
1082 if (l < 0)
1083 return NULL;
1084 if (i1 < 0)
1085 i1 += l;
1086 if (i2 < 0)
1087 i2 += l;
1088 }
1089 }
1090 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001091 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1092 PyObject *res;
1093 PyObject *slice = sliceobj_from_intint(i1, i2);
1094 if (!slice)
1095 return NULL;
1096 res = mp->mp_subscript(s, slice);
1097 Py_DECREF(slice);
1098 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001100
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001101 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001102}
1103
1104int
Fred Drake79912472000-07-09 04:06:11 +00001105PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001106{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001107 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001108
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 if (s == NULL) {
1110 null_error();
1111 return -1;
1112 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001113
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001114 m = s->ob_type->tp_as_sequence;
1115 if (m && m->sq_ass_item) {
1116 if (i < 0) {
1117 if (m->sq_length) {
1118 int l = (*m->sq_length)(s);
1119 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001120 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001121 i += l;
1122 }
1123 }
1124 return m->sq_ass_item(s, i, o);
1125 }
1126
1127 type_error("object doesn't support item assignment");
1128 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001129}
1130
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001131int
Fred Drake79912472000-07-09 04:06:11 +00001132PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001133{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001134 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001136 if (s == NULL) {
1137 null_error();
1138 return -1;
1139 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001140
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001141 m = s->ob_type->tp_as_sequence;
1142 if (m && m->sq_ass_item) {
1143 if (i < 0) {
1144 if (m->sq_length) {
1145 int l = (*m->sq_length)(s);
1146 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001147 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001148 i += l;
1149 }
1150 }
1151 return m->sq_ass_item(s, i, (PyObject *)NULL);
1152 }
1153
1154 type_error("object doesn't support item deletion");
1155 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001156}
1157
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158int
Fred Drake79912472000-07-09 04:06:11 +00001159PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001160{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001161 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001162 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001163
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001164 if (s == NULL) {
1165 null_error();
1166 return -1;
1167 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001168
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001169 m = s->ob_type->tp_as_sequence;
1170 if (m && m->sq_ass_slice) {
1171 if (i1 < 0 || i2 < 0) {
1172 if (m->sq_length) {
1173 int l = (*m->sq_length)(s);
1174 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001175 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001176 if (i1 < 0)
1177 i1 += l;
1178 if (i2 < 0)
1179 i2 += l;
1180 }
1181 }
1182 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001183 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1184 int res;
1185 PyObject *slice = sliceobj_from_intint(i1, i2);
1186 if (!slice)
1187 return -1;
1188 res = mp->mp_ass_subscript(s, slice, o);
1189 Py_DECREF(slice);
1190 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001191 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193 type_error("object doesn't support slice assignment");
1194 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001195}
1196
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197int
Fred Drake79912472000-07-09 04:06:11 +00001198PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001199{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001200 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001201
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 if (s == NULL) {
1203 null_error();
1204 return -1;
1205 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001206
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001207 m = s->ob_type->tp_as_sequence;
1208 if (m && m->sq_ass_slice) {
1209 if (i1 < 0 || i2 < 0) {
1210 if (m->sq_length) {
1211 int l = (*m->sq_length)(s);
1212 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001213 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001214 if (i1 < 0)
1215 i1 += l;
1216 if (i2 < 0)
1217 i2 += l;
1218 }
1219 }
1220 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1221 }
1222 type_error("object doesn't support slice deletion");
1223 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001224}
1225
Guido van Rossume15dee51995-07-18 14:12:02 +00001226PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001227PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001228{
Tim Peters6912d4d2001-05-05 03:56:37 +00001229 PyObject *it; /* iter(v) */
1230 int n; /* guess for result tuple size */
1231 PyObject *result;
1232 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001233
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001234 if (v == NULL)
1235 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001236
Tim Peters6912d4d2001-05-05 03:56:37 +00001237 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001238 if (PyTuple_CheckExact(v)) {
1239 /* Note that we can't know whether it's safe to return
1240 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001241 to exact tuples here. In contrast, lists always make
1242 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 Py_INCREF(v);
1244 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001245 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001246 if (PyList_Check(v))
1247 return PyList_AsTuple(v);
1248
Tim Peters6912d4d2001-05-05 03:56:37 +00001249 /* Get iterator. */
1250 it = PyObject_GetIter(v);
1251 if (it == NULL)
1252 return type_error("tuple() argument must support iteration");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001253
Tim Peters6912d4d2001-05-05 03:56:37 +00001254 /* Guess result size and allocate space. */
1255 n = PySequence_Size(v);
1256 if (n < 0) {
1257 PyErr_Clear();
1258 n = 10; /* arbitrary */
1259 }
1260 result = PyTuple_New(n);
1261 if (result == NULL)
1262 goto Fail;
1263
1264 /* Fill the tuple. */
1265 for (j = 0; ; ++j) {
1266 PyObject *item = PyIter_Next(it);
1267 if (item == NULL) {
1268 if (PyErr_Occurred())
1269 goto Fail;
1270 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001271 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001272 if (j >= n) {
1273 if (n < 500)
1274 n += 10;
1275 else
1276 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001277 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001278 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001279 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001280 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001281 }
1282 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283 }
1284
Tim Peters6912d4d2001-05-05 03:56:37 +00001285 /* Cut tuple back if guess was too large. */
1286 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001287 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001288 goto Fail;
1289
1290 Py_DECREF(it);
1291 return result;
1292
1293Fail:
1294 Py_XDECREF(result);
1295 Py_DECREF(it);
1296 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001297}
1298
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001299PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001300PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001301{
Tim Petersf553f892001-05-01 20:45:31 +00001302 PyObject *it; /* iter(v) */
1303 PyObject *result; /* result list */
1304 int n; /* guess for result list size */
1305 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001306
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001307 if (v == NULL)
1308 return null_error();
1309
Tim Petersf553f892001-05-01 20:45:31 +00001310 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001311 if (PyList_Check(v))
1312 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1313
Tim Petersf553f892001-05-01 20:45:31 +00001314 /* Get iterator. There may be some low-level efficiency to be gained
1315 * by caching the tp_iternext slot instead of using PyIter_Next()
1316 * later, but premature optimization is the root etc.
1317 */
1318 it = PyObject_GetIter(v);
1319 if (it == NULL)
1320 return NULL;
1321
1322 /* Guess a result list size. */
1323 n = -1; /* unknown */
1324 if (PySequence_Check(v) &&
1325 v->ob_type->tp_as_sequence->sq_length) {
1326 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001327 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001328 PyErr_Clear();
1329 }
1330 if (n < 0)
1331 n = 8; /* arbitrary */
1332 result = PyList_New(n);
1333 if (result == NULL) {
1334 Py_DECREF(it);
1335 return NULL;
1336 }
1337
1338 /* Run iterator to exhaustion. */
1339 for (i = 0; ; i++) {
1340 PyObject *item = PyIter_Next(it);
1341 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001342 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001343 Py_DECREF(result);
1344 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001345 }
Tim Petersf553f892001-05-01 20:45:31 +00001346 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001347 }
Tim Petersf553f892001-05-01 20:45:31 +00001348 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001349 PyList_SET_ITEM(result, i, item); /* steals ref */
1350 else {
1351 int status = PyList_Append(result, item);
1352 Py_DECREF(item); /* append creates a new ref */
1353 if (status < 0) {
1354 Py_DECREF(result);
1355 result = NULL;
1356 break;
1357 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001358 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001359 }
Tim Petersf553f892001-05-01 20:45:31 +00001360
1361 /* Cut back result list if initial guess was too large. */
1362 if (i < n && result != NULL) {
1363 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1364 Py_DECREF(result);
1365 result = NULL;
1366 }
1367 }
1368 Py_DECREF(it);
1369 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001370}
1371
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001372PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001373PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001374{
1375 if (v == NULL)
1376 return null_error();
1377
1378 if (PyList_Check(v) || PyTuple_Check(v)) {
1379 Py_INCREF(v);
1380 return v;
1381 }
1382
1383 v = PySequence_Tuple(v);
1384 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1385 return type_error(m);
1386
1387 return v;
1388}
1389
Tim Peters16a77ad2001-09-08 04:00:12 +00001390/* Iterate over seq. Result depends on the operation:
1391 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1392 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1393 set ValueError and return -1 if none found; also return -1 on error.
1394 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1395*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396int
Tim Peters16a77ad2001-09-08 04:00:12 +00001397_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001398{
Tim Peters16a77ad2001-09-08 04:00:12 +00001399 int n;
1400 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1401 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001402
Tim Peters16a77ad2001-09-08 04:00:12 +00001403 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001404 null_error();
1405 return -1;
1406 }
Tim Peters75f8e352001-05-05 11:33:43 +00001407
Tim Peters16a77ad2001-09-08 04:00:12 +00001408 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001409 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001410 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001412 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001413
Tim Peters16a77ad2001-09-08 04:00:12 +00001414 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001415 for (;;) {
1416 int cmp;
1417 PyObject *item = PyIter_Next(it);
1418 if (item == NULL) {
1419 if (PyErr_Occurred())
1420 goto Fail;
1421 break;
1422 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001423
1424 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001426 if (cmp < 0)
1427 goto Fail;
1428 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001429 switch (operation) {
1430 case PY_ITERSEARCH_COUNT:
1431 ++n;
1432 if (n <= 0) {
1433 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001434 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001435 goto Fail;
1436 }
1437 break;
1438
1439 case PY_ITERSEARCH_INDEX:
1440 if (wrapped) {
1441 PyErr_SetString(PyExc_OverflowError,
1442 "index exceeds C int size");
1443 goto Fail;
1444 }
1445 goto Done;
1446
1447 case PY_ITERSEARCH_CONTAINS:
1448 n = 1;
1449 goto Done;
1450
1451 default:
1452 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001453 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001454 }
1455
1456 if (operation == PY_ITERSEARCH_INDEX) {
1457 ++n;
1458 if (n <= 0)
1459 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001460 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001461 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001462
1463 if (operation != PY_ITERSEARCH_INDEX)
1464 goto Done;
1465
1466 PyErr_SetString(PyExc_ValueError,
1467 "sequence.index(x): x not in sequence");
1468 /* fall into failure code */
1469Fail:
1470 n = -1;
1471 /* fall through */
1472Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001473 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001475
Guido van Rossume15dee51995-07-18 14:12:02 +00001476}
1477
Tim Peters16a77ad2001-09-08 04:00:12 +00001478/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001479int
Tim Peters16a77ad2001-09-08 04:00:12 +00001480PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001481{
Tim Peters16a77ad2001-09-08 04:00:12 +00001482 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001483}
1484
Tim Peterscb8d3682001-05-05 21:05:01 +00001485/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001486 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001487 */
1488int
1489PySequence_Contains(PyObject *seq, PyObject *ob)
1490{
1491 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1492 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1493 if (sqm != NULL && sqm->sq_contains != NULL)
1494 return (*sqm->sq_contains)(seq, ob);
1495 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001496 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001497}
1498
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001499/* Backwards compatibility */
1500#undef PySequence_In
1501int
Fred Drake79912472000-07-09 04:06:11 +00001502PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001503{
1504 return PySequence_Contains(w, v);
1505}
1506
1507int
Fred Drake79912472000-07-09 04:06:11 +00001508PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001509{
Tim Peters16a77ad2001-09-08 04:00:12 +00001510 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001511}
1512
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001513/* Operations on mappings */
1514
1515int
Fred Drake79912472000-07-09 04:06:11 +00001516PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001517{
Guido van Rossum8700b422001-09-07 20:20:11 +00001518 return o && o->ob_type->tp_as_mapping &&
1519 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001520}
1521
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001522int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001523PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001524{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001525 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001526
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001527 if (o == NULL) {
1528 null_error();
1529 return -1;
1530 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001531
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001532 m = o->ob_type->tp_as_mapping;
1533 if (m && m->mp_length)
1534 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001535
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001536 type_error("len() of unsized object");
1537 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001538}
1539
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001540#undef PyMapping_Length
1541int
1542PyMapping_Length(PyObject *o)
1543{
1544 return PyMapping_Size(o);
1545}
1546#define PyMapping_Length PyMapping_Size
1547
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001548PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001549PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001550{
1551 PyObject *okey, *r;
1552
1553 if (key == NULL)
1554 return null_error();
1555
1556 okey = PyString_FromString(key);
1557 if (okey == NULL)
1558 return NULL;
1559 r = PyObject_GetItem(o, okey);
1560 Py_DECREF(okey);
1561 return r;
1562}
1563
1564int
Fred Drake79912472000-07-09 04:06:11 +00001565PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001566{
1567 PyObject *okey;
1568 int r;
1569
1570 if (key == NULL) {
1571 null_error();
1572 return -1;
1573 }
1574
1575 okey = PyString_FromString(key);
1576 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001577 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001578 r = PyObject_SetItem(o, okey, value);
1579 Py_DECREF(okey);
1580 return r;
1581}
1582
1583int
Fred Drake79912472000-07-09 04:06:11 +00001584PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001585{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001586 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001587
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001588 v = PyMapping_GetItemString(o, key);
1589 if (v) {
1590 Py_DECREF(v);
1591 return 1;
1592 }
1593 PyErr_Clear();
1594 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001595}
1596
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001597int
Fred Drake79912472000-07-09 04:06:11 +00001598PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001599{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001600 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001601
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001602 v = PyObject_GetItem(o, key);
1603 if (v) {
1604 Py_DECREF(v);
1605 return 1;
1606 }
1607 PyErr_Clear();
1608 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001609}
1610
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611/* Operations on callable objects */
1612
1613/* XXX PyCallable_Check() is in object.c */
1614
Guido van Rossume15dee51995-07-18 14:12:02 +00001615PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001616PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001617{
Guido van Rossum5560b742001-09-14 16:47:50 +00001618 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001619}
Guido van Rossume15dee51995-07-18 14:12:02 +00001620
1621PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001622PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1623{
1624 ternaryfunc call;
1625
1626 if ((call = func->ob_type->tp_call) != NULL) {
1627 PyObject *result = (*call)(func, arg, kw);
1628 if (result == NULL && !PyErr_Occurred())
1629 PyErr_SetString(
1630 PyExc_SystemError,
1631 "NULL result without error in PyObject_Call");
1632 return result;
1633 }
1634 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
1635 PyString_AS_STRING(PyObject_Repr(func)));
1636 return NULL;
1637}
1638
1639PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001640PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001641{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001642 va_list va;
1643 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001644 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001645
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001646 if (callable == NULL) {
1647 va_end(va);
1648 return null_error();
1649 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001650
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001651 if (format)
1652 args = Py_VaBuildValue(format, va);
1653 else
1654 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001655
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001656 va_end(va);
1657
1658 if (args == NULL)
1659 return NULL;
1660
1661 if (!PyTuple_Check(args)) {
1662 PyObject *a;
1663
1664 a = PyTuple_New(1);
1665 if (a == NULL)
1666 return NULL;
1667 if (PyTuple_SetItem(a, 0, args) < 0)
1668 return NULL;
1669 args = a;
1670 }
1671 retval = PyObject_CallObject(callable, args);
1672
1673 Py_DECREF(args);
1674
1675 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001676}
1677
1678PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001679PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001680{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001681 va_list va;
1682 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001683 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001684
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001685 if (o == NULL || name == NULL) {
1686 va_end(va);
1687 return null_error();
1688 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001689
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001690 func = PyObject_GetAttrString(o, name);
1691 if (func == NULL) {
1692 va_end(va);
1693 PyErr_SetString(PyExc_AttributeError, name);
1694 return 0;
1695 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001696
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001697 if (!PyCallable_Check(func)) {
1698 va_end(va);
1699 return type_error("call of non-callable attribute");
1700 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001701
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001702 if (format && *format)
1703 args = Py_VaBuildValue(format, va);
1704 else
1705 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001706
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001707 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001708
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001709 if (!args)
1710 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001711
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001712 if (!PyTuple_Check(args)) {
1713 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001714
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001715 a = PyTuple_New(1);
1716 if (a == NULL)
1717 return NULL;
1718 if (PyTuple_SetItem(a, 0, args) < 0)
1719 return NULL;
1720 args = a;
1721 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001722
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001723 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001724
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001725 Py_DECREF(args);
1726 Py_DECREF(func);
1727
1728 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001729}
Guido van Rossum823649d2001-03-21 18:40:58 +00001730
1731
1732/* isinstance(), issubclass() */
1733
1734static int
1735abstract_issubclass(PyObject *derived, PyObject *cls, int first)
1736{
1737 static PyObject *__bases__ = NULL;
1738 PyObject *bases;
1739 int i, n;
1740 int r = 0;
1741
1742 if (__bases__ == NULL) {
1743 __bases__ = PyString_FromString("__bases__");
1744 if (__bases__ == NULL)
1745 return -1;
1746 }
1747
1748 if (first) {
1749 bases = PyObject_GetAttr(cls, __bases__);
1750 if (bases == NULL || !PyTuple_Check(bases)) {
1751 Py_XDECREF(bases);
1752 PyErr_SetString(PyExc_TypeError,
1753 "issubclass() arg 2 must be a class");
1754 return -1;
1755 }
1756 Py_DECREF(bases);
1757 }
1758
1759 if (derived == cls)
1760 return 1;
1761
1762 bases = PyObject_GetAttr(derived, __bases__);
1763 if (bases == NULL || !PyTuple_Check(bases)) {
1764 Py_XDECREF(bases);
1765 PyErr_SetString(PyExc_TypeError,
1766 "issubclass() arg 1 must be a class");
1767 return -1;
1768 }
1769
1770 n = PyTuple_GET_SIZE(bases);
1771 for (i = 0; i < n; i++) {
1772 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls, 0);
1773 if (r != 0)
1774 break;
1775 }
1776
1777 Py_DECREF(bases);
1778
1779 return r;
1780}
1781
1782int
1783PyObject_IsInstance(PyObject *inst, PyObject *cls)
1784{
1785 PyObject *icls;
1786 static PyObject *__class__ = NULL;
1787 int retval = 0;
1788
1789 if (PyClass_Check(cls)) {
1790 if (PyInstance_Check(inst)) {
1791 PyObject *inclass =
1792 (PyObject*)((PyInstanceObject*)inst)->in_class;
1793 retval = PyClass_IsSubclass(inclass, cls);
1794 }
1795 }
1796 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001797 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001798 }
1799 else if (!PyInstance_Check(inst)) {
1800 if (__class__ == NULL) {
1801 __class__ = PyString_FromString("__class__");
1802 if (__class__ == NULL)
1803 return -1;
1804 }
1805 icls = PyObject_GetAttr(inst, __class__);
1806 if (icls != NULL) {
1807 retval = abstract_issubclass(icls, cls, 1);
1808 Py_DECREF(icls);
1809 if (retval < 0 &&
1810 !PyErr_ExceptionMatches(PyExc_TypeError))
1811 return -1;
1812 }
1813 else
1814 retval = -1;
1815 }
1816 else
1817 retval = -1;
1818
1819 if (retval < 0) {
1820 PyErr_SetString(PyExc_TypeError,
1821 "isinstance() arg 2 must be a class or type");
1822 }
1823 return retval;
1824}
1825
1826int
1827PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1828{
1829 int retval;
1830
1831 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
1832 retval = abstract_issubclass(derived, cls, 1);
1833 }
1834 else {
1835 /* shortcut */
1836 if (!(retval = (derived == cls)))
1837 retval = PyClass_IsSubclass(derived, cls);
1838 }
1839
1840 return retval;
1841}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001842
1843PyObject *
1844PyObject_GetIter(PyObject *o)
1845{
1846 PyTypeObject *t = o->ob_type;
1847 getiterfunc f = NULL;
1848 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
1849 f = t->tp_iter;
1850 if (f == NULL) {
1851 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00001852 return PySeqIter_New(o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001853 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1854 return NULL;
1855 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00001856 else {
1857 PyObject *res = (*f)(o);
1858 if (res != NULL && !PyIter_Check(res)) {
1859 PyErr_Format(PyExc_TypeError,
1860 "iter() returned non-iterator "
1861 "of type '%.100s'",
1862 res->ob_type->tp_name);
1863 Py_DECREF(res);
1864 res = NULL;
1865 }
1866 return res;
1867 }
1868}
1869
Tim Petersf4848da2001-05-05 00:14:56 +00001870/* Return next item.
1871 * If an error occurs, return NULL. PyErr_Occurred() will be true.
1872 * If the iteration terminates normally, return NULL and clear the
1873 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
1874 * will be false.
1875 * Else return the next object. PyErr_Occurred() will be false.
1876 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001877PyObject *
1878PyIter_Next(PyObject *iter)
1879{
Tim Petersf4848da2001-05-05 00:14:56 +00001880 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00001881 if (!PyIter_Check(iter)) {
1882 PyErr_Format(PyExc_TypeError,
1883 "'%.100s' object is not an iterator",
1884 iter->ob_type->tp_name);
1885 return NULL;
1886 }
Tim Petersf4848da2001-05-05 00:14:56 +00001887 result = (*iter->ob_type->tp_iternext)(iter);
1888 if (result == NULL &&
1889 PyErr_Occurred() &&
1890 PyErr_ExceptionMatches(PyExc_StopIteration))
1891 PyErr_Clear();
1892 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001893}