blob: 2bd0fcceba1618a5cf8ae0a97afdcba163181998 [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();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000912 if (PyFloat_Check(o)) {
913 Py_INCREF(o);
914 return o;
915 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000916 if (!PyString_Check(o)) {
917 m = o->ob_type->tp_as_number;
918 if (m && m->nb_float)
919 return m->nb_float(o);
920 }
921 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000922}
923
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000924/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000925
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000926int
Fred Drake79912472000-07-09 04:06:11 +0000927PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000928{
Guido van Rossum8700b422001-09-07 20:20:11 +0000929 return s != NULL && s->ob_type->tp_as_sequence &&
930 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000931}
932
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000933int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000934PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000935{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000936 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000937
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000938 if (s == NULL) {
939 null_error();
940 return -1;
941 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000942
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000943 m = s->ob_type->tp_as_sequence;
944 if (m && m->sq_length)
945 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000946
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 type_error("len() of unsized object");
948 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000949}
950
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000951#undef PySequence_Length
952int
953PySequence_Length(PyObject *s)
954{
955 return PySequence_Size(s);
956}
957#define PySequence_Length PySequence_Size
958
Guido van Rossume15dee51995-07-18 14:12:02 +0000959PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000960PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000961{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000962 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000963
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000964 if (s == NULL || o == NULL)
965 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000966
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000967 m = s->ob_type->tp_as_sequence;
968 if (m && m->sq_concat)
969 return m->sq_concat(s, o);
970
971 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000972}
973
974PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000975PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +0000976{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000977 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000978
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000979 if (o == NULL)
980 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000981
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000982 m = o->ob_type->tp_as_sequence;
983 if (m && m->sq_repeat)
984 return m->sq_repeat(o, count);
985
986 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000987}
988
989PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000990PySequence_InPlaceConcat(PyObject *s, PyObject *o)
991{
992 PySequenceMethods *m;
993
994 if (s == NULL || o == NULL)
995 return null_error();
996
997 m = s->ob_type->tp_as_sequence;
998 if (m && HASINPLACE(s) && m->sq_inplace_concat)
999 return m->sq_inplace_concat(s, o);
1000 if (m && m->sq_concat)
1001 return m->sq_concat(s, o);
1002
1003 return type_error("object can't be concatenated");
1004}
1005
1006PyObject *
1007PySequence_InPlaceRepeat(PyObject *o, int count)
1008{
1009 PySequenceMethods *m;
1010
1011 if (o == NULL)
1012 return null_error();
1013
1014 m = o->ob_type->tp_as_sequence;
1015 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1016 return m->sq_inplace_repeat(o, count);
1017 if (m && m->sq_repeat)
1018 return m->sq_repeat(o, count);
1019
1020 return type_error("object can't be repeated");
1021}
1022
1023PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001024PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001025{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001026 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001027
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001028 if (s == NULL)
1029 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001030
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001031 m = s->ob_type->tp_as_sequence;
1032 if (m && m->sq_item) {
1033 if (i < 0) {
1034 if (m->sq_length) {
1035 int l = (*m->sq_length)(s);
1036 if (l < 0)
1037 return NULL;
1038 i += l;
1039 }
1040 }
1041 return m->sq_item(s, i);
1042 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001043
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001044 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001045}
1046
Thomas Wouters1d75a792000-08-17 22:37:32 +00001047static PyObject *
1048sliceobj_from_intint(int i, int j)
1049{
1050 PyObject *start, *end, *slice;
1051 start = PyInt_FromLong((long)i);
1052 if (!start)
1053 return NULL;
1054 end = PyInt_FromLong((long)j);
1055 if (!end) {
1056 Py_DECREF(start);
1057 return NULL;
1058 }
1059 slice = PySlice_New(start, end, NULL);
1060 Py_DECREF(start);
1061 Py_DECREF(end);
1062 return slice;
1063}
1064
Guido van Rossume15dee51995-07-18 14:12:02 +00001065PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001066PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001067{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001068 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001069 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001070
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001071 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001072
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001073 m = s->ob_type->tp_as_sequence;
1074 if (m && m->sq_slice) {
1075 if (i1 < 0 || i2 < 0) {
1076 if (m->sq_length) {
1077 int l = (*m->sq_length)(s);
1078 if (l < 0)
1079 return NULL;
1080 if (i1 < 0)
1081 i1 += l;
1082 if (i2 < 0)
1083 i2 += l;
1084 }
1085 }
1086 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001087 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1088 PyObject *res;
1089 PyObject *slice = sliceobj_from_intint(i1, i2);
1090 if (!slice)
1091 return NULL;
1092 res = mp->mp_subscript(s, slice);
1093 Py_DECREF(slice);
1094 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001095 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001098}
1099
1100int
Fred Drake79912472000-07-09 04:06:11 +00001101PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001102{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001103 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001104
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001105 if (s == NULL) {
1106 null_error();
1107 return -1;
1108 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001109
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001110 m = s->ob_type->tp_as_sequence;
1111 if (m && m->sq_ass_item) {
1112 if (i < 0) {
1113 if (m->sq_length) {
1114 int l = (*m->sq_length)(s);
1115 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001116 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001117 i += l;
1118 }
1119 }
1120 return m->sq_ass_item(s, i, o);
1121 }
1122
1123 type_error("object doesn't support item assignment");
1124 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001125}
1126
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001127int
Fred Drake79912472000-07-09 04:06:11 +00001128PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001129{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001131
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 if (s == NULL) {
1133 null_error();
1134 return -1;
1135 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001136
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001137 m = s->ob_type->tp_as_sequence;
1138 if (m && m->sq_ass_item) {
1139 if (i < 0) {
1140 if (m->sq_length) {
1141 int l = (*m->sq_length)(s);
1142 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001143 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144 i += l;
1145 }
1146 }
1147 return m->sq_ass_item(s, i, (PyObject *)NULL);
1148 }
1149
1150 type_error("object doesn't support item deletion");
1151 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001152}
1153
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154int
Fred Drake79912472000-07-09 04:06:11 +00001155PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001156{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001157 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001158 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001159
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001160 if (s == NULL) {
1161 null_error();
1162 return -1;
1163 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001164
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001165 m = s->ob_type->tp_as_sequence;
1166 if (m && m->sq_ass_slice) {
1167 if (i1 < 0 || i2 < 0) {
1168 if (m->sq_length) {
1169 int l = (*m->sq_length)(s);
1170 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001171 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001172 if (i1 < 0)
1173 i1 += l;
1174 if (i2 < 0)
1175 i2 += l;
1176 }
1177 }
1178 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001179 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1180 int res;
1181 PyObject *slice = sliceobj_from_intint(i1, i2);
1182 if (!slice)
1183 return -1;
1184 res = mp->mp_ass_subscript(s, slice, o);
1185 Py_DECREF(slice);
1186 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001187 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001188
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 type_error("object doesn't support slice assignment");
1190 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001191}
1192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193int
Fred Drake79912472000-07-09 04:06:11 +00001194PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001195{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001196 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001197
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198 if (s == NULL) {
1199 null_error();
1200 return -1;
1201 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001202
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001203 m = s->ob_type->tp_as_sequence;
1204 if (m && m->sq_ass_slice) {
1205 if (i1 < 0 || i2 < 0) {
1206 if (m->sq_length) {
1207 int l = (*m->sq_length)(s);
1208 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001209 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001210 if (i1 < 0)
1211 i1 += l;
1212 if (i2 < 0)
1213 i2 += l;
1214 }
1215 }
1216 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1217 }
1218 type_error("object doesn't support slice deletion");
1219 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001220}
1221
Guido van Rossume15dee51995-07-18 14:12:02 +00001222PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001223PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001224{
Tim Peters6912d4d2001-05-05 03:56:37 +00001225 PyObject *it; /* iter(v) */
1226 int n; /* guess for result tuple size */
1227 PyObject *result;
1228 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001229
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230 if (v == NULL)
1231 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001232
Tim Peters6912d4d2001-05-05 03:56:37 +00001233 /* Special-case the common tuple and list cases, for efficiency. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001234 if (PyTuple_Check(v)) {
1235 Py_INCREF(v);
1236 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001237 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001238 if (PyList_Check(v))
1239 return PyList_AsTuple(v);
1240
Tim Peters6912d4d2001-05-05 03:56:37 +00001241 /* Get iterator. */
1242 it = PyObject_GetIter(v);
1243 if (it == NULL)
1244 return type_error("tuple() argument must support iteration");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001245
Tim Peters6912d4d2001-05-05 03:56:37 +00001246 /* Guess result size and allocate space. */
1247 n = PySequence_Size(v);
1248 if (n < 0) {
1249 PyErr_Clear();
1250 n = 10; /* arbitrary */
1251 }
1252 result = PyTuple_New(n);
1253 if (result == NULL)
1254 goto Fail;
1255
1256 /* Fill the tuple. */
1257 for (j = 0; ; ++j) {
1258 PyObject *item = PyIter_Next(it);
1259 if (item == NULL) {
1260 if (PyErr_Occurred())
1261 goto Fail;
1262 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001264 if (j >= n) {
1265 if (n < 500)
1266 n += 10;
1267 else
1268 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001269 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001270 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001271 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001272 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001273 }
1274 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275 }
1276
Tim Peters6912d4d2001-05-05 03:56:37 +00001277 /* Cut tuple back if guess was too large. */
1278 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001279 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001280 goto Fail;
1281
1282 Py_DECREF(it);
1283 return result;
1284
1285Fail:
1286 Py_XDECREF(result);
1287 Py_DECREF(it);
1288 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001289}
1290
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001291PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001292PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001293{
Tim Petersf553f892001-05-01 20:45:31 +00001294 PyObject *it; /* iter(v) */
1295 PyObject *result; /* result list */
1296 int n; /* guess for result list size */
1297 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001298
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001299 if (v == NULL)
1300 return null_error();
1301
Tim Petersf553f892001-05-01 20:45:31 +00001302 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001303 if (PyList_Check(v))
1304 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1305
Tim Petersf553f892001-05-01 20:45:31 +00001306 /* Get iterator. There may be some low-level efficiency to be gained
1307 * by caching the tp_iternext slot instead of using PyIter_Next()
1308 * later, but premature optimization is the root etc.
1309 */
1310 it = PyObject_GetIter(v);
1311 if (it == NULL)
1312 return NULL;
1313
1314 /* Guess a result list size. */
1315 n = -1; /* unknown */
1316 if (PySequence_Check(v) &&
1317 v->ob_type->tp_as_sequence->sq_length) {
1318 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001320 PyErr_Clear();
1321 }
1322 if (n < 0)
1323 n = 8; /* arbitrary */
1324 result = PyList_New(n);
1325 if (result == NULL) {
1326 Py_DECREF(it);
1327 return NULL;
1328 }
1329
1330 /* Run iterator to exhaustion. */
1331 for (i = 0; ; i++) {
1332 PyObject *item = PyIter_Next(it);
1333 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001334 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001335 Py_DECREF(result);
1336 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001337 }
Tim Petersf553f892001-05-01 20:45:31 +00001338 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001339 }
Tim Petersf553f892001-05-01 20:45:31 +00001340 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001341 PyList_SET_ITEM(result, i, item); /* steals ref */
1342 else {
1343 int status = PyList_Append(result, item);
1344 Py_DECREF(item); /* append creates a new ref */
1345 if (status < 0) {
1346 Py_DECREF(result);
1347 result = NULL;
1348 break;
1349 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001350 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001351 }
Tim Petersf553f892001-05-01 20:45:31 +00001352
1353 /* Cut back result list if initial guess was too large. */
1354 if (i < n && result != NULL) {
1355 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1356 Py_DECREF(result);
1357 result = NULL;
1358 }
1359 }
1360 Py_DECREF(it);
1361 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001362}
1363
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001364PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001365PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001366{
1367 if (v == NULL)
1368 return null_error();
1369
1370 if (PyList_Check(v) || PyTuple_Check(v)) {
1371 Py_INCREF(v);
1372 return v;
1373 }
1374
1375 v = PySequence_Tuple(v);
1376 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1377 return type_error(m);
1378
1379 return v;
1380}
1381
Tim Peters16a77ad2001-09-08 04:00:12 +00001382/* Iterate over seq. Result depends on the operation:
1383 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1384 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1385 set ValueError and return -1 if none found; also return -1 on error.
1386 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1387*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001388int
Tim Peters16a77ad2001-09-08 04:00:12 +00001389_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001390{
Tim Peters16a77ad2001-09-08 04:00:12 +00001391 int n;
1392 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1393 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001394
Tim Peters16a77ad2001-09-08 04:00:12 +00001395 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 null_error();
1397 return -1;
1398 }
Tim Peters75f8e352001-05-05 11:33:43 +00001399
Tim Peters16a77ad2001-09-08 04:00:12 +00001400 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001401 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001402 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001403 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001404 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001405
Tim Peters16a77ad2001-09-08 04:00:12 +00001406 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001407 for (;;) {
1408 int cmp;
1409 PyObject *item = PyIter_Next(it);
1410 if (item == NULL) {
1411 if (PyErr_Occurred())
1412 goto Fail;
1413 break;
1414 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001415
1416 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001417 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001418 if (cmp < 0)
1419 goto Fail;
1420 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001421 switch (operation) {
1422 case PY_ITERSEARCH_COUNT:
1423 ++n;
1424 if (n <= 0) {
1425 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001426 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001427 goto Fail;
1428 }
1429 break;
1430
1431 case PY_ITERSEARCH_INDEX:
1432 if (wrapped) {
1433 PyErr_SetString(PyExc_OverflowError,
1434 "index exceeds C int size");
1435 goto Fail;
1436 }
1437 goto Done;
1438
1439 case PY_ITERSEARCH_CONTAINS:
1440 n = 1;
1441 goto Done;
1442
1443 default:
1444 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001445 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001446 }
1447
1448 if (operation == PY_ITERSEARCH_INDEX) {
1449 ++n;
1450 if (n <= 0)
1451 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001452 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001454
1455 if (operation != PY_ITERSEARCH_INDEX)
1456 goto Done;
1457
1458 PyErr_SetString(PyExc_ValueError,
1459 "sequence.index(x): x not in sequence");
1460 /* fall into failure code */
1461Fail:
1462 n = -1;
1463 /* fall through */
1464Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001465 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001467
Guido van Rossume15dee51995-07-18 14:12:02 +00001468}
1469
Tim Peters16a77ad2001-09-08 04:00:12 +00001470/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001471int
Tim Peters16a77ad2001-09-08 04:00:12 +00001472PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001473{
Tim Peters16a77ad2001-09-08 04:00:12 +00001474 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001475}
1476
Tim Peterscb8d3682001-05-05 21:05:01 +00001477/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001478 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001479 */
1480int
1481PySequence_Contains(PyObject *seq, PyObject *ob)
1482{
1483 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1484 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1485 if (sqm != NULL && sqm->sq_contains != NULL)
1486 return (*sqm->sq_contains)(seq, ob);
1487 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001488 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001489}
1490
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001491/* Backwards compatibility */
1492#undef PySequence_In
1493int
Fred Drake79912472000-07-09 04:06:11 +00001494PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001495{
1496 return PySequence_Contains(w, v);
1497}
1498
1499int
Fred Drake79912472000-07-09 04:06:11 +00001500PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001501{
Tim Peters16a77ad2001-09-08 04:00:12 +00001502 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001503}
1504
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001505/* Operations on mappings */
1506
1507int
Fred Drake79912472000-07-09 04:06:11 +00001508PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001509{
Guido van Rossum8700b422001-09-07 20:20:11 +00001510 return o && o->ob_type->tp_as_mapping &&
1511 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001512}
1513
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001514int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001515PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001516{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001517 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001518
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001519 if (o == NULL) {
1520 null_error();
1521 return -1;
1522 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001523
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001524 m = o->ob_type->tp_as_mapping;
1525 if (m && m->mp_length)
1526 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001527
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001528 type_error("len() of unsized object");
1529 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001530}
1531
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001532#undef PyMapping_Length
1533int
1534PyMapping_Length(PyObject *o)
1535{
1536 return PyMapping_Size(o);
1537}
1538#define PyMapping_Length PyMapping_Size
1539
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001540PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001541PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001542{
1543 PyObject *okey, *r;
1544
1545 if (key == NULL)
1546 return null_error();
1547
1548 okey = PyString_FromString(key);
1549 if (okey == NULL)
1550 return NULL;
1551 r = PyObject_GetItem(o, okey);
1552 Py_DECREF(okey);
1553 return r;
1554}
1555
1556int
Fred Drake79912472000-07-09 04:06:11 +00001557PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001558{
1559 PyObject *okey;
1560 int r;
1561
1562 if (key == NULL) {
1563 null_error();
1564 return -1;
1565 }
1566
1567 okey = PyString_FromString(key);
1568 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001569 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001570 r = PyObject_SetItem(o, okey, value);
1571 Py_DECREF(okey);
1572 return r;
1573}
1574
1575int
Fred Drake79912472000-07-09 04:06:11 +00001576PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001577{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001578 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001579
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001580 v = PyMapping_GetItemString(o, key);
1581 if (v) {
1582 Py_DECREF(v);
1583 return 1;
1584 }
1585 PyErr_Clear();
1586 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001587}
1588
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001589int
Fred Drake79912472000-07-09 04:06:11 +00001590PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001591{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001592 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001593
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001594 v = PyObject_GetItem(o, key);
1595 if (v) {
1596 Py_DECREF(v);
1597 return 1;
1598 }
1599 PyErr_Clear();
1600 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001601}
1602
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001603/* Operations on callable objects */
1604
1605/* XXX PyCallable_Check() is in object.c */
1606
Guido van Rossume15dee51995-07-18 14:12:02 +00001607PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001608PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001609{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001610 PyObject *r;
1611 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001612
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001613 if (args == NULL) {
1614 args = PyTuple_New(0);
1615 if (args == NULL)
1616 return NULL;
1617 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001618
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001619 r = PyEval_CallObject(o, args);
1620
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001621 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001622 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001623 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001624
1625 return r;
1626}
Guido van Rossume15dee51995-07-18 14:12:02 +00001627
1628PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001629PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1630{
1631 ternaryfunc call;
1632
1633 if ((call = func->ob_type->tp_call) != NULL) {
1634 PyObject *result = (*call)(func, arg, kw);
1635 if (result == NULL && !PyErr_Occurred())
1636 PyErr_SetString(
1637 PyExc_SystemError,
1638 "NULL result without error in PyObject_Call");
1639 return result;
1640 }
1641 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
1642 PyString_AS_STRING(PyObject_Repr(func)));
1643 return NULL;
1644}
1645
1646PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001647PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001648{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001649 va_list va;
1650 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001651 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001652
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001653 if (callable == NULL) {
1654 va_end(va);
1655 return null_error();
1656 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001657
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001658 if (format)
1659 args = Py_VaBuildValue(format, va);
1660 else
1661 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001662
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001663 va_end(va);
1664
1665 if (args == NULL)
1666 return NULL;
1667
1668 if (!PyTuple_Check(args)) {
1669 PyObject *a;
1670
1671 a = PyTuple_New(1);
1672 if (a == NULL)
1673 return NULL;
1674 if (PyTuple_SetItem(a, 0, args) < 0)
1675 return NULL;
1676 args = a;
1677 }
1678 retval = PyObject_CallObject(callable, args);
1679
1680 Py_DECREF(args);
1681
1682 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001683}
1684
1685PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001686PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001687{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001688 va_list va;
1689 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001690 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001691
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001692 if (o == NULL || name == NULL) {
1693 va_end(va);
1694 return null_error();
1695 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001696
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001697 func = PyObject_GetAttrString(o, name);
1698 if (func == NULL) {
1699 va_end(va);
1700 PyErr_SetString(PyExc_AttributeError, name);
1701 return 0;
1702 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001703
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001704 if (!PyCallable_Check(func)) {
1705 va_end(va);
1706 return type_error("call of non-callable attribute");
1707 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001708
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001709 if (format && *format)
1710 args = Py_VaBuildValue(format, va);
1711 else
1712 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001713
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001715
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001716 if (!args)
1717 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001718
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001719 if (!PyTuple_Check(args)) {
1720 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001721
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001722 a = PyTuple_New(1);
1723 if (a == NULL)
1724 return NULL;
1725 if (PyTuple_SetItem(a, 0, args) < 0)
1726 return NULL;
1727 args = a;
1728 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001729
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001730 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001731
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001732 Py_DECREF(args);
1733 Py_DECREF(func);
1734
1735 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001736}
Guido van Rossum823649d2001-03-21 18:40:58 +00001737
1738
1739/* isinstance(), issubclass() */
1740
1741static int
1742abstract_issubclass(PyObject *derived, PyObject *cls, int first)
1743{
1744 static PyObject *__bases__ = NULL;
1745 PyObject *bases;
1746 int i, n;
1747 int r = 0;
1748
1749 if (__bases__ == NULL) {
1750 __bases__ = PyString_FromString("__bases__");
1751 if (__bases__ == NULL)
1752 return -1;
1753 }
1754
1755 if (first) {
1756 bases = PyObject_GetAttr(cls, __bases__);
1757 if (bases == NULL || !PyTuple_Check(bases)) {
1758 Py_XDECREF(bases);
1759 PyErr_SetString(PyExc_TypeError,
1760 "issubclass() arg 2 must be a class");
1761 return -1;
1762 }
1763 Py_DECREF(bases);
1764 }
1765
1766 if (derived == cls)
1767 return 1;
1768
1769 bases = PyObject_GetAttr(derived, __bases__);
1770 if (bases == NULL || !PyTuple_Check(bases)) {
1771 Py_XDECREF(bases);
1772 PyErr_SetString(PyExc_TypeError,
1773 "issubclass() arg 1 must be a class");
1774 return -1;
1775 }
1776
1777 n = PyTuple_GET_SIZE(bases);
1778 for (i = 0; i < n; i++) {
1779 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls, 0);
1780 if (r != 0)
1781 break;
1782 }
1783
1784 Py_DECREF(bases);
1785
1786 return r;
1787}
1788
1789int
1790PyObject_IsInstance(PyObject *inst, PyObject *cls)
1791{
1792 PyObject *icls;
1793 static PyObject *__class__ = NULL;
1794 int retval = 0;
1795
1796 if (PyClass_Check(cls)) {
1797 if (PyInstance_Check(inst)) {
1798 PyObject *inclass =
1799 (PyObject*)((PyInstanceObject*)inst)->in_class;
1800 retval = PyClass_IsSubclass(inclass, cls);
1801 }
1802 }
1803 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001804 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001805 }
1806 else if (!PyInstance_Check(inst)) {
1807 if (__class__ == NULL) {
1808 __class__ = PyString_FromString("__class__");
1809 if (__class__ == NULL)
1810 return -1;
1811 }
1812 icls = PyObject_GetAttr(inst, __class__);
1813 if (icls != NULL) {
1814 retval = abstract_issubclass(icls, cls, 1);
1815 Py_DECREF(icls);
1816 if (retval < 0 &&
1817 !PyErr_ExceptionMatches(PyExc_TypeError))
1818 return -1;
1819 }
1820 else
1821 retval = -1;
1822 }
1823 else
1824 retval = -1;
1825
1826 if (retval < 0) {
1827 PyErr_SetString(PyExc_TypeError,
1828 "isinstance() arg 2 must be a class or type");
1829 }
1830 return retval;
1831}
1832
1833int
1834PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1835{
1836 int retval;
1837
1838 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
1839 retval = abstract_issubclass(derived, cls, 1);
1840 }
1841 else {
1842 /* shortcut */
1843 if (!(retval = (derived == cls)))
1844 retval = PyClass_IsSubclass(derived, cls);
1845 }
1846
1847 return retval;
1848}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001849
1850PyObject *
1851PyObject_GetIter(PyObject *o)
1852{
1853 PyTypeObject *t = o->ob_type;
1854 getiterfunc f = NULL;
1855 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
1856 f = t->tp_iter;
1857 if (f == NULL) {
1858 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00001859 return PySeqIter_New(o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001860 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1861 return NULL;
1862 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00001863 else {
1864 PyObject *res = (*f)(o);
1865 if (res != NULL && !PyIter_Check(res)) {
1866 PyErr_Format(PyExc_TypeError,
1867 "iter() returned non-iterator "
1868 "of type '%.100s'",
1869 res->ob_type->tp_name);
1870 Py_DECREF(res);
1871 res = NULL;
1872 }
1873 return res;
1874 }
1875}
1876
Tim Petersf4848da2001-05-05 00:14:56 +00001877/* Return next item.
1878 * If an error occurs, return NULL. PyErr_Occurred() will be true.
1879 * If the iteration terminates normally, return NULL and clear the
1880 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
1881 * will be false.
1882 * Else return the next object. PyErr_Occurred() will be false.
1883 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001884PyObject *
1885PyIter_Next(PyObject *iter)
1886{
Tim Petersf4848da2001-05-05 00:14:56 +00001887 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00001888 if (!PyIter_Check(iter)) {
1889 PyErr_Format(PyExc_TypeError,
1890 "'%.100s' object is not an iterator",
1891 iter->ob_type->tp_name);
1892 return NULL;
1893 }
Tim Petersf4848da2001-05-05 00:14:56 +00001894 result = (*iter->ob_type->tp_iternext)(iter);
1895 if (result == NULL &&
1896 PyErr_Occurred() &&
1897 PyErr_ExceptionMatches(PyExc_StopIteration))
1898 PyErr_Clear();
1899 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001900}