blob: c353159e985f6fd32758ede46d6095de2d0bd5e9 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00003
Guido van Rossume15dee51995-07-18 14:12:02 +00004#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00005#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00006#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00007#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00008
9#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +000010 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000013
14static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000015type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000016{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000017 PyErr_SetString(PyExc_TypeError, msg);
18 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000019}
20
Guido van Rossum052b7e11996-11-11 15:08:19 +000021static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000022null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000023{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000024 if (!PyErr_Occurred())
25 PyErr_SetString(PyExc_SystemError,
26 "null argument to internal routine");
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000030/* Operations on any object */
31
32int
Fred Drake79912472000-07-09 04:06:11 +000033PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034{
35 int r;
36
37 if (o1 == NULL || o2 == NULL) {
38 null_error();
39 return -1;
40 }
41 r = PyObject_Compare(o1, o2);
42 if (PyErr_Occurred())
43 return -1;
44 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000045 return 0;
46}
Guido van Rossume15dee51995-07-18 14:12:02 +000047
48PyObject *
Fred Drake79912472000-07-09 04:06:11 +000049PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000050{
51 PyObject *v;
52
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000053 if (o == NULL)
54 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000055 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
58}
59
60int
Jeremy Hylton6253f832000-07-12 12:56:19 +000061PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 m = o->ob_type->tp_as_sequence;
71 if (m && m->sq_length)
72 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Jeremy Hylton6253f832000-07-12 12:56:19 +000074 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075}
76
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000077#undef PyObject_Length
78int
79PyObject_Length(PyObject *o)
80{
81 return PyObject_Size(o);
82}
83#define PyObject_Length PyObject_Size
84
Guido van Rossume15dee51995-07-18 14:12:02 +000085PyObject *
Fred Drake79912472000-07-09 04:06:11 +000086PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +000087{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000088 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000089
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000090 if (o == NULL || key == NULL)
91 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000092
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000093 m = o->ob_type->tp_as_mapping;
94 if (m && m->mp_subscript)
95 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +000096
Guido van Rossum21308241998-08-13 16:44:44 +000097 if (o->ob_type->tp_as_sequence) {
98 if (PyInt_Check(key))
99 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000100 else if (PyLong_Check(key)) {
101 long key_value = PyLong_AsLong(key);
102 if (key_value == -1 && PyErr_Occurred())
103 return NULL;
104 return PySequence_GetItem(o, key_value);
105 }
Guido van Rossum21308241998-08-13 16:44:44 +0000106 return type_error("sequence index must be integer");
107 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000108
109 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000110}
111
112int
Fred Drake79912472000-07-09 04:06:11 +0000113PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000114{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000117 if (o == NULL || key == NULL || value == NULL) {
118 null_error();
119 return -1;
120 }
121 m = o->ob_type->tp_as_mapping;
122 if (m && m->mp_ass_subscript)
123 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000124
Guido van Rossum21308241998-08-13 16:44:44 +0000125 if (o->ob_type->tp_as_sequence) {
126 if (PyInt_Check(key))
127 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000128 else if (PyLong_Check(key)) {
129 long key_value = PyLong_AsLong(key);
130 if (key_value == -1 && PyErr_Occurred())
131 return -1;
132 return PySequence_SetItem(o, key_value, value);
133 }
Guido van Rossum21308241998-08-13 16:44:44 +0000134 type_error("sequence index must be integer");
135 return -1;
136 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000137
138 type_error("object does not support item assignment");
139 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000140}
141
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000142int
Fred Drake79912472000-07-09 04:06:11 +0000143PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000144{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000145 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000146
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000147 if (o == NULL || key == NULL) {
148 null_error();
149 return -1;
150 }
151 m = o->ob_type->tp_as_mapping;
152 if (m && m->mp_ass_subscript)
153 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000154
Guido van Rossum21308241998-08-13 16:44:44 +0000155 if (o->ob_type->tp_as_sequence) {
156 if (PyInt_Check(key))
157 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000158 else if (PyLong_Check(key)) {
159 long key_value = PyLong_AsLong(key);
160 if (key_value == -1 && PyErr_Occurred())
161 return -1;
162 return PySequence_DelItem(o, key_value);
163 }
Guido van Rossum21308241998-08-13 16:44:44 +0000164 type_error("sequence index must be integer");
165 return -1;
166 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000167
168 type_error("object does not support item deletion");
169 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000170}
171
Guido van Rossum4c08d552000-03-10 22:55:18 +0000172int PyObject_AsCharBuffer(PyObject *obj,
173 const char **buffer,
174 int *buffer_len)
175{
176 PyBufferProcs *pb;
177 const char *pp;
178 int len;
179
180 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
181 null_error();
182 return -1;
183 }
184 pb = obj->ob_type->tp_as_buffer;
185 if ( pb == NULL ||
186 pb->bf_getcharbuffer == NULL ||
187 pb->bf_getsegcount == NULL ) {
188 PyErr_SetString(PyExc_TypeError,
189 "expected a character buffer object");
190 goto onError;
191 }
192 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
193 PyErr_SetString(PyExc_TypeError,
194 "expected a single-segment buffer object");
195 goto onError;
196 }
197 len = (*pb->bf_getcharbuffer)(obj,0,&pp);
198 if (len < 0)
199 goto onError;
200 *buffer = pp;
201 *buffer_len = len;
202 return 0;
203
204 onError:
205 return -1;
206}
207
208int PyObject_AsReadBuffer(PyObject *obj,
209 const void **buffer,
210 int *buffer_len)
211{
212 PyBufferProcs *pb;
213 void *pp;
214 int len;
215
216 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
217 null_error();
218 return -1;
219 }
220 pb = obj->ob_type->tp_as_buffer;
221 if ( pb == NULL ||
222 pb->bf_getreadbuffer == NULL ||
223 pb->bf_getsegcount == NULL ) {
224 PyErr_SetString(PyExc_TypeError,
225 "expected a readable buffer object");
226 goto onError;
227 }
228 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
229 PyErr_SetString(PyExc_TypeError,
230 "expected a single-segment buffer object");
231 goto onError;
232 }
233 len = (*pb->bf_getreadbuffer)(obj,0,&pp);
234 if (len < 0)
235 goto onError;
236 *buffer = pp;
237 *buffer_len = len;
238 return 0;
239
240 onError:
241 return -1;
242}
243
244int PyObject_AsWriteBuffer(PyObject *obj,
245 void **buffer,
246 int *buffer_len)
247{
248 PyBufferProcs *pb;
249 void*pp;
250 int len;
251
252 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
253 null_error();
254 return -1;
255 }
256 pb = obj->ob_type->tp_as_buffer;
257 if ( pb == NULL ||
258 pb->bf_getwritebuffer == NULL ||
259 pb->bf_getsegcount == NULL ) {
260 PyErr_SetString(PyExc_TypeError,
261 "expected a writeable buffer object");
262 goto onError;
263 }
264 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
265 PyErr_SetString(PyExc_TypeError,
266 "expected a single-segment buffer object");
267 goto onError;
268 }
269 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
270 if (len < 0)
271 goto onError;
272 *buffer = pp;
273 *buffer_len = len;
274 return 0;
275
276 onError:
277 return -1;
278}
279
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000280/* Operations on numbers */
281
282int
Fred Drake79912472000-07-09 04:06:11 +0000283PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000284{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000285 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000286}
287
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000288/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000289
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000290/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000291
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000292#define NB_SLOT(x) offsetof(PyNumberMethods, x)
293#define NB_BINOP(nb_methods, slot) \
294 ((binaryfunc*)(& ((char*)nb_methods)[slot] ))
295#define NB_TERNOP(nb_methods, slot) \
296 ((ternaryfunc*)(& ((char*)nb_methods)[slot] ))
297
298/*
299 Calling scheme used for binary operations:
300
301 v w Action
302 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000303 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000304 new old v.op(v,w), coerce(v,w), v.op(v,w)
305 old new w.op(v,w), coerce(v,w), v.op(v,w)
306 old old coerce(v,w), v.op(v,w)
307
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000308 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
309 v->ob_type
310
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000311 Legend:
312 -------
313 * new == new style number
314 * old == old style number
315 * Action indicates the order in which operations are tried until either
316 a valid result is produced or an error occurs.
317
318 */
319
320static PyObject *
321binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000322{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000323 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000324 binaryfunc slotv = NULL;
325 binaryfunc slotw = NULL;
326
327 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
328 slotv = *NB_BINOP(v->ob_type->tp_as_number, op_slot);
329 if (w->ob_type != v->ob_type &&
330 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
331 slotw = *NB_BINOP(w->ob_type->tp_as_number, op_slot);
332 if (slotw == slotv)
333 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000334 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000335 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
336 x = slotw(v, w);
337 if (x != Py_NotImplemented)
338 return x;
339 Py_DECREF(x); /* can't do it */
340 slotw = NULL;
341 }
342 if (slotv) {
343 x = slotv(v, w);
344 if (x != Py_NotImplemented)
345 return x;
346 Py_DECREF(x); /* can't do it */
347 }
348 if (slotw) {
349 x = slotw(v, w);
350 if (x != Py_NotImplemented)
351 return x;
352 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000353 }
354 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
355 int err = PyNumber_CoerceEx(&v, &w);
356 if (err < 0) {
357 return NULL;
358 }
359 if (err == 0) {
360 PyNumberMethods *mv = v->ob_type->tp_as_number;
361 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000362 binaryfunc slot;
363 slot = *NB_BINOP(mv, op_slot);
364 if (slot) {
365 PyObject *x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000366 Py_DECREF(v);
367 Py_DECREF(w);
368 return x;
369 }
370 }
371 /* CoerceEx incremented the reference counts */
372 Py_DECREF(v);
373 Py_DECREF(w);
374 }
375 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000376 Py_INCREF(Py_NotImplemented);
377 return Py_NotImplemented;
378}
379
380static PyObject *
381binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
382{
383 PyObject *result = binary_op1(v, w, op_slot);
384 if (result == Py_NotImplemented) {
385 Py_DECREF(Py_NotImplemented);
386 PyErr_Format(PyExc_TypeError,
387 "unsupported operand type(s) for %s", op_name);
388 return NULL;
389 }
390 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000391}
392
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000393
394/*
395 Calling scheme used for ternary operations:
396
397 v w z Action
398 -------------------------------------------------------------------
399 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
400 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
401 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
402 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
403 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
404 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
405 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
406 old old old coerce(v,w,z), v.op(v,w,z)
407
408 Legend:
409 -------
410 * new == new style number
411 * old == old style number
412 * Action indicates the order in which operations are tried until either
413 a valid result is produced or an error occurs.
414 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
415 only if z != Py_None; if z == Py_None, then it is treated as absent
416 variable and only coerce(v,w) is tried.
417
418 */
419
420static PyObject *
421ternary_op(PyObject *v,
422 PyObject *w,
423 PyObject *z,
424 const int op_slot,
425 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000426{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000427 PyNumberMethods *mv, *mw, *mz;
428 register PyObject *x = NULL;
429 register ternaryfunc *slot;
430
431 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000432 mw = w->ob_type->tp_as_number;
433 if (v->ob_type != w->ob_type && mw && NEW_STYLE_NUMBER(w)) {
434 slot = NB_TERNOP(mw, op_slot);
435 if (*slot && *slot != *NB_TERNOP(mv, op_slot) &&
436 PyType_IsSubtype(w->ob_type, v->ob_type)) {
437 x = (*slot)(v, w, z);
438 if (x != Py_NotImplemented)
439 return x;
440 /* Can't do it... fall through */
441 Py_DECREF(x);
442 }
443 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000444 if (mv != NULL && NEW_STYLE_NUMBER(v)) {
445 /* try v.op(v,w,z) */
446 slot = NB_TERNOP(mv, op_slot);
447 if (*slot) {
448 x = (*slot)(v, w, z);
449 if (x != Py_NotImplemented)
450 return x;
451 /* Can't do it... fall through */
452 Py_DECREF(x);
453 }
454 if (v->ob_type == w->ob_type &&
455 (z == Py_None || z->ob_type == v->ob_type)) {
456 goto ternary_error;
457 }
458 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000459 if (mw != NULL && NEW_STYLE_NUMBER(w)) {
460 /* try w.op(v,w,z) */
461 slot = NB_TERNOP(mw,op_slot);
462 if (*slot) {
463 x = (*slot)(v, w, z);
464 if (x != Py_NotImplemented)
465 return x;
466 /* Can't do it... fall through */
467 Py_DECREF(x);
468 }
469 if (NEW_STYLE_NUMBER(v) &&
470 (z == Py_None || z->ob_type == v->ob_type)) {
471 goto ternary_error;
472 }
473 }
474 mz = z->ob_type->tp_as_number;
475 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
476 /* try: z.op(v,w,z) */
477 slot = NB_TERNOP(mz, op_slot);
478 if (*slot) {
479 x = (*slot)(v, w, z);
480 if (x != Py_NotImplemented)
481 return x;
482 /* Can't do it... fall through */
483 Py_DECREF(x);
484 }
485 }
486
487 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
488 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
489 /* we have an old style operand, coerce */
490 PyObject *v1, *z1, *w2, *z2;
491 int c;
492
493 c = PyNumber_Coerce(&v, &w);
494 if (c != 0)
495 goto error3;
496
497 /* Special case: if the third argument is None, it is
498 treated as absent argument and not coerced. */
499 if (z == Py_None) {
500 if (v->ob_type->tp_as_number) {
501 slot = NB_TERNOP(v->ob_type->tp_as_number,
502 op_slot);
503 if (*slot)
504 x = (*slot)(v, w, z);
505 else
506 c = -1;
507 }
508 else
509 c = -1;
510 goto error2;
511 }
512 v1 = v;
513 z1 = z;
514 c = PyNumber_Coerce(&v1, &z1);
515 if (c != 0)
516 goto error2;
517 w2 = w;
518 z2 = z1;
519 c = PyNumber_Coerce(&w2, &z2);
520 if (c != 0)
521 goto error1;
522
523 if (v1->ob_type->tp_as_number != NULL) {
524 slot = NB_TERNOP(v1->ob_type->tp_as_number,
525 op_slot);
526 if (*slot)
527 x = (*slot)(v1, w2, z2);
528 else
529 c = -1;
530 }
531 else
532 c = -1;
533
534 Py_DECREF(w2);
535 Py_DECREF(z2);
536 error1:
537 Py_DECREF(v1);
538 Py_DECREF(z1);
539 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000540 Py_DECREF(v);
541 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000542 error3:
543 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000544 return x;
545 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000546
547ternary_error:
548 PyErr_Format(PyExc_TypeError, "unsupported operand type(s) for %s",
549 op_name);
550 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000551}
552
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000553#define BINARY_FUNC(func, op, op_name) \
554 PyObject * \
555 func(PyObject *v, PyObject *w) { \
556 return binary_op(v, w, NB_SLOT(op), op_name); \
557 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000558
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000559BINARY_FUNC(PyNumber_Or, nb_or, "|")
560BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
561BINARY_FUNC(PyNumber_And, nb_and, "&")
562BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
563BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
564BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
565BINARY_FUNC(PyNumber_Multiply, nb_multiply, "*")
566BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
567BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000568
569PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000570PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000571{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000572 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
573 if (result == Py_NotImplemented) {
574 PySequenceMethods *m = v->ob_type->tp_as_sequence;
575 Py_DECREF(Py_NotImplemented);
576 if (m && m->sq_concat) {
577 result = (*m->sq_concat)(v, w);
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000578 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000579 else {
580 PyErr_SetString(PyExc_TypeError,
581 "unsupported operand types for +");
582 result = NULL;
583 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000584 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000585 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000586}
587
588PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000589PyNumber_FloorDivide(PyObject *v, PyObject *w)
590{
591 /* XXX tp_flags test */
592 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
593}
594
595PyObject *
596PyNumber_TrueDivide(PyObject *v, PyObject *w)
597{
598 /* XXX tp_flags test */
599 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
600}
601
602PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000603PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000604{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000605 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000606 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000607#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000608 else if (PyUnicode_Check(v))
609 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000610#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000611 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000612}
613
614PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000615PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000616{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000617 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000618}
619
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000620/* Binary in-place operators */
621
622/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000623 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000624
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000625 - If the left hand object has the appropriate struct members, and
626 they are filled, call the appropriate function and return the
627 result. No coercion is done on the arguments; the left-hand object
628 is the one the operation is performed on, and it's up to the
629 function to deal with the right-hand object.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000630
631 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000632 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000633
634 */
635
636#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
637
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000638static PyObject *
639binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
640 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000641{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000642 PyNumberMethods *mv = v->ob_type->tp_as_number;
643 if (mv != NULL && HASINPLACE(v)) {
644 binaryfunc *slot = NB_BINOP(mv, iop_slot);
645 if (*slot) {
646 PyObject *x = (*slot)(v, w);
647 if (x != Py_NotImplemented) {
648 return x;
649 }
650 Py_DECREF(x);
651 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000652 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000653 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000654}
655
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000656#define INPLACE_BINOP(func, iop, op, op_name) \
657 PyObject * \
658 func(PyObject *v, PyObject *w) { \
659 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000660 }
661
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000662INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
663INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
664INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
665INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
666INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
667INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
668INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000669
670PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000671PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
672{
673 /* XXX tp_flags test */
674 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
675 NB_SLOT(nb_floor_divide), "//=");
676}
677
678PyObject *
679PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
680{
681 /* XXX tp_flags test */
682 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
683 NB_SLOT(nb_true_divide), "/=");
684}
685
686PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000687PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
688{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000689 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000690
Guido van Rossumbb8be932000-09-01 23:27:32 +0000691 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000692 if (HASINPLACE(v))
693 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
694 if (f == NULL)
695 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000696 if (f != NULL)
697 return (*f)(v, w);
698 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000699 return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000700}
701
702PyObject *
703PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
704{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000705 PyObject * (*g)(PyObject *, int) = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000706 if (HASINPLACE(v) && v->ob_type->tp_as_sequence &&
707 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) {
708 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000709 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000710 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000711 }
712 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000713 n = PyLong_AsLong(w);
714 if (n == -1 && PyErr_Occurred())
715 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000716 }
717 else {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000718 return type_error("can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000719 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000720 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000721 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000722 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
723 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000724}
725
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000726
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000727
728PyObject *
729PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
730{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000731 if (PyString_Check(v))
732 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000733#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000734 else if (PyUnicode_Check(v))
735 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000736#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000737 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000738 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
739 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000740}
741
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000742
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000743PyObject *
744PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
745{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000746 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
747 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
748 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000749 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000750 else {
751 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
752 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000753}
754
755
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000756/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000757
758PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000759PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000760{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000761 PyNumberMethods *m;
762
763 if (o == NULL)
764 return null_error();
765 m = o->ob_type->tp_as_number;
766 if (m && m->nb_negative)
767 return (*m->nb_negative)(o);
768
769 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000770}
771
772PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000773PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000774{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000775 PyNumberMethods *m;
776
777 if (o == NULL)
778 return null_error();
779 m = o->ob_type->tp_as_number;
780 if (m && m->nb_positive)
781 return (*m->nb_positive)(o);
782
783 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000784}
785
786PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000787PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000788{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000789 PyNumberMethods *m;
790
791 if (o == NULL)
792 return null_error();
793 m = o->ob_type->tp_as_number;
794 if (m && m->nb_invert)
795 return (*m->nb_invert)(o);
796
797 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000798}
799
800PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000801PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000802{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000803 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000804
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000805 if (o == NULL)
806 return null_error();
807 m = o->ob_type->tp_as_number;
808 if (m && m->nb_absolute)
809 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000810
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000811 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000812}
813
Guido van Rossum9e896b32000-04-05 20:11:21 +0000814/* Add a check for embedded NULL-bytes in the argument. */
815static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000816int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000817{
818 char *end;
819 PyObject *x;
820
821 x = PyInt_FromString((char*)s, &end, 10);
822 if (x == NULL)
823 return NULL;
824 if (end != s + len) {
825 PyErr_SetString(PyExc_ValueError,
826 "null byte in argument for int()");
827 Py_DECREF(x);
828 return NULL;
829 }
830 return x;
831}
832
Guido van Rossume15dee51995-07-18 14:12:02 +0000833PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000834PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000835{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000836 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000837 const char *buffer;
838 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000839
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000840 if (o == NULL)
841 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000842 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000843 Py_INCREF(o);
844 return o;
845 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000846 if (PyInt_Check(o)) {
847 PyIntObject *io = (PyIntObject*)o;
848 return PyInt_FromLong(io->ob_ival);
849 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000850 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000851 return int_from_string(PyString_AS_STRING(o),
852 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000853#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000854 if (PyUnicode_Check(o))
855 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
856 PyUnicode_GET_SIZE(o),
857 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000858#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000859 m = o->ob_type->tp_as_number;
860 if (m && m->nb_int)
861 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000862 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000863 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000864
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000865 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000866}
867
Guido van Rossum9e896b32000-04-05 20:11:21 +0000868/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000869static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000870long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000871{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000872 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000873 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000874
Guido van Rossum4c08d552000-03-10 22:55:18 +0000875 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000876 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000877 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000878 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000879 PyErr_SetString(PyExc_ValueError,
880 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000881 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000882 return NULL;
883 }
884 return x;
885}
886
Guido van Rossume15dee51995-07-18 14:12:02 +0000887PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000888PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000889{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000890 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000891 const char *buffer;
892 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000893
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000894 if (o == NULL)
895 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000896 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000897 Py_INCREF(o);
898 return o;
899 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000900 if (PyLong_Check(o))
901 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000902 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000903 /* need to do extra error checking that PyLong_FromString()
904 * doesn't do. In particular long('9.5') must raise an
905 * exception, not truncate the float.
906 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000907 return long_from_string(PyString_AS_STRING(o),
908 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000909#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000910 if (PyUnicode_Check(o))
911 /* The above check is done in PyLong_FromUnicode(). */
912 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
913 PyUnicode_GET_SIZE(o),
914 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000915#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000916 m = o->ob_type->tp_as_number;
917 if (m && m->nb_long)
918 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000919 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
920 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000921
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000922 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000923}
924
925PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000926PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000927{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000929
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000930 if (o == NULL)
931 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000932 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000933 Py_INCREF(o);
934 return o;
935 }
Tim Peters7a50f252001-09-10 21:28:20 +0000936 if (PyFloat_Check(o)) {
937 PyFloatObject *po = (PyFloatObject *)o;
938 return PyFloat_FromDouble(po->ob_fval);
939 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000940 if (!PyString_Check(o)) {
941 m = o->ob_type->tp_as_number;
942 if (m && m->nb_float)
943 return m->nb_float(o);
944 }
945 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000946}
947
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000948/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000949
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000950int
Fred Drake79912472000-07-09 04:06:11 +0000951PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000952{
Guido van Rossum8700b422001-09-07 20:20:11 +0000953 return s != NULL && s->ob_type->tp_as_sequence &&
954 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000955}
956
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000957int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000958PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000959{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000960 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000961
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000962 if (s == NULL) {
963 null_error();
964 return -1;
965 }
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_length)
969 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000970
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000971 type_error("len() of unsized object");
972 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000973}
974
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000975#undef PySequence_Length
976int
977PySequence_Length(PyObject *s)
978{
979 return PySequence_Size(s);
980}
981#define PySequence_Length PySequence_Size
982
Guido van Rossume15dee51995-07-18 14:12:02 +0000983PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000984PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000985{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000987
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000988 if (s == NULL || o == NULL)
989 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000990
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000991 m = s->ob_type->tp_as_sequence;
992 if (m && m->sq_concat)
993 return m->sq_concat(s, o);
994
995 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000996}
997
998PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000999PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001000{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001002
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003 if (o == NULL)
1004 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001005
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001006 m = o->ob_type->tp_as_sequence;
1007 if (m && m->sq_repeat)
1008 return m->sq_repeat(o, count);
1009
1010 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001011}
1012
1013PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001014PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1015{
1016 PySequenceMethods *m;
1017
1018 if (s == NULL || o == NULL)
1019 return null_error();
1020
1021 m = s->ob_type->tp_as_sequence;
1022 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1023 return m->sq_inplace_concat(s, o);
1024 if (m && m->sq_concat)
1025 return m->sq_concat(s, o);
1026
1027 return type_error("object can't be concatenated");
1028}
1029
1030PyObject *
1031PySequence_InPlaceRepeat(PyObject *o, int count)
1032{
1033 PySequenceMethods *m;
1034
1035 if (o == NULL)
1036 return null_error();
1037
1038 m = o->ob_type->tp_as_sequence;
1039 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1040 return m->sq_inplace_repeat(o, count);
1041 if (m && m->sq_repeat)
1042 return m->sq_repeat(o, count);
1043
1044 return type_error("object can't be repeated");
1045}
1046
1047PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001048PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001049{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001050 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001051
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001052 if (s == NULL)
1053 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001054
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001055 m = s->ob_type->tp_as_sequence;
1056 if (m && m->sq_item) {
1057 if (i < 0) {
1058 if (m->sq_length) {
1059 int l = (*m->sq_length)(s);
1060 if (l < 0)
1061 return NULL;
1062 i += l;
1063 }
1064 }
1065 return m->sq_item(s, i);
1066 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001067
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001068 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001069}
1070
Thomas Wouters1d75a792000-08-17 22:37:32 +00001071static PyObject *
1072sliceobj_from_intint(int i, int j)
1073{
1074 PyObject *start, *end, *slice;
1075 start = PyInt_FromLong((long)i);
1076 if (!start)
1077 return NULL;
1078 end = PyInt_FromLong((long)j);
1079 if (!end) {
1080 Py_DECREF(start);
1081 return NULL;
1082 }
1083 slice = PySlice_New(start, end, NULL);
1084 Py_DECREF(start);
1085 Py_DECREF(end);
1086 return slice;
1087}
1088
Guido van Rossume15dee51995-07-18 14:12:02 +00001089PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001090PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001091{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001092 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001093 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001094
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001095 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097 m = s->ob_type->tp_as_sequence;
1098 if (m && m->sq_slice) {
1099 if (i1 < 0 || i2 < 0) {
1100 if (m->sq_length) {
1101 int l = (*m->sq_length)(s);
1102 if (l < 0)
1103 return NULL;
1104 if (i1 < 0)
1105 i1 += l;
1106 if (i2 < 0)
1107 i2 += l;
1108 }
1109 }
1110 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001111 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1112 PyObject *res;
1113 PyObject *slice = sliceobj_from_intint(i1, i2);
1114 if (!slice)
1115 return NULL;
1116 res = mp->mp_subscript(s, slice);
1117 Py_DECREF(slice);
1118 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001119 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001120
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001121 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001122}
1123
1124int
Fred Drake79912472000-07-09 04:06:11 +00001125PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001126{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001127 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001128
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001129 if (s == NULL) {
1130 null_error();
1131 return -1;
1132 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001134 m = s->ob_type->tp_as_sequence;
1135 if (m && m->sq_ass_item) {
1136 if (i < 0) {
1137 if (m->sq_length) {
1138 int l = (*m->sq_length)(s);
1139 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001140 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001141 i += l;
1142 }
1143 }
1144 return m->sq_ass_item(s, i, o);
1145 }
1146
1147 type_error("object doesn't support item assignment");
1148 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001149}
1150
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001151int
Fred Drake79912472000-07-09 04:06:11 +00001152PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001153{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001155
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156 if (s == NULL) {
1157 null_error();
1158 return -1;
1159 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001161 m = s->ob_type->tp_as_sequence;
1162 if (m && m->sq_ass_item) {
1163 if (i < 0) {
1164 if (m->sq_length) {
1165 int l = (*m->sq_length)(s);
1166 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001167 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001168 i += l;
1169 }
1170 }
1171 return m->sq_ass_item(s, i, (PyObject *)NULL);
1172 }
1173
1174 type_error("object doesn't support item deletion");
1175 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001176}
1177
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178int
Fred Drake79912472000-07-09 04:06:11 +00001179PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001180{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001181 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001182 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001183
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001184 if (s == NULL) {
1185 null_error();
1186 return -1;
1187 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001188
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 m = s->ob_type->tp_as_sequence;
1190 if (m && m->sq_ass_slice) {
1191 if (i1 < 0 || i2 < 0) {
1192 if (m->sq_length) {
1193 int l = (*m->sq_length)(s);
1194 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001195 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001196 if (i1 < 0)
1197 i1 += l;
1198 if (i2 < 0)
1199 i2 += l;
1200 }
1201 }
1202 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001203 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1204 int res;
1205 PyObject *slice = sliceobj_from_intint(i1, i2);
1206 if (!slice)
1207 return -1;
1208 res = mp->mp_ass_subscript(s, slice, o);
1209 Py_DECREF(slice);
1210 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001211 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001212
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001213 type_error("object doesn't support slice assignment");
1214 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001215}
1216
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217int
Fred Drake79912472000-07-09 04:06:11 +00001218PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001219{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001220 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001221
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222 if (s == NULL) {
1223 null_error();
1224 return -1;
1225 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001226
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 m = s->ob_type->tp_as_sequence;
1228 if (m && m->sq_ass_slice) {
1229 if (i1 < 0 || i2 < 0) {
1230 if (m->sq_length) {
1231 int l = (*m->sq_length)(s);
1232 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001233 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001234 if (i1 < 0)
1235 i1 += l;
1236 if (i2 < 0)
1237 i2 += l;
1238 }
1239 }
1240 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1241 }
1242 type_error("object doesn't support slice deletion");
1243 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001244}
1245
Guido van Rossume15dee51995-07-18 14:12:02 +00001246PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001247PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001248{
Tim Peters6912d4d2001-05-05 03:56:37 +00001249 PyObject *it; /* iter(v) */
1250 int n; /* guess for result tuple size */
1251 PyObject *result;
1252 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001253
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254 if (v == NULL)
1255 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001256
Tim Peters6912d4d2001-05-05 03:56:37 +00001257 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001258 if (PyTuple_CheckExact(v)) {
1259 /* Note that we can't know whether it's safe to return
1260 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001261 to exact tuples here. In contrast, lists always make
1262 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263 Py_INCREF(v);
1264 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001265 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001266 if (PyList_Check(v))
1267 return PyList_AsTuple(v);
1268
Tim Peters6912d4d2001-05-05 03:56:37 +00001269 /* Get iterator. */
1270 it = PyObject_GetIter(v);
1271 if (it == NULL)
1272 return type_error("tuple() argument must support iteration");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001273
Tim Peters6912d4d2001-05-05 03:56:37 +00001274 /* Guess result size and allocate space. */
1275 n = PySequence_Size(v);
1276 if (n < 0) {
1277 PyErr_Clear();
1278 n = 10; /* arbitrary */
1279 }
1280 result = PyTuple_New(n);
1281 if (result == NULL)
1282 goto Fail;
1283
1284 /* Fill the tuple. */
1285 for (j = 0; ; ++j) {
1286 PyObject *item = PyIter_Next(it);
1287 if (item == NULL) {
1288 if (PyErr_Occurred())
1289 goto Fail;
1290 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001292 if (j >= n) {
1293 if (n < 500)
1294 n += 10;
1295 else
1296 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001297 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001298 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001299 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001300 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001301 }
1302 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 }
1304
Tim Peters6912d4d2001-05-05 03:56:37 +00001305 /* Cut tuple back if guess was too large. */
1306 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001307 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001308 goto Fail;
1309
1310 Py_DECREF(it);
1311 return result;
1312
1313Fail:
1314 Py_XDECREF(result);
1315 Py_DECREF(it);
1316 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001317}
1318
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001319PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001320PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001321{
Tim Petersf553f892001-05-01 20:45:31 +00001322 PyObject *it; /* iter(v) */
1323 PyObject *result; /* result list */
1324 int n; /* guess for result list size */
1325 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001326
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001327 if (v == NULL)
1328 return null_error();
1329
Tim Petersf553f892001-05-01 20:45:31 +00001330 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001331 if (PyList_Check(v))
1332 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1333
Tim Petersf553f892001-05-01 20:45:31 +00001334 /* Get iterator. There may be some low-level efficiency to be gained
1335 * by caching the tp_iternext slot instead of using PyIter_Next()
1336 * later, but premature optimization is the root etc.
1337 */
1338 it = PyObject_GetIter(v);
1339 if (it == NULL)
1340 return NULL;
1341
1342 /* Guess a result list size. */
1343 n = -1; /* unknown */
1344 if (PySequence_Check(v) &&
1345 v->ob_type->tp_as_sequence->sq_length) {
1346 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001347 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001348 PyErr_Clear();
1349 }
1350 if (n < 0)
1351 n = 8; /* arbitrary */
1352 result = PyList_New(n);
1353 if (result == NULL) {
1354 Py_DECREF(it);
1355 return NULL;
1356 }
1357
1358 /* Run iterator to exhaustion. */
1359 for (i = 0; ; i++) {
1360 PyObject *item = PyIter_Next(it);
1361 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001362 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001363 Py_DECREF(result);
1364 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001365 }
Tim Petersf553f892001-05-01 20:45:31 +00001366 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001367 }
Tim Petersf553f892001-05-01 20:45:31 +00001368 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001369 PyList_SET_ITEM(result, i, item); /* steals ref */
1370 else {
1371 int status = PyList_Append(result, item);
1372 Py_DECREF(item); /* append creates a new ref */
1373 if (status < 0) {
1374 Py_DECREF(result);
1375 result = NULL;
1376 break;
1377 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001378 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001379 }
Tim Petersf553f892001-05-01 20:45:31 +00001380
1381 /* Cut back result list if initial guess was too large. */
1382 if (i < n && result != NULL) {
1383 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1384 Py_DECREF(result);
1385 result = NULL;
1386 }
1387 }
1388 Py_DECREF(it);
1389 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001390}
1391
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001392PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001393PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001394{
1395 if (v == NULL)
1396 return null_error();
1397
1398 if (PyList_Check(v) || PyTuple_Check(v)) {
1399 Py_INCREF(v);
1400 return v;
1401 }
1402
1403 v = PySequence_Tuple(v);
1404 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1405 return type_error(m);
1406
1407 return v;
1408}
1409
Tim Peters16a77ad2001-09-08 04:00:12 +00001410/* Iterate over seq. Result depends on the operation:
1411 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1412 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1413 set ValueError and return -1 if none found; also return -1 on error.
1414 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1415*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001416int
Tim Peters16a77ad2001-09-08 04:00:12 +00001417_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001418{
Tim Peters16a77ad2001-09-08 04:00:12 +00001419 int n;
1420 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1421 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001422
Tim Peters16a77ad2001-09-08 04:00:12 +00001423 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 null_error();
1425 return -1;
1426 }
Tim Peters75f8e352001-05-05 11:33:43 +00001427
Tim Peters16a77ad2001-09-08 04:00:12 +00001428 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001429 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001430 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001431 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001432 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001433
Tim Peters16a77ad2001-09-08 04:00:12 +00001434 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001435 for (;;) {
1436 int cmp;
1437 PyObject *item = PyIter_Next(it);
1438 if (item == NULL) {
1439 if (PyErr_Occurred())
1440 goto Fail;
1441 break;
1442 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001443
1444 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001446 if (cmp < 0)
1447 goto Fail;
1448 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001449 switch (operation) {
1450 case PY_ITERSEARCH_COUNT:
1451 ++n;
1452 if (n <= 0) {
1453 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001454 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001455 goto Fail;
1456 }
1457 break;
1458
1459 case PY_ITERSEARCH_INDEX:
1460 if (wrapped) {
1461 PyErr_SetString(PyExc_OverflowError,
1462 "index exceeds C int size");
1463 goto Fail;
1464 }
1465 goto Done;
1466
1467 case PY_ITERSEARCH_CONTAINS:
1468 n = 1;
1469 goto Done;
1470
1471 default:
1472 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001473 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001474 }
1475
1476 if (operation == PY_ITERSEARCH_INDEX) {
1477 ++n;
1478 if (n <= 0)
1479 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001480 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001481 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001482
1483 if (operation != PY_ITERSEARCH_INDEX)
1484 goto Done;
1485
1486 PyErr_SetString(PyExc_ValueError,
1487 "sequence.index(x): x not in sequence");
1488 /* fall into failure code */
1489Fail:
1490 n = -1;
1491 /* fall through */
1492Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001493 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001494 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001495
Guido van Rossume15dee51995-07-18 14:12:02 +00001496}
1497
Tim Peters16a77ad2001-09-08 04:00:12 +00001498/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001499int
Tim Peters16a77ad2001-09-08 04:00:12 +00001500PySequence_Count(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_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001503}
1504
Tim Peterscb8d3682001-05-05 21:05:01 +00001505/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001506 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001507 */
1508int
1509PySequence_Contains(PyObject *seq, PyObject *ob)
1510{
1511 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1512 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1513 if (sqm != NULL && sqm->sq_contains != NULL)
1514 return (*sqm->sq_contains)(seq, ob);
1515 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001516 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001517}
1518
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001519/* Backwards compatibility */
1520#undef PySequence_In
1521int
Fred Drake79912472000-07-09 04:06:11 +00001522PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001523{
1524 return PySequence_Contains(w, v);
1525}
1526
1527int
Fred Drake79912472000-07-09 04:06:11 +00001528PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001529{
Tim Peters16a77ad2001-09-08 04:00:12 +00001530 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001531}
1532
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001533/* Operations on mappings */
1534
1535int
Fred Drake79912472000-07-09 04:06:11 +00001536PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001537{
Guido van Rossum8700b422001-09-07 20:20:11 +00001538 return o && o->ob_type->tp_as_mapping &&
1539 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001540}
1541
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001542int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001543PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001544{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001545 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001546
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001547 if (o == NULL) {
1548 null_error();
1549 return -1;
1550 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001551
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001552 m = o->ob_type->tp_as_mapping;
1553 if (m && m->mp_length)
1554 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001555
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001556 type_error("len() of unsized object");
1557 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001558}
1559
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001560#undef PyMapping_Length
1561int
1562PyMapping_Length(PyObject *o)
1563{
1564 return PyMapping_Size(o);
1565}
1566#define PyMapping_Length PyMapping_Size
1567
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001568PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001569PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001570{
1571 PyObject *okey, *r;
1572
1573 if (key == NULL)
1574 return null_error();
1575
1576 okey = PyString_FromString(key);
1577 if (okey == NULL)
1578 return NULL;
1579 r = PyObject_GetItem(o, okey);
1580 Py_DECREF(okey);
1581 return r;
1582}
1583
1584int
Fred Drake79912472000-07-09 04:06:11 +00001585PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001586{
1587 PyObject *okey;
1588 int r;
1589
1590 if (key == NULL) {
1591 null_error();
1592 return -1;
1593 }
1594
1595 okey = PyString_FromString(key);
1596 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001597 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001598 r = PyObject_SetItem(o, okey, value);
1599 Py_DECREF(okey);
1600 return r;
1601}
1602
1603int
Fred Drake79912472000-07-09 04:06:11 +00001604PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001605{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001606 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001607
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001608 v = PyMapping_GetItemString(o, key);
1609 if (v) {
1610 Py_DECREF(v);
1611 return 1;
1612 }
1613 PyErr_Clear();
1614 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001615}
1616
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001617int
Fred Drake79912472000-07-09 04:06:11 +00001618PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001619{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001620 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001621
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001622 v = PyObject_GetItem(o, key);
1623 if (v) {
1624 Py_DECREF(v);
1625 return 1;
1626 }
1627 PyErr_Clear();
1628 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001629}
1630
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001631/* Operations on callable objects */
1632
1633/* XXX PyCallable_Check() is in object.c */
1634
Guido van Rossume15dee51995-07-18 14:12:02 +00001635PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001636PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001637{
Guido van Rossum5560b742001-09-14 16:47:50 +00001638 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001639}
Guido van Rossume15dee51995-07-18 14:12:02 +00001640
1641PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001642PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1643{
1644 ternaryfunc call;
1645
1646 if ((call = func->ob_type->tp_call) != NULL) {
1647 PyObject *result = (*call)(func, arg, kw);
1648 if (result == NULL && !PyErr_Occurred())
1649 PyErr_SetString(
1650 PyExc_SystemError,
1651 "NULL result without error in PyObject_Call");
1652 return result;
1653 }
1654 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
1655 PyString_AS_STRING(PyObject_Repr(func)));
1656 return NULL;
1657}
1658
1659PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001660PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001661{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001662 va_list va;
1663 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001664 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001665
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001666 if (callable == NULL) {
1667 va_end(va);
1668 return null_error();
1669 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001670
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001671 if (format)
1672 args = Py_VaBuildValue(format, va);
1673 else
1674 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001675
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001676 va_end(va);
1677
1678 if (args == NULL)
1679 return NULL;
1680
1681 if (!PyTuple_Check(args)) {
1682 PyObject *a;
1683
1684 a = PyTuple_New(1);
1685 if (a == NULL)
1686 return NULL;
1687 if (PyTuple_SetItem(a, 0, args) < 0)
1688 return NULL;
1689 args = a;
1690 }
1691 retval = PyObject_CallObject(callable, args);
1692
1693 Py_DECREF(args);
1694
1695 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001696}
1697
1698PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001699PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001700{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001701 va_list va;
1702 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001703 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001704
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001705 if (o == NULL || name == NULL) {
1706 va_end(va);
1707 return null_error();
1708 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001709
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001710 func = PyObject_GetAttrString(o, name);
1711 if (func == NULL) {
1712 va_end(va);
1713 PyErr_SetString(PyExc_AttributeError, name);
1714 return 0;
1715 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001716
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001717 if (!PyCallable_Check(func)) {
1718 va_end(va);
1719 return type_error("call of non-callable attribute");
1720 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001721
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001722 if (format && *format)
1723 args = Py_VaBuildValue(format, va);
1724 else
1725 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001726
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001727 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001728
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001729 if (!args)
1730 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001731
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001732 if (!PyTuple_Check(args)) {
1733 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001734
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001735 a = PyTuple_New(1);
1736 if (a == NULL)
1737 return NULL;
1738 if (PyTuple_SetItem(a, 0, args) < 0)
1739 return NULL;
1740 args = a;
1741 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001742
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001743 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001744
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001745 Py_DECREF(args);
1746 Py_DECREF(func);
1747
1748 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001749}
Guido van Rossum823649d2001-03-21 18:40:58 +00001750
1751
1752/* isinstance(), issubclass() */
1753
1754static int
1755abstract_issubclass(PyObject *derived, PyObject *cls, int first)
1756{
1757 static PyObject *__bases__ = NULL;
1758 PyObject *bases;
1759 int i, n;
1760 int r = 0;
1761
1762 if (__bases__ == NULL) {
1763 __bases__ = PyString_FromString("__bases__");
1764 if (__bases__ == NULL)
1765 return -1;
1766 }
1767
1768 if (first) {
1769 bases = PyObject_GetAttr(cls, __bases__);
1770 if (bases == NULL || !PyTuple_Check(bases)) {
1771 Py_XDECREF(bases);
1772 PyErr_SetString(PyExc_TypeError,
1773 "issubclass() arg 2 must be a class");
1774 return -1;
1775 }
1776 Py_DECREF(bases);
1777 }
1778
1779 if (derived == cls)
1780 return 1;
1781
1782 bases = PyObject_GetAttr(derived, __bases__);
1783 if (bases == NULL || !PyTuple_Check(bases)) {
1784 Py_XDECREF(bases);
1785 PyErr_SetString(PyExc_TypeError,
1786 "issubclass() arg 1 must be a class");
1787 return -1;
1788 }
1789
1790 n = PyTuple_GET_SIZE(bases);
1791 for (i = 0; i < n; i++) {
1792 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls, 0);
1793 if (r != 0)
1794 break;
1795 }
1796
1797 Py_DECREF(bases);
1798
1799 return r;
1800}
1801
1802int
1803PyObject_IsInstance(PyObject *inst, PyObject *cls)
1804{
1805 PyObject *icls;
1806 static PyObject *__class__ = NULL;
1807 int retval = 0;
1808
1809 if (PyClass_Check(cls)) {
1810 if (PyInstance_Check(inst)) {
1811 PyObject *inclass =
1812 (PyObject*)((PyInstanceObject*)inst)->in_class;
1813 retval = PyClass_IsSubclass(inclass, cls);
1814 }
1815 }
1816 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001817 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001818 }
1819 else if (!PyInstance_Check(inst)) {
1820 if (__class__ == NULL) {
1821 __class__ = PyString_FromString("__class__");
1822 if (__class__ == NULL)
1823 return -1;
1824 }
1825 icls = PyObject_GetAttr(inst, __class__);
1826 if (icls != NULL) {
1827 retval = abstract_issubclass(icls, cls, 1);
1828 Py_DECREF(icls);
1829 if (retval < 0 &&
1830 !PyErr_ExceptionMatches(PyExc_TypeError))
1831 return -1;
1832 }
1833 else
1834 retval = -1;
1835 }
1836 else
1837 retval = -1;
1838
1839 if (retval < 0) {
1840 PyErr_SetString(PyExc_TypeError,
1841 "isinstance() arg 2 must be a class or type");
1842 }
1843 return retval;
1844}
1845
1846int
1847PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1848{
1849 int retval;
1850
1851 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
1852 retval = abstract_issubclass(derived, cls, 1);
1853 }
1854 else {
1855 /* shortcut */
1856 if (!(retval = (derived == cls)))
1857 retval = PyClass_IsSubclass(derived, cls);
1858 }
1859
1860 return retval;
1861}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001862
1863PyObject *
1864PyObject_GetIter(PyObject *o)
1865{
1866 PyTypeObject *t = o->ob_type;
1867 getiterfunc f = NULL;
1868 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
1869 f = t->tp_iter;
1870 if (f == NULL) {
1871 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00001872 return PySeqIter_New(o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001873 PyErr_SetString(PyExc_TypeError, "iter() of non-sequence");
1874 return NULL;
1875 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00001876 else {
1877 PyObject *res = (*f)(o);
1878 if (res != NULL && !PyIter_Check(res)) {
1879 PyErr_Format(PyExc_TypeError,
1880 "iter() returned non-iterator "
1881 "of type '%.100s'",
1882 res->ob_type->tp_name);
1883 Py_DECREF(res);
1884 res = NULL;
1885 }
1886 return res;
1887 }
1888}
1889
Tim Petersf4848da2001-05-05 00:14:56 +00001890/* Return next item.
1891 * If an error occurs, return NULL. PyErr_Occurred() will be true.
1892 * If the iteration terminates normally, return NULL and clear the
1893 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
1894 * will be false.
1895 * Else return the next object. PyErr_Occurred() will be false.
1896 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00001897PyObject *
1898PyIter_Next(PyObject *iter)
1899{
Tim Petersf4848da2001-05-05 00:14:56 +00001900 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00001901 if (!PyIter_Check(iter)) {
1902 PyErr_Format(PyExc_TypeError,
1903 "'%.100s' object is not an iterator",
1904 iter->ob_type->tp_name);
1905 return NULL;
1906 }
Tim Petersf4848da2001-05-05 00:14:56 +00001907 result = (*iter->ob_type->tp_iternext)(iter);
1908 if (result == NULL &&
1909 PyErr_Occurred() &&
1910 PyErr_ExceptionMatches(PyExc_StopIteration))
1911 PyErr_Clear();
1912 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001913}