blob: 2df934db8afdc9fc687fc96575169ee6fcb9ce57 [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 Rossum64585f62001-11-24 18:24:47 +0000106 else if (o->ob_type->tp_as_sequence->sq_item)
107 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000108 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000109
110 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000111}
112
113int
Fred Drake79912472000-07-09 04:06:11 +0000114PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000115{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000116 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000118 if (o == NULL || key == NULL || value == NULL) {
119 null_error();
120 return -1;
121 }
122 m = o->ob_type->tp_as_mapping;
123 if (m && m->mp_ass_subscript)
124 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000125
Guido van Rossum21308241998-08-13 16:44:44 +0000126 if (o->ob_type->tp_as_sequence) {
127 if (PyInt_Check(key))
128 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000129 else if (PyLong_Check(key)) {
130 long key_value = PyLong_AsLong(key);
131 if (key_value == -1 && PyErr_Occurred())
132 return -1;
133 return PySequence_SetItem(o, key_value, value);
134 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000135 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
136 type_error("sequence index must be integer");
137 return -1;
138 }
Guido van Rossum21308241998-08-13 16:44:44 +0000139 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000140
141 type_error("object does not support item assignment");
142 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000143}
144
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000145int
Fred Drake79912472000-07-09 04:06:11 +0000146PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000147{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000148 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000149
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000150 if (o == NULL || key == NULL) {
151 null_error();
152 return -1;
153 }
154 m = o->ob_type->tp_as_mapping;
155 if (m && m->mp_ass_subscript)
156 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000157
Guido van Rossum21308241998-08-13 16:44:44 +0000158 if (o->ob_type->tp_as_sequence) {
159 if (PyInt_Check(key))
160 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000161 else if (PyLong_Check(key)) {
162 long key_value = PyLong_AsLong(key);
163 if (key_value == -1 && PyErr_Occurred())
164 return -1;
165 return PySequence_DelItem(o, key_value);
166 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000167 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
168 type_error("sequence index must be integer");
169 return -1;
170 }
Guido van Rossum21308241998-08-13 16:44:44 +0000171 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000172
173 type_error("object does not support item deletion");
174 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000175}
176
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000177int
178PyObject_DelItemString(PyObject *o, char *key)
179{
180 PyObject *okey;
181 int ret;
182
183 if (o == NULL || key == NULL) {
184 null_error();
185 return -1;
186 }
187 okey = PyString_FromString(key);
188 if (okey == NULL)
189 return -1;
190 ret = PyObject_DelItem(o, okey);
191 Py_DECREF(okey);
192 return ret;
193}
194
Guido van Rossum4c08d552000-03-10 22:55:18 +0000195int PyObject_AsCharBuffer(PyObject *obj,
196 const char **buffer,
197 int *buffer_len)
198{
199 PyBufferProcs *pb;
200 const char *pp;
201 int len;
202
203 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
204 null_error();
205 return -1;
206 }
207 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000208 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000209 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000210 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000211 PyErr_SetString(PyExc_TypeError,
212 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000213 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000214 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000215 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000216 PyErr_SetString(PyExc_TypeError,
217 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000218 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000219 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000220 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000221 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000222 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000223 *buffer = pp;
224 *buffer_len = len;
225 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000226}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000227
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000228int
229PyObject_CheckReadBuffer(PyObject *obj)
230{
231 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
232
233 if (pb == NULL ||
234 pb->bf_getreadbuffer == NULL ||
235 pb->bf_getsegcount == NULL ||
236 (*pb->bf_getsegcount)(obj, NULL) != 1)
237 return 0;
238 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239}
240
241int PyObject_AsReadBuffer(PyObject *obj,
242 const void **buffer,
243 int *buffer_len)
244{
245 PyBufferProcs *pb;
246 void *pp;
247 int len;
248
249 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
250 null_error();
251 return -1;
252 }
253 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000255 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000256 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000257 PyErr_SetString(PyExc_TypeError,
258 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000260 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000261 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000262 PyErr_SetString(PyExc_TypeError,
263 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000266 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000268 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000269 *buffer = pp;
270 *buffer_len = len;
271 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000272}
273
274int PyObject_AsWriteBuffer(PyObject *obj,
275 void **buffer,
276 int *buffer_len)
277{
278 PyBufferProcs *pb;
279 void*pp;
280 int len;
281
282 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
283 null_error();
284 return -1;
285 }
286 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000287 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000289 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 PyErr_SetString(PyExc_TypeError,
291 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000292 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000293 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000294 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000295 PyErr_SetString(PyExc_TypeError,
296 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000297 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000298 }
299 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
300 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000301 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000302 *buffer = pp;
303 *buffer_len = len;
304 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000305}
306
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000307/* Operations on numbers */
308
309int
Fred Drake79912472000-07-09 04:06:11 +0000310PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000311{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000312 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000313}
314
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000315/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000316
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000317/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000318
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000319#define NB_SLOT(x) offsetof(PyNumberMethods, x)
320#define NB_BINOP(nb_methods, slot) \
321 ((binaryfunc*)(& ((char*)nb_methods)[slot] ))
322#define NB_TERNOP(nb_methods, slot) \
323 ((ternaryfunc*)(& ((char*)nb_methods)[slot] ))
324
325/*
326 Calling scheme used for binary operations:
327
328 v w Action
329 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000330 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000331 new old v.op(v,w), coerce(v,w), v.op(v,w)
332 old new w.op(v,w), coerce(v,w), v.op(v,w)
333 old old coerce(v,w), v.op(v,w)
334
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000335 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
336 v->ob_type
337
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000338 Legend:
339 -------
340 * new == new style number
341 * old == old style number
342 * Action indicates the order in which operations are tried until either
343 a valid result is produced or an error occurs.
344
345 */
346
347static PyObject *
348binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000349{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000350 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000351 binaryfunc slotv = NULL;
352 binaryfunc slotw = NULL;
353
354 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
355 slotv = *NB_BINOP(v->ob_type->tp_as_number, op_slot);
356 if (w->ob_type != v->ob_type &&
357 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
358 slotw = *NB_BINOP(w->ob_type->tp_as_number, op_slot);
359 if (slotw == slotv)
360 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000361 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000362 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000363 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
364 x = slotw(v, w);
365 if (x != Py_NotImplemented)
366 return x;
367 Py_DECREF(x); /* can't do it */
368 slotw = NULL;
369 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000370 x = slotv(v, w);
371 if (x != Py_NotImplemented)
372 return x;
373 Py_DECREF(x); /* can't do it */
374 }
375 if (slotw) {
376 x = slotw(v, w);
377 if (x != Py_NotImplemented)
378 return x;
379 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000380 }
381 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
382 int err = PyNumber_CoerceEx(&v, &w);
383 if (err < 0) {
384 return NULL;
385 }
386 if (err == 0) {
387 PyNumberMethods *mv = v->ob_type->tp_as_number;
388 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000389 binaryfunc slot;
390 slot = *NB_BINOP(mv, op_slot);
391 if (slot) {
392 PyObject *x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000393 Py_DECREF(v);
394 Py_DECREF(w);
395 return x;
396 }
397 }
398 /* CoerceEx incremented the reference counts */
399 Py_DECREF(v);
400 Py_DECREF(w);
401 }
402 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000403 Py_INCREF(Py_NotImplemented);
404 return Py_NotImplemented;
405}
Guido van Rossum77660912002-04-16 16:32:50 +0000406
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000407static PyObject *
408binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
409{
410 PyObject *result = binary_op1(v, w, op_slot);
411 if (result == Py_NotImplemented) {
412 Py_DECREF(Py_NotImplemented);
Guido van Rossum5c66a262001-10-22 04:12:44 +0000413 PyErr_Format(
Guido van Rossum77660912002-04-16 16:32:50 +0000414 PyExc_TypeError,
Guido van Rossum5c66a262001-10-22 04:12:44 +0000415 "unsupported operand type(s) for %s: '%s' and '%s'",
416 op_name,
417 v->ob_type->tp_name,
418 w->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000419 return NULL;
420 }
421 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000422}
423
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000424
425/*
426 Calling scheme used for ternary operations:
427
Guido van Rossum84675ac2001-09-29 01:05:03 +0000428 *** In some cases, w.op is called before v.op; see binary_op1. ***
429
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000430 v w z Action
431 -------------------------------------------------------------------
432 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
433 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
434 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
435 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
436 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
437 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
438 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
439 old old old coerce(v,w,z), v.op(v,w,z)
440
441 Legend:
442 -------
443 * new == new style number
444 * old == old style number
445 * Action indicates the order in which operations are tried until either
446 a valid result is produced or an error occurs.
447 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
448 only if z != Py_None; if z == Py_None, then it is treated as absent
449 variable and only coerce(v,w) is tried.
450
451 */
452
453static PyObject *
454ternary_op(PyObject *v,
455 PyObject *w,
456 PyObject *z,
457 const int op_slot,
458 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000459{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000460 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000461 PyObject *x = NULL;
462 ternaryfunc slotv = NULL;
463 ternaryfunc slotw = NULL;
464 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000465
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000466 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000467 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000468 if (mv != NULL && NEW_STYLE_NUMBER(v))
469 slotv = *NB_TERNOP(mv, op_slot);
470 if (w->ob_type != v->ob_type &&
471 mv != NULL && NEW_STYLE_NUMBER(w)) {
472 slotw = *NB_TERNOP(mw, op_slot);
473 if (slotw == slotv)
474 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000475 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000476 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000477 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
478 x = slotw(v, w, z);
479 if (x != Py_NotImplemented)
480 return x;
481 Py_DECREF(x); /* can't do it */
482 slotw = NULL;
483 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000484 x = slotv(v, w, z);
485 if (x != Py_NotImplemented)
486 return x;
487 Py_DECREF(x); /* can't do it */
488 }
489 if (slotw) {
490 x = slotw(v, w, z);
491 if (x != Py_NotImplemented)
492 return x;
493 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000494 }
495 mz = z->ob_type->tp_as_number;
496 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000497 slotz = *NB_TERNOP(mz, op_slot);
498 if (slotz == slotv || slotz == slotw)
499 slotz = NULL;
500 if (slotz) {
501 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000502 if (x != Py_NotImplemented)
503 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000504 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000505 }
506 }
507
508 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
509 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
510 /* we have an old style operand, coerce */
511 PyObject *v1, *z1, *w2, *z2;
512 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000513
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000514 c = PyNumber_Coerce(&v, &w);
515 if (c != 0)
516 goto error3;
517
518 /* Special case: if the third argument is None, it is
519 treated as absent argument and not coerced. */
520 if (z == Py_None) {
521 if (v->ob_type->tp_as_number) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000522 slotz = *NB_TERNOP(v->ob_type->tp_as_number,
523 op_slot);
524 if (slotz)
525 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000526 else
527 c = -1;
528 }
529 else
530 c = -1;
531 goto error2;
532 }
533 v1 = v;
534 z1 = z;
535 c = PyNumber_Coerce(&v1, &z1);
536 if (c != 0)
537 goto error2;
538 w2 = w;
539 z2 = z1;
540 c = PyNumber_Coerce(&w2, &z2);
541 if (c != 0)
542 goto error1;
543
544 if (v1->ob_type->tp_as_number != NULL) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000545 slotv = *NB_TERNOP(v1->ob_type->tp_as_number,
546 op_slot);
547 if (slotv)
548 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000549 else
550 c = -1;
551 }
552 else
553 c = -1;
554
555 Py_DECREF(w2);
556 Py_DECREF(z2);
557 error1:
558 Py_DECREF(v1);
559 Py_DECREF(z1);
560 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000561 Py_DECREF(v);
562 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000563 error3:
564 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000565 return x;
566 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000567
568 if (z == Py_None)
569 PyErr_Format(
570 PyExc_TypeError,
571 "unsupported operand type(s) for ** or pow(): "
572 "'%s' and '%s'",
573 v->ob_type->tp_name,
574 w->ob_type->tp_name);
575 else
576 PyErr_Format(
577 PyExc_TypeError,
578 "unsupported operand type(s) for pow(): "
579 "'%s', '%s', '%s'",
580 v->ob_type->tp_name,
581 w->ob_type->tp_name,
582 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000583 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000584}
585
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000586#define BINARY_FUNC(func, op, op_name) \
587 PyObject * \
588 func(PyObject *v, PyObject *w) { \
589 return binary_op(v, w, NB_SLOT(op), op_name); \
590 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000591
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000592BINARY_FUNC(PyNumber_Or, nb_or, "|")
593BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
594BINARY_FUNC(PyNumber_And, nb_and, "&")
595BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
596BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
597BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
598BINARY_FUNC(PyNumber_Multiply, nb_multiply, "*")
599BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
600BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000601
602PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000603PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000604{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000605 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
606 if (result == Py_NotImplemented) {
607 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Jeremy Hylton0522d982002-03-08 21:28:54 +0000608 if (m && m->sq_concat) {
609 Py_DECREF(result);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000610 result = (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000611 }
Jeremy Hylton6ae6a432002-03-08 21:11:37 +0000612 if (result == Py_NotImplemented) {
Jeremy Hylton0522d982002-03-08 21:28:54 +0000613 Py_DECREF(result);
614 PyErr_Format(
Guido van Rossum5c66a262001-10-22 04:12:44 +0000615 PyExc_TypeError,
616 "unsupported operand types for +: '%s' and '%s'",
617 v->ob_type->tp_name,
618 w->ob_type->tp_name);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000619 result = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000620 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000621 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000622 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000623}
624
625PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000626PyNumber_FloorDivide(PyObject *v, PyObject *w)
627{
628 /* XXX tp_flags test */
629 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
630}
631
632PyObject *
633PyNumber_TrueDivide(PyObject *v, PyObject *w)
634{
635 /* XXX tp_flags test */
636 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
637}
638
639PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000640PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000641{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000642 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000643}
644
645PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000646PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000647{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000648 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000649}
650
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000651/* Binary in-place operators */
652
653/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000654 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000655
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000656 - If the left hand object has the appropriate struct members, and
657 they are filled, call the appropriate function and return the
658 result. No coercion is done on the arguments; the left-hand object
659 is the one the operation is performed on, and it's up to the
660 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000661
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000662 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000663 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000664
665 */
666
Guido van Rossum77660912002-04-16 16:32:50 +0000667#define HASINPLACE(t) \
668 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000669
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000670static PyObject *
671binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
672 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000673{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000674 PyNumberMethods *mv = v->ob_type->tp_as_number;
675 if (mv != NULL && HASINPLACE(v)) {
676 binaryfunc *slot = NB_BINOP(mv, iop_slot);
677 if (*slot) {
678 PyObject *x = (*slot)(v, w);
679 if (x != Py_NotImplemented) {
680 return x;
681 }
682 Py_DECREF(x);
683 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000684 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000685 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000686}
687
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000688#define INPLACE_BINOP(func, iop, op, op_name) \
689 PyObject * \
690 func(PyObject *v, PyObject *w) { \
691 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000692 }
693
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000694INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
695INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
696INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
697INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
698INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
699INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
700INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000701
702PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000703PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
704{
705 /* XXX tp_flags test */
706 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
707 NB_SLOT(nb_floor_divide), "//=");
708}
709
710PyObject *
711PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
712{
713 /* XXX tp_flags test */
714 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
715 NB_SLOT(nb_true_divide), "/=");
716}
717
718PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000719PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
720{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000721 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000722
Guido van Rossumbb8be932000-09-01 23:27:32 +0000723 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000724 if (HASINPLACE(v))
725 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
726 if (f == NULL)
727 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000728 if (f != NULL)
729 return (*f)(v, w);
730 }
Guido van Rossum77660912002-04-16 16:32:50 +0000731 return binary_iop(v, w, NB_SLOT(nb_inplace_add),
732 NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000733}
734
735PyObject *
736PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
737{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000738 PyObject * (*g)(PyObject *, int) = NULL;
Guido van Rossume8fc6402002-04-16 16:44:51 +0000739 if (HASINPLACE(v) &&
740 v->ob_type->tp_as_sequence &&
741 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat) &&
742 !(v->ob_type->tp_as_number &&
743 v->ob_type->tp_as_number->nb_inplace_multiply))
744 {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000745 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000746 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000747 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000748 }
749 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000750 n = PyLong_AsLong(w);
751 if (n == -1 && PyErr_Occurred())
752 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000753 }
754 else {
Guido van Rossum77660912002-04-16 16:32:50 +0000755 return type_error(
756 "can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000757 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000758 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000760 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
761 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000762}
763
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000764PyObject *
765PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
766{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000767 if (PyString_Check(v))
768 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000769#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000770 else if (PyUnicode_Check(v))
771 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000772#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000773 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000774 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
775 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000776}
777
778PyObject *
779PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
780{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000781 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
782 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
783 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000784 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000785 else {
786 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
787 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000788}
789
790
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000791/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000792
793PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000794PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000795{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000796 PyNumberMethods *m;
797
798 if (o == NULL)
799 return null_error();
800 m = o->ob_type->tp_as_number;
801 if (m && m->nb_negative)
802 return (*m->nb_negative)(o);
803
804 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000805}
806
807PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000808PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000809{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000810 PyNumberMethods *m;
811
812 if (o == NULL)
813 return null_error();
814 m = o->ob_type->tp_as_number;
815 if (m && m->nb_positive)
816 return (*m->nb_positive)(o);
817
818 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000819}
820
821PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000822PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000823{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000824 PyNumberMethods *m;
825
826 if (o == NULL)
827 return null_error();
828 m = o->ob_type->tp_as_number;
829 if (m && m->nb_invert)
830 return (*m->nb_invert)(o);
831
832 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000833}
834
835PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000836PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000837{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000838 PyNumberMethods *m;
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();
842 m = o->ob_type->tp_as_number;
843 if (m && m->nb_absolute)
844 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000845
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000846 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000847}
848
Guido van Rossum9e896b32000-04-05 20:11:21 +0000849/* Add a check for embedded NULL-bytes in the argument. */
850static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000851int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000852{
853 char *end;
854 PyObject *x;
855
856 x = PyInt_FromString((char*)s, &end, 10);
857 if (x == NULL)
858 return NULL;
859 if (end != s + len) {
860 PyErr_SetString(PyExc_ValueError,
861 "null byte in argument for int()");
862 Py_DECREF(x);
863 return NULL;
864 }
865 return x;
866}
867
Guido van Rossume15dee51995-07-18 14:12:02 +0000868PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000869PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000870{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000871 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000872 const char *buffer;
873 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000874
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000875 if (o == NULL)
876 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000877 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000878 Py_INCREF(o);
879 return o;
880 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000881 if (PyInt_Check(o)) {
882 PyIntObject *io = (PyIntObject*)o;
883 return PyInt_FromLong(io->ob_ival);
884 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000885 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000886 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000887 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000888#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000889 if (PyUnicode_Check(o))
890 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
891 PyUnicode_GET_SIZE(o),
892 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000893#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000894 m = o->ob_type->tp_as_number;
895 if (m && m->nb_int)
896 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000897 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000898 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000899
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000900 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000901}
902
Guido van Rossum9e896b32000-04-05 20:11:21 +0000903/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000904static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000905long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000906{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000907 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000908 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000909
Guido van Rossum4c08d552000-03-10 22:55:18 +0000910 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000911 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000912 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000913 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000914 PyErr_SetString(PyExc_ValueError,
915 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000916 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000917 return NULL;
918 }
919 return x;
920}
921
Guido van Rossume15dee51995-07-18 14:12:02 +0000922PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000923PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000924{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000925 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000926 const char *buffer;
927 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000928
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000929 if (o == NULL)
930 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000931 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000932 Py_INCREF(o);
933 return o;
934 }
Tim Petersdb30ac42002-03-02 04:14:21 +0000935 if (PyLong_Check(o))
936 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000937 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000938 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000939 * doesn't do. In particular long('9.5') must raise an
940 * exception, not truncate the float.
941 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000942 return long_from_string(PyString_AS_STRING(o),
943 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000944#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000945 if (PyUnicode_Check(o))
946 /* The above check is done in PyLong_FromUnicode(). */
947 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
948 PyUnicode_GET_SIZE(o),
949 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000950#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000951 m = o->ob_type->tp_as_number;
952 if (m && m->nb_long)
953 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000954 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
955 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000956
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000957 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000958}
959
960PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000961PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000962{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000963 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000964
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965 if (o == NULL)
966 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000967 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000968 Py_INCREF(o);
969 return o;
970 }
Tim Peters7a50f252001-09-10 21:28:20 +0000971 if (PyFloat_Check(o)) {
972 PyFloatObject *po = (PyFloatObject *)o;
973 return PyFloat_FromDouble(po->ob_fval);
974 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000975 if (!PyString_Check(o)) {
976 m = o->ob_type->tp_as_number;
977 if (m && m->nb_float)
978 return m->nb_float(o);
979 }
980 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000981}
982
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000983/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000984
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000985int
Fred Drake79912472000-07-09 04:06:11 +0000986PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000987{
Guido van Rossum8700b422001-09-07 20:20:11 +0000988 return s != NULL && s->ob_type->tp_as_sequence &&
989 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000990}
991
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000992int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000993PySequence_Size(PyObject *s)
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) {
998 null_error();
999 return -1;
1000 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001001
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001002 m = s->ob_type->tp_as_sequence;
1003 if (m && m->sq_length)
1004 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001005
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001006 type_error("len() of unsized object");
1007 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001008}
1009
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001010#undef PySequence_Length
1011int
1012PySequence_Length(PyObject *s)
1013{
1014 return PySequence_Size(s);
1015}
1016#define PySequence_Length PySequence_Size
1017
Guido van Rossume15dee51995-07-18 14:12:02 +00001018PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001019PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001020{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001021 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001022
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001023 if (s == NULL || o == NULL)
1024 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001025
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001026 m = s->ob_type->tp_as_sequence;
1027 if (m && m->sq_concat)
1028 return m->sq_concat(s, o);
1029
1030 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001031}
1032
1033PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001034PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001035{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001036 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001037
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001038 if (o == NULL)
1039 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001040
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001041 m = o->ob_type->tp_as_sequence;
1042 if (m && m->sq_repeat)
1043 return m->sq_repeat(o, count);
1044
1045 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001046}
1047
1048PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001049PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1050{
1051 PySequenceMethods *m;
1052
1053 if (s == NULL || o == NULL)
1054 return null_error();
1055
1056 m = s->ob_type->tp_as_sequence;
1057 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1058 return m->sq_inplace_concat(s, o);
1059 if (m && m->sq_concat)
1060 return m->sq_concat(s, o);
1061
1062 return type_error("object can't be concatenated");
1063}
1064
1065PyObject *
1066PySequence_InPlaceRepeat(PyObject *o, int count)
1067{
1068 PySequenceMethods *m;
1069
1070 if (o == NULL)
1071 return null_error();
1072
1073 m = o->ob_type->tp_as_sequence;
1074 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1075 return m->sq_inplace_repeat(o, count);
1076 if (m && m->sq_repeat)
1077 return m->sq_repeat(o, count);
1078
1079 return type_error("object can't be repeated");
1080}
1081
1082PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001083PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001084{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001085 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001086
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001087 if (s == NULL)
1088 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001089
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001090 m = s->ob_type->tp_as_sequence;
1091 if (m && m->sq_item) {
1092 if (i < 0) {
1093 if (m->sq_length) {
1094 int l = (*m->sq_length)(s);
1095 if (l < 0)
1096 return NULL;
1097 i += l;
1098 }
1099 }
1100 return m->sq_item(s, i);
1101 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001102
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001103 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001104}
1105
Thomas Wouters1d75a792000-08-17 22:37:32 +00001106static PyObject *
1107sliceobj_from_intint(int i, int j)
1108{
1109 PyObject *start, *end, *slice;
1110 start = PyInt_FromLong((long)i);
1111 if (!start)
1112 return NULL;
1113 end = PyInt_FromLong((long)j);
1114 if (!end) {
1115 Py_DECREF(start);
1116 return NULL;
1117 }
1118 slice = PySlice_New(start, end, NULL);
1119 Py_DECREF(start);
1120 Py_DECREF(end);
1121 return slice;
1122}
1123
Guido van Rossume15dee51995-07-18 14:12:02 +00001124PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001125PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001126{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001127 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001128 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001129
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001131
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 m = s->ob_type->tp_as_sequence;
1133 if (m && m->sq_slice) {
1134 if (i1 < 0 || i2 < 0) {
1135 if (m->sq_length) {
1136 int l = (*m->sq_length)(s);
1137 if (l < 0)
1138 return NULL;
1139 if (i1 < 0)
1140 i1 += l;
1141 if (i2 < 0)
1142 i2 += l;
1143 }
1144 }
1145 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001146 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1147 PyObject *res;
1148 PyObject *slice = sliceobj_from_intint(i1, i2);
1149 if (!slice)
1150 return NULL;
1151 res = mp->mp_subscript(s, slice);
1152 Py_DECREF(slice);
1153 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001155
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001157}
1158
1159int
Fred Drake79912472000-07-09 04:06:11 +00001160PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001161{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001163
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001164 if (s == NULL) {
1165 null_error();
1166 return -1;
1167 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001168
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001169 m = s->ob_type->tp_as_sequence;
1170 if (m && m->sq_ass_item) {
1171 if (i < 0) {
1172 if (m->sq_length) {
1173 int l = (*m->sq_length)(s);
1174 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001175 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001176 i += l;
1177 }
1178 }
1179 return m->sq_ass_item(s, i, o);
1180 }
1181
1182 type_error("object doesn't support item assignment");
1183 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001184}
1185
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001186int
Fred Drake79912472000-07-09 04:06:11 +00001187PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001188{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001190
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001191 if (s == NULL) {
1192 null_error();
1193 return -1;
1194 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001195
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001196 m = s->ob_type->tp_as_sequence;
1197 if (m && m->sq_ass_item) {
1198 if (i < 0) {
1199 if (m->sq_length) {
1200 int l = (*m->sq_length)(s);
1201 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001202 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001203 i += l;
1204 }
1205 }
1206 return m->sq_ass_item(s, i, (PyObject *)NULL);
1207 }
1208
1209 type_error("object doesn't support item deletion");
1210 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001211}
1212
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001213int
Fred Drake79912472000-07-09 04:06:11 +00001214PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001215{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001216 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001217 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001218
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001219 if (s == NULL) {
1220 null_error();
1221 return -1;
1222 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001223
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001224 m = s->ob_type->tp_as_sequence;
1225 if (m && m->sq_ass_slice) {
1226 if (i1 < 0 || i2 < 0) {
1227 if (m->sq_length) {
1228 int l = (*m->sq_length)(s);
1229 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001230 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001231 if (i1 < 0)
1232 i1 += l;
1233 if (i2 < 0)
1234 i2 += l;
1235 }
1236 }
1237 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001238 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1239 int res;
1240 PyObject *slice = sliceobj_from_intint(i1, i2);
1241 if (!slice)
1242 return -1;
1243 res = mp->mp_ass_subscript(s, slice, o);
1244 Py_DECREF(slice);
1245 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001246 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001247
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 type_error("object doesn't support slice assignment");
1249 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001250}
1251
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001252int
Fred Drake79912472000-07-09 04:06:11 +00001253PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001254{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001256
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257 if (s == NULL) {
1258 null_error();
1259 return -1;
1260 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001261
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262 m = s->ob_type->tp_as_sequence;
1263 if (m && m->sq_ass_slice) {
1264 if (i1 < 0 || i2 < 0) {
1265 if (m->sq_length) {
1266 int l = (*m->sq_length)(s);
1267 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001268 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001269 if (i1 < 0)
1270 i1 += l;
1271 if (i2 < 0)
1272 i2 += l;
1273 }
1274 }
1275 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1276 }
1277 type_error("object doesn't support slice deletion");
1278 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001279}
1280
Guido van Rossume15dee51995-07-18 14:12:02 +00001281PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001282PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001283{
Tim Peters6912d4d2001-05-05 03:56:37 +00001284 PyObject *it; /* iter(v) */
1285 int n; /* guess for result tuple size */
1286 PyObject *result;
1287 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001288
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001289 if (v == NULL)
1290 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001291
Tim Peters6912d4d2001-05-05 03:56:37 +00001292 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001293 if (PyTuple_CheckExact(v)) {
1294 /* Note that we can't know whether it's safe to return
1295 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001296 to exact tuples here. In contrast, lists always make
1297 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001298 Py_INCREF(v);
1299 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001300 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301 if (PyList_Check(v))
1302 return PyList_AsTuple(v);
1303
Tim Peters6912d4d2001-05-05 03:56:37 +00001304 /* Get iterator. */
1305 it = PyObject_GetIter(v);
1306 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001307 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001308
Tim Peters6912d4d2001-05-05 03:56:37 +00001309 /* Guess result size and allocate space. */
1310 n = PySequence_Size(v);
1311 if (n < 0) {
1312 PyErr_Clear();
1313 n = 10; /* arbitrary */
1314 }
1315 result = PyTuple_New(n);
1316 if (result == NULL)
1317 goto Fail;
1318
1319 /* Fill the tuple. */
1320 for (j = 0; ; ++j) {
1321 PyObject *item = PyIter_Next(it);
1322 if (item == NULL) {
1323 if (PyErr_Occurred())
1324 goto Fail;
1325 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001327 if (j >= n) {
1328 if (n < 500)
1329 n += 10;
1330 else
1331 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001332 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001333 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001334 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001335 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001336 }
1337 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001338 }
1339
Tim Peters6912d4d2001-05-05 03:56:37 +00001340 /* Cut tuple back if guess was too large. */
1341 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001342 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001343 goto Fail;
1344
1345 Py_DECREF(it);
1346 return result;
1347
1348Fail:
1349 Py_XDECREF(result);
1350 Py_DECREF(it);
1351 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001352}
1353
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001354PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001355PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001356{
Tim Petersf553f892001-05-01 20:45:31 +00001357 PyObject *it; /* iter(v) */
1358 PyObject *result; /* result list */
1359 int n; /* guess for result list size */
1360 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001361
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001362 if (v == NULL)
1363 return null_error();
1364
Tim Petersf553f892001-05-01 20:45:31 +00001365 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001366 if (PyList_Check(v))
1367 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1368
Tim Petersf553f892001-05-01 20:45:31 +00001369 /* Get iterator. There may be some low-level efficiency to be gained
1370 * by caching the tp_iternext slot instead of using PyIter_Next()
1371 * later, but premature optimization is the root etc.
1372 */
1373 it = PyObject_GetIter(v);
1374 if (it == NULL)
1375 return NULL;
1376
1377 /* Guess a result list size. */
1378 n = -1; /* unknown */
1379 if (PySequence_Check(v) &&
1380 v->ob_type->tp_as_sequence->sq_length) {
1381 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001382 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001383 PyErr_Clear();
1384 }
1385 if (n < 0)
1386 n = 8; /* arbitrary */
1387 result = PyList_New(n);
1388 if (result == NULL) {
1389 Py_DECREF(it);
1390 return NULL;
1391 }
1392
1393 /* Run iterator to exhaustion. */
1394 for (i = 0; ; i++) {
1395 PyObject *item = PyIter_Next(it);
1396 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001397 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001398 Py_DECREF(result);
1399 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001400 }
Tim Petersf553f892001-05-01 20:45:31 +00001401 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001402 }
Tim Petersf553f892001-05-01 20:45:31 +00001403 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001404 PyList_SET_ITEM(result, i, item); /* steals ref */
1405 else {
1406 int status = PyList_Append(result, item);
1407 Py_DECREF(item); /* append creates a new ref */
1408 if (status < 0) {
1409 Py_DECREF(result);
1410 result = NULL;
1411 break;
1412 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001414 }
Tim Petersf553f892001-05-01 20:45:31 +00001415
1416 /* Cut back result list if initial guess was too large. */
1417 if (i < n && result != NULL) {
1418 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1419 Py_DECREF(result);
1420 result = NULL;
1421 }
1422 }
1423 Py_DECREF(it);
1424 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001425}
1426
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001427PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001428PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001429{
1430 if (v == NULL)
1431 return null_error();
1432
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001433 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001434 Py_INCREF(v);
1435 return v;
1436 }
1437
1438 v = PySequence_Tuple(v);
1439 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1440 return type_error(m);
1441
1442 return v;
1443}
1444
Tim Peters16a77ad2001-09-08 04:00:12 +00001445/* Iterate over seq. Result depends on the operation:
1446 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1447 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1448 set ValueError and return -1 if none found; also return -1 on error.
1449 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1450*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001451int
Tim Peters16a77ad2001-09-08 04:00:12 +00001452_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001453{
Tim Peters16a77ad2001-09-08 04:00:12 +00001454 int n;
1455 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1456 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001457
Tim Peters16a77ad2001-09-08 04:00:12 +00001458 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001459 null_error();
1460 return -1;
1461 }
Tim Peters75f8e352001-05-05 11:33:43 +00001462
Tim Peters16a77ad2001-09-08 04:00:12 +00001463 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001464 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001465 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001467 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001468
Tim Peters16a77ad2001-09-08 04:00:12 +00001469 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001470 for (;;) {
1471 int cmp;
1472 PyObject *item = PyIter_Next(it);
1473 if (item == NULL) {
1474 if (PyErr_Occurred())
1475 goto Fail;
1476 break;
1477 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001478
1479 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001480 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001481 if (cmp < 0)
1482 goto Fail;
1483 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001484 switch (operation) {
1485 case PY_ITERSEARCH_COUNT:
1486 ++n;
1487 if (n <= 0) {
1488 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001489 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001490 goto Fail;
1491 }
1492 break;
1493
1494 case PY_ITERSEARCH_INDEX:
1495 if (wrapped) {
1496 PyErr_SetString(PyExc_OverflowError,
1497 "index exceeds C int size");
1498 goto Fail;
1499 }
1500 goto Done;
1501
1502 case PY_ITERSEARCH_CONTAINS:
1503 n = 1;
1504 goto Done;
1505
1506 default:
1507 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001508 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001509 }
1510
1511 if (operation == PY_ITERSEARCH_INDEX) {
1512 ++n;
1513 if (n <= 0)
1514 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001515 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001516 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001517
1518 if (operation != PY_ITERSEARCH_INDEX)
1519 goto Done;
1520
1521 PyErr_SetString(PyExc_ValueError,
1522 "sequence.index(x): x not in sequence");
1523 /* fall into failure code */
1524Fail:
1525 n = -1;
1526 /* fall through */
1527Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001528 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001529 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001530
Guido van Rossume15dee51995-07-18 14:12:02 +00001531}
1532
Tim Peters16a77ad2001-09-08 04:00:12 +00001533/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001534int
Tim Peters16a77ad2001-09-08 04:00:12 +00001535PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001536{
Tim Peters16a77ad2001-09-08 04:00:12 +00001537 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001538}
1539
Tim Peterscb8d3682001-05-05 21:05:01 +00001540/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001541 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001542 */
1543int
1544PySequence_Contains(PyObject *seq, PyObject *ob)
1545{
1546 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1547 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1548 if (sqm != NULL && sqm->sq_contains != NULL)
1549 return (*sqm->sq_contains)(seq, ob);
1550 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001551 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001552}
1553
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001554/* Backwards compatibility */
1555#undef PySequence_In
1556int
Fred Drake79912472000-07-09 04:06:11 +00001557PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001558{
1559 return PySequence_Contains(w, v);
1560}
1561
1562int
Fred Drake79912472000-07-09 04:06:11 +00001563PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001564{
Tim Peters16a77ad2001-09-08 04:00:12 +00001565 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001566}
1567
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001568/* Operations on mappings */
1569
1570int
Fred Drake79912472000-07-09 04:06:11 +00001571PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001572{
Guido van Rossum8700b422001-09-07 20:20:11 +00001573 return o && o->ob_type->tp_as_mapping &&
1574 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001575}
1576
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001577int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001578PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001579{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001580 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001581
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001582 if (o == NULL) {
1583 null_error();
1584 return -1;
1585 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001586
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001587 m = o->ob_type->tp_as_mapping;
1588 if (m && m->mp_length)
1589 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001590
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001591 type_error("len() of unsized object");
1592 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001593}
1594
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001595#undef PyMapping_Length
1596int
1597PyMapping_Length(PyObject *o)
1598{
1599 return PyMapping_Size(o);
1600}
1601#define PyMapping_Length PyMapping_Size
1602
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001603PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001604PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001605{
1606 PyObject *okey, *r;
1607
1608 if (key == NULL)
1609 return null_error();
1610
1611 okey = PyString_FromString(key);
1612 if (okey == NULL)
1613 return NULL;
1614 r = PyObject_GetItem(o, okey);
1615 Py_DECREF(okey);
1616 return r;
1617}
1618
1619int
Fred Drake79912472000-07-09 04:06:11 +00001620PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001621{
1622 PyObject *okey;
1623 int r;
1624
1625 if (key == NULL) {
1626 null_error();
1627 return -1;
1628 }
1629
1630 okey = PyString_FromString(key);
1631 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001632 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001633 r = PyObject_SetItem(o, okey, value);
1634 Py_DECREF(okey);
1635 return r;
1636}
1637
1638int
Fred Drake79912472000-07-09 04:06:11 +00001639PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001640{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001641 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001642
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001643 v = PyMapping_GetItemString(o, key);
1644 if (v) {
1645 Py_DECREF(v);
1646 return 1;
1647 }
1648 PyErr_Clear();
1649 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001650}
1651
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001652int
Fred Drake79912472000-07-09 04:06:11 +00001653PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001654{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001655 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001656
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001657 v = PyObject_GetItem(o, key);
1658 if (v) {
1659 Py_DECREF(v);
1660 return 1;
1661 }
1662 PyErr_Clear();
1663 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001664}
1665
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001666/* Operations on callable objects */
1667
1668/* XXX PyCallable_Check() is in object.c */
1669
Guido van Rossume15dee51995-07-18 14:12:02 +00001670PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001671PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001672{
Guido van Rossum5560b742001-09-14 16:47:50 +00001673 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001674}
Guido van Rossume15dee51995-07-18 14:12:02 +00001675
1676PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001677PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1678{
1679 ternaryfunc call;
1680
1681 if ((call = func->ob_type->tp_call) != NULL) {
1682 PyObject *result = (*call)(func, arg, kw);
1683 if (result == NULL && !PyErr_Occurred())
1684 PyErr_SetString(
1685 PyExc_SystemError,
1686 "NULL result without error in PyObject_Call");
1687 return result;
1688 }
Fred Drake573395a2001-11-01 20:26:12 +00001689 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1690 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001691 return NULL;
1692}
1693
1694PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001695PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001696{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001697 va_list va;
1698 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001699
Fred Drakeb92cf062001-10-27 06:16:31 +00001700 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001701 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001702
Fred Drakeb92cf062001-10-27 06:16:31 +00001703 if (format && *format) {
1704 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001705 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001706 va_end(va);
1707 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001708 else
1709 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001710
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001711 if (args == NULL)
1712 return NULL;
1713
1714 if (!PyTuple_Check(args)) {
1715 PyObject *a;
1716
1717 a = PyTuple_New(1);
1718 if (a == NULL)
1719 return NULL;
1720 if (PyTuple_SetItem(a, 0, args) < 0)
1721 return NULL;
1722 args = a;
1723 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001724 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001725
1726 Py_DECREF(args);
1727
1728 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001729}
1730
1731PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001732PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001733{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001734 va_list va;
1735 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001736
Fred Drakeb92cf062001-10-27 06:16:31 +00001737 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001738 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001739
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001740 func = PyObject_GetAttrString(o, name);
1741 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001742 PyErr_SetString(PyExc_AttributeError, name);
1743 return 0;
1744 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001745
Fred Drakeb92cf062001-10-27 06:16:31 +00001746 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001747 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001748
Fred Drakeb92cf062001-10-27 06:16:31 +00001749 if (format && *format) {
1750 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001751 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001752 va_end(va);
1753 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001754 else
1755 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001756
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001757 if (!args)
1758 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001759
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760 if (!PyTuple_Check(args)) {
1761 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001762
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001763 a = PyTuple_New(1);
1764 if (a == NULL)
1765 return NULL;
1766 if (PyTuple_SetItem(a, 0, args) < 0)
1767 return NULL;
1768 args = a;
1769 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001770
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001771 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001772
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001773 Py_DECREF(args);
1774 Py_DECREF(func);
1775
1776 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001777}
Guido van Rossum823649d2001-03-21 18:40:58 +00001778
1779
Fred Drakeb421b8c2001-10-26 16:21:32 +00001780static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001781objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001782{
1783 int i, n = 0;
1784 va_list countva;
1785 PyObject *result, *tmp;
1786
1787#ifdef VA_LIST_IS_ARRAY
1788 memcpy(countva, va, sizeof(va_list));
1789#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001790#ifdef __va_copy
1791 __va_copy(countva, va);
1792#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001793 countva = va;
1794#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001795#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001796
1797 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1798 ++n;
1799 result = PyTuple_New(n);
1800 if (result != NULL && n > 0) {
1801 for (i = 0; i < n; ++i) {
1802 tmp = (PyObject *)va_arg(va, PyObject *);
1803 PyTuple_SET_ITEM(result, i, tmp);
1804 Py_INCREF(tmp);
1805 }
1806 }
1807 return result;
1808}
1809
1810PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001811PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001812{
1813 PyObject *args, *tmp;
1814 va_list vargs;
1815
1816 if (callable == NULL || name == NULL)
1817 return null_error();
1818
1819 callable = PyObject_GetAttr(callable, name);
1820 if (callable == NULL)
1821 return NULL;
1822
1823 /* count the args */
1824 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001825 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001826 va_end(vargs);
1827 if (args == NULL) {
1828 Py_DECREF(callable);
1829 return NULL;
1830 }
1831 tmp = PyObject_Call(callable, args, NULL);
1832 Py_DECREF(args);
1833 Py_DECREF(callable);
1834
1835 return tmp;
1836}
1837
1838PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001839PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001840{
1841 PyObject *args, *tmp;
1842 va_list vargs;
1843
1844 if (callable == NULL)
1845 return null_error();
1846
1847 /* count the args */
1848 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001849 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001850 va_end(vargs);
1851 if (args == NULL)
1852 return NULL;
1853 tmp = PyObject_Call(callable, args, NULL);
1854 Py_DECREF(args);
1855
1856 return tmp;
1857}
1858
1859
Guido van Rossum823649d2001-03-21 18:40:58 +00001860/* isinstance(), issubclass() */
1861
Barry Warsawf16951c2002-04-23 22:45:44 +00001862/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1863 * state that will almost never happen.
1864 *
1865 * 0. creating the __bases__ static string could get a MemoryError
1866 * 1. getattr(cls, '__bases__') could raise an AttributeError
1867 * 2. getattr(cls, '__bases__') could raise some other exception
1868 * 3. getattr(cls, '__bases__') could return a tuple
1869 * 4. getattr(cls, '__bases__') could return something other than a tuple
1870 *
1871 * Only state #3 is a non-error state and only it returns a non-NULL object
1872 * (it returns the retrieved tuple).
1873 *
1874 * Any raised AttributeErrors are masked by clearing the exception and
1875 * returning NULL. If an object other than a tuple comes out of __bases__,
1876 * then again, the return value is NULL. So yes, these two situations
1877 * produce exactly the same results: NULL is returned and no error is set.
1878 *
1879 * If some exception other than AttributeError is raised, then NULL is also
1880 * returned, but the exception is not cleared. That's because we want the
1881 * exception to be propagated along.
1882 *
1883 * Callers are expected to test for PyErr_Occurred() when the return value
1884 * is NULL to decide whether a valid exception should be propagated or not.
1885 * When there's no exception to propagate, it's customary for the caller to
1886 * set a TypeError.
1887 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001888static PyObject *
1889abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001890{
1891 static PyObject *__bases__ = NULL;
1892 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001893
1894 if (__bases__ == NULL) {
1895 __bases__ = PyString_FromString("__bases__");
1896 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001897 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001898 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001899 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001900 if (bases == NULL) {
1901 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1902 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001903 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001904 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001905 if (!PyTuple_Check(bases)) {
1906 Py_DECREF(bases);
1907 return NULL;
1908 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001909 return bases;
1910}
1911
1912
1913static int
1914abstract_issubclass(PyObject *derived, PyObject *cls)
1915{
1916 PyObject *bases;
1917 int i, n;
1918 int r = 0;
1919
1920
Guido van Rossum823649d2001-03-21 18:40:58 +00001921 if (derived == cls)
1922 return 1;
1923
Neil Schemenauer6b471292001-10-18 03:18:43 +00001924 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00001925 if (bases == NULL) {
1926 if (PyErr_Occurred())
1927 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00001928 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00001929 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001930 n = PyTuple_GET_SIZE(bases);
1931 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001932 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001933 if (r != 0)
1934 break;
1935 }
1936
1937 Py_DECREF(bases);
1938
1939 return r;
1940}
1941
1942int
1943PyObject_IsInstance(PyObject *inst, PyObject *cls)
1944{
1945 PyObject *icls;
1946 static PyObject *__class__ = NULL;
1947 int retval = 0;
1948
Neil Schemenauer6b471292001-10-18 03:18:43 +00001949 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1950 PyObject *inclass =
1951 (PyObject*)((PyInstanceObject*)inst)->in_class;
1952 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001953 }
1954 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001955 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001956 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001957 else if (PyTuple_Check(cls)) {
1958 /* Not a general sequence -- that opens up the road to
1959 recursion and stack overflow. */
1960 int i, n;
1961
1962 n = PyTuple_GET_SIZE(cls);
1963 for (i = 0; i < n; i++) {
1964 retval = PyObject_IsInstance(
1965 inst, PyTuple_GET_ITEM(cls, i));
1966 if (retval != 0)
1967 break;
1968 }
1969 return retval;
1970 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001971 else {
1972 PyObject *cls_bases = abstract_get_bases(cls);
1973 if (cls_bases == NULL) {
Barry Warsawf16951c2002-04-23 22:45:44 +00001974 /* Do not mask errors. */
1975 if (!PyErr_Occurred())
1976 PyErr_SetString(PyExc_TypeError,
Thomas Helleraee2d5f2002-06-05 12:55:19 +00001977 "isinstance() arg 2 must be a class, type,"
1978 " or tuple of classes and types");
Neil Schemenauer6b471292001-10-18 03:18:43 +00001979 return -1;
Guido van Rossum77660912002-04-16 16:32:50 +00001980 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001981 Py_DECREF(cls_bases);
Guido van Rossum823649d2001-03-21 18:40:58 +00001982 if (__class__ == NULL) {
1983 __class__ = PyString_FromString("__class__");
1984 if (__class__ == NULL)
1985 return -1;
1986 }
1987 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001988 if (icls == NULL) {
1989 PyErr_Clear();
1990 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001991 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001992 else {
1993 retval = abstract_issubclass(icls, cls);
1994 Py_DECREF(icls);
1995 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001996 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001997
Guido van Rossum823649d2001-03-21 18:40:58 +00001998 return retval;
1999}
2000
2001int
2002PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2003{
2004 int retval;
2005
2006 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002007 PyObject *derived_bases;
2008 PyObject *cls_bases;
Guido van Rossum77660912002-04-16 16:32:50 +00002009
Neil Schemenauer6b471292001-10-18 03:18:43 +00002010 derived_bases = abstract_get_bases(derived);
2011 if (derived_bases == NULL) {
Barry Warsawf16951c2002-04-23 22:45:44 +00002012 /* Do not mask errors */
2013 if (!PyErr_Occurred())
2014 PyErr_SetString(PyExc_TypeError,
Neil Schemenauer6b471292001-10-18 03:18:43 +00002015 "issubclass() arg 1 must be a class");
2016 return -1;
2017 }
2018 Py_DECREF(derived_bases);
2019
2020 cls_bases = abstract_get_bases(cls);
2021 if (cls_bases == NULL) {
Barry Warsawf16951c2002-04-23 22:45:44 +00002022 /* Do not mask errors */
2023 if (!PyErr_Occurred())
2024 PyErr_SetString(PyExc_TypeError,
Neil Schemenauer6b471292001-10-18 03:18:43 +00002025 "issubclass() arg 2 must be a class");
2026 return -1;
2027 }
2028 Py_DECREF(cls_bases);
2029
2030 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002031 }
2032 else {
2033 /* shortcut */
2034 if (!(retval = (derived == cls)))
2035 retval = PyClass_IsSubclass(derived, cls);
2036 }
2037
2038 return retval;
2039}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002040
2041PyObject *
2042PyObject_GetIter(PyObject *o)
2043{
2044 PyTypeObject *t = o->ob_type;
2045 getiterfunc f = NULL;
2046 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2047 f = t->tp_iter;
2048 if (f == NULL) {
2049 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002050 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002051 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002052 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002053 return NULL;
2054 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002055 else {
2056 PyObject *res = (*f)(o);
2057 if (res != NULL && !PyIter_Check(res)) {
2058 PyErr_Format(PyExc_TypeError,
2059 "iter() returned non-iterator "
2060 "of type '%.100s'",
2061 res->ob_type->tp_name);
2062 Py_DECREF(res);
2063 res = NULL;
2064 }
2065 return res;
2066 }
2067}
2068
Tim Petersf4848da2001-05-05 00:14:56 +00002069/* Return next item.
2070 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2071 * If the iteration terminates normally, return NULL and clear the
2072 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2073 * will be false.
2074 * Else return the next object. PyErr_Occurred() will be false.
2075 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002076PyObject *
2077PyIter_Next(PyObject *iter)
2078{
Tim Petersf4848da2001-05-05 00:14:56 +00002079 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002080 if (!PyIter_Check(iter)) {
2081 PyErr_Format(PyExc_TypeError,
2082 "'%.100s' object is not an iterator",
2083 iter->ob_type->tp_name);
2084 return NULL;
2085 }
Tim Petersf4848da2001-05-05 00:14:56 +00002086 result = (*iter->ob_type->tp_iternext)(iter);
2087 if (result == NULL &&
2088 PyErr_Occurred() &&
2089 PyErr_ExceptionMatches(PyExc_StopIteration))
2090 PyErr_Clear();
2091 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002092}