blob: 9f4a13f68d461e71a71770b48db62653d7314181 [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 (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000336 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
337 x = slotw(v, w);
338 if (x != Py_NotImplemented)
339 return x;
340 Py_DECREF(x); /* can't do it */
341 slotw = NULL;
342 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000343 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);
Guido van Rossum5c66a262001-10-22 04:12:44 +0000386 PyErr_Format(
387 PyExc_TypeError,
388 "unsupported operand type(s) for %s: '%s' and '%s'",
389 op_name,
390 v->ob_type->tp_name,
391 w->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000392 return NULL;
393 }
394 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000395}
396
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000397
398/*
399 Calling scheme used for ternary operations:
400
Guido van Rossum84675ac2001-09-29 01:05:03 +0000401 *** In some cases, w.op is called before v.op; see binary_op1. ***
402
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000403 v w z Action
404 -------------------------------------------------------------------
405 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
406 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
407 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
408 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
409 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
410 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
411 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
412 old old old coerce(v,w,z), v.op(v,w,z)
413
414 Legend:
415 -------
416 * new == new style number
417 * old == old style number
418 * Action indicates the order in which operations are tried until either
419 a valid result is produced or an error occurs.
420 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
421 only if z != Py_None; if z == Py_None, then it is treated as absent
422 variable and only coerce(v,w) is tried.
423
424 */
425
426static PyObject *
427ternary_op(PyObject *v,
428 PyObject *w,
429 PyObject *z,
430 const int op_slot,
431 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000432{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000433 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000434 PyObject *x = NULL;
435 ternaryfunc slotv = NULL;
436 ternaryfunc slotw = NULL;
437 ternaryfunc slotz = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000438
439 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000440 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000441 if (mv != NULL && NEW_STYLE_NUMBER(v))
442 slotv = *NB_TERNOP(mv, op_slot);
443 if (w->ob_type != v->ob_type &&
444 mv != NULL && NEW_STYLE_NUMBER(w)) {
445 slotw = *NB_TERNOP(mw, op_slot);
446 if (slotw == slotv)
447 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000448 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000449 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000450 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
451 x = slotw(v, w, z);
452 if (x != Py_NotImplemented)
453 return x;
454 Py_DECREF(x); /* can't do it */
455 slotw = NULL;
456 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000457 x = slotv(v, w, z);
458 if (x != Py_NotImplemented)
459 return x;
460 Py_DECREF(x); /* can't do it */
461 }
462 if (slotw) {
463 x = slotw(v, w, z);
464 if (x != Py_NotImplemented)
465 return x;
466 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000467 }
468 mz = z->ob_type->tp_as_number;
469 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000470 slotz = *NB_TERNOP(mz, op_slot);
471 if (slotz == slotv || slotz == slotw)
472 slotz = NULL;
473 if (slotz) {
474 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000475 if (x != Py_NotImplemented)
476 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000477 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000478 }
479 }
480
481 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
482 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
483 /* we have an old style operand, coerce */
484 PyObject *v1, *z1, *w2, *z2;
485 int c;
486
487 c = PyNumber_Coerce(&v, &w);
488 if (c != 0)
489 goto error3;
490
491 /* Special case: if the third argument is None, it is
492 treated as absent argument and not coerced. */
493 if (z == Py_None) {
494 if (v->ob_type->tp_as_number) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000495 slotz = *NB_TERNOP(v->ob_type->tp_as_number,
496 op_slot);
497 if (slotz)
498 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000499 else
500 c = -1;
501 }
502 else
503 c = -1;
504 goto error2;
505 }
506 v1 = v;
507 z1 = z;
508 c = PyNumber_Coerce(&v1, &z1);
509 if (c != 0)
510 goto error2;
511 w2 = w;
512 z2 = z1;
513 c = PyNumber_Coerce(&w2, &z2);
514 if (c != 0)
515 goto error1;
516
517 if (v1->ob_type->tp_as_number != NULL) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000518 slotv = *NB_TERNOP(v1->ob_type->tp_as_number,
519 op_slot);
520 if (slotv)
521 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000522 else
523 c = -1;
524 }
525 else
526 c = -1;
527
528 Py_DECREF(w2);
529 Py_DECREF(z2);
530 error1:
531 Py_DECREF(v1);
532 Py_DECREF(z1);
533 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000534 Py_DECREF(v);
535 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000536 error3:
537 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000538 return x;
539 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000540
541 if (z == Py_None)
542 PyErr_Format(
543 PyExc_TypeError,
544 "unsupported operand type(s) for ** or pow(): "
545 "'%s' and '%s'",
546 v->ob_type->tp_name,
547 w->ob_type->tp_name);
548 else
549 PyErr_Format(
550 PyExc_TypeError,
551 "unsupported operand type(s) for pow(): "
552 "'%s', '%s', '%s'",
553 v->ob_type->tp_name,
554 w->ob_type->tp_name,
555 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000556 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000557}
558
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000559#define BINARY_FUNC(func, op, op_name) \
560 PyObject * \
561 func(PyObject *v, PyObject *w) { \
562 return binary_op(v, w, NB_SLOT(op), op_name); \
563 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000564
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000565BINARY_FUNC(PyNumber_Or, nb_or, "|")
566BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
567BINARY_FUNC(PyNumber_And, nb_and, "&")
568BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
569BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
570BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
571BINARY_FUNC(PyNumber_Multiply, nb_multiply, "*")
572BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
573BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000574
575PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000576PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000577{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000578 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
579 if (result == Py_NotImplemented) {
580 PySequenceMethods *m = v->ob_type->tp_as_sequence;
581 Py_DECREF(Py_NotImplemented);
582 if (m && m->sq_concat) {
583 result = (*m->sq_concat)(v, w);
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000584 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000585 else {
Guido van Rossum5c66a262001-10-22 04:12:44 +0000586 PyErr_Format(
587 PyExc_TypeError,
588 "unsupported operand types for +: '%s' and '%s'",
589 v->ob_type->tp_name,
590 w->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000591 result = NULL;
592 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000593 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000594 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000595}
596
597PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000598PyNumber_FloorDivide(PyObject *v, PyObject *w)
599{
600 /* XXX tp_flags test */
601 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
602}
603
604PyObject *
605PyNumber_TrueDivide(PyObject *v, PyObject *w)
606{
607 /* XXX tp_flags test */
608 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
609}
610
611PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000612PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000613{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000614 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000615 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000616#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000617 else if (PyUnicode_Check(v))
618 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000619#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000620 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000621}
622
623PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000624PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000625{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000626 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000627}
628
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000629/* Binary in-place operators */
630
631/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000632 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000633
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000634 - If the left hand object has the appropriate struct members, and
635 they are filled, call the appropriate function and return the
636 result. No coercion is done on the arguments; the left-hand object
637 is the one the operation is performed on, and it's up to the
638 function to deal with the right-hand object.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000639
640 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000641 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000642
643 */
644
645#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
646
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000647static PyObject *
648binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
649 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000650{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000651 PyNumberMethods *mv = v->ob_type->tp_as_number;
652 if (mv != NULL && HASINPLACE(v)) {
653 binaryfunc *slot = NB_BINOP(mv, iop_slot);
654 if (*slot) {
655 PyObject *x = (*slot)(v, w);
656 if (x != Py_NotImplemented) {
657 return x;
658 }
659 Py_DECREF(x);
660 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000661 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000662 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000663}
664
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000665#define INPLACE_BINOP(func, iop, op, op_name) \
666 PyObject * \
667 func(PyObject *v, PyObject *w) { \
668 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000669 }
670
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000671INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
672INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
673INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
674INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
675INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
676INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
677INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000678
679PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000680PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
681{
682 /* XXX tp_flags test */
683 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
684 NB_SLOT(nb_floor_divide), "//=");
685}
686
687PyObject *
688PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
689{
690 /* XXX tp_flags test */
691 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
692 NB_SLOT(nb_true_divide), "/=");
693}
694
695PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000696PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
697{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000698 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000699
Guido van Rossumbb8be932000-09-01 23:27:32 +0000700 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000701 if (HASINPLACE(v))
702 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
703 if (f == NULL)
704 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000705 if (f != NULL)
706 return (*f)(v, w);
707 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000708 return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000709}
710
711PyObject *
712PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
713{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000714 PyObject * (*g)(PyObject *, int) = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000715 if (HASINPLACE(v) && v->ob_type->tp_as_sequence &&
716 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) {
717 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000718 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000719 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000720 }
721 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000722 n = PyLong_AsLong(w);
723 if (n == -1 && PyErr_Occurred())
724 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000725 }
726 else {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000727 return type_error("can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000728 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000729 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000730 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000731 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
732 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000733}
734
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000735
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000736
737PyObject *
738PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
739{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000740 if (PyString_Check(v))
741 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000742#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000743 else if (PyUnicode_Check(v))
744 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000745#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000746 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000747 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
748 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000749}
750
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000751
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000752PyObject *
753PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
754{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000755 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
756 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
757 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000758 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000759 else {
760 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
761 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000762}
763
764
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000765/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000766
767PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000768PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000769{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000770 PyNumberMethods *m;
771
772 if (o == NULL)
773 return null_error();
774 m = o->ob_type->tp_as_number;
775 if (m && m->nb_negative)
776 return (*m->nb_negative)(o);
777
778 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000779}
780
781PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000782PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000783{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000784 PyNumberMethods *m;
785
786 if (o == NULL)
787 return null_error();
788 m = o->ob_type->tp_as_number;
789 if (m && m->nb_positive)
790 return (*m->nb_positive)(o);
791
792 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000793}
794
795PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000796PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000797{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000798 PyNumberMethods *m;
799
800 if (o == NULL)
801 return null_error();
802 m = o->ob_type->tp_as_number;
803 if (m && m->nb_invert)
804 return (*m->nb_invert)(o);
805
806 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000807}
808
809PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000810PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000811{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000812 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000813
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000814 if (o == NULL)
815 return null_error();
816 m = o->ob_type->tp_as_number;
817 if (m && m->nb_absolute)
818 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000819
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000820 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000821}
822
Guido van Rossum9e896b32000-04-05 20:11:21 +0000823/* Add a check for embedded NULL-bytes in the argument. */
824static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000825int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000826{
827 char *end;
828 PyObject *x;
829
830 x = PyInt_FromString((char*)s, &end, 10);
831 if (x == NULL)
832 return NULL;
833 if (end != s + len) {
834 PyErr_SetString(PyExc_ValueError,
835 "null byte in argument for int()");
836 Py_DECREF(x);
837 return NULL;
838 }
839 return x;
840}
841
Guido van Rossume15dee51995-07-18 14:12:02 +0000842PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000843PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000844{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000845 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000846 const char *buffer;
847 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000848
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000849 if (o == NULL)
850 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000851 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000852 Py_INCREF(o);
853 return o;
854 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000855 if (PyInt_Check(o)) {
856 PyIntObject *io = (PyIntObject*)o;
857 return PyInt_FromLong(io->ob_ival);
858 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000859 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000860 return int_from_string(PyString_AS_STRING(o),
861 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000862#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000863 if (PyUnicode_Check(o))
864 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
865 PyUnicode_GET_SIZE(o),
866 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000867#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000868 m = o->ob_type->tp_as_number;
869 if (m && m->nb_int)
870 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000871 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000872 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000873
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000874 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000875}
876
Guido van Rossum9e896b32000-04-05 20:11:21 +0000877/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000878static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000879long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000880{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000881 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000882 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000883
Guido van Rossum4c08d552000-03-10 22:55:18 +0000884 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000885 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000886 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000887 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000888 PyErr_SetString(PyExc_ValueError,
889 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000890 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000891 return NULL;
892 }
893 return x;
894}
895
Guido van Rossume15dee51995-07-18 14:12:02 +0000896PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000897PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000898{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000899 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000900 const char *buffer;
901 int buffer_len;
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();
Tim Peters64b5ce32001-09-10 20:52:51 +0000905 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000906 Py_INCREF(o);
907 return o;
908 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000909 if (PyLong_Check(o))
910 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000912 /* need to do extra error checking that PyLong_FromString()
913 * doesn't do. In particular long('9.5') must raise an
914 * exception, not truncate the float.
915 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000916 return long_from_string(PyString_AS_STRING(o),
917 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000918#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000919 if (PyUnicode_Check(o))
920 /* The above check is done in PyLong_FromUnicode(). */
921 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
922 PyUnicode_GET_SIZE(o),
923 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000924#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000925 m = o->ob_type->tp_as_number;
926 if (m && m->nb_long)
927 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000928 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
929 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000930
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000931 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000932}
933
934PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000935PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000936{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000937 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000938
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000939 if (o == NULL)
940 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000941 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000942 Py_INCREF(o);
943 return o;
944 }
Tim Peters7a50f252001-09-10 21:28:20 +0000945 if (PyFloat_Check(o)) {
946 PyFloatObject *po = (PyFloatObject *)o;
947 return PyFloat_FromDouble(po->ob_fval);
948 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000949 if (!PyString_Check(o)) {
950 m = o->ob_type->tp_as_number;
951 if (m && m->nb_float)
952 return m->nb_float(o);
953 }
954 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000955}
956
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000957/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000958
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000959int
Fred Drake79912472000-07-09 04:06:11 +0000960PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000961{
Guido van Rossum8700b422001-09-07 20:20:11 +0000962 return s != NULL && s->ob_type->tp_as_sequence &&
963 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000964}
965
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000966int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000967PySequence_Size(PyObject *s)
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 (s == NULL) {
972 null_error();
973 return -1;
974 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000975
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000976 m = s->ob_type->tp_as_sequence;
977 if (m && m->sq_length)
978 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000979
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000980 type_error("len() of unsized object");
981 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000982}
983
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000984#undef PySequence_Length
985int
986PySequence_Length(PyObject *s)
987{
988 return PySequence_Size(s);
989}
990#define PySequence_Length PySequence_Size
991
Guido van Rossume15dee51995-07-18 14:12:02 +0000992PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000993PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000994{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000995 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000996
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000997 if (s == NULL || o == NULL)
998 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000999
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001000 m = s->ob_type->tp_as_sequence;
1001 if (m && m->sq_concat)
1002 return m->sq_concat(s, o);
1003
1004 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001005}
1006
1007PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001008PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001009{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001010 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001012 if (o == NULL)
1013 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001014
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001015 m = o->ob_type->tp_as_sequence;
1016 if (m && m->sq_repeat)
1017 return m->sq_repeat(o, count);
1018
1019 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001020}
1021
1022PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001023PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1024{
1025 PySequenceMethods *m;
1026
1027 if (s == NULL || o == NULL)
1028 return null_error();
1029
1030 m = s->ob_type->tp_as_sequence;
1031 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1032 return m->sq_inplace_concat(s, o);
1033 if (m && m->sq_concat)
1034 return m->sq_concat(s, o);
1035
1036 return type_error("object can't be concatenated");
1037}
1038
1039PyObject *
1040PySequence_InPlaceRepeat(PyObject *o, int count)
1041{
1042 PySequenceMethods *m;
1043
1044 if (o == NULL)
1045 return null_error();
1046
1047 m = o->ob_type->tp_as_sequence;
1048 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1049 return m->sq_inplace_repeat(o, count);
1050 if (m && m->sq_repeat)
1051 return m->sq_repeat(o, count);
1052
1053 return type_error("object can't be repeated");
1054}
1055
1056PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001057PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001058{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001059 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001060
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001061 if (s == NULL)
1062 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064 m = s->ob_type->tp_as_sequence;
1065 if (m && m->sq_item) {
1066 if (i < 0) {
1067 if (m->sq_length) {
1068 int l = (*m->sq_length)(s);
1069 if (l < 0)
1070 return NULL;
1071 i += l;
1072 }
1073 }
1074 return m->sq_item(s, i);
1075 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001076
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001077 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001078}
1079
Thomas Wouters1d75a792000-08-17 22:37:32 +00001080static PyObject *
1081sliceobj_from_intint(int i, int j)
1082{
1083 PyObject *start, *end, *slice;
1084 start = PyInt_FromLong((long)i);
1085 if (!start)
1086 return NULL;
1087 end = PyInt_FromLong((long)j);
1088 if (!end) {
1089 Py_DECREF(start);
1090 return NULL;
1091 }
1092 slice = PySlice_New(start, end, NULL);
1093 Py_DECREF(start);
1094 Py_DECREF(end);
1095 return slice;
1096}
1097
Guido van Rossume15dee51995-07-18 14:12:02 +00001098PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001099PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001100{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001101 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001102 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001103
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001105
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 m = s->ob_type->tp_as_sequence;
1107 if (m && m->sq_slice) {
1108 if (i1 < 0 || i2 < 0) {
1109 if (m->sq_length) {
1110 int l = (*m->sq_length)(s);
1111 if (l < 0)
1112 return NULL;
1113 if (i1 < 0)
1114 i1 += l;
1115 if (i2 < 0)
1116 i2 += l;
1117 }
1118 }
1119 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001120 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1121 PyObject *res;
1122 PyObject *slice = sliceobj_from_intint(i1, i2);
1123 if (!slice)
1124 return NULL;
1125 res = mp->mp_subscript(s, slice);
1126 Py_DECREF(slice);
1127 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001128 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001129
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001131}
1132
1133int
Fred Drake79912472000-07-09 04:06:11 +00001134PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001135{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001136 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001137
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001138 if (s == NULL) {
1139 null_error();
1140 return -1;
1141 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001142
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001143 m = s->ob_type->tp_as_sequence;
1144 if (m && m->sq_ass_item) {
1145 if (i < 0) {
1146 if (m->sq_length) {
1147 int l = (*m->sq_length)(s);
1148 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001149 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150 i += l;
1151 }
1152 }
1153 return m->sq_ass_item(s, i, o);
1154 }
1155
1156 type_error("object doesn't support item assignment");
1157 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001158}
1159
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001160int
Fred Drake79912472000-07-09 04:06:11 +00001161PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001162{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001163 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001164
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001165 if (s == NULL) {
1166 null_error();
1167 return -1;
1168 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001169
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170 m = s->ob_type->tp_as_sequence;
1171 if (m && m->sq_ass_item) {
1172 if (i < 0) {
1173 if (m->sq_length) {
1174 int l = (*m->sq_length)(s);
1175 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001176 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001177 i += l;
1178 }
1179 }
1180 return m->sq_ass_item(s, i, (PyObject *)NULL);
1181 }
1182
1183 type_error("object doesn't support item deletion");
1184 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001185}
1186
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001187int
Fred Drake79912472000-07-09 04:06:11 +00001188PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001189{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001190 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001191 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193 if (s == NULL) {
1194 null_error();
1195 return -1;
1196 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001197
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198 m = s->ob_type->tp_as_sequence;
1199 if (m && m->sq_ass_slice) {
1200 if (i1 < 0 || i2 < 0) {
1201 if (m->sq_length) {
1202 int l = (*m->sq_length)(s);
1203 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001204 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205 if (i1 < 0)
1206 i1 += l;
1207 if (i2 < 0)
1208 i2 += l;
1209 }
1210 }
1211 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001212 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1213 int res;
1214 PyObject *slice = sliceobj_from_intint(i1, i2);
1215 if (!slice)
1216 return -1;
1217 res = mp->mp_ass_subscript(s, slice, o);
1218 Py_DECREF(slice);
1219 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001220 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001221
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222 type_error("object doesn't support slice assignment");
1223 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001224}
1225
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226int
Fred Drake79912472000-07-09 04:06:11 +00001227PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001228{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001229 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001230
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001231 if (s == NULL) {
1232 null_error();
1233 return -1;
1234 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001235
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001236 m = s->ob_type->tp_as_sequence;
1237 if (m && m->sq_ass_slice) {
1238 if (i1 < 0 || i2 < 0) {
1239 if (m->sq_length) {
1240 int l = (*m->sq_length)(s);
1241 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001242 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 if (i1 < 0)
1244 i1 += l;
1245 if (i2 < 0)
1246 i2 += l;
1247 }
1248 }
1249 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1250 }
1251 type_error("object doesn't support slice deletion");
1252 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001253}
1254
Guido van Rossume15dee51995-07-18 14:12:02 +00001255PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001256PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001257{
Tim Peters6912d4d2001-05-05 03:56:37 +00001258 PyObject *it; /* iter(v) */
1259 int n; /* guess for result tuple size */
1260 PyObject *result;
1261 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001262
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263 if (v == NULL)
1264 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001265
Tim Peters6912d4d2001-05-05 03:56:37 +00001266 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001267 if (PyTuple_CheckExact(v)) {
1268 /* Note that we can't know whether it's safe to return
1269 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001270 to exact tuples here. In contrast, lists always make
1271 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001272 Py_INCREF(v);
1273 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001274 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275 if (PyList_Check(v))
1276 return PyList_AsTuple(v);
1277
Tim Peters6912d4d2001-05-05 03:56:37 +00001278 /* Get iterator. */
1279 it = PyObject_GetIter(v);
1280 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001281 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001282
Tim Peters6912d4d2001-05-05 03:56:37 +00001283 /* Guess result size and allocate space. */
1284 n = PySequence_Size(v);
1285 if (n < 0) {
1286 PyErr_Clear();
1287 n = 10; /* arbitrary */
1288 }
1289 result = PyTuple_New(n);
1290 if (result == NULL)
1291 goto Fail;
1292
1293 /* Fill the tuple. */
1294 for (j = 0; ; ++j) {
1295 PyObject *item = PyIter_Next(it);
1296 if (item == NULL) {
1297 if (PyErr_Occurred())
1298 goto Fail;
1299 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001300 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001301 if (j >= n) {
1302 if (n < 500)
1303 n += 10;
1304 else
1305 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001306 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001307 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001308 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001309 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001310 }
1311 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 }
1313
Tim Peters6912d4d2001-05-05 03:56:37 +00001314 /* Cut tuple back if guess was too large. */
1315 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001316 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001317 goto Fail;
1318
1319 Py_DECREF(it);
1320 return result;
1321
1322Fail:
1323 Py_XDECREF(result);
1324 Py_DECREF(it);
1325 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001326}
1327
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001328PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001329PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001330{
Tim Petersf553f892001-05-01 20:45:31 +00001331 PyObject *it; /* iter(v) */
1332 PyObject *result; /* result list */
1333 int n; /* guess for result list size */
1334 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001335
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001336 if (v == NULL)
1337 return null_error();
1338
Tim Petersf553f892001-05-01 20:45:31 +00001339 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001340 if (PyList_Check(v))
1341 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1342
Tim Petersf553f892001-05-01 20:45:31 +00001343 /* Get iterator. There may be some low-level efficiency to be gained
1344 * by caching the tp_iternext slot instead of using PyIter_Next()
1345 * later, but premature optimization is the root etc.
1346 */
1347 it = PyObject_GetIter(v);
1348 if (it == NULL)
1349 return NULL;
1350
1351 /* Guess a result list size. */
1352 n = -1; /* unknown */
1353 if (PySequence_Check(v) &&
1354 v->ob_type->tp_as_sequence->sq_length) {
1355 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001356 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001357 PyErr_Clear();
1358 }
1359 if (n < 0)
1360 n = 8; /* arbitrary */
1361 result = PyList_New(n);
1362 if (result == NULL) {
1363 Py_DECREF(it);
1364 return NULL;
1365 }
1366
1367 /* Run iterator to exhaustion. */
1368 for (i = 0; ; i++) {
1369 PyObject *item = PyIter_Next(it);
1370 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001371 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001372 Py_DECREF(result);
1373 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001374 }
Tim Petersf553f892001-05-01 20:45:31 +00001375 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001376 }
Tim Petersf553f892001-05-01 20:45:31 +00001377 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001378 PyList_SET_ITEM(result, i, item); /* steals ref */
1379 else {
1380 int status = PyList_Append(result, item);
1381 Py_DECREF(item); /* append creates a new ref */
1382 if (status < 0) {
1383 Py_DECREF(result);
1384 result = NULL;
1385 break;
1386 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001387 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001388 }
Tim Petersf553f892001-05-01 20:45:31 +00001389
1390 /* Cut back result list if initial guess was too large. */
1391 if (i < n && result != NULL) {
1392 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1393 Py_DECREF(result);
1394 result = NULL;
1395 }
1396 }
1397 Py_DECREF(it);
1398 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001399}
1400
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001401PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001402PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001403{
1404 if (v == NULL)
1405 return null_error();
1406
1407 if (PyList_Check(v) || PyTuple_Check(v)) {
1408 Py_INCREF(v);
1409 return v;
1410 }
1411
1412 v = PySequence_Tuple(v);
1413 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1414 return type_error(m);
1415
1416 return v;
1417}
1418
Tim Peters16a77ad2001-09-08 04:00:12 +00001419/* Iterate over seq. Result depends on the operation:
1420 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1421 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1422 set ValueError and return -1 if none found; also return -1 on error.
1423 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1424*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425int
Tim Peters16a77ad2001-09-08 04:00:12 +00001426_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001427{
Tim Peters16a77ad2001-09-08 04:00:12 +00001428 int n;
1429 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1430 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001431
Tim Peters16a77ad2001-09-08 04:00:12 +00001432 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 null_error();
1434 return -1;
1435 }
Tim Peters75f8e352001-05-05 11:33:43 +00001436
Tim Peters16a77ad2001-09-08 04:00:12 +00001437 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001438 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001439 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001441 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001442
Tim Peters16a77ad2001-09-08 04:00:12 +00001443 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001444 for (;;) {
1445 int cmp;
1446 PyObject *item = PyIter_Next(it);
1447 if (item == NULL) {
1448 if (PyErr_Occurred())
1449 goto Fail;
1450 break;
1451 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001452
1453 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001454 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001455 if (cmp < 0)
1456 goto Fail;
1457 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001458 switch (operation) {
1459 case PY_ITERSEARCH_COUNT:
1460 ++n;
1461 if (n <= 0) {
1462 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001463 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001464 goto Fail;
1465 }
1466 break;
1467
1468 case PY_ITERSEARCH_INDEX:
1469 if (wrapped) {
1470 PyErr_SetString(PyExc_OverflowError,
1471 "index exceeds C int size");
1472 goto Fail;
1473 }
1474 goto Done;
1475
1476 case PY_ITERSEARCH_CONTAINS:
1477 n = 1;
1478 goto Done;
1479
1480 default:
1481 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001482 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001483 }
1484
1485 if (operation == PY_ITERSEARCH_INDEX) {
1486 ++n;
1487 if (n <= 0)
1488 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001489 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001490 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001491
1492 if (operation != PY_ITERSEARCH_INDEX)
1493 goto Done;
1494
1495 PyErr_SetString(PyExc_ValueError,
1496 "sequence.index(x): x not in sequence");
1497 /* fall into failure code */
1498Fail:
1499 n = -1;
1500 /* fall through */
1501Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001502 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001503 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001504
Guido van Rossume15dee51995-07-18 14:12:02 +00001505}
1506
Tim Peters16a77ad2001-09-08 04:00:12 +00001507/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001508int
Tim Peters16a77ad2001-09-08 04:00:12 +00001509PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001510{
Tim Peters16a77ad2001-09-08 04:00:12 +00001511 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001512}
1513
Tim Peterscb8d3682001-05-05 21:05:01 +00001514/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001515 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001516 */
1517int
1518PySequence_Contains(PyObject *seq, PyObject *ob)
1519{
1520 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1521 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1522 if (sqm != NULL && sqm->sq_contains != NULL)
1523 return (*sqm->sq_contains)(seq, ob);
1524 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001525 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001526}
1527
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001528/* Backwards compatibility */
1529#undef PySequence_In
1530int
Fred Drake79912472000-07-09 04:06:11 +00001531PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001532{
1533 return PySequence_Contains(w, v);
1534}
1535
1536int
Fred Drake79912472000-07-09 04:06:11 +00001537PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001538{
Tim Peters16a77ad2001-09-08 04:00:12 +00001539 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001540}
1541
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001542/* Operations on mappings */
1543
1544int
Fred Drake79912472000-07-09 04:06:11 +00001545PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001546{
Guido van Rossum8700b422001-09-07 20:20:11 +00001547 return o && o->ob_type->tp_as_mapping &&
1548 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001549}
1550
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001551int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001552PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001553{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001554 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001555
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001556 if (o == NULL) {
1557 null_error();
1558 return -1;
1559 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001560
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001561 m = o->ob_type->tp_as_mapping;
1562 if (m && m->mp_length)
1563 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001564
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001565 type_error("len() of unsized object");
1566 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001567}
1568
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001569#undef PyMapping_Length
1570int
1571PyMapping_Length(PyObject *o)
1572{
1573 return PyMapping_Size(o);
1574}
1575#define PyMapping_Length PyMapping_Size
1576
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001577PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001578PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001579{
1580 PyObject *okey, *r;
1581
1582 if (key == NULL)
1583 return null_error();
1584
1585 okey = PyString_FromString(key);
1586 if (okey == NULL)
1587 return NULL;
1588 r = PyObject_GetItem(o, okey);
1589 Py_DECREF(okey);
1590 return r;
1591}
1592
1593int
Fred Drake79912472000-07-09 04:06:11 +00001594PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001595{
1596 PyObject *okey;
1597 int r;
1598
1599 if (key == NULL) {
1600 null_error();
1601 return -1;
1602 }
1603
1604 okey = PyString_FromString(key);
1605 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001606 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001607 r = PyObject_SetItem(o, okey, value);
1608 Py_DECREF(okey);
1609 return r;
1610}
1611
1612int
Fred Drake79912472000-07-09 04:06:11 +00001613PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001614{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001615 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001616
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001617 v = PyMapping_GetItemString(o, key);
1618 if (v) {
1619 Py_DECREF(v);
1620 return 1;
1621 }
1622 PyErr_Clear();
1623 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001624}
1625
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001626int
Fred Drake79912472000-07-09 04:06:11 +00001627PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001628{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001629 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001630
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001631 v = PyObject_GetItem(o, key);
1632 if (v) {
1633 Py_DECREF(v);
1634 return 1;
1635 }
1636 PyErr_Clear();
1637 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001638}
1639
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001640/* Operations on callable objects */
1641
1642/* XXX PyCallable_Check() is in object.c */
1643
Guido van Rossume15dee51995-07-18 14:12:02 +00001644PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001645PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001646{
Guido van Rossum5560b742001-09-14 16:47:50 +00001647 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001648}
Guido van Rossume15dee51995-07-18 14:12:02 +00001649
1650PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001651PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1652{
1653 ternaryfunc call;
1654
1655 if ((call = func->ob_type->tp_call) != NULL) {
1656 PyObject *result = (*call)(func, arg, kw);
1657 if (result == NULL && !PyErr_Occurred())
1658 PyErr_SetString(
1659 PyExc_SystemError,
1660 "NULL result without error in PyObject_Call");
1661 return result;
1662 }
1663 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
1664 PyString_AS_STRING(PyObject_Repr(func)));
1665 return NULL;
1666}
1667
1668PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001669PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001670{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001671 va_list va;
1672 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001673
Fred Drakeb92cf062001-10-27 06:16:31 +00001674 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001675 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001676
Fred Drakeb92cf062001-10-27 06:16:31 +00001677 if (format && *format) {
1678 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001679 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001680 va_end(va);
1681 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001682 else
1683 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001684
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001685 if (args == NULL)
1686 return NULL;
1687
1688 if (!PyTuple_Check(args)) {
1689 PyObject *a;
1690
1691 a = PyTuple_New(1);
1692 if (a == NULL)
1693 return NULL;
1694 if (PyTuple_SetItem(a, 0, args) < 0)
1695 return NULL;
1696 args = a;
1697 }
1698 retval = PyObject_CallObject(callable, args);
1699
1700 Py_DECREF(args);
1701
1702 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001703}
1704
1705PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001706PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001707{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001708 va_list va;
1709 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001710
Fred Drakeb92cf062001-10-27 06:16:31 +00001711 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001712 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001713
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714 func = PyObject_GetAttrString(o, name);
1715 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001716 PyErr_SetString(PyExc_AttributeError, name);
1717 return 0;
1718 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001719
Fred Drakeb92cf062001-10-27 06:16:31 +00001720 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001721 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001722
Fred Drakeb92cf062001-10-27 06:16:31 +00001723 if (format && *format) {
1724 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001725 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001726 va_end(va);
1727 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001728 else
1729 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001730
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001731 if (!args)
1732 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001733
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001734 if (!PyTuple_Check(args)) {
1735 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001736
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001737 a = PyTuple_New(1);
1738 if (a == NULL)
1739 return NULL;
1740 if (PyTuple_SetItem(a, 0, args) < 0)
1741 return NULL;
1742 args = a;
1743 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001744
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001745 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001746
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001747 Py_DECREF(args);
1748 Py_DECREF(func);
1749
1750 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001751}
Guido van Rossum823649d2001-03-21 18:40:58 +00001752
1753
Fred Drakeb421b8c2001-10-26 16:21:32 +00001754static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001755objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001756{
1757 int i, n = 0;
1758 va_list countva;
1759 PyObject *result, *tmp;
1760
1761#ifdef VA_LIST_IS_ARRAY
1762 memcpy(countva, va, sizeof(va_list));
1763#else
1764 countva = va;
1765#endif
1766
1767 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1768 ++n;
1769 result = PyTuple_New(n);
1770 if (result != NULL && n > 0) {
1771 for (i = 0; i < n; ++i) {
1772 tmp = (PyObject *)va_arg(va, PyObject *);
1773 PyTuple_SET_ITEM(result, i, tmp);
1774 Py_INCREF(tmp);
1775 }
1776 }
1777 return result;
1778}
1779
1780PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001781PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001782{
1783 PyObject *args, *tmp;
1784 va_list vargs;
1785
1786 if (callable == NULL || name == NULL)
1787 return null_error();
1788
1789 callable = PyObject_GetAttr(callable, name);
1790 if (callable == NULL)
1791 return NULL;
1792
1793 /* count the args */
1794 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001795 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001796 va_end(vargs);
1797 if (args == NULL) {
1798 Py_DECREF(callable);
1799 return NULL;
1800 }
1801 tmp = PyObject_Call(callable, args, NULL);
1802 Py_DECREF(args);
1803 Py_DECREF(callable);
1804
1805 return tmp;
1806}
1807
1808PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001809PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001810{
1811 PyObject *args, *tmp;
1812 va_list vargs;
1813
1814 if (callable == NULL)
1815 return null_error();
1816
1817 /* count the args */
1818 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001819 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001820 va_end(vargs);
1821 if (args == NULL)
1822 return NULL;
1823 tmp = PyObject_Call(callable, args, NULL);
1824 Py_DECREF(args);
1825
1826 return tmp;
1827}
1828
1829
Guido van Rossum823649d2001-03-21 18:40:58 +00001830/* isinstance(), issubclass() */
1831
Neil Schemenauer6b471292001-10-18 03:18:43 +00001832static PyObject *
1833abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001834{
1835 static PyObject *__bases__ = NULL;
1836 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001837
1838 if (__bases__ == NULL) {
1839 __bases__ = PyString_FromString("__bases__");
1840 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001841 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001842 }
1843
Neil Schemenauer6b471292001-10-18 03:18:43 +00001844 bases = PyObject_GetAttr(cls, __bases__);
1845 if (bases == NULL || !PyTuple_Check(bases)) {
1846 Py_XDECREF(bases);
1847 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001848 }
1849
Neil Schemenauer6b471292001-10-18 03:18:43 +00001850 return bases;
1851}
1852
1853
1854static int
1855abstract_issubclass(PyObject *derived, PyObject *cls)
1856{
1857 PyObject *bases;
1858 int i, n;
1859 int r = 0;
1860
1861
Guido van Rossum823649d2001-03-21 18:40:58 +00001862 if (derived == cls)
1863 return 1;
1864
Neil Schemenauer6b471292001-10-18 03:18:43 +00001865 bases = abstract_get_bases(derived);
1866 if (bases == NULL)
1867 return 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001868
1869 n = PyTuple_GET_SIZE(bases);
1870 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001871 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001872 if (r != 0)
1873 break;
1874 }
1875
1876 Py_DECREF(bases);
1877
1878 return r;
1879}
1880
1881int
1882PyObject_IsInstance(PyObject *inst, PyObject *cls)
1883{
1884 PyObject *icls;
1885 static PyObject *__class__ = NULL;
1886 int retval = 0;
1887
Neil Schemenauer6b471292001-10-18 03:18:43 +00001888 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1889 PyObject *inclass =
1890 (PyObject*)((PyInstanceObject*)inst)->in_class;
1891 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001892 }
1893 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001894 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001895 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001896 else if (PyTuple_Check(cls)) {
1897 /* Not a general sequence -- that opens up the road to
1898 recursion and stack overflow. */
1899 int i, n;
1900
1901 n = PyTuple_GET_SIZE(cls);
1902 for (i = 0; i < n; i++) {
1903 retval = PyObject_IsInstance(
1904 inst, PyTuple_GET_ITEM(cls, i));
1905 if (retval != 0)
1906 break;
1907 }
1908 return retval;
1909 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001910 else {
1911 PyObject *cls_bases = abstract_get_bases(cls);
1912 if (cls_bases == NULL) {
1913 PyErr_SetString(PyExc_TypeError,
1914 "isinstance() arg 2 must be a class or type");
1915 return -1;
1916 }
1917 Py_DECREF(cls_bases);
Guido van Rossum823649d2001-03-21 18:40:58 +00001918 if (__class__ == NULL) {
1919 __class__ = PyString_FromString("__class__");
1920 if (__class__ == NULL)
1921 return -1;
1922 }
1923 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001924 if (icls == NULL) {
1925 PyErr_Clear();
1926 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001927 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001928 else {
1929 retval = abstract_issubclass(icls, cls);
1930 Py_DECREF(icls);
1931 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001932 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001933
Guido van Rossum823649d2001-03-21 18:40:58 +00001934 return retval;
1935}
1936
1937int
1938PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1939{
1940 int retval;
1941
1942 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001943 PyObject *derived_bases;
1944 PyObject *cls_bases;
1945
1946 derived_bases = abstract_get_bases(derived);
1947 if (derived_bases == NULL) {
1948 PyErr_SetString(PyExc_TypeError,
1949 "issubclass() arg 1 must be a class");
1950 return -1;
1951 }
1952 Py_DECREF(derived_bases);
1953
1954 cls_bases = abstract_get_bases(cls);
1955 if (cls_bases == NULL) {
1956 PyErr_SetString(PyExc_TypeError,
1957 "issubclass() arg 2 must be a class");
1958 return -1;
1959 }
1960 Py_DECREF(cls_bases);
1961
1962 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001963 }
1964 else {
1965 /* shortcut */
1966 if (!(retval = (derived == cls)))
1967 retval = PyClass_IsSubclass(derived, cls);
1968 }
1969
1970 return retval;
1971}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001972
1973PyObject *
1974PyObject_GetIter(PyObject *o)
1975{
1976 PyTypeObject *t = o->ob_type;
1977 getiterfunc f = NULL;
1978 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
1979 f = t->tp_iter;
1980 if (f == NULL) {
1981 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00001982 return PySeqIter_New(o);
Tim Peters8b13b3e2001-09-30 05:58:42 +00001983 PyErr_SetString(PyExc_TypeError, "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001984 return NULL;
1985 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00001986 else {
1987 PyObject *res = (*f)(o);
1988 if (res != NULL && !PyIter_Check(res)) {
1989 PyErr_Format(PyExc_TypeError,
1990 "iter() returned non-iterator "
1991 "of type '%.100s'",
1992 res->ob_type->tp_name);
1993 Py_DECREF(res);
1994 res = NULL;
1995 }
1996 return res;
1997 }
1998}
1999
Tim Petersf4848da2001-05-05 00:14:56 +00002000/* Return next item.
2001 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2002 * If the iteration terminates normally, return NULL and clear the
2003 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2004 * will be false.
2005 * Else return the next object. PyErr_Occurred() will be false.
2006 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002007PyObject *
2008PyIter_Next(PyObject *iter)
2009{
Tim Petersf4848da2001-05-05 00:14:56 +00002010 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002011 if (!PyIter_Check(iter)) {
2012 PyErr_Format(PyExc_TypeError,
2013 "'%.100s' object is not an iterator",
2014 iter->ob_type->tp_name);
2015 return NULL;
2016 }
Tim Petersf4848da2001-05-05 00:14:56 +00002017 result = (*iter->ob_type->tp_iternext)(iter);
2018 if (result == NULL &&
2019 PyErr_Occurred() &&
2020 PyErr_ExceptionMatches(PyExc_StopIteration))
2021 PyErr_Clear();
2022 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002023}