blob: 4f8dd3e533e49549e05d310490ab5feb3e401f96 [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{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000642 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000643 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000644#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000645 else if (PyUnicode_Check(v))
646 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000647#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000648 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000649}
650
651PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000652PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000653{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000654 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000655}
656
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000657/* Binary in-place operators */
658
659/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000660 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000661
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000662 - If the left hand object has the appropriate struct members, and
663 they are filled, call the appropriate function and return the
664 result. No coercion is done on the arguments; the left-hand object
665 is the one the operation is performed on, and it's up to the
666 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000667
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000668 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000669 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000670
671 */
672
Guido van Rossum77660912002-04-16 16:32:50 +0000673#define HASINPLACE(t) \
674 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000675
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000676static PyObject *
677binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
678 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000679{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000680 PyNumberMethods *mv = v->ob_type->tp_as_number;
681 if (mv != NULL && HASINPLACE(v)) {
682 binaryfunc *slot = NB_BINOP(mv, iop_slot);
683 if (*slot) {
684 PyObject *x = (*slot)(v, w);
685 if (x != Py_NotImplemented) {
686 return x;
687 }
688 Py_DECREF(x);
689 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000690 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000691 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000692}
693
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000694#define INPLACE_BINOP(func, iop, op, op_name) \
695 PyObject * \
696 func(PyObject *v, PyObject *w) { \
697 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000698 }
699
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000700INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
701INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
702INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
703INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
704INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
705INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
706INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000707
708PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000709PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
710{
711 /* XXX tp_flags test */
712 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
713 NB_SLOT(nb_floor_divide), "//=");
714}
715
716PyObject *
717PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
718{
719 /* XXX tp_flags test */
720 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
721 NB_SLOT(nb_true_divide), "/=");
722}
723
724PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000725PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
726{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000727 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000728
Guido van Rossumbb8be932000-09-01 23:27:32 +0000729 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000730 if (HASINPLACE(v))
731 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
732 if (f == NULL)
733 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000734 if (f != NULL)
735 return (*f)(v, w);
736 }
Guido van Rossum77660912002-04-16 16:32:50 +0000737 return binary_iop(v, w, NB_SLOT(nb_inplace_add),
738 NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000739}
740
741PyObject *
742PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
743{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000744 PyObject * (*g)(PyObject *, int) = NULL;
Guido van Rossume8fc6402002-04-16 16:44:51 +0000745 if (HASINPLACE(v) &&
746 v->ob_type->tp_as_sequence &&
747 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat) &&
748 !(v->ob_type->tp_as_number &&
749 v->ob_type->tp_as_number->nb_inplace_multiply))
750 {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000751 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000752 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000753 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000754 }
755 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000756 n = PyLong_AsLong(w);
757 if (n == -1 && PyErr_Occurred())
758 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759 }
760 else {
Guido van Rossum77660912002-04-16 16:32:50 +0000761 return type_error(
762 "can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000763 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000764 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000765 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000766 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
767 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000768}
769
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000770PyObject *
771PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
772{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000773 if (PyString_Check(v))
774 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000775#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000776 else if (PyUnicode_Check(v))
777 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000778#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000779 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000780 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
781 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000782}
783
784PyObject *
785PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
786{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000787 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
788 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
789 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000790 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000791 else {
792 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
793 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000794}
795
796
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000797/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000798
799PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000800PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000801{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000802 PyNumberMethods *m;
803
804 if (o == NULL)
805 return null_error();
806 m = o->ob_type->tp_as_number;
807 if (m && m->nb_negative)
808 return (*m->nb_negative)(o);
809
810 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000811}
812
813PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000814PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000815{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000816 PyNumberMethods *m;
817
818 if (o == NULL)
819 return null_error();
820 m = o->ob_type->tp_as_number;
821 if (m && m->nb_positive)
822 return (*m->nb_positive)(o);
823
824 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000825}
826
827PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000828PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000829{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000830 PyNumberMethods *m;
831
832 if (o == NULL)
833 return null_error();
834 m = o->ob_type->tp_as_number;
835 if (m && m->nb_invert)
836 return (*m->nb_invert)(o);
837
838 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000839}
840
841PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000842PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000843{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000844 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000845
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000846 if (o == NULL)
847 return null_error();
848 m = o->ob_type->tp_as_number;
849 if (m && m->nb_absolute)
850 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000851
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000852 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000853}
854
Guido van Rossum9e896b32000-04-05 20:11:21 +0000855/* Add a check for embedded NULL-bytes in the argument. */
856static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000857int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000858{
859 char *end;
860 PyObject *x;
861
862 x = PyInt_FromString((char*)s, &end, 10);
863 if (x == NULL)
864 return NULL;
865 if (end != s + len) {
866 PyErr_SetString(PyExc_ValueError,
867 "null byte in argument for int()");
868 Py_DECREF(x);
869 return NULL;
870 }
871 return x;
872}
873
Guido van Rossume15dee51995-07-18 14:12:02 +0000874PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000875PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000876{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000877 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000878 const char *buffer;
879 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000880
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000881 if (o == NULL)
882 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000883 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000884 Py_INCREF(o);
885 return o;
886 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000887 if (PyInt_Check(o)) {
888 PyIntObject *io = (PyIntObject*)o;
889 return PyInt_FromLong(io->ob_ival);
890 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000891 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000892 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000893 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000894#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000895 if (PyUnicode_Check(o))
896 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
897 PyUnicode_GET_SIZE(o),
898 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000899#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000900 m = o->ob_type->tp_as_number;
901 if (m && m->nb_int)
902 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000903 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000904 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000905
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000906 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000907}
908
Guido van Rossum9e896b32000-04-05 20:11:21 +0000909/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000910static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000911long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000912{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000913 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000914 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000915
Guido van Rossum4c08d552000-03-10 22:55:18 +0000916 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000917 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000918 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000919 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000920 PyErr_SetString(PyExc_ValueError,
921 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000922 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000923 return NULL;
924 }
925 return x;
926}
927
Guido van Rossume15dee51995-07-18 14:12:02 +0000928PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000929PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000930{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000931 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000932 const char *buffer;
933 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000934
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 if (o == NULL)
936 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000937 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000938 Py_INCREF(o);
939 return o;
940 }
Tim Petersdb30ac42002-03-02 04:14:21 +0000941 if (PyLong_Check(o))
942 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000943 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000944 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000945 * doesn't do. In particular long('9.5') must raise an
946 * exception, not truncate the float.
947 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000948 return long_from_string(PyString_AS_STRING(o),
949 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000950#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000951 if (PyUnicode_Check(o))
952 /* The above check is done in PyLong_FromUnicode(). */
953 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
954 PyUnicode_GET_SIZE(o),
955 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000956#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000957 m = o->ob_type->tp_as_number;
958 if (m && m->nb_long)
959 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000960 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
961 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000962
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000963 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000964}
965
966PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000967PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000968{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000969 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000970
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000971 if (o == NULL)
972 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000973 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000974 Py_INCREF(o);
975 return o;
976 }
Tim Peters7a50f252001-09-10 21:28:20 +0000977 if (PyFloat_Check(o)) {
978 PyFloatObject *po = (PyFloatObject *)o;
979 return PyFloat_FromDouble(po->ob_fval);
980 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000981 if (!PyString_Check(o)) {
982 m = o->ob_type->tp_as_number;
983 if (m && m->nb_float)
984 return m->nb_float(o);
985 }
986 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000987}
988
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000989/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000990
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000991int
Fred Drake79912472000-07-09 04:06:11 +0000992PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000993{
Guido van Rossum8700b422001-09-07 20:20:11 +0000994 return s != NULL && s->ob_type->tp_as_sequence &&
995 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000996}
997
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000998int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000999PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001000{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001002
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003 if (s == NULL) {
1004 null_error();
1005 return -1;
1006 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001007
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 m = s->ob_type->tp_as_sequence;
1009 if (m && m->sq_length)
1010 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001012 type_error("len() of unsized object");
1013 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001014}
1015
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001016#undef PySequence_Length
1017int
1018PySequence_Length(PyObject *s)
1019{
1020 return PySequence_Size(s);
1021}
1022#define PySequence_Length PySequence_Size
1023
Guido van Rossume15dee51995-07-18 14:12:02 +00001024PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001025PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001026{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001027 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001028
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001029 if (s == NULL || o == NULL)
1030 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001031
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032 m = s->ob_type->tp_as_sequence;
1033 if (m && m->sq_concat)
1034 return m->sq_concat(s, o);
1035
1036 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001037}
1038
1039PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001040PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001041{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001042 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001043
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001044 if (o == NULL)
1045 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001046
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001047 m = o->ob_type->tp_as_sequence;
1048 if (m && m->sq_repeat)
1049 return m->sq_repeat(o, count);
1050
1051 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001052}
1053
1054PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001055PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1056{
1057 PySequenceMethods *m;
1058
1059 if (s == NULL || o == NULL)
1060 return null_error();
1061
1062 m = s->ob_type->tp_as_sequence;
1063 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1064 return m->sq_inplace_concat(s, o);
1065 if (m && m->sq_concat)
1066 return m->sq_concat(s, o);
1067
1068 return type_error("object can't be concatenated");
1069}
1070
1071PyObject *
1072PySequence_InPlaceRepeat(PyObject *o, int count)
1073{
1074 PySequenceMethods *m;
1075
1076 if (o == NULL)
1077 return null_error();
1078
1079 m = o->ob_type->tp_as_sequence;
1080 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1081 return m->sq_inplace_repeat(o, count);
1082 if (m && m->sq_repeat)
1083 return m->sq_repeat(o, count);
1084
1085 return type_error("object can't be repeated");
1086}
1087
1088PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001089PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001090{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001091 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001092
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001093 if (s == NULL)
1094 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001096 m = s->ob_type->tp_as_sequence;
1097 if (m && m->sq_item) {
1098 if (i < 0) {
1099 if (m->sq_length) {
1100 int l = (*m->sq_length)(s);
1101 if (l < 0)
1102 return NULL;
1103 i += l;
1104 }
1105 }
1106 return m->sq_item(s, i);
1107 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001108
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001110}
1111
Thomas Wouters1d75a792000-08-17 22:37:32 +00001112static PyObject *
1113sliceobj_from_intint(int i, int j)
1114{
1115 PyObject *start, *end, *slice;
1116 start = PyInt_FromLong((long)i);
1117 if (!start)
1118 return NULL;
1119 end = PyInt_FromLong((long)j);
1120 if (!end) {
1121 Py_DECREF(start);
1122 return NULL;
1123 }
1124 slice = PySlice_New(start, end, NULL);
1125 Py_DECREF(start);
1126 Py_DECREF(end);
1127 return slice;
1128}
1129
Guido van Rossume15dee51995-07-18 14:12:02 +00001130PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001131PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001132{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001133 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001134 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001136 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001137
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001138 m = s->ob_type->tp_as_sequence;
1139 if (m && m->sq_slice) {
1140 if (i1 < 0 || i2 < 0) {
1141 if (m->sq_length) {
1142 int l = (*m->sq_length)(s);
1143 if (l < 0)
1144 return NULL;
1145 if (i1 < 0)
1146 i1 += l;
1147 if (i2 < 0)
1148 i2 += l;
1149 }
1150 }
1151 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001152 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1153 PyObject *res;
1154 PyObject *slice = sliceobj_from_intint(i1, i2);
1155 if (!slice)
1156 return NULL;
1157 res = mp->mp_subscript(s, slice);
1158 Py_DECREF(slice);
1159 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001160 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001161
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001163}
1164
1165int
Fred Drake79912472000-07-09 04:06:11 +00001166PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001167{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001168 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001169
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170 if (s == NULL) {
1171 null_error();
1172 return -1;
1173 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001174
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001175 m = s->ob_type->tp_as_sequence;
1176 if (m && m->sq_ass_item) {
1177 if (i < 0) {
1178 if (m->sq_length) {
1179 int l = (*m->sq_length)(s);
1180 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001181 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001182 i += l;
1183 }
1184 }
1185 return m->sq_ass_item(s, i, o);
1186 }
1187
1188 type_error("object doesn't support item assignment");
1189 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001190}
1191
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001192int
Fred Drake79912472000-07-09 04:06:11 +00001193PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001194{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001195 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001196
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197 if (s == NULL) {
1198 null_error();
1199 return -1;
1200 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001201
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 m = s->ob_type->tp_as_sequence;
1203 if (m && m->sq_ass_item) {
1204 if (i < 0) {
1205 if (m->sq_length) {
1206 int l = (*m->sq_length)(s);
1207 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001208 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001209 i += l;
1210 }
1211 }
1212 return m->sq_ass_item(s, i, (PyObject *)NULL);
1213 }
1214
1215 type_error("object doesn't support item deletion");
1216 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001217}
1218
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001219int
Fred Drake79912472000-07-09 04:06:11 +00001220PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001221{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001223 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001224
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001225 if (s == NULL) {
1226 null_error();
1227 return -1;
1228 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001229
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230 m = s->ob_type->tp_as_sequence;
1231 if (m && m->sq_ass_slice) {
1232 if (i1 < 0 || i2 < 0) {
1233 if (m->sq_length) {
1234 int l = (*m->sq_length)(s);
1235 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001236 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 if (i1 < 0)
1238 i1 += l;
1239 if (i2 < 0)
1240 i2 += l;
1241 }
1242 }
1243 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001244 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1245 int res;
1246 PyObject *slice = sliceobj_from_intint(i1, i2);
1247 if (!slice)
1248 return -1;
1249 res = mp->mp_ass_subscript(s, slice, o);
1250 Py_DECREF(slice);
1251 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001252 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001253
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254 type_error("object doesn't support slice assignment");
1255 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001256}
1257
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001258int
Fred Drake79912472000-07-09 04:06:11 +00001259PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001260{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001262
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263 if (s == NULL) {
1264 null_error();
1265 return -1;
1266 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001267
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001268 m = s->ob_type->tp_as_sequence;
1269 if (m && m->sq_ass_slice) {
1270 if (i1 < 0 || i2 < 0) {
1271 if (m->sq_length) {
1272 int l = (*m->sq_length)(s);
1273 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001274 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275 if (i1 < 0)
1276 i1 += l;
1277 if (i2 < 0)
1278 i2 += l;
1279 }
1280 }
1281 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1282 }
1283 type_error("object doesn't support slice deletion");
1284 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001285}
1286
Guido van Rossume15dee51995-07-18 14:12:02 +00001287PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001288PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001289{
Tim Peters6912d4d2001-05-05 03:56:37 +00001290 PyObject *it; /* iter(v) */
1291 int n; /* guess for result tuple size */
1292 PyObject *result;
1293 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001294
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001295 if (v == NULL)
1296 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001297
Tim Peters6912d4d2001-05-05 03:56:37 +00001298 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001299 if (PyTuple_CheckExact(v)) {
1300 /* Note that we can't know whether it's safe to return
1301 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001302 to exact tuples here. In contrast, lists always make
1303 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 Py_INCREF(v);
1305 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001306 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307 if (PyList_Check(v))
1308 return PyList_AsTuple(v);
1309
Tim Peters6912d4d2001-05-05 03:56:37 +00001310 /* Get iterator. */
1311 it = PyObject_GetIter(v);
1312 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001313 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001314
Tim Peters6912d4d2001-05-05 03:56:37 +00001315 /* Guess result size and allocate space. */
1316 n = PySequence_Size(v);
1317 if (n < 0) {
1318 PyErr_Clear();
1319 n = 10; /* arbitrary */
1320 }
1321 result = PyTuple_New(n);
1322 if (result == NULL)
1323 goto Fail;
1324
1325 /* Fill the tuple. */
1326 for (j = 0; ; ++j) {
1327 PyObject *item = PyIter_Next(it);
1328 if (item == NULL) {
1329 if (PyErr_Occurred())
1330 goto Fail;
1331 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001332 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001333 if (j >= n) {
1334 if (n < 500)
1335 n += 10;
1336 else
1337 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001338 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001339 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001340 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001341 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001342 }
1343 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001344 }
1345
Tim Peters6912d4d2001-05-05 03:56:37 +00001346 /* Cut tuple back if guess was too large. */
1347 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001348 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001349 goto Fail;
1350
1351 Py_DECREF(it);
1352 return result;
1353
1354Fail:
1355 Py_XDECREF(result);
1356 Py_DECREF(it);
1357 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001358}
1359
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001360PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001361PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001362{
Tim Petersf553f892001-05-01 20:45:31 +00001363 PyObject *it; /* iter(v) */
1364 PyObject *result; /* result list */
1365 int n; /* guess for result list size */
1366 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001367
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001368 if (v == NULL)
1369 return null_error();
1370
Tim Petersf553f892001-05-01 20:45:31 +00001371 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001372 if (PyList_Check(v))
1373 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1374
Tim Petersf553f892001-05-01 20:45:31 +00001375 /* Get iterator. There may be some low-level efficiency to be gained
1376 * by caching the tp_iternext slot instead of using PyIter_Next()
1377 * later, but premature optimization is the root etc.
1378 */
1379 it = PyObject_GetIter(v);
1380 if (it == NULL)
1381 return NULL;
1382
1383 /* Guess a result list size. */
1384 n = -1; /* unknown */
1385 if (PySequence_Check(v) &&
1386 v->ob_type->tp_as_sequence->sq_length) {
1387 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001388 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001389 PyErr_Clear();
1390 }
1391 if (n < 0)
1392 n = 8; /* arbitrary */
1393 result = PyList_New(n);
1394 if (result == NULL) {
1395 Py_DECREF(it);
1396 return NULL;
1397 }
1398
1399 /* Run iterator to exhaustion. */
1400 for (i = 0; ; i++) {
1401 PyObject *item = PyIter_Next(it);
1402 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001403 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001404 Py_DECREF(result);
1405 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001406 }
Tim Petersf553f892001-05-01 20:45:31 +00001407 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001408 }
Tim Petersf553f892001-05-01 20:45:31 +00001409 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001410 PyList_SET_ITEM(result, i, item); /* steals ref */
1411 else {
1412 int status = PyList_Append(result, item);
1413 Py_DECREF(item); /* append creates a new ref */
1414 if (status < 0) {
1415 Py_DECREF(result);
1416 result = NULL;
1417 break;
1418 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001419 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001420 }
Tim Petersf553f892001-05-01 20:45:31 +00001421
1422 /* Cut back result list if initial guess was too large. */
1423 if (i < n && result != NULL) {
1424 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1425 Py_DECREF(result);
1426 result = NULL;
1427 }
1428 }
1429 Py_DECREF(it);
1430 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001431}
1432
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001433PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001434PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001435{
1436 if (v == NULL)
1437 return null_error();
1438
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001439 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001440 Py_INCREF(v);
1441 return v;
1442 }
1443
1444 v = PySequence_Tuple(v);
1445 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1446 return type_error(m);
1447
1448 return v;
1449}
1450
Tim Peters16a77ad2001-09-08 04:00:12 +00001451/* Iterate over seq. Result depends on the operation:
1452 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1453 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1454 set ValueError and return -1 if none found; also return -1 on error.
1455 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1456*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457int
Tim Peters16a77ad2001-09-08 04:00:12 +00001458_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001459{
Tim Peters16a77ad2001-09-08 04:00:12 +00001460 int n;
1461 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1462 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001463
Tim Peters16a77ad2001-09-08 04:00:12 +00001464 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001465 null_error();
1466 return -1;
1467 }
Tim Peters75f8e352001-05-05 11:33:43 +00001468
Tim Peters16a77ad2001-09-08 04:00:12 +00001469 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001470 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001471 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001472 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001473 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001474
Tim Peters16a77ad2001-09-08 04:00:12 +00001475 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001476 for (;;) {
1477 int cmp;
1478 PyObject *item = PyIter_Next(it);
1479 if (item == NULL) {
1480 if (PyErr_Occurred())
1481 goto Fail;
1482 break;
1483 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001484
1485 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001486 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001487 if (cmp < 0)
1488 goto Fail;
1489 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001490 switch (operation) {
1491 case PY_ITERSEARCH_COUNT:
1492 ++n;
1493 if (n <= 0) {
1494 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001495 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001496 goto Fail;
1497 }
1498 break;
1499
1500 case PY_ITERSEARCH_INDEX:
1501 if (wrapped) {
1502 PyErr_SetString(PyExc_OverflowError,
1503 "index exceeds C int size");
1504 goto Fail;
1505 }
1506 goto Done;
1507
1508 case PY_ITERSEARCH_CONTAINS:
1509 n = 1;
1510 goto Done;
1511
1512 default:
1513 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001514 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001515 }
1516
1517 if (operation == PY_ITERSEARCH_INDEX) {
1518 ++n;
1519 if (n <= 0)
1520 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001521 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001522 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001523
1524 if (operation != PY_ITERSEARCH_INDEX)
1525 goto Done;
1526
1527 PyErr_SetString(PyExc_ValueError,
1528 "sequence.index(x): x not in sequence");
1529 /* fall into failure code */
1530Fail:
1531 n = -1;
1532 /* fall through */
1533Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001534 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001535 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001536
Guido van Rossume15dee51995-07-18 14:12:02 +00001537}
1538
Tim Peters16a77ad2001-09-08 04:00:12 +00001539/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001540int
Tim Peters16a77ad2001-09-08 04:00:12 +00001541PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001542{
Tim Peters16a77ad2001-09-08 04:00:12 +00001543 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001544}
1545
Tim Peterscb8d3682001-05-05 21:05:01 +00001546/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001547 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001548 */
1549int
1550PySequence_Contains(PyObject *seq, PyObject *ob)
1551{
1552 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1553 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1554 if (sqm != NULL && sqm->sq_contains != NULL)
1555 return (*sqm->sq_contains)(seq, ob);
1556 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001557 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001558}
1559
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001560/* Backwards compatibility */
1561#undef PySequence_In
1562int
Fred Drake79912472000-07-09 04:06:11 +00001563PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001564{
1565 return PySequence_Contains(w, v);
1566}
1567
1568int
Fred Drake79912472000-07-09 04:06:11 +00001569PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001570{
Tim Peters16a77ad2001-09-08 04:00:12 +00001571 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001572}
1573
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001574/* Operations on mappings */
1575
1576int
Fred Drake79912472000-07-09 04:06:11 +00001577PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001578{
Guido van Rossum8700b422001-09-07 20:20:11 +00001579 return o && o->ob_type->tp_as_mapping &&
1580 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001581}
1582
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001583int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001584PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001585{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001586 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001587
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001588 if (o == NULL) {
1589 null_error();
1590 return -1;
1591 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001592
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001593 m = o->ob_type->tp_as_mapping;
1594 if (m && m->mp_length)
1595 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001596
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001597 type_error("len() of unsized object");
1598 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001599}
1600
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001601#undef PyMapping_Length
1602int
1603PyMapping_Length(PyObject *o)
1604{
1605 return PyMapping_Size(o);
1606}
1607#define PyMapping_Length PyMapping_Size
1608
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001609PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001610PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611{
1612 PyObject *okey, *r;
1613
1614 if (key == NULL)
1615 return null_error();
1616
1617 okey = PyString_FromString(key);
1618 if (okey == NULL)
1619 return NULL;
1620 r = PyObject_GetItem(o, okey);
1621 Py_DECREF(okey);
1622 return r;
1623}
1624
1625int
Fred Drake79912472000-07-09 04:06:11 +00001626PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001627{
1628 PyObject *okey;
1629 int r;
1630
1631 if (key == NULL) {
1632 null_error();
1633 return -1;
1634 }
1635
1636 okey = PyString_FromString(key);
1637 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001638 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001639 r = PyObject_SetItem(o, okey, value);
1640 Py_DECREF(okey);
1641 return r;
1642}
1643
1644int
Fred Drake79912472000-07-09 04:06:11 +00001645PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001646{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001647 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001648
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001649 v = PyMapping_GetItemString(o, key);
1650 if (v) {
1651 Py_DECREF(v);
1652 return 1;
1653 }
1654 PyErr_Clear();
1655 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001656}
1657
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001658int
Fred Drake79912472000-07-09 04:06:11 +00001659PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001660{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001661 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001662
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001663 v = PyObject_GetItem(o, key);
1664 if (v) {
1665 Py_DECREF(v);
1666 return 1;
1667 }
1668 PyErr_Clear();
1669 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001670}
1671
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001672/* Operations on callable objects */
1673
1674/* XXX PyCallable_Check() is in object.c */
1675
Guido van Rossume15dee51995-07-18 14:12:02 +00001676PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001677PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001678{
Guido van Rossum5560b742001-09-14 16:47:50 +00001679 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001680}
Guido van Rossume15dee51995-07-18 14:12:02 +00001681
1682PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001683PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1684{
1685 ternaryfunc call;
1686
1687 if ((call = func->ob_type->tp_call) != NULL) {
1688 PyObject *result = (*call)(func, arg, kw);
1689 if (result == NULL && !PyErr_Occurred())
1690 PyErr_SetString(
1691 PyExc_SystemError,
1692 "NULL result without error in PyObject_Call");
1693 return result;
1694 }
Fred Drake573395a2001-11-01 20:26:12 +00001695 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1696 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001697 return NULL;
1698}
1699
1700PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001701PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001702{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001703 va_list va;
1704 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001705
Fred Drakeb92cf062001-10-27 06:16:31 +00001706 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001707 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001708
Fred Drakeb92cf062001-10-27 06:16:31 +00001709 if (format && *format) {
1710 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001711 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001712 va_end(va);
1713 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714 else
1715 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001716
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001717 if (args == NULL)
1718 return NULL;
1719
1720 if (!PyTuple_Check(args)) {
1721 PyObject *a;
1722
1723 a = PyTuple_New(1);
1724 if (a == NULL)
1725 return NULL;
1726 if (PyTuple_SetItem(a, 0, args) < 0)
1727 return NULL;
1728 args = a;
1729 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001730 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001731
1732 Py_DECREF(args);
1733
1734 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001735}
1736
1737PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001738PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001739{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001740 va_list va;
1741 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001742
Fred Drakeb92cf062001-10-27 06:16:31 +00001743 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001744 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001745
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001746 func = PyObject_GetAttrString(o, name);
1747 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001748 PyErr_SetString(PyExc_AttributeError, name);
1749 return 0;
1750 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001751
Fred Drakeb92cf062001-10-27 06:16:31 +00001752 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001753 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001754
Fred Drakeb92cf062001-10-27 06:16:31 +00001755 if (format && *format) {
1756 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001757 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001758 va_end(va);
1759 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760 else
1761 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001762
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001763 if (!args)
1764 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001765
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001766 if (!PyTuple_Check(args)) {
1767 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001769 a = PyTuple_New(1);
1770 if (a == NULL)
1771 return NULL;
1772 if (PyTuple_SetItem(a, 0, args) < 0)
1773 return NULL;
1774 args = a;
1775 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001776
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001777 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001778
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001779 Py_DECREF(args);
1780 Py_DECREF(func);
1781
1782 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001783}
Guido van Rossum823649d2001-03-21 18:40:58 +00001784
1785
Fred Drakeb421b8c2001-10-26 16:21:32 +00001786static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001787objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001788{
1789 int i, n = 0;
1790 va_list countva;
1791 PyObject *result, *tmp;
1792
1793#ifdef VA_LIST_IS_ARRAY
1794 memcpy(countva, va, sizeof(va_list));
1795#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001796#ifdef __va_copy
1797 __va_copy(countva, va);
1798#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001799 countva = va;
1800#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001801#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001802
1803 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1804 ++n;
1805 result = PyTuple_New(n);
1806 if (result != NULL && n > 0) {
1807 for (i = 0; i < n; ++i) {
1808 tmp = (PyObject *)va_arg(va, PyObject *);
1809 PyTuple_SET_ITEM(result, i, tmp);
1810 Py_INCREF(tmp);
1811 }
1812 }
1813 return result;
1814}
1815
1816PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001817PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001818{
1819 PyObject *args, *tmp;
1820 va_list vargs;
1821
1822 if (callable == NULL || name == NULL)
1823 return null_error();
1824
1825 callable = PyObject_GetAttr(callable, name);
1826 if (callable == NULL)
1827 return NULL;
1828
1829 /* count the args */
1830 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001831 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001832 va_end(vargs);
1833 if (args == NULL) {
1834 Py_DECREF(callable);
1835 return NULL;
1836 }
1837 tmp = PyObject_Call(callable, args, NULL);
1838 Py_DECREF(args);
1839 Py_DECREF(callable);
1840
1841 return tmp;
1842}
1843
1844PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001845PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001846{
1847 PyObject *args, *tmp;
1848 va_list vargs;
1849
1850 if (callable == NULL)
1851 return null_error();
1852
1853 /* count the args */
1854 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001855 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001856 va_end(vargs);
1857 if (args == NULL)
1858 return NULL;
1859 tmp = PyObject_Call(callable, args, NULL);
1860 Py_DECREF(args);
1861
1862 return tmp;
1863}
1864
1865
Guido van Rossum823649d2001-03-21 18:40:58 +00001866/* isinstance(), issubclass() */
1867
Barry Warsawf16951c2002-04-23 22:45:44 +00001868/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1869 * state that will almost never happen.
1870 *
1871 * 0. creating the __bases__ static string could get a MemoryError
1872 * 1. getattr(cls, '__bases__') could raise an AttributeError
1873 * 2. getattr(cls, '__bases__') could raise some other exception
1874 * 3. getattr(cls, '__bases__') could return a tuple
1875 * 4. getattr(cls, '__bases__') could return something other than a tuple
1876 *
1877 * Only state #3 is a non-error state and only it returns a non-NULL object
1878 * (it returns the retrieved tuple).
1879 *
1880 * Any raised AttributeErrors are masked by clearing the exception and
1881 * returning NULL. If an object other than a tuple comes out of __bases__,
1882 * then again, the return value is NULL. So yes, these two situations
1883 * produce exactly the same results: NULL is returned and no error is set.
1884 *
1885 * If some exception other than AttributeError is raised, then NULL is also
1886 * returned, but the exception is not cleared. That's because we want the
1887 * exception to be propagated along.
1888 *
1889 * Callers are expected to test for PyErr_Occurred() when the return value
1890 * is NULL to decide whether a valid exception should be propagated or not.
1891 * When there's no exception to propagate, it's customary for the caller to
1892 * set a TypeError.
1893 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001894static PyObject *
1895abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001896{
1897 static PyObject *__bases__ = NULL;
1898 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001899
1900 if (__bases__ == NULL) {
1901 __bases__ = PyString_FromString("__bases__");
1902 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001903 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001904 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001905 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001906 if (bases == NULL) {
1907 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1908 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001909 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001910 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001911 if (!PyTuple_Check(bases)) {
1912 Py_DECREF(bases);
1913 return NULL;
1914 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001915 return bases;
1916}
1917
1918
1919static int
1920abstract_issubclass(PyObject *derived, PyObject *cls)
1921{
1922 PyObject *bases;
1923 int i, n;
1924 int r = 0;
1925
1926
Guido van Rossum823649d2001-03-21 18:40:58 +00001927 if (derived == cls)
1928 return 1;
1929
Neil Schemenauer6b471292001-10-18 03:18:43 +00001930 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00001931 if (bases == NULL) {
1932 if (PyErr_Occurred())
1933 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00001934 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00001935 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001936 n = PyTuple_GET_SIZE(bases);
1937 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001938 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001939 if (r != 0)
1940 break;
1941 }
1942
1943 Py_DECREF(bases);
1944
1945 return r;
1946}
1947
1948int
1949PyObject_IsInstance(PyObject *inst, PyObject *cls)
1950{
1951 PyObject *icls;
1952 static PyObject *__class__ = NULL;
1953 int retval = 0;
1954
Neil Schemenauer6b471292001-10-18 03:18:43 +00001955 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1956 PyObject *inclass =
1957 (PyObject*)((PyInstanceObject*)inst)->in_class;
1958 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001959 }
1960 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001961 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001962 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001963 else if (PyTuple_Check(cls)) {
1964 /* Not a general sequence -- that opens up the road to
1965 recursion and stack overflow. */
1966 int i, n;
1967
1968 n = PyTuple_GET_SIZE(cls);
1969 for (i = 0; i < n; i++) {
1970 retval = PyObject_IsInstance(
1971 inst, PyTuple_GET_ITEM(cls, i));
1972 if (retval != 0)
1973 break;
1974 }
1975 return retval;
1976 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001977 else {
1978 PyObject *cls_bases = abstract_get_bases(cls);
1979 if (cls_bases == NULL) {
Barry Warsawf16951c2002-04-23 22:45:44 +00001980 /* Do not mask errors. */
1981 if (!PyErr_Occurred())
1982 PyErr_SetString(PyExc_TypeError,
Thomas Helleraee2d5f2002-06-05 12:55:19 +00001983 "isinstance() arg 2 must be a class, type,"
1984 " or tuple of classes and types");
Neil Schemenauer6b471292001-10-18 03:18:43 +00001985 return -1;
Guido van Rossum77660912002-04-16 16:32:50 +00001986 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001987 Py_DECREF(cls_bases);
Guido van Rossum823649d2001-03-21 18:40:58 +00001988 if (__class__ == NULL) {
1989 __class__ = PyString_FromString("__class__");
1990 if (__class__ == NULL)
1991 return -1;
1992 }
1993 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001994 if (icls == NULL) {
1995 PyErr_Clear();
1996 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001997 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001998 else {
1999 retval = abstract_issubclass(icls, cls);
2000 Py_DECREF(icls);
2001 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002002 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002003
Guido van Rossum823649d2001-03-21 18:40:58 +00002004 return retval;
2005}
2006
2007int
2008PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2009{
2010 int retval;
2011
2012 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002013 PyObject *derived_bases;
2014 PyObject *cls_bases;
Guido van Rossum77660912002-04-16 16:32:50 +00002015
Neil Schemenauer6b471292001-10-18 03:18:43 +00002016 derived_bases = abstract_get_bases(derived);
2017 if (derived_bases == NULL) {
Barry Warsawf16951c2002-04-23 22:45:44 +00002018 /* Do not mask errors */
2019 if (!PyErr_Occurred())
2020 PyErr_SetString(PyExc_TypeError,
Neil Schemenauer6b471292001-10-18 03:18:43 +00002021 "issubclass() arg 1 must be a class");
2022 return -1;
2023 }
2024 Py_DECREF(derived_bases);
2025
2026 cls_bases = abstract_get_bases(cls);
2027 if (cls_bases == NULL) {
Barry Warsawf16951c2002-04-23 22:45:44 +00002028 /* Do not mask errors */
2029 if (!PyErr_Occurred())
2030 PyErr_SetString(PyExc_TypeError,
Neil Schemenauer6b471292001-10-18 03:18:43 +00002031 "issubclass() arg 2 must be a class");
2032 return -1;
2033 }
2034 Py_DECREF(cls_bases);
2035
2036 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002037 }
2038 else {
2039 /* shortcut */
2040 if (!(retval = (derived == cls)))
2041 retval = PyClass_IsSubclass(derived, cls);
2042 }
2043
2044 return retval;
2045}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002046
2047PyObject *
2048PyObject_GetIter(PyObject *o)
2049{
2050 PyTypeObject *t = o->ob_type;
2051 getiterfunc f = NULL;
2052 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2053 f = t->tp_iter;
2054 if (f == NULL) {
2055 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002056 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002057 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002058 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002059 return NULL;
2060 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002061 else {
2062 PyObject *res = (*f)(o);
2063 if (res != NULL && !PyIter_Check(res)) {
2064 PyErr_Format(PyExc_TypeError,
2065 "iter() returned non-iterator "
2066 "of type '%.100s'",
2067 res->ob_type->tp_name);
2068 Py_DECREF(res);
2069 res = NULL;
2070 }
2071 return res;
2072 }
2073}
2074
Tim Petersf4848da2001-05-05 00:14:56 +00002075/* Return next item.
2076 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2077 * If the iteration terminates normally, return NULL and clear the
2078 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2079 * will be false.
2080 * Else return the next object. PyErr_Occurred() will be false.
2081 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002082PyObject *
2083PyIter_Next(PyObject *iter)
2084{
Tim Petersf4848da2001-05-05 00:14:56 +00002085 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002086 if (!PyIter_Check(iter)) {
2087 PyErr_Format(PyExc_TypeError,
2088 "'%.100s' object is not an iterator",
2089 iter->ob_type->tp_name);
2090 return NULL;
2091 }
Tim Petersf4848da2001-05-05 00:14:56 +00002092 result = (*iter->ob_type->tp_iternext)(iter);
2093 if (result == NULL &&
2094 PyErr_Occurred() &&
2095 PyErr_ExceptionMatches(PyExc_StopIteration))
2096 PyErr_Clear();
2097 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002098}