blob: 37f7eeab0528a052946312dbf756bc8326481afe [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. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001238 if (PyTuple_Check(v)) {
1239 Py_INCREF(v);
1240 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001241 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242 if (PyList_Check(v))
1243 return PyList_AsTuple(v);
1244
Tim Peters6912d4d2001-05-05 03:56:37 +00001245 /* Get iterator. */
1246 it = PyObject_GetIter(v);
1247 if (it == NULL)
1248 return type_error("tuple() argument must support iteration");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001249
Tim Peters6912d4d2001-05-05 03:56:37 +00001250 /* Guess result size and allocate space. */
1251 n = PySequence_Size(v);
1252 if (n < 0) {
1253 PyErr_Clear();
1254 n = 10; /* arbitrary */
1255 }
1256 result = PyTuple_New(n);
1257 if (result == NULL)
1258 goto Fail;
1259
1260 /* Fill the tuple. */
1261 for (j = 0; ; ++j) {
1262 PyObject *item = PyIter_Next(it);
1263 if (item == NULL) {
1264 if (PyErr_Occurred())
1265 goto Fail;
1266 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001268 if (j >= n) {
1269 if (n < 500)
1270 n += 10;
1271 else
1272 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001273 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001274 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001275 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001276 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001277 }
1278 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279 }
1280
Tim Peters6912d4d2001-05-05 03:56:37 +00001281 /* Cut tuple back if guess was too large. */
1282 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001283 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001284 goto Fail;
1285
1286 Py_DECREF(it);
1287 return result;
1288
1289Fail:
1290 Py_XDECREF(result);
1291 Py_DECREF(it);
1292 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001293}
1294
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001295PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001296PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001297{
Tim Petersf553f892001-05-01 20:45:31 +00001298 PyObject *it; /* iter(v) */
1299 PyObject *result; /* result list */
1300 int n; /* guess for result list size */
1301 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001302
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001303 if (v == NULL)
1304 return null_error();
1305
Tim Petersf553f892001-05-01 20:45:31 +00001306 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001307 if (PyList_Check(v))
1308 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1309
Tim Petersf553f892001-05-01 20:45:31 +00001310 /* Get iterator. There may be some low-level efficiency to be gained
1311 * by caching the tp_iternext slot instead of using PyIter_Next()
1312 * later, but premature optimization is the root etc.
1313 */
1314 it = PyObject_GetIter(v);
1315 if (it == NULL)
1316 return NULL;
1317
1318 /* Guess a result list size. */
1319 n = -1; /* unknown */
1320 if (PySequence_Check(v) &&
1321 v->ob_type->tp_as_sequence->sq_length) {
1322 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001324 PyErr_Clear();
1325 }
1326 if (n < 0)
1327 n = 8; /* arbitrary */
1328 result = PyList_New(n);
1329 if (result == NULL) {
1330 Py_DECREF(it);
1331 return NULL;
1332 }
1333
1334 /* Run iterator to exhaustion. */
1335 for (i = 0; ; i++) {
1336 PyObject *item = PyIter_Next(it);
1337 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001338 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001339 Py_DECREF(result);
1340 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001341 }
Tim Petersf553f892001-05-01 20:45:31 +00001342 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001343 }
Tim Petersf553f892001-05-01 20:45:31 +00001344 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001345 PyList_SET_ITEM(result, i, item); /* steals ref */
1346 else {
1347 int status = PyList_Append(result, item);
1348 Py_DECREF(item); /* append creates a new ref */
1349 if (status < 0) {
1350 Py_DECREF(result);
1351 result = NULL;
1352 break;
1353 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001354 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001355 }
Tim Petersf553f892001-05-01 20:45:31 +00001356
1357 /* Cut back result list if initial guess was too large. */
1358 if (i < n && result != NULL) {
1359 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1360 Py_DECREF(result);
1361 result = NULL;
1362 }
1363 }
1364 Py_DECREF(it);
1365 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001366}
1367
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001368PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001369PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001370{
1371 if (v == NULL)
1372 return null_error();
1373
1374 if (PyList_Check(v) || PyTuple_Check(v)) {
1375 Py_INCREF(v);
1376 return v;
1377 }
1378
1379 v = PySequence_Tuple(v);
1380 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1381 return type_error(m);
1382
1383 return v;
1384}
1385
Tim Peters16a77ad2001-09-08 04:00:12 +00001386/* Iterate over seq. Result depends on the operation:
1387 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1388 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1389 set ValueError and return -1 if none found; also return -1 on error.
1390 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1391*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392int
Tim Peters16a77ad2001-09-08 04:00:12 +00001393_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001394{
Tim Peters16a77ad2001-09-08 04:00:12 +00001395 int n;
1396 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1397 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001398
Tim Peters16a77ad2001-09-08 04:00:12 +00001399 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001400 null_error();
1401 return -1;
1402 }
Tim Peters75f8e352001-05-05 11:33:43 +00001403
Tim Peters16a77ad2001-09-08 04:00:12 +00001404 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001405 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001406 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001407 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001408 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001409
Tim Peters16a77ad2001-09-08 04:00:12 +00001410 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001411 for (;;) {
1412 int cmp;
1413 PyObject *item = PyIter_Next(it);
1414 if (item == NULL) {
1415 if (PyErr_Occurred())
1416 goto Fail;
1417 break;
1418 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001419
1420 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001421 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001422 if (cmp < 0)
1423 goto Fail;
1424 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001425 switch (operation) {
1426 case PY_ITERSEARCH_COUNT:
1427 ++n;
1428 if (n <= 0) {
1429 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001430 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001431 goto Fail;
1432 }
1433 break;
1434
1435 case PY_ITERSEARCH_INDEX:
1436 if (wrapped) {
1437 PyErr_SetString(PyExc_OverflowError,
1438 "index exceeds C int size");
1439 goto Fail;
1440 }
1441 goto Done;
1442
1443 case PY_ITERSEARCH_CONTAINS:
1444 n = 1;
1445 goto Done;
1446
1447 default:
1448 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001449 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001450 }
1451
1452 if (operation == PY_ITERSEARCH_INDEX) {
1453 ++n;
1454 if (n <= 0)
1455 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001456 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001458
1459 if (operation != PY_ITERSEARCH_INDEX)
1460 goto Done;
1461
1462 PyErr_SetString(PyExc_ValueError,
1463 "sequence.index(x): x not in sequence");
1464 /* fall into failure code */
1465Fail:
1466 n = -1;
1467 /* fall through */
1468Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001469 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001470 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001471
Guido van Rossume15dee51995-07-18 14:12:02 +00001472}
1473
Tim Peters16a77ad2001-09-08 04:00:12 +00001474/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001475int
Tim Peters16a77ad2001-09-08 04:00:12 +00001476PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001477{
Tim Peters16a77ad2001-09-08 04:00:12 +00001478 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001479}
1480
Tim Peterscb8d3682001-05-05 21:05:01 +00001481/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001482 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001483 */
1484int
1485PySequence_Contains(PyObject *seq, PyObject *ob)
1486{
1487 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1488 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1489 if (sqm != NULL && sqm->sq_contains != NULL)
1490 return (*sqm->sq_contains)(seq, ob);
1491 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001492 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001493}
1494
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001495/* Backwards compatibility */
1496#undef PySequence_In
1497int
Fred Drake79912472000-07-09 04:06:11 +00001498PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001499{
1500 return PySequence_Contains(w, v);
1501}
1502
1503int
Fred Drake79912472000-07-09 04:06:11 +00001504PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001505{
Tim Peters16a77ad2001-09-08 04:00:12 +00001506 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001507}
1508
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001509/* Operations on mappings */
1510
1511int
Fred Drake79912472000-07-09 04:06:11 +00001512PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001513{
Guido van Rossum8700b422001-09-07 20:20:11 +00001514 return o && o->ob_type->tp_as_mapping &&
1515 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001516}
1517
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001518int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001519PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001520{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001521 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001522
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001523 if (o == NULL) {
1524 null_error();
1525 return -1;
1526 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001527
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001528 m = o->ob_type->tp_as_mapping;
1529 if (m && m->mp_length)
1530 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001531
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001532 type_error("len() of unsized object");
1533 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001534}
1535
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001536#undef PyMapping_Length
1537int
1538PyMapping_Length(PyObject *o)
1539{
1540 return PyMapping_Size(o);
1541}
1542#define PyMapping_Length PyMapping_Size
1543
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001544PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001545PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001546{
1547 PyObject *okey, *r;
1548
1549 if (key == NULL)
1550 return null_error();
1551
1552 okey = PyString_FromString(key);
1553 if (okey == NULL)
1554 return NULL;
1555 r = PyObject_GetItem(o, okey);
1556 Py_DECREF(okey);
1557 return r;
1558}
1559
1560int
Fred Drake79912472000-07-09 04:06:11 +00001561PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001562{
1563 PyObject *okey;
1564 int r;
1565
1566 if (key == NULL) {
1567 null_error();
1568 return -1;
1569 }
1570
1571 okey = PyString_FromString(key);
1572 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001573 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001574 r = PyObject_SetItem(o, okey, value);
1575 Py_DECREF(okey);
1576 return r;
1577}
1578
1579int
Fred Drake79912472000-07-09 04:06:11 +00001580PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001581{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001582 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001583
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001584 v = PyMapping_GetItemString(o, key);
1585 if (v) {
1586 Py_DECREF(v);
1587 return 1;
1588 }
1589 PyErr_Clear();
1590 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001591}
1592
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001593int
Fred Drake79912472000-07-09 04:06:11 +00001594PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001595{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001596 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001597
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001598 v = PyObject_GetItem(o, key);
1599 if (v) {
1600 Py_DECREF(v);
1601 return 1;
1602 }
1603 PyErr_Clear();
1604 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001605}
1606
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001607/* Operations on callable objects */
1608
1609/* XXX PyCallable_Check() is in object.c */
1610
Guido van Rossume15dee51995-07-18 14:12:02 +00001611PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001612PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001613{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001614 PyObject *r;
1615 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001616
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001617 if (args == NULL) {
1618 args = PyTuple_New(0);
1619 if (args == NULL)
1620 return NULL;
1621 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001622
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001623 r = PyEval_CallObject(o, args);
1624
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001625 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001626 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001627 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001628
1629 return r;
1630}
Guido van Rossume15dee51995-07-18 14:12:02 +00001631
1632PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001633PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1634{
1635 ternaryfunc call;
1636
1637 if ((call = func->ob_type->tp_call) != NULL) {
1638 PyObject *result = (*call)(func, arg, kw);
1639 if (result == NULL && !PyErr_Occurred())
1640 PyErr_SetString(
1641 PyExc_SystemError,
1642 "NULL result without error in PyObject_Call");
1643 return result;
1644 }
1645 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
1646 PyString_AS_STRING(PyObject_Repr(func)));
1647 return NULL;
1648}
1649
1650PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001651PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001652{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001653 va_list va;
1654 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001655 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001656
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001657 if (callable == NULL) {
1658 va_end(va);
1659 return null_error();
1660 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001661
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001662 if (format)
1663 args = Py_VaBuildValue(format, va);
1664 else
1665 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001666
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001667 va_end(va);
1668
1669 if (args == NULL)
1670 return NULL;
1671
1672 if (!PyTuple_Check(args)) {
1673 PyObject *a;
1674
1675 a = PyTuple_New(1);
1676 if (a == NULL)
1677 return NULL;
1678 if (PyTuple_SetItem(a, 0, args) < 0)
1679 return NULL;
1680 args = a;
1681 }
1682 retval = PyObject_CallObject(callable, args);
1683
1684 Py_DECREF(args);
1685
1686 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001687}
1688
1689PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001690PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001691{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001692 va_list va;
1693 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001694 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001695
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001696 if (o == NULL || name == NULL) {
1697 va_end(va);
1698 return null_error();
1699 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001700
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001701 func = PyObject_GetAttrString(o, name);
1702 if (func == NULL) {
1703 va_end(va);
1704 PyErr_SetString(PyExc_AttributeError, name);
1705 return 0;
1706 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001707
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001708 if (!PyCallable_Check(func)) {
1709 va_end(va);
1710 return type_error("call of non-callable attribute");
1711 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001712
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001713 if (format && *format)
1714 args = Py_VaBuildValue(format, va);
1715 else
1716 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001717
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001718 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001720 if (!args)
1721 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001722
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001723 if (!PyTuple_Check(args)) {
1724 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001725
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001726 a = PyTuple_New(1);
1727 if (a == NULL)
1728 return NULL;
1729 if (PyTuple_SetItem(a, 0, args) < 0)
1730 return NULL;
1731 args = a;
1732 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001733
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001734 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001735
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001736 Py_DECREF(args);
1737 Py_DECREF(func);
1738
1739 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001740}
Guido van Rossum823649d2001-03-21 18:40:58 +00001741
1742
1743/* isinstance(), issubclass() */
1744
1745static int
1746abstract_issubclass(PyObject *derived, PyObject *cls, int first)
1747{
1748 static PyObject *__bases__ = NULL;
1749 PyObject *bases;
1750 int i, n;
1751 int r = 0;
1752
1753 if (__bases__ == NULL) {
1754 __bases__ = PyString_FromString("__bases__");
1755 if (__bases__ == NULL)
1756 return -1;
1757 }
1758
1759 if (first) {
1760 bases = PyObject_GetAttr(cls, __bases__);
1761 if (bases == NULL || !PyTuple_Check(bases)) {
1762 Py_XDECREF(bases);
1763 PyErr_SetString(PyExc_TypeError,
1764 "issubclass() arg 2 must be a class");
1765 return -1;
1766 }
1767 Py_DECREF(bases);
1768 }
1769
1770 if (derived == cls)
1771 return 1;
1772
1773 bases = PyObject_GetAttr(derived, __bases__);
1774 if (bases == NULL || !PyTuple_Check(bases)) {
1775 Py_XDECREF(bases);
1776 PyErr_SetString(PyExc_TypeError,
1777 "issubclass() arg 1 must be a class");
1778 return -1;
1779 }
1780
1781 n = PyTuple_GET_SIZE(bases);
1782 for (i = 0; i < n; i++) {
1783 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls, 0);
1784 if (r != 0)
1785 break;
1786 }
1787
1788 Py_DECREF(bases);
1789
1790 return r;
1791}
1792
1793int
1794PyObject_IsInstance(PyObject *inst, PyObject *cls)
1795{
1796 PyObject *icls;
1797 static PyObject *__class__ = NULL;
1798 int retval = 0;
1799
1800 if (PyClass_Check(cls)) {
1801 if (PyInstance_Check(inst)) {
1802 PyObject *inclass =
1803 (PyObject*)((PyInstanceObject*)inst)->in_class;
1804 retval = PyClass_IsSubclass(inclass, cls);
1805 }
1806 }
1807 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001808 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001809 }
1810 else if (!PyInstance_Check(inst)) {
1811 if (__class__ == NULL) {
1812 __class__ = PyString_FromString("__class__");
1813 if (__class__ == NULL)
1814 return -1;
1815 }
1816 icls = PyObject_GetAttr(inst, __class__);
1817 if (icls != NULL) {
1818 retval = abstract_issubclass(icls, cls, 1);
1819 Py_DECREF(icls);
1820 if (retval < 0 &&
1821 !PyErr_ExceptionMatches(PyExc_TypeError))
1822 return -1;
1823 }
1824 else
1825 retval = -1;
1826 }
1827 else
1828 retval = -1;
1829
1830 if (retval < 0) {
1831 PyErr_SetString(PyExc_TypeError,
1832 "isinstance() arg 2 must be a class or type");
1833 }
1834 return retval;
1835}
1836
1837int
1838PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1839{
1840 int retval;
1841
1842 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
1843 retval = abstract_issubclass(derived, cls, 1);
1844 }
1845 else {
1846 /* shortcut */
1847 if (!(retval = (derived == cls)))
1848 retval = PyClass_IsSubclass(derived, cls);
1849 }
1850
1851 return retval;
1852}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001853
1854PyObject *
1855PyObject_GetIter(PyObject *o)
1856{
1857 PyTypeObject *t = o->ob_type;
1858 getiterfunc f = NULL;
1859 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
1860 f = t->tp_iter;
1861 if (f == NULL) {
1862 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00001863 return PySeqIter_New(o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001864 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1865 return NULL;
1866 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00001867 else {
1868 PyObject *res = (*f)(o);
1869 if (res != NULL && !PyIter_Check(res)) {
1870 PyErr_Format(PyExc_TypeError,
1871 "iter() returned non-iterator "
1872 "of type '%.100s'",
1873 res->ob_type->tp_name);
1874 Py_DECREF(res);
1875 res = NULL;
1876 }
1877 return res;
1878 }
1879}
1880
Tim Petersf4848da2001-05-05 00:14:56 +00001881/* Return next item.
1882 * If an error occurs, return NULL. PyErr_Occurred() will be true.
1883 * If the iteration terminates normally, return NULL and clear the
1884 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
1885 * will be false.
1886 * Else return the next object. PyErr_Occurred() will be false.
1887 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001888PyObject *
1889PyIter_Next(PyObject *iter)
1890{
Tim Petersf4848da2001-05-05 00:14:56 +00001891 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00001892 if (!PyIter_Check(iter)) {
1893 PyErr_Format(PyExc_TypeError,
1894 "'%.100s' object is not an iterator",
1895 iter->ob_type->tp_name);
1896 return NULL;
1897 }
Tim Petersf4848da2001-05-05 00:14:56 +00001898 result = (*iter->ob_type->tp_iternext)(iter);
1899 if (result == NULL &&
1900 PyErr_Occurred() &&
1901 PyErr_ExceptionMatches(PyExc_StopIteration))
1902 PyErr_Clear();
1903 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001904}