blob: f7ade6de63d545c7acdd6a34f1f975351cafcdb4 [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 */
7
8#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +00009 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000010
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000011/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000012
13static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000014type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000015{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000016 PyErr_SetString(PyExc_TypeError, msg);
17 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000018}
19
Guido van Rossum052b7e11996-11-11 15:08:19 +000020static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000021null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000022{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000023 if (!PyErr_Occurred())
24 PyErr_SetString(PyExc_SystemError,
25 "null argument to internal routine");
26 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000027}
28
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000029/* Operations on any object */
30
31int
Fred Drake79912472000-07-09 04:06:11 +000032PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000033{
34 int r;
35
36 if (o1 == NULL || o2 == NULL) {
37 null_error();
38 return -1;
39 }
40 r = PyObject_Compare(o1, o2);
41 if (PyErr_Occurred())
42 return -1;
43 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000044 return 0;
45}
Guido van Rossume15dee51995-07-18 14:12:02 +000046
47PyObject *
Fred Drake79912472000-07-09 04:06:11 +000048PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000049{
50 PyObject *v;
51
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000052 if (o == NULL)
53 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000054 v = (PyObject *)o->ob_type;
55 Py_INCREF(v);
56 return v;
57}
58
59int
Jeremy Hylton6253f832000-07-12 12:56:19 +000060PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000064 if (o == NULL) {
65 null_error();
66 return -1;
67 }
Guido van Rossume15dee51995-07-18 14:12:02 +000068
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000069 m = o->ob_type->tp_as_sequence;
70 if (m && m->sq_length)
71 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000072
Jeremy Hylton6253f832000-07-12 12:56:19 +000073 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000074}
75
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000076#undef PyObject_Length
77int
78PyObject_Length(PyObject *o)
79{
80 return PyObject_Size(o);
81}
82#define PyObject_Length PyObject_Size
83
Guido van Rossume15dee51995-07-18 14:12:02 +000084PyObject *
Fred Drake79912472000-07-09 04:06:11 +000085PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +000086{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000087 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000088
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000089 if (o == NULL || key == NULL)
90 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000091
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000092 m = o->ob_type->tp_as_mapping;
93 if (m && m->mp_subscript)
94 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +000095
Guido van Rossum21308241998-08-13 16:44:44 +000096 if (o->ob_type->tp_as_sequence) {
97 if (PyInt_Check(key))
98 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +000099 else if (PyLong_Check(key)) {
100 long key_value = PyLong_AsLong(key);
101 if (key_value == -1 && PyErr_Occurred())
102 return NULL;
103 return PySequence_GetItem(o, key_value);
104 }
Guido van Rossum21308241998-08-13 16:44:44 +0000105 return type_error("sequence index must be integer");
106 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000107
108 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000109}
110
111int
Fred Drake79912472000-07-09 04:06:11 +0000112PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000113{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000114 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000115
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000116 if (o == NULL || key == NULL || value == NULL) {
117 null_error();
118 return -1;
119 }
120 m = o->ob_type->tp_as_mapping;
121 if (m && m->mp_ass_subscript)
122 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000123
Guido van Rossum21308241998-08-13 16:44:44 +0000124 if (o->ob_type->tp_as_sequence) {
125 if (PyInt_Check(key))
126 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000127 else if (PyLong_Check(key)) {
128 long key_value = PyLong_AsLong(key);
129 if (key_value == -1 && PyErr_Occurred())
130 return -1;
131 return PySequence_SetItem(o, key_value, value);
132 }
Guido van Rossum21308241998-08-13 16:44:44 +0000133 type_error("sequence index must be integer");
134 return -1;
135 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000136
137 type_error("object does not support item assignment");
138 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000139}
140
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000141int
Fred Drake79912472000-07-09 04:06:11 +0000142PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000143{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000144 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000145
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000146 if (o == NULL || key == NULL) {
147 null_error();
148 return -1;
149 }
150 m = o->ob_type->tp_as_mapping;
151 if (m && m->mp_ass_subscript)
152 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000153
Guido van Rossum21308241998-08-13 16:44:44 +0000154 if (o->ob_type->tp_as_sequence) {
155 if (PyInt_Check(key))
156 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000157 else if (PyLong_Check(key)) {
158 long key_value = PyLong_AsLong(key);
159 if (key_value == -1 && PyErr_Occurred())
160 return -1;
161 return PySequence_DelItem(o, key_value);
162 }
Guido van Rossum21308241998-08-13 16:44:44 +0000163 type_error("sequence index must be integer");
164 return -1;
165 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000166
167 type_error("object does not support item deletion");
168 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000169}
170
Guido van Rossum4c08d552000-03-10 22:55:18 +0000171int PyObject_AsCharBuffer(PyObject *obj,
172 const char **buffer,
173 int *buffer_len)
174{
175 PyBufferProcs *pb;
176 const char *pp;
177 int len;
178
179 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
180 null_error();
181 return -1;
182 }
183 pb = obj->ob_type->tp_as_buffer;
184 if ( pb == NULL ||
185 pb->bf_getcharbuffer == NULL ||
186 pb->bf_getsegcount == NULL ) {
187 PyErr_SetString(PyExc_TypeError,
188 "expected a character buffer object");
189 goto onError;
190 }
191 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
192 PyErr_SetString(PyExc_TypeError,
193 "expected a single-segment buffer object");
194 goto onError;
195 }
196 len = (*pb->bf_getcharbuffer)(obj,0,&pp);
197 if (len < 0)
198 goto onError;
199 *buffer = pp;
200 *buffer_len = len;
201 return 0;
202
203 onError:
204 return -1;
205}
206
207int PyObject_AsReadBuffer(PyObject *obj,
208 const void **buffer,
209 int *buffer_len)
210{
211 PyBufferProcs *pb;
212 void *pp;
213 int len;
214
215 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
216 null_error();
217 return -1;
218 }
219 pb = obj->ob_type->tp_as_buffer;
220 if ( pb == NULL ||
221 pb->bf_getreadbuffer == NULL ||
222 pb->bf_getsegcount == NULL ) {
223 PyErr_SetString(PyExc_TypeError,
224 "expected a readable buffer object");
225 goto onError;
226 }
227 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
228 PyErr_SetString(PyExc_TypeError,
229 "expected a single-segment buffer object");
230 goto onError;
231 }
232 len = (*pb->bf_getreadbuffer)(obj,0,&pp);
233 if (len < 0)
234 goto onError;
235 *buffer = pp;
236 *buffer_len = len;
237 return 0;
238
239 onError:
240 return -1;
241}
242
243int PyObject_AsWriteBuffer(PyObject *obj,
244 void **buffer,
245 int *buffer_len)
246{
247 PyBufferProcs *pb;
248 void*pp;
249 int len;
250
251 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
252 null_error();
253 return -1;
254 }
255 pb = obj->ob_type->tp_as_buffer;
256 if ( pb == NULL ||
257 pb->bf_getwritebuffer == NULL ||
258 pb->bf_getsegcount == NULL ) {
259 PyErr_SetString(PyExc_TypeError,
260 "expected a writeable buffer object");
261 goto onError;
262 }
263 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
264 PyErr_SetString(PyExc_TypeError,
265 "expected a single-segment buffer object");
266 goto onError;
267 }
268 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
269 if (len < 0)
270 goto onError;
271 *buffer = pp;
272 *buffer_len = len;
273 return 0;
274
275 onError:
276 return -1;
277}
278
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000279/* Operations on numbers */
280
281int
Fred Drake79912472000-07-09 04:06:11 +0000282PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000283{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000284 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000285}
286
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000287/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000288
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000289/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000290
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000291#define NB_SLOT(x) offsetof(PyNumberMethods, x)
292#define NB_BINOP(nb_methods, slot) \
293 ((binaryfunc*)(& ((char*)nb_methods)[slot] ))
294#define NB_TERNOP(nb_methods, slot) \
295 ((ternaryfunc*)(& ((char*)nb_methods)[slot] ))
296
297/*
298 Calling scheme used for binary operations:
299
300 v w Action
301 -------------------------------------------------------------------
302 new new v.op(v,w), w.op(v,w)
303 new old v.op(v,w), coerce(v,w), v.op(v,w)
304 old new w.op(v,w), coerce(v,w), v.op(v,w)
305 old old coerce(v,w), v.op(v,w)
306
307 Legend:
308 -------
309 * new == new style number
310 * old == old style number
311 * Action indicates the order in which operations are tried until either
312 a valid result is produced or an error occurs.
313
314 */
315
316static PyObject *
317binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000318{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000319 PyObject *x;
320 binaryfunc *slot;
321 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v)) {
322 slot = NB_BINOP(v->ob_type->tp_as_number, op_slot);
323 if (*slot) {
324 x = (*slot)(v, w);
325 if (x != Py_NotImplemented) {
326 return x;
327 }
328 Py_DECREF(x); /* can't do it */
329 }
330 if (v->ob_type == w->ob_type) {
331 goto binop_error;
332 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000333 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000334 if (w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
335 slot = NB_BINOP(w->ob_type->tp_as_number, op_slot);
336 if (*slot) {
337 x = (*slot)(v, w);
338 if (x != Py_NotImplemented) {
339 return x;
340 }
341 Py_DECREF(x); /* can't do it */
342 }
343 }
344 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
345 int err = PyNumber_CoerceEx(&v, &w);
346 if (err < 0) {
347 return NULL;
348 }
349 if (err == 0) {
350 PyNumberMethods *mv = v->ob_type->tp_as_number;
351 if (mv) {
352 slot = NB_BINOP(mv, op_slot);
353 if (*slot) {
354 PyObject *x = (*slot)(v, w);
355 Py_DECREF(v);
356 Py_DECREF(w);
357 return x;
358 }
359 }
360 /* CoerceEx incremented the reference counts */
361 Py_DECREF(v);
362 Py_DECREF(w);
363 }
364 }
365binop_error:
366 Py_INCREF(Py_NotImplemented);
367 return Py_NotImplemented;
368}
369
370static PyObject *
371binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
372{
373 PyObject *result = binary_op1(v, w, op_slot);
374 if (result == Py_NotImplemented) {
375 Py_DECREF(Py_NotImplemented);
376 PyErr_Format(PyExc_TypeError,
377 "unsupported operand type(s) for %s", op_name);
378 return NULL;
379 }
380 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000381}
382
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000383
384/*
385 Calling scheme used for ternary operations:
386
387 v w z Action
388 -------------------------------------------------------------------
389 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
390 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
391 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
392 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
393 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
394 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
395 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
396 old old old coerce(v,w,z), v.op(v,w,z)
397
398 Legend:
399 -------
400 * new == new style number
401 * old == old style number
402 * Action indicates the order in which operations are tried until either
403 a valid result is produced or an error occurs.
404 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
405 only if z != Py_None; if z == Py_None, then it is treated as absent
406 variable and only coerce(v,w) is tried.
407
408 */
409
410static PyObject *
411ternary_op(PyObject *v,
412 PyObject *w,
413 PyObject *z,
414 const int op_slot,
415 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000416{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000417 PyNumberMethods *mv, *mw, *mz;
418 register PyObject *x = NULL;
419 register ternaryfunc *slot;
420
421 mv = v->ob_type->tp_as_number;
422 if (mv != NULL && NEW_STYLE_NUMBER(v)) {
423 /* try v.op(v,w,z) */
424 slot = NB_TERNOP(mv, op_slot);
425 if (*slot) {
426 x = (*slot)(v, w, z);
427 if (x != Py_NotImplemented)
428 return x;
429 /* Can't do it... fall through */
430 Py_DECREF(x);
431 }
432 if (v->ob_type == w->ob_type &&
433 (z == Py_None || z->ob_type == v->ob_type)) {
434 goto ternary_error;
435 }
436 }
437 mw = w->ob_type->tp_as_number;
438 if (mw != NULL && NEW_STYLE_NUMBER(w)) {
439 /* try w.op(v,w,z) */
440 slot = NB_TERNOP(mw,op_slot);
441 if (*slot) {
442 x = (*slot)(v, w, z);
443 if (x != Py_NotImplemented)
444 return x;
445 /* Can't do it... fall through */
446 Py_DECREF(x);
447 }
448 if (NEW_STYLE_NUMBER(v) &&
449 (z == Py_None || z->ob_type == v->ob_type)) {
450 goto ternary_error;
451 }
452 }
453 mz = z->ob_type->tp_as_number;
454 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
455 /* try: z.op(v,w,z) */
456 slot = NB_TERNOP(mz, op_slot);
457 if (*slot) {
458 x = (*slot)(v, w, z);
459 if (x != Py_NotImplemented)
460 return x;
461 /* Can't do it... fall through */
462 Py_DECREF(x);
463 }
464 }
465
466 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
467 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
468 /* we have an old style operand, coerce */
469 PyObject *v1, *z1, *w2, *z2;
470 int c;
471
472 c = PyNumber_Coerce(&v, &w);
473 if (c != 0)
474 goto error3;
475
476 /* Special case: if the third argument is None, it is
477 treated as absent argument and not coerced. */
478 if (z == Py_None) {
479 if (v->ob_type->tp_as_number) {
480 slot = NB_TERNOP(v->ob_type->tp_as_number,
481 op_slot);
482 if (*slot)
483 x = (*slot)(v, w, z);
484 else
485 c = -1;
486 }
487 else
488 c = -1;
489 goto error2;
490 }
491 v1 = v;
492 z1 = z;
493 c = PyNumber_Coerce(&v1, &z1);
494 if (c != 0)
495 goto error2;
496 w2 = w;
497 z2 = z1;
498 c = PyNumber_Coerce(&w2, &z2);
499 if (c != 0)
500 goto error1;
501
502 if (v1->ob_type->tp_as_number != NULL) {
503 slot = NB_TERNOP(v1->ob_type->tp_as_number,
504 op_slot);
505 if (*slot)
506 x = (*slot)(v1, w2, z2);
507 else
508 c = -1;
509 }
510 else
511 c = -1;
512
513 Py_DECREF(w2);
514 Py_DECREF(z2);
515 error1:
516 Py_DECREF(v1);
517 Py_DECREF(z1);
518 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000519 Py_DECREF(v);
520 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000521 error3:
522 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000523 return x;
524 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000525
526ternary_error:
527 PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for %s",
528 op_name);
529 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000530}
531
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000532#define BINARY_FUNC(func, op, op_name) \
533 PyObject * \
534 func(PyObject *v, PyObject *w) { \
535 return binary_op(v, w, NB_SLOT(op), op_name); \
536 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000537
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000538BINARY_FUNC(PyNumber_Or, nb_or, "|")
539BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
540BINARY_FUNC(PyNumber_And, nb_and, "&")
541BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
542BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
543BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
544BINARY_FUNC(PyNumber_Multiply, nb_multiply, "*")
545BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
546BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000547
548PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000549PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000550{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000551 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
552 if (result == Py_NotImplemented) {
553 PySequenceMethods *m = v->ob_type->tp_as_sequence;
554 Py_DECREF(Py_NotImplemented);
555 if (m && m->sq_concat) {
556 result = (*m->sq_concat)(v, w);
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000557 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000558 else {
559 PyErr_SetString(PyExc_TypeError,
560 "unsupported operand types for +");
561 result = NULL;
562 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000563 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000564 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000565}
566
567PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000568PyNumber_FloorDivide(PyObject *v, PyObject *w)
569{
570 /* XXX tp_flags test */
571 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
572}
573
574PyObject *
575PyNumber_TrueDivide(PyObject *v, PyObject *w)
576{
577 /* XXX tp_flags test */
578 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
579}
580
581PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000582PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000583{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000584 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000585 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000586#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000587 else if (PyUnicode_Check(v))
588 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000589#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000590 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000591}
592
593PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000594PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000595{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000596 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000597}
598
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000599/* Binary in-place operators */
600
601/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000602 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000603
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000604 - If the left hand object has the appropriate struct members, and
605 they are filled, call the appropriate function and return the
606 result. No coercion is done on the arguments; the left-hand object
607 is the one the operation is performed on, and it's up to the
608 function to deal with the right-hand object.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000609
610 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000611 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000612
613 */
614
615#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
616
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000617static PyObject *
618binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
619 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000620{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000621 PyNumberMethods *mv = v->ob_type->tp_as_number;
622 if (mv != NULL && HASINPLACE(v)) {
623 binaryfunc *slot = NB_BINOP(mv, iop_slot);
624 if (*slot) {
625 PyObject *x = (*slot)(v, w);
626 if (x != Py_NotImplemented) {
627 return x;
628 }
629 Py_DECREF(x);
630 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000631 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000632 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000633}
634
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000635#define INPLACE_BINOP(func, iop, op, op_name) \
636 PyObject * \
637 func(PyObject *v, PyObject *w) { \
638 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000639 }
640
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000641INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
642INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
643INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
644INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
645INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
646INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
647INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000648
649PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000650PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
651{
652 /* XXX tp_flags test */
653 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
654 NB_SLOT(nb_floor_divide), "//=");
655}
656
657PyObject *
658PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
659{
660 /* XXX tp_flags test */
661 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
662 NB_SLOT(nb_true_divide), "/=");
663}
664
665PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000666PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
667{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000668 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000669
Guido van Rossumbb8be932000-09-01 23:27:32 +0000670 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000671 if (HASINPLACE(v))
672 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
673 if (f == NULL)
674 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000675 if (f != NULL)
676 return (*f)(v, w);
677 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000678 return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000679}
680
681PyObject *
682PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
683{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000684 PyObject * (*g)(PyObject *, int) = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000685 if (HASINPLACE(v) && v->ob_type->tp_as_sequence &&
686 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) {
687 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000688 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000689 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000690 }
691 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000692 n = PyLong_AsLong(w);
693 if (n == -1 && PyErr_Occurred())
694 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000695 }
696 else {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000697 return type_error("can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000698 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000699 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000700 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000701 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
702 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000703}
704
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000705
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000706
707PyObject *
708PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
709{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000710 if (PyString_Check(v))
711 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000712#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000713 else if (PyUnicode_Check(v))
714 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000715#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000716 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000717 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
718 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000719}
720
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000721
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000722PyObject *
723PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
724{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000725 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
726 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
727 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000728 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000729 else {
730 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
731 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000732}
733
734
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000735/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000736
737PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000738PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000739{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000740 PyNumberMethods *m;
741
742 if (o == NULL)
743 return null_error();
744 m = o->ob_type->tp_as_number;
745 if (m && m->nb_negative)
746 return (*m->nb_negative)(o);
747
748 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000749}
750
751PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000752PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000753{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000754 PyNumberMethods *m;
755
756 if (o == NULL)
757 return null_error();
758 m = o->ob_type->tp_as_number;
759 if (m && m->nb_positive)
760 return (*m->nb_positive)(o);
761
762 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000763}
764
765PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000766PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000767{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000768 PyNumberMethods *m;
769
770 if (o == NULL)
771 return null_error();
772 m = o->ob_type->tp_as_number;
773 if (m && m->nb_invert)
774 return (*m->nb_invert)(o);
775
776 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000777}
778
779PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000780PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000781{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000782 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000783
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000784 if (o == NULL)
785 return null_error();
786 m = o->ob_type->tp_as_number;
787 if (m && m->nb_absolute)
788 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000789
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000790 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000791}
792
Guido van Rossum9e896b32000-04-05 20:11:21 +0000793/* Add a check for embedded NULL-bytes in the argument. */
794static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000795int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000796{
797 char *end;
798 PyObject *x;
799
800 x = PyInt_FromString((char*)s, &end, 10);
801 if (x == NULL)
802 return NULL;
803 if (end != s + len) {
804 PyErr_SetString(PyExc_ValueError,
805 "null byte in argument for int()");
806 Py_DECREF(x);
807 return NULL;
808 }
809 return x;
810}
811
Guido van Rossume15dee51995-07-18 14:12:02 +0000812PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000813PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000814{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000815 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000816 const char *buffer;
817 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000818
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 if (o == NULL)
820 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000821 if (PyInt_Check(o)) {
822 Py_INCREF(o);
823 return o;
824 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000825 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000826 return int_from_string(PyString_AS_STRING(o),
827 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000828#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000829 if (PyUnicode_Check(o))
830 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
831 PyUnicode_GET_SIZE(o),
832 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000833#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000834 m = o->ob_type->tp_as_number;
835 if (m && m->nb_int)
836 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000837 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000838 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000839
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000840 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000841}
842
Guido van Rossum9e896b32000-04-05 20:11:21 +0000843/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000844static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000845long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000846{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000847 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000848 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000849
Guido van Rossum4c08d552000-03-10 22:55:18 +0000850 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000851 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000852 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000853 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000854 PyErr_SetString(PyExc_ValueError,
855 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000856 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000857 return NULL;
858 }
859 return x;
860}
861
Guido van Rossume15dee51995-07-18 14:12:02 +0000862PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000863PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000864{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000865 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000866 const char *buffer;
867 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000868
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000869 if (o == NULL)
870 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000871 if (PyLong_Check(o)) {
872 Py_INCREF(o);
873 return o;
874 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000875 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000876 /* need to do extra error checking that PyLong_FromString()
877 * doesn't do. In particular long('9.5') must raise an
878 * exception, not truncate the float.
879 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000880 return long_from_string(PyString_AS_STRING(o),
881 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000882#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000883 if (PyUnicode_Check(o))
884 /* The above check is done in PyLong_FromUnicode(). */
885 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
886 PyUnicode_GET_SIZE(o),
887 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000888#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000889 m = o->ob_type->tp_as_number;
890 if (m && m->nb_long)
891 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000892 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
893 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000894
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000895 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000896}
897
898PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000899PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000900{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000901 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000902
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000903 if (o == NULL)
904 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000905 if (PyFloat_Check(o)) {
906 Py_INCREF(o);
907 return o;
908 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000909 if (!PyString_Check(o)) {
910 m = o->ob_type->tp_as_number;
911 if (m && m->nb_float)
912 return m->nb_float(o);
913 }
914 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000915}
916
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000917/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000918
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000919int
Fred Drake79912472000-07-09 04:06:11 +0000920PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000921{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000922 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000923}
924
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000925int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000926PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000927{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000929
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000930 if (s == NULL) {
931 null_error();
932 return -1;
933 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000934
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 m = s->ob_type->tp_as_sequence;
936 if (m && m->sq_length)
937 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000938
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000939 type_error("len() of unsized object");
940 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000941}
942
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000943#undef PySequence_Length
944int
945PySequence_Length(PyObject *s)
946{
947 return PySequence_Size(s);
948}
949#define PySequence_Length PySequence_Size
950
Guido van Rossume15dee51995-07-18 14:12:02 +0000951PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000952PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000953{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000954 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000955
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000956 if (s == NULL || o == NULL)
957 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000958
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000959 m = s->ob_type->tp_as_sequence;
960 if (m && m->sq_concat)
961 return m->sq_concat(s, o);
962
963 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000964}
965
966PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000967PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +0000968{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000969 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000970
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000971 if (o == NULL)
972 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000973
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000974 m = o->ob_type->tp_as_sequence;
975 if (m && m->sq_repeat)
976 return m->sq_repeat(o, count);
977
978 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000979}
980
981PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000982PySequence_InPlaceConcat(PyObject *s, PyObject *o)
983{
984 PySequenceMethods *m;
985
986 if (s == NULL || o == NULL)
987 return null_error();
988
989 m = s->ob_type->tp_as_sequence;
990 if (m && HASINPLACE(s) && m->sq_inplace_concat)
991 return m->sq_inplace_concat(s, o);
992 if (m && m->sq_concat)
993 return m->sq_concat(s, o);
994
995 return type_error("object can't be concatenated");
996}
997
998PyObject *
999PySequence_InPlaceRepeat(PyObject *o, int count)
1000{
1001 PySequenceMethods *m;
1002
1003 if (o == NULL)
1004 return null_error();
1005
1006 m = o->ob_type->tp_as_sequence;
1007 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1008 return m->sq_inplace_repeat(o, count);
1009 if (m && m->sq_repeat)
1010 return m->sq_repeat(o, count);
1011
1012 return type_error("object can't be repeated");
1013}
1014
1015PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001016PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001017{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001018 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001019
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001020 if (s == NULL)
1021 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001022
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001023 m = s->ob_type->tp_as_sequence;
1024 if (m && m->sq_item) {
1025 if (i < 0) {
1026 if (m->sq_length) {
1027 int l = (*m->sq_length)(s);
1028 if (l < 0)
1029 return NULL;
1030 i += l;
1031 }
1032 }
1033 return m->sq_item(s, i);
1034 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001035
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001036 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001037}
1038
Thomas Wouters1d75a792000-08-17 22:37:32 +00001039static PyObject *
1040sliceobj_from_intint(int i, int j)
1041{
1042 PyObject *start, *end, *slice;
1043 start = PyInt_FromLong((long)i);
1044 if (!start)
1045 return NULL;
1046 end = PyInt_FromLong((long)j);
1047 if (!end) {
1048 Py_DECREF(start);
1049 return NULL;
1050 }
1051 slice = PySlice_New(start, end, NULL);
1052 Py_DECREF(start);
1053 Py_DECREF(end);
1054 return slice;
1055}
1056
Guido van Rossume15dee51995-07-18 14:12:02 +00001057PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001058PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001059{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001060 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001061 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001062
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001063 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001065 m = s->ob_type->tp_as_sequence;
1066 if (m && m->sq_slice) {
1067 if (i1 < 0 || i2 < 0) {
1068 if (m->sq_length) {
1069 int l = (*m->sq_length)(s);
1070 if (l < 0)
1071 return NULL;
1072 if (i1 < 0)
1073 i1 += l;
1074 if (i2 < 0)
1075 i2 += l;
1076 }
1077 }
1078 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001079 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1080 PyObject *res;
1081 PyObject *slice = sliceobj_from_intint(i1, i2);
1082 if (!slice)
1083 return NULL;
1084 res = mp->mp_subscript(s, slice);
1085 Py_DECREF(slice);
1086 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001087 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001088
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001089 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001090}
1091
1092int
Fred Drake79912472000-07-09 04:06:11 +00001093PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001094{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001095 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097 if (s == NULL) {
1098 null_error();
1099 return -1;
1100 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001101
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001102 m = s->ob_type->tp_as_sequence;
1103 if (m && m->sq_ass_item) {
1104 if (i < 0) {
1105 if (m->sq_length) {
1106 int l = (*m->sq_length)(s);
1107 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001108 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 i += l;
1110 }
1111 }
1112 return m->sq_ass_item(s, i, o);
1113 }
1114
1115 type_error("object doesn't support item assignment");
1116 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001117}
1118
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001119int
Fred Drake79912472000-07-09 04:06:11 +00001120PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001121{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001122 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001123
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001124 if (s == NULL) {
1125 null_error();
1126 return -1;
1127 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001128
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001129 m = s->ob_type->tp_as_sequence;
1130 if (m && m->sq_ass_item) {
1131 if (i < 0) {
1132 if (m->sq_length) {
1133 int l = (*m->sq_length)(s);
1134 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001135 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001136 i += l;
1137 }
1138 }
1139 return m->sq_ass_item(s, i, (PyObject *)NULL);
1140 }
1141
1142 type_error("object doesn't support item deletion");
1143 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001144}
1145
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001146int
Fred Drake79912472000-07-09 04:06:11 +00001147PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001148{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001149 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001150 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001151
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152 if (s == NULL) {
1153 null_error();
1154 return -1;
1155 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001156
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001157 m = s->ob_type->tp_as_sequence;
1158 if (m && m->sq_ass_slice) {
1159 if (i1 < 0 || i2 < 0) {
1160 if (m->sq_length) {
1161 int l = (*m->sq_length)(s);
1162 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001163 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001164 if (i1 < 0)
1165 i1 += l;
1166 if (i2 < 0)
1167 i2 += l;
1168 }
1169 }
1170 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001171 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1172 int res;
1173 PyObject *slice = sliceobj_from_intint(i1, i2);
1174 if (!slice)
1175 return -1;
1176 res = mp->mp_ass_subscript(s, slice, o);
1177 Py_DECREF(slice);
1178 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001179 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001180
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001181 type_error("object doesn't support slice assignment");
1182 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001183}
1184
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001185int
Fred Drake79912472000-07-09 04:06:11 +00001186PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001187{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001188 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001189
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001190 if (s == NULL) {
1191 null_error();
1192 return -1;
1193 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001194
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001195 m = s->ob_type->tp_as_sequence;
1196 if (m && m->sq_ass_slice) {
1197 if (i1 < 0 || i2 < 0) {
1198 if (m->sq_length) {
1199 int l = (*m->sq_length)(s);
1200 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001201 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 if (i1 < 0)
1203 i1 += l;
1204 if (i2 < 0)
1205 i2 += l;
1206 }
1207 }
1208 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1209 }
1210 type_error("object doesn't support slice deletion");
1211 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001212}
1213
Guido van Rossume15dee51995-07-18 14:12:02 +00001214PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001215PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001216{
Tim Peters6912d4d2001-05-05 03:56:37 +00001217 PyObject *it; /* iter(v) */
1218 int n; /* guess for result tuple size */
1219 PyObject *result;
1220 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001221
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222 if (v == NULL)
1223 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001224
Tim Peters6912d4d2001-05-05 03:56:37 +00001225 /* Special-case the common tuple and list cases, for efficiency. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226 if (PyTuple_Check(v)) {
1227 Py_INCREF(v);
1228 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001229 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230 if (PyList_Check(v))
1231 return PyList_AsTuple(v);
1232
Tim Peters6912d4d2001-05-05 03:56:37 +00001233 /* Get iterator. */
1234 it = PyObject_GetIter(v);
1235 if (it == NULL)
1236 return type_error("tuple() argument must support iteration");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237
Tim Peters6912d4d2001-05-05 03:56:37 +00001238 /* Guess result size and allocate space. */
1239 n = PySequence_Size(v);
1240 if (n < 0) {
1241 PyErr_Clear();
1242 n = 10; /* arbitrary */
1243 }
1244 result = PyTuple_New(n);
1245 if (result == NULL)
1246 goto Fail;
1247
1248 /* Fill the tuple. */
1249 for (j = 0; ; ++j) {
1250 PyObject *item = PyIter_Next(it);
1251 if (item == NULL) {
1252 if (PyErr_Occurred())
1253 goto Fail;
1254 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001256 if (j >= n) {
1257 if (n < 500)
1258 n += 10;
1259 else
1260 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001261 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001262 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001263 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001264 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001265 }
1266 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 }
1268
Tim Peters6912d4d2001-05-05 03:56:37 +00001269 /* Cut tuple back if guess was too large. */
1270 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001271 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001272 goto Fail;
1273
1274 Py_DECREF(it);
1275 return result;
1276
1277Fail:
1278 Py_XDECREF(result);
1279 Py_DECREF(it);
1280 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001281}
1282
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001283PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001284PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001285{
Tim Petersf553f892001-05-01 20:45:31 +00001286 PyObject *it; /* iter(v) */
1287 PyObject *result; /* result list */
1288 int n; /* guess for result list size */
1289 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001290
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001291 if (v == NULL)
1292 return null_error();
1293
Tim Petersf553f892001-05-01 20:45:31 +00001294 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001295 if (PyList_Check(v))
1296 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1297
Tim Petersf553f892001-05-01 20:45:31 +00001298 /* Get iterator. There may be some low-level efficiency to be gained
1299 * by caching the tp_iternext slot instead of using PyIter_Next()
1300 * later, but premature optimization is the root etc.
1301 */
1302 it = PyObject_GetIter(v);
1303 if (it == NULL)
1304 return NULL;
1305
1306 /* Guess a result list size. */
1307 n = -1; /* unknown */
1308 if (PySequence_Check(v) &&
1309 v->ob_type->tp_as_sequence->sq_length) {
1310 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001312 PyErr_Clear();
1313 }
1314 if (n < 0)
1315 n = 8; /* arbitrary */
1316 result = PyList_New(n);
1317 if (result == NULL) {
1318 Py_DECREF(it);
1319 return NULL;
1320 }
1321
1322 /* Run iterator to exhaustion. */
1323 for (i = 0; ; i++) {
1324 PyObject *item = PyIter_Next(it);
1325 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001326 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001327 Py_DECREF(result);
1328 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001329 }
Tim Petersf553f892001-05-01 20:45:31 +00001330 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001331 }
Tim Petersf553f892001-05-01 20:45:31 +00001332 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001333 PyList_SET_ITEM(result, i, item); /* steals ref */
1334 else {
1335 int status = PyList_Append(result, item);
1336 Py_DECREF(item); /* append creates a new ref */
1337 if (status < 0) {
1338 Py_DECREF(result);
1339 result = NULL;
1340 break;
1341 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001343 }
Tim Petersf553f892001-05-01 20:45:31 +00001344
1345 /* Cut back result list if initial guess was too large. */
1346 if (i < n && result != NULL) {
1347 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1348 Py_DECREF(result);
1349 result = NULL;
1350 }
1351 }
1352 Py_DECREF(it);
1353 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001354}
1355
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001356PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001357PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001358{
1359 if (v == NULL)
1360 return null_error();
1361
1362 if (PyList_Check(v) || PyTuple_Check(v)) {
1363 Py_INCREF(v);
1364 return v;
1365 }
1366
1367 v = PySequence_Tuple(v);
1368 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1369 return type_error(m);
1370
1371 return v;
1372}
1373
Tim Peters75f8e352001-05-05 11:33:43 +00001374/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375int
Fred Drake79912472000-07-09 04:06:11 +00001376PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001377{
Tim Peters75f8e352001-05-05 11:33:43 +00001378 int n; /* running count of o hits */
1379 PyObject *it; /* iter(s) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001380
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381 if (s == NULL || o == NULL) {
1382 null_error();
1383 return -1;
1384 }
Tim Peters75f8e352001-05-05 11:33:43 +00001385
1386 it = PyObject_GetIter(s);
1387 if (it == NULL) {
1388 type_error(".count() requires iterable argument");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001389 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001390 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001391
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 n = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001393 for (;;) {
1394 int cmp;
1395 PyObject *item = PyIter_Next(it);
1396 if (item == NULL) {
1397 if (PyErr_Occurred())
1398 goto Fail;
1399 break;
1400 }
1401 cmp = PyObject_RichCompareBool(o, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001402 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001403 if (cmp < 0)
1404 goto Fail;
1405 if (cmp > 0) {
1406 if (n == INT_MAX) {
1407 PyErr_SetString(PyExc_OverflowError,
1408 "count exceeds C int size");
1409 goto Fail;
1410 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411 n++;
Tim Peters75f8e352001-05-05 11:33:43 +00001412 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 }
Tim Peters75f8e352001-05-05 11:33:43 +00001414 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001415 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001416
1417Fail:
1418 Py_DECREF(it);
1419 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001420}
1421
Tim Peterscb8d3682001-05-05 21:05:01 +00001422/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
1423 * Always uses the iteration protocol, and only Py_EQ comparison.
1424 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425int
Tim Peterscb8d3682001-05-05 21:05:01 +00001426_PySequence_IterContains(PyObject *seq, PyObject *ob)
Guido van Rossume15dee51995-07-18 14:12:02 +00001427{
Tim Petersde9725f2001-05-05 10:06:17 +00001428 int result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001429 PyObject *it = PyObject_GetIter(seq);
Tim Petersde9725f2001-05-05 10:06:17 +00001430 if (it == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001431 PyErr_SetString(PyExc_TypeError,
Tim Petersde9725f2001-05-05 10:06:17 +00001432 "'in' or 'not in' needs iterable right argument");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 return -1;
1434 }
1435
Tim Petersde9725f2001-05-05 10:06:17 +00001436 for (;;) {
1437 int cmp;
1438 PyObject *item = PyIter_Next(it);
1439 if (item == NULL) {
1440 result = PyErr_Occurred() ? -1 : 0;
1441 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442 }
Tim Peterscb8d3682001-05-05 21:05:01 +00001443 cmp = PyObject_RichCompareBool(ob, item, Py_EQ);
Tim Petersde9725f2001-05-05 10:06:17 +00001444 Py_DECREF(item);
1445 if (cmp == 0)
1446 continue;
1447 result = cmp > 0 ? 1 : -1;
1448 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001449 }
Tim Petersde9725f2001-05-05 10:06:17 +00001450 Py_DECREF(it);
1451 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001452}
1453
Tim Peterscb8d3682001-05-05 21:05:01 +00001454/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
1455 * Use sq_contains if possible, else defer to _PySequence_IterContains().
1456 */
1457int
1458PySequence_Contains(PyObject *seq, PyObject *ob)
1459{
1460 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1461 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1462 if (sqm != NULL && sqm->sq_contains != NULL)
1463 return (*sqm->sq_contains)(seq, ob);
1464 }
1465 return _PySequence_IterContains(seq, ob);
1466}
1467
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001468/* Backwards compatibility */
1469#undef PySequence_In
1470int
Fred Drake79912472000-07-09 04:06:11 +00001471PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001472{
1473 return PySequence_Contains(w, v);
1474}
1475
1476int
Fred Drake79912472000-07-09 04:06:11 +00001477PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001478{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001479 int l, i, cmp, err;
1480 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001481
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001482 if (s == NULL || o == NULL) {
1483 null_error();
1484 return -1;
1485 }
1486
Jeremy Hylton6253f832000-07-12 12:56:19 +00001487 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001488 if (l < 0)
1489 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001490
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001491 for (i = 0; i < l; i++) {
1492 item = PySequence_GetItem(s, i);
1493 if (item == NULL)
1494 return -1;
1495 err = PyObject_Cmp(item, o, &cmp);
1496 Py_DECREF(item);
1497 if (err < 0)
1498 return err;
1499 if (cmp == 0)
1500 return i;
1501 }
1502
1503 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1504 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001505}
1506
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001507/* Operations on mappings */
1508
1509int
Fred Drake79912472000-07-09 04:06:11 +00001510PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001511{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001512 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001513}
1514
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001515int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001516PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001517{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001518 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001519
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001520 if (o == NULL) {
1521 null_error();
1522 return -1;
1523 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001524
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001525 m = o->ob_type->tp_as_mapping;
1526 if (m && m->mp_length)
1527 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001528
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001529 type_error("len() of unsized object");
1530 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001531}
1532
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001533#undef PyMapping_Length
1534int
1535PyMapping_Length(PyObject *o)
1536{
1537 return PyMapping_Size(o);
1538}
1539#define PyMapping_Length PyMapping_Size
1540
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001541PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001542PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001543{
1544 PyObject *okey, *r;
1545
1546 if (key == NULL)
1547 return null_error();
1548
1549 okey = PyString_FromString(key);
1550 if (okey == NULL)
1551 return NULL;
1552 r = PyObject_GetItem(o, okey);
1553 Py_DECREF(okey);
1554 return r;
1555}
1556
1557int
Fred Drake79912472000-07-09 04:06:11 +00001558PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001559{
1560 PyObject *okey;
1561 int r;
1562
1563 if (key == NULL) {
1564 null_error();
1565 return -1;
1566 }
1567
1568 okey = PyString_FromString(key);
1569 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001570 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001571 r = PyObject_SetItem(o, okey, value);
1572 Py_DECREF(okey);
1573 return r;
1574}
1575
1576int
Fred Drake79912472000-07-09 04:06:11 +00001577PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001578{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001579 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001580
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001581 v = PyMapping_GetItemString(o, key);
1582 if (v) {
1583 Py_DECREF(v);
1584 return 1;
1585 }
1586 PyErr_Clear();
1587 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001588}
1589
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001590int
Fred Drake79912472000-07-09 04:06:11 +00001591PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001592{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001593 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001594
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001595 v = PyObject_GetItem(o, key);
1596 if (v) {
1597 Py_DECREF(v);
1598 return 1;
1599 }
1600 PyErr_Clear();
1601 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001602}
1603
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001604/* Operations on callable objects */
1605
1606/* XXX PyCallable_Check() is in object.c */
1607
Guido van Rossume15dee51995-07-18 14:12:02 +00001608PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001609PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001610{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611 PyObject *r;
1612 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001613
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001614 if (args == NULL) {
1615 args = PyTuple_New(0);
1616 if (args == NULL)
1617 return NULL;
1618 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001619
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001620 r = PyEval_CallObject(o, args);
1621
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001622 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001623 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001624 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001625
1626 return r;
1627}
Guido van Rossume15dee51995-07-18 14:12:02 +00001628
1629PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001630PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1631{
1632 ternaryfunc call;
1633
1634 if ((call = func->ob_type->tp_call) != NULL) {
1635 PyObject *result = (*call)(func, arg, kw);
1636 if (result == NULL && !PyErr_Occurred())
1637 PyErr_SetString(
1638 PyExc_SystemError,
1639 "NULL result without error in PyObject_Call");
1640 return result;
1641 }
1642 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
1643 PyString_AS_STRING(PyObject_Repr(func)));
1644 return NULL;
1645}
1646
1647PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001648PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001649{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001650 va_list va;
1651 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001652 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001653
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001654 if (callable == NULL) {
1655 va_end(va);
1656 return null_error();
1657 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001658
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001659 if (format)
1660 args = Py_VaBuildValue(format, va);
1661 else
1662 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001663
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001664 va_end(va);
1665
1666 if (args == NULL)
1667 return NULL;
1668
1669 if (!PyTuple_Check(args)) {
1670 PyObject *a;
1671
1672 a = PyTuple_New(1);
1673 if (a == NULL)
1674 return NULL;
1675 if (PyTuple_SetItem(a, 0, args) < 0)
1676 return NULL;
1677 args = a;
1678 }
1679 retval = PyObject_CallObject(callable, args);
1680
1681 Py_DECREF(args);
1682
1683 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001684}
1685
1686PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001687PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001688{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001689 va_list va;
1690 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001691 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001692
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001693 if (o == NULL || name == NULL) {
1694 va_end(va);
1695 return null_error();
1696 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001697
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001698 func = PyObject_GetAttrString(o, name);
1699 if (func == NULL) {
1700 va_end(va);
1701 PyErr_SetString(PyExc_AttributeError, name);
1702 return 0;
1703 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001704
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001705 if (!PyCallable_Check(func)) {
1706 va_end(va);
1707 return type_error("call of non-callable attribute");
1708 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001709
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001710 if (format && *format)
1711 args = Py_VaBuildValue(format, va);
1712 else
1713 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001714
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001715 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001716
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001717 if (!args)
1718 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001720 if (!PyTuple_Check(args)) {
1721 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001722
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001723 a = PyTuple_New(1);
1724 if (a == NULL)
1725 return NULL;
1726 if (PyTuple_SetItem(a, 0, args) < 0)
1727 return NULL;
1728 args = a;
1729 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001730
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001731 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001732
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001733 Py_DECREF(args);
1734 Py_DECREF(func);
1735
1736 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001737}
Guido van Rossum823649d2001-03-21 18:40:58 +00001738
1739
1740/* isinstance(), issubclass() */
1741
1742static int
1743abstract_issubclass(PyObject *derived, PyObject *cls, int first)
1744{
1745 static PyObject *__bases__ = NULL;
1746 PyObject *bases;
1747 int i, n;
1748 int r = 0;
1749
1750 if (__bases__ == NULL) {
1751 __bases__ = PyString_FromString("__bases__");
1752 if (__bases__ == NULL)
1753 return -1;
1754 }
1755
1756 if (first) {
1757 bases = PyObject_GetAttr(cls, __bases__);
1758 if (bases == NULL || !PyTuple_Check(bases)) {
1759 Py_XDECREF(bases);
1760 PyErr_SetString(PyExc_TypeError,
1761 "issubclass() arg 2 must be a class");
1762 return -1;
1763 }
1764 Py_DECREF(bases);
1765 }
1766
1767 if (derived == cls)
1768 return 1;
1769
1770 bases = PyObject_GetAttr(derived, __bases__);
1771 if (bases == NULL || !PyTuple_Check(bases)) {
1772 Py_XDECREF(bases);
1773 PyErr_SetString(PyExc_TypeError,
1774 "issubclass() arg 1 must be a class");
1775 return -1;
1776 }
1777
1778 n = PyTuple_GET_SIZE(bases);
1779 for (i = 0; i < n; i++) {
1780 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls, 0);
1781 if (r != 0)
1782 break;
1783 }
1784
1785 Py_DECREF(bases);
1786
1787 return r;
1788}
1789
1790int
1791PyObject_IsInstance(PyObject *inst, PyObject *cls)
1792{
1793 PyObject *icls;
1794 static PyObject *__class__ = NULL;
1795 int retval = 0;
1796
1797 if (PyClass_Check(cls)) {
1798 if (PyInstance_Check(inst)) {
1799 PyObject *inclass =
1800 (PyObject*)((PyInstanceObject*)inst)->in_class;
1801 retval = PyClass_IsSubclass(inclass, cls);
1802 }
1803 }
1804 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001805 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001806 }
1807 else if (!PyInstance_Check(inst)) {
1808 if (__class__ == NULL) {
1809 __class__ = PyString_FromString("__class__");
1810 if (__class__ == NULL)
1811 return -1;
1812 }
1813 icls = PyObject_GetAttr(inst, __class__);
1814 if (icls != NULL) {
1815 retval = abstract_issubclass(icls, cls, 1);
1816 Py_DECREF(icls);
1817 if (retval < 0 &&
1818 !PyErr_ExceptionMatches(PyExc_TypeError))
1819 return -1;
1820 }
1821 else
1822 retval = -1;
1823 }
1824 else
1825 retval = -1;
1826
1827 if (retval < 0) {
1828 PyErr_SetString(PyExc_TypeError,
1829 "isinstance() arg 2 must be a class or type");
1830 }
1831 return retval;
1832}
1833
1834int
1835PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1836{
1837 int retval;
1838
1839 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
1840 retval = abstract_issubclass(derived, cls, 1);
1841 }
1842 else {
1843 /* shortcut */
1844 if (!(retval = (derived == cls)))
1845 retval = PyClass_IsSubclass(derived, cls);
1846 }
1847
1848 return retval;
1849}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001850
1851PyObject *
1852PyObject_GetIter(PyObject *o)
1853{
1854 PyTypeObject *t = o->ob_type;
1855 getiterfunc f = NULL;
1856 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
1857 f = t->tp_iter;
1858 if (f == NULL) {
1859 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00001860 return PySeqIter_New(o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001861 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1862 return NULL;
1863 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00001864 else {
1865 PyObject *res = (*f)(o);
1866 if (res != NULL && !PyIter_Check(res)) {
1867 PyErr_Format(PyExc_TypeError,
1868 "iter() returned non-iterator "
1869 "of type '%.100s'",
1870 res->ob_type->tp_name);
1871 Py_DECREF(res);
1872 res = NULL;
1873 }
1874 return res;
1875 }
1876}
1877
Tim Petersf4848da2001-05-05 00:14:56 +00001878/* Return next item.
1879 * If an error occurs, return NULL. PyErr_Occurred() will be true.
1880 * If the iteration terminates normally, return NULL and clear the
1881 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
1882 * will be false.
1883 * Else return the next object. PyErr_Occurred() will be false.
1884 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001885PyObject *
1886PyIter_Next(PyObject *iter)
1887{
Tim Petersf4848da2001-05-05 00:14:56 +00001888 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00001889 if (!PyIter_Check(iter)) {
1890 PyErr_Format(PyExc_TypeError,
1891 "'%.100s' object is not an iterator",
1892 iter->ob_type->tp_name);
1893 return NULL;
1894 }
Tim Petersf4848da2001-05-05 00:14:56 +00001895 result = (*iter->ob_type->tp_iternext)(iter);
1896 if (result == NULL &&
1897 PyErr_Occurred() &&
1898 PyErr_ExceptionMatches(PyExc_StopIteration))
1899 PyErr_Clear();
1900 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001901}