blob: 8389774e2fa66242c2de1891cd3cf89227314e25 [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) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000321 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000322#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000323 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000324
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))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000355 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000356 if (w->ob_type != v->ob_type &&
357 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000358 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000359 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;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000390 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000391 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))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000469 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000470 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000471 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000472 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000473 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)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000497 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000498 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) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000522 slotz = NB_TERNOP(v->ob_type->tp_as_number,
523 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000524 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) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000545 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
546 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000547 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)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000676 binaryfunc slot = NB_BINOP(mv, iop_slot);
677 if (slot) {
678 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000679 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{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000767 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
768 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000769}
770
771PyObject *
772PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
773{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000774 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
775 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
776 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000777 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000778 else {
779 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
780 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000781}
782
783
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000784/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000785
786PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000787PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000788{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000789 PyNumberMethods *m;
790
791 if (o == NULL)
792 return null_error();
793 m = o->ob_type->tp_as_number;
794 if (m && m->nb_negative)
795 return (*m->nb_negative)(o);
796
797 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000798}
799
800PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000801PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000802{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000803 PyNumberMethods *m;
804
805 if (o == NULL)
806 return null_error();
807 m = o->ob_type->tp_as_number;
808 if (m && m->nb_positive)
809 return (*m->nb_positive)(o);
810
811 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000812}
813
814PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000815PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000816{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000817 PyNumberMethods *m;
818
819 if (o == NULL)
820 return null_error();
821 m = o->ob_type->tp_as_number;
822 if (m && m->nb_invert)
823 return (*m->nb_invert)(o);
824
825 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000826}
827
828PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000829PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000830{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000831 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000832
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000833 if (o == NULL)
834 return null_error();
835 m = o->ob_type->tp_as_number;
836 if (m && m->nb_absolute)
837 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000838
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000839 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000840}
841
Guido van Rossum9e896b32000-04-05 20:11:21 +0000842/* Add a check for embedded NULL-bytes in the argument. */
843static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000844int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000845{
846 char *end;
847 PyObject *x;
848
849 x = PyInt_FromString((char*)s, &end, 10);
850 if (x == NULL)
851 return NULL;
852 if (end != s + len) {
853 PyErr_SetString(PyExc_ValueError,
854 "null byte in argument for int()");
855 Py_DECREF(x);
856 return NULL;
857 }
858 return x;
859}
860
Guido van Rossume15dee51995-07-18 14:12:02 +0000861PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000862PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000863{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000864 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000865 const char *buffer;
866 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000867
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000868 if (o == NULL)
869 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000870 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000871 Py_INCREF(o);
872 return o;
873 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000874 if (PyInt_Check(o)) {
875 PyIntObject *io = (PyIntObject*)o;
876 return PyInt_FromLong(io->ob_ival);
877 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000878 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000879 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000880 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000881#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000882 if (PyUnicode_Check(o))
883 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
884 PyUnicode_GET_SIZE(o),
885 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000886#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000887 m = o->ob_type->tp_as_number;
888 if (m && m->nb_int)
889 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000890 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000891 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000892
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000893 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000894}
895
Guido van Rossum9e896b32000-04-05 20:11:21 +0000896/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000897static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000898long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000899{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000900 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000901 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000902
Guido van Rossum4c08d552000-03-10 22:55:18 +0000903 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000904 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000905 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000906 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000907 PyErr_SetString(PyExc_ValueError,
908 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000909 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000910 return NULL;
911 }
912 return x;
913}
914
Guido van Rossume15dee51995-07-18 14:12:02 +0000915PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000916PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000917{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000918 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000919 const char *buffer;
920 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000921
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000922 if (o == NULL)
923 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000924 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000925 Py_INCREF(o);
926 return o;
927 }
Tim Petersdb30ac42002-03-02 04:14:21 +0000928 if (PyLong_Check(o))
929 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000930 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000931 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000932 * doesn't do. In particular long('9.5') must raise an
933 * exception, not truncate the float.
934 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000935 return long_from_string(PyString_AS_STRING(o),
936 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000937#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000938 if (PyUnicode_Check(o))
939 /* The above check is done in PyLong_FromUnicode(). */
940 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
941 PyUnicode_GET_SIZE(o),
942 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000943#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000944 m = o->ob_type->tp_as_number;
945 if (m && m->nb_long)
946 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000947 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
948 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000949
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000950 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000951}
952
953PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000954PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000955{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000956 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000957
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000958 if (o == NULL)
959 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000960 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000961 Py_INCREF(o);
962 return o;
963 }
Tim Peters7a50f252001-09-10 21:28:20 +0000964 if (PyFloat_Check(o)) {
965 PyFloatObject *po = (PyFloatObject *)o;
966 return PyFloat_FromDouble(po->ob_fval);
967 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000968 if (!PyString_Check(o)) {
969 m = o->ob_type->tp_as_number;
970 if (m && m->nb_float)
971 return m->nb_float(o);
972 }
973 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000974}
975
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000976/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000977
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000978int
Fred Drake79912472000-07-09 04:06:11 +0000979PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000980{
Guido van Rossum8700b422001-09-07 20:20:11 +0000981 return s != NULL && s->ob_type->tp_as_sequence &&
982 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000983}
984
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000985int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000986PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000987{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000988 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000989
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000990 if (s == NULL) {
991 null_error();
992 return -1;
993 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000994
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000995 m = s->ob_type->tp_as_sequence;
996 if (m && m->sq_length)
997 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000998
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000999 type_error("len() of unsized object");
1000 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001001}
1002
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001003#undef PySequence_Length
1004int
1005PySequence_Length(PyObject *s)
1006{
1007 return PySequence_Size(s);
1008}
1009#define PySequence_Length PySequence_Size
1010
Guido van Rossume15dee51995-07-18 14:12:02 +00001011PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001012PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001013{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001014 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001015
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001016 if (s == NULL || o == NULL)
1017 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001018
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001019 m = s->ob_type->tp_as_sequence;
1020 if (m && m->sq_concat)
1021 return m->sq_concat(s, o);
1022
1023 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001024}
1025
1026PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001027PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001028{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001029 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001030
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001031 if (o == NULL)
1032 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001033
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 m = o->ob_type->tp_as_sequence;
1035 if (m && m->sq_repeat)
1036 return m->sq_repeat(o, count);
1037
1038 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001039}
1040
1041PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001042PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1043{
1044 PySequenceMethods *m;
1045
1046 if (s == NULL || o == NULL)
1047 return null_error();
1048
1049 m = s->ob_type->tp_as_sequence;
1050 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1051 return m->sq_inplace_concat(s, o);
1052 if (m && m->sq_concat)
1053 return m->sq_concat(s, o);
1054
1055 return type_error("object can't be concatenated");
1056}
1057
1058PyObject *
1059PySequence_InPlaceRepeat(PyObject *o, int count)
1060{
1061 PySequenceMethods *m;
1062
1063 if (o == NULL)
1064 return null_error();
1065
1066 m = o->ob_type->tp_as_sequence;
1067 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1068 return m->sq_inplace_repeat(o, count);
1069 if (m && m->sq_repeat)
1070 return m->sq_repeat(o, count);
1071
1072 return type_error("object can't be repeated");
1073}
1074
1075PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001076PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001077{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001078 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001079
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001080 if (s == NULL)
1081 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001082
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001083 m = s->ob_type->tp_as_sequence;
1084 if (m && m->sq_item) {
1085 if (i < 0) {
1086 if (m->sq_length) {
1087 int l = (*m->sq_length)(s);
1088 if (l < 0)
1089 return NULL;
1090 i += l;
1091 }
1092 }
1093 return m->sq_item(s, i);
1094 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001096 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001097}
1098
Thomas Wouters1d75a792000-08-17 22:37:32 +00001099static PyObject *
1100sliceobj_from_intint(int i, int j)
1101{
1102 PyObject *start, *end, *slice;
1103 start = PyInt_FromLong((long)i);
1104 if (!start)
1105 return NULL;
1106 end = PyInt_FromLong((long)j);
1107 if (!end) {
1108 Py_DECREF(start);
1109 return NULL;
1110 }
1111 slice = PySlice_New(start, end, NULL);
1112 Py_DECREF(start);
1113 Py_DECREF(end);
1114 return slice;
1115}
1116
Guido van Rossume15dee51995-07-18 14:12:02 +00001117PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001118PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001119{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001120 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001121 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001122
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001123 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001124
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001125 m = s->ob_type->tp_as_sequence;
1126 if (m && m->sq_slice) {
1127 if (i1 < 0 || i2 < 0) {
1128 if (m->sq_length) {
1129 int l = (*m->sq_length)(s);
1130 if (l < 0)
1131 return NULL;
1132 if (i1 < 0)
1133 i1 += l;
1134 if (i2 < 0)
1135 i2 += l;
1136 }
1137 }
1138 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001139 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1140 PyObject *res;
1141 PyObject *slice = sliceobj_from_intint(i1, i2);
1142 if (!slice)
1143 return NULL;
1144 res = mp->mp_subscript(s, slice);
1145 Py_DECREF(slice);
1146 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001147 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001148
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001149 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001150}
1151
1152int
Fred Drake79912472000-07-09 04:06:11 +00001153PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001154{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001155 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001156
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001157 if (s == NULL) {
1158 null_error();
1159 return -1;
1160 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001161
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162 m = s->ob_type->tp_as_sequence;
1163 if (m && m->sq_ass_item) {
1164 if (i < 0) {
1165 if (m->sq_length) {
1166 int l = (*m->sq_length)(s);
1167 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001168 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001169 i += l;
1170 }
1171 }
1172 return m->sq_ass_item(s, i, o);
1173 }
1174
1175 type_error("object doesn't support item assignment");
1176 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001177}
1178
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001179int
Fred Drake79912472000-07-09 04:06:11 +00001180PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001181{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001182 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001183
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001184 if (s == NULL) {
1185 null_error();
1186 return -1;
1187 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001188
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 m = s->ob_type->tp_as_sequence;
1190 if (m && m->sq_ass_item) {
1191 if (i < 0) {
1192 if (m->sq_length) {
1193 int l = (*m->sq_length)(s);
1194 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001195 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001196 i += l;
1197 }
1198 }
1199 return m->sq_ass_item(s, i, (PyObject *)NULL);
1200 }
1201
1202 type_error("object doesn't support item deletion");
1203 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001204}
1205
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001206int
Fred Drake79912472000-07-09 04:06:11 +00001207PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001208{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001209 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001210 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001211
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001212 if (s == NULL) {
1213 null_error();
1214 return -1;
1215 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001216
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217 m = s->ob_type->tp_as_sequence;
1218 if (m && m->sq_ass_slice) {
1219 if (i1 < 0 || i2 < 0) {
1220 if (m->sq_length) {
1221 int l = (*m->sq_length)(s);
1222 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001223 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001224 if (i1 < 0)
1225 i1 += l;
1226 if (i2 < 0)
1227 i2 += l;
1228 }
1229 }
1230 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001231 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1232 int res;
1233 PyObject *slice = sliceobj_from_intint(i1, i2);
1234 if (!slice)
1235 return -1;
1236 res = mp->mp_ass_subscript(s, slice, o);
1237 Py_DECREF(slice);
1238 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001239 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001240
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241 type_error("object doesn't support slice assignment");
1242 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001243}
1244
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001245int
Fred Drake79912472000-07-09 04:06:11 +00001246PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001247{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001249
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001250 if (s == NULL) {
1251 null_error();
1252 return -1;
1253 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001254
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255 m = s->ob_type->tp_as_sequence;
1256 if (m && m->sq_ass_slice) {
1257 if (i1 < 0 || i2 < 0) {
1258 if (m->sq_length) {
1259 int l = (*m->sq_length)(s);
1260 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001261 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262 if (i1 < 0)
1263 i1 += l;
1264 if (i2 < 0)
1265 i2 += l;
1266 }
1267 }
1268 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1269 }
1270 type_error("object doesn't support slice deletion");
1271 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001272}
1273
Guido van Rossume15dee51995-07-18 14:12:02 +00001274PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001275PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001276{
Tim Peters6912d4d2001-05-05 03:56:37 +00001277 PyObject *it; /* iter(v) */
1278 int n; /* guess for result tuple size */
1279 PyObject *result;
1280 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001281
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001282 if (v == NULL)
1283 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001284
Tim Peters6912d4d2001-05-05 03:56:37 +00001285 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001286 if (PyTuple_CheckExact(v)) {
1287 /* Note that we can't know whether it's safe to return
1288 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001289 to exact tuples here. In contrast, lists always make
1290 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291 Py_INCREF(v);
1292 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001293 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001294 if (PyList_Check(v))
1295 return PyList_AsTuple(v);
1296
Tim Peters6912d4d2001-05-05 03:56:37 +00001297 /* Get iterator. */
1298 it = PyObject_GetIter(v);
1299 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001300 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301
Tim Peters6912d4d2001-05-05 03:56:37 +00001302 /* Guess result size and allocate space. */
1303 n = PySequence_Size(v);
1304 if (n < 0) {
1305 PyErr_Clear();
1306 n = 10; /* arbitrary */
1307 }
1308 result = PyTuple_New(n);
1309 if (result == NULL)
1310 goto Fail;
1311
1312 /* Fill the tuple. */
1313 for (j = 0; ; ++j) {
1314 PyObject *item = PyIter_Next(it);
1315 if (item == NULL) {
1316 if (PyErr_Occurred())
1317 goto Fail;
1318 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001320 if (j >= n) {
1321 if (n < 500)
1322 n += 10;
1323 else
1324 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001325 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001326 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001327 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001328 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001329 }
1330 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 }
1332
Tim Peters6912d4d2001-05-05 03:56:37 +00001333 /* Cut tuple back if guess was too large. */
1334 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001335 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001336 goto Fail;
1337
1338 Py_DECREF(it);
1339 return result;
1340
1341Fail:
1342 Py_XDECREF(result);
1343 Py_DECREF(it);
1344 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001345}
1346
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001347PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001348PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001349{
Tim Petersf553f892001-05-01 20:45:31 +00001350 PyObject *it; /* iter(v) */
1351 PyObject *result; /* result list */
1352 int n; /* guess for result list size */
1353 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001354
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001355 if (v == NULL)
1356 return null_error();
1357
Tim Petersf553f892001-05-01 20:45:31 +00001358 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001359 if (PyList_Check(v))
1360 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1361
Tim Petersf553f892001-05-01 20:45:31 +00001362 /* Get iterator. There may be some low-level efficiency to be gained
1363 * by caching the tp_iternext slot instead of using PyIter_Next()
1364 * later, but premature optimization is the root etc.
1365 */
1366 it = PyObject_GetIter(v);
1367 if (it == NULL)
1368 return NULL;
1369
1370 /* Guess a result list size. */
1371 n = -1; /* unknown */
1372 if (PySequence_Check(v) &&
1373 v->ob_type->tp_as_sequence->sq_length) {
1374 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001376 PyErr_Clear();
1377 }
1378 if (n < 0)
1379 n = 8; /* arbitrary */
1380 result = PyList_New(n);
1381 if (result == NULL) {
1382 Py_DECREF(it);
1383 return NULL;
1384 }
1385
1386 /* Run iterator to exhaustion. */
1387 for (i = 0; ; i++) {
1388 PyObject *item = PyIter_Next(it);
1389 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001390 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001391 Py_DECREF(result);
1392 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001393 }
Tim Petersf553f892001-05-01 20:45:31 +00001394 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001395 }
Tim Petersf553f892001-05-01 20:45:31 +00001396 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001397 PyList_SET_ITEM(result, i, item); /* steals ref */
1398 else {
1399 int status = PyList_Append(result, item);
1400 Py_DECREF(item); /* append creates a new ref */
1401 if (status < 0) {
1402 Py_DECREF(result);
1403 result = NULL;
1404 break;
1405 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001406 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001407 }
Tim Petersf553f892001-05-01 20:45:31 +00001408
1409 /* Cut back result list if initial guess was too large. */
1410 if (i < n && result != NULL) {
1411 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1412 Py_DECREF(result);
1413 result = NULL;
1414 }
1415 }
1416 Py_DECREF(it);
1417 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001418}
1419
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001420PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001421PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001422{
1423 if (v == NULL)
1424 return null_error();
1425
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001426 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001427 Py_INCREF(v);
1428 return v;
1429 }
1430
1431 v = PySequence_Tuple(v);
1432 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1433 return type_error(m);
1434
1435 return v;
1436}
1437
Tim Peters16a77ad2001-09-08 04:00:12 +00001438/* Iterate over seq. Result depends on the operation:
1439 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1440 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1441 set ValueError and return -1 if none found; also return -1 on error.
1442 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1443*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001444int
Tim Peters16a77ad2001-09-08 04:00:12 +00001445_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001446{
Tim Peters16a77ad2001-09-08 04:00:12 +00001447 int n;
1448 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1449 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001450
Tim Peters16a77ad2001-09-08 04:00:12 +00001451 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001452 null_error();
1453 return -1;
1454 }
Tim Peters75f8e352001-05-05 11:33:43 +00001455
Tim Peters16a77ad2001-09-08 04:00:12 +00001456 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001457 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001458 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001459 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001460 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001461
Tim Peters16a77ad2001-09-08 04:00:12 +00001462 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001463 for (;;) {
1464 int cmp;
1465 PyObject *item = PyIter_Next(it);
1466 if (item == NULL) {
1467 if (PyErr_Occurred())
1468 goto Fail;
1469 break;
1470 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001471
1472 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001473 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001474 if (cmp < 0)
1475 goto Fail;
1476 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001477 switch (operation) {
1478 case PY_ITERSEARCH_COUNT:
1479 ++n;
1480 if (n <= 0) {
1481 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001482 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001483 goto Fail;
1484 }
1485 break;
1486
1487 case PY_ITERSEARCH_INDEX:
1488 if (wrapped) {
1489 PyErr_SetString(PyExc_OverflowError,
1490 "index exceeds C int size");
1491 goto Fail;
1492 }
1493 goto Done;
1494
1495 case PY_ITERSEARCH_CONTAINS:
1496 n = 1;
1497 goto Done;
1498
1499 default:
1500 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001501 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001502 }
1503
1504 if (operation == PY_ITERSEARCH_INDEX) {
1505 ++n;
1506 if (n <= 0)
1507 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001508 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001509 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001510
1511 if (operation != PY_ITERSEARCH_INDEX)
1512 goto Done;
1513
1514 PyErr_SetString(PyExc_ValueError,
1515 "sequence.index(x): x not in sequence");
1516 /* fall into failure code */
1517Fail:
1518 n = -1;
1519 /* fall through */
1520Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001521 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001522 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001523
Guido van Rossume15dee51995-07-18 14:12:02 +00001524}
1525
Tim Peters16a77ad2001-09-08 04:00:12 +00001526/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001527int
Tim Peters16a77ad2001-09-08 04:00:12 +00001528PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001529{
Tim Peters16a77ad2001-09-08 04:00:12 +00001530 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001531}
1532
Tim Peterscb8d3682001-05-05 21:05:01 +00001533/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001534 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001535 */
1536int
1537PySequence_Contains(PyObject *seq, PyObject *ob)
1538{
1539 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1540 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1541 if (sqm != NULL && sqm->sq_contains != NULL)
1542 return (*sqm->sq_contains)(seq, ob);
1543 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001544 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001545}
1546
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001547/* Backwards compatibility */
1548#undef PySequence_In
1549int
Fred Drake79912472000-07-09 04:06:11 +00001550PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001551{
1552 return PySequence_Contains(w, v);
1553}
1554
1555int
Fred Drake79912472000-07-09 04:06:11 +00001556PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001557{
Tim Peters16a77ad2001-09-08 04:00:12 +00001558 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001559}
1560
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001561/* Operations on mappings */
1562
1563int
Fred Drake79912472000-07-09 04:06:11 +00001564PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001565{
Guido van Rossum8700b422001-09-07 20:20:11 +00001566 return o && o->ob_type->tp_as_mapping &&
1567 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001568}
1569
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001570int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001571PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001572{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001573 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001574
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001575 if (o == NULL) {
1576 null_error();
1577 return -1;
1578 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001579
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001580 m = o->ob_type->tp_as_mapping;
1581 if (m && m->mp_length)
1582 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001583
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001584 type_error("len() of unsized object");
1585 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001586}
1587
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001588#undef PyMapping_Length
1589int
1590PyMapping_Length(PyObject *o)
1591{
1592 return PyMapping_Size(o);
1593}
1594#define PyMapping_Length PyMapping_Size
1595
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001596PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001597PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001598{
1599 PyObject *okey, *r;
1600
1601 if (key == NULL)
1602 return null_error();
1603
1604 okey = PyString_FromString(key);
1605 if (okey == NULL)
1606 return NULL;
1607 r = PyObject_GetItem(o, okey);
1608 Py_DECREF(okey);
1609 return r;
1610}
1611
1612int
Fred Drake79912472000-07-09 04:06:11 +00001613PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001614{
1615 PyObject *okey;
1616 int r;
1617
1618 if (key == NULL) {
1619 null_error();
1620 return -1;
1621 }
1622
1623 okey = PyString_FromString(key);
1624 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001625 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001626 r = PyObject_SetItem(o, okey, value);
1627 Py_DECREF(okey);
1628 return r;
1629}
1630
1631int
Fred Drake79912472000-07-09 04:06:11 +00001632PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001633{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001634 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001635
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001636 v = PyMapping_GetItemString(o, key);
1637 if (v) {
1638 Py_DECREF(v);
1639 return 1;
1640 }
1641 PyErr_Clear();
1642 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001643}
1644
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001645int
Fred Drake79912472000-07-09 04:06:11 +00001646PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001647{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001648 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001649
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001650 v = PyObject_GetItem(o, key);
1651 if (v) {
1652 Py_DECREF(v);
1653 return 1;
1654 }
1655 PyErr_Clear();
1656 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001657}
1658
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001659/* Operations on callable objects */
1660
1661/* XXX PyCallable_Check() is in object.c */
1662
Guido van Rossume15dee51995-07-18 14:12:02 +00001663PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001664PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001665{
Guido van Rossum5560b742001-09-14 16:47:50 +00001666 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001667}
Guido van Rossume15dee51995-07-18 14:12:02 +00001668
1669PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001670PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1671{
1672 ternaryfunc call;
1673
1674 if ((call = func->ob_type->tp_call) != NULL) {
1675 PyObject *result = (*call)(func, arg, kw);
1676 if (result == NULL && !PyErr_Occurred())
1677 PyErr_SetString(
1678 PyExc_SystemError,
1679 "NULL result without error in PyObject_Call");
1680 return result;
1681 }
Fred Drake573395a2001-11-01 20:26:12 +00001682 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1683 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001684 return NULL;
1685}
1686
1687PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001688PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001689{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001690 va_list va;
1691 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001692
Fred Drakeb92cf062001-10-27 06:16:31 +00001693 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001694 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001695
Fred Drakeb92cf062001-10-27 06:16:31 +00001696 if (format && *format) {
1697 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001698 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001699 va_end(va);
1700 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001701 else
1702 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001703
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001704 if (args == NULL)
1705 return NULL;
1706
1707 if (!PyTuple_Check(args)) {
1708 PyObject *a;
1709
1710 a = PyTuple_New(1);
1711 if (a == NULL)
1712 return NULL;
1713 if (PyTuple_SetItem(a, 0, args) < 0)
1714 return NULL;
1715 args = a;
1716 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001717 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001718
1719 Py_DECREF(args);
1720
1721 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001722}
1723
1724PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001725PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001726{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001727 va_list va;
1728 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001729
Fred Drakeb92cf062001-10-27 06:16:31 +00001730 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001731 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001732
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001733 func = PyObject_GetAttrString(o, name);
1734 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001735 PyErr_SetString(PyExc_AttributeError, name);
1736 return 0;
1737 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001738
Fred Drakeb92cf062001-10-27 06:16:31 +00001739 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001740 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001741
Fred Drakeb92cf062001-10-27 06:16:31 +00001742 if (format && *format) {
1743 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001744 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001745 va_end(va);
1746 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001747 else
1748 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001749
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001750 if (!args)
1751 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001752
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001753 if (!PyTuple_Check(args)) {
1754 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001755
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001756 a = PyTuple_New(1);
1757 if (a == NULL)
1758 return NULL;
1759 if (PyTuple_SetItem(a, 0, args) < 0)
1760 return NULL;
1761 args = a;
1762 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001763
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001764 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001765
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001766 Py_DECREF(args);
1767 Py_DECREF(func);
1768
1769 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001770}
Guido van Rossum823649d2001-03-21 18:40:58 +00001771
1772
Fred Drakeb421b8c2001-10-26 16:21:32 +00001773static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001774objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001775{
1776 int i, n = 0;
1777 va_list countva;
1778 PyObject *result, *tmp;
1779
1780#ifdef VA_LIST_IS_ARRAY
1781 memcpy(countva, va, sizeof(va_list));
1782#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001783#ifdef __va_copy
1784 __va_copy(countva, va);
1785#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001786 countva = va;
1787#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001788#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001789
1790 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1791 ++n;
1792 result = PyTuple_New(n);
1793 if (result != NULL && n > 0) {
1794 for (i = 0; i < n; ++i) {
1795 tmp = (PyObject *)va_arg(va, PyObject *);
1796 PyTuple_SET_ITEM(result, i, tmp);
1797 Py_INCREF(tmp);
1798 }
1799 }
1800 return result;
1801}
1802
1803PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001804PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001805{
1806 PyObject *args, *tmp;
1807 va_list vargs;
1808
1809 if (callable == NULL || name == NULL)
1810 return null_error();
1811
1812 callable = PyObject_GetAttr(callable, name);
1813 if (callable == NULL)
1814 return NULL;
1815
1816 /* count the args */
1817 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001818 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001819 va_end(vargs);
1820 if (args == NULL) {
1821 Py_DECREF(callable);
1822 return NULL;
1823 }
1824 tmp = PyObject_Call(callable, args, NULL);
1825 Py_DECREF(args);
1826 Py_DECREF(callable);
1827
1828 return tmp;
1829}
1830
1831PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001832PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001833{
1834 PyObject *args, *tmp;
1835 va_list vargs;
1836
1837 if (callable == NULL)
1838 return null_error();
1839
1840 /* count the args */
1841 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001842 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001843 va_end(vargs);
1844 if (args == NULL)
1845 return NULL;
1846 tmp = PyObject_Call(callable, args, NULL);
1847 Py_DECREF(args);
1848
1849 return tmp;
1850}
1851
1852
Guido van Rossum823649d2001-03-21 18:40:58 +00001853/* isinstance(), issubclass() */
1854
Barry Warsawf16951c2002-04-23 22:45:44 +00001855/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1856 * state that will almost never happen.
1857 *
1858 * 0. creating the __bases__ static string could get a MemoryError
1859 * 1. getattr(cls, '__bases__') could raise an AttributeError
1860 * 2. getattr(cls, '__bases__') could raise some other exception
1861 * 3. getattr(cls, '__bases__') could return a tuple
1862 * 4. getattr(cls, '__bases__') could return something other than a tuple
1863 *
1864 * Only state #3 is a non-error state and only it returns a non-NULL object
1865 * (it returns the retrieved tuple).
1866 *
1867 * Any raised AttributeErrors are masked by clearing the exception and
1868 * returning NULL. If an object other than a tuple comes out of __bases__,
1869 * then again, the return value is NULL. So yes, these two situations
1870 * produce exactly the same results: NULL is returned and no error is set.
1871 *
1872 * If some exception other than AttributeError is raised, then NULL is also
1873 * returned, but the exception is not cleared. That's because we want the
1874 * exception to be propagated along.
1875 *
1876 * Callers are expected to test for PyErr_Occurred() when the return value
1877 * is NULL to decide whether a valid exception should be propagated or not.
1878 * When there's no exception to propagate, it's customary for the caller to
1879 * set a TypeError.
1880 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001881static PyObject *
1882abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001883{
1884 static PyObject *__bases__ = NULL;
1885 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001886
1887 if (__bases__ == NULL) {
1888 __bases__ = PyString_FromString("__bases__");
1889 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001890 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001891 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001892 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001893 if (bases == NULL) {
1894 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1895 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001896 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001897 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001898 if (!PyTuple_Check(bases)) {
1899 Py_DECREF(bases);
1900 return NULL;
1901 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001902 return bases;
1903}
1904
1905
1906static int
1907abstract_issubclass(PyObject *derived, PyObject *cls)
1908{
1909 PyObject *bases;
1910 int i, n;
1911 int r = 0;
1912
1913
Guido van Rossum823649d2001-03-21 18:40:58 +00001914 if (derived == cls)
1915 return 1;
1916
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00001917 if (PyTuple_Check(cls)) {
1918 /* Not a general sequence -- that opens up the road to
1919 recursion and stack overflow. */
1920 n = PyTuple_GET_SIZE(cls);
1921 for (i = 0; i < n; i++) {
1922 if (derived == PyTuple_GET_ITEM(cls, i))
1923 return 1;
1924 }
1925 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001926 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00001927 if (bases == NULL) {
1928 if (PyErr_Occurred())
1929 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00001930 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00001931 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001932 n = PyTuple_GET_SIZE(bases);
1933 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001934 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001935 if (r != 0)
1936 break;
1937 }
1938
1939 Py_DECREF(bases);
1940
1941 return r;
1942}
1943
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00001944static int
1945check_class(PyObject *cls, const char *error)
1946{
1947 PyObject *bases = abstract_get_bases(cls);
1948 if (bases == NULL) {
1949 /* Do not mask errors. */
1950 if (!PyErr_Occurred())
1951 PyErr_SetString(PyExc_TypeError, error);
1952 return 0;
1953 }
1954 Py_DECREF(bases);
1955 return -1;
1956}
1957
Guido van Rossum823649d2001-03-21 18:40:58 +00001958int
1959PyObject_IsInstance(PyObject *inst, PyObject *cls)
1960{
1961 PyObject *icls;
1962 static PyObject *__class__ = NULL;
1963 int retval = 0;
1964
Neil Schemenauer6b471292001-10-18 03:18:43 +00001965 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1966 PyObject *inclass =
1967 (PyObject*)((PyInstanceObject*)inst)->in_class;
1968 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001969 }
1970 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001971 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001972 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001973 else if (PyTuple_Check(cls)) {
1974 /* Not a general sequence -- that opens up the road to
1975 recursion and stack overflow. */
1976 int i, n;
1977
1978 n = PyTuple_GET_SIZE(cls);
1979 for (i = 0; i < n; i++) {
1980 retval = PyObject_IsInstance(
1981 inst, PyTuple_GET_ITEM(cls, i));
1982 if (retval != 0)
1983 break;
1984 }
1985 return retval;
1986 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001987 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00001988 if (!check_class(cls,
1989 "isinstance() arg 2 must be a class, type,"
1990 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00001991 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00001992 if (__class__ == NULL) {
1993 __class__ = PyString_FromString("__class__");
1994 if (__class__ == NULL)
1995 return -1;
1996 }
1997 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001998 if (icls == NULL) {
1999 PyErr_Clear();
2000 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002001 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002002 else {
2003 retval = abstract_issubclass(icls, cls);
2004 Py_DECREF(icls);
2005 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002006 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002007
Guido van Rossum823649d2001-03-21 18:40:58 +00002008 return retval;
2009}
2010
2011int
2012PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2013{
2014 int retval;
2015
2016 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002017 if (!check_class(derived, "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002018 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002019
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002020 if (PyTuple_Check(cls)) {
2021 int i;
2022 int n = PyTuple_GET_SIZE(cls);
2023 for (i = 0; i < n; ++i) {
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002024 retval = PyObject_IsSubclass(derived, PyTuple_GET_ITEM(cls, i));
2025 if (retval != 0) /* either found it, or got an error */
2026 return retval;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002027 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002028 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002029 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002030 else {
2031 if (!check_class(cls,
2032 "issubclass() arg 2 must be a class"
2033 " or tuple of classes"))
2034 return -1;
2035 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002036
2037 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002038 }
2039 else {
2040 /* shortcut */
2041 if (!(retval = (derived == cls)))
2042 retval = PyClass_IsSubclass(derived, cls);
2043 }
2044
2045 return retval;
2046}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002047
2048PyObject *
2049PyObject_GetIter(PyObject *o)
2050{
2051 PyTypeObject *t = o->ob_type;
2052 getiterfunc f = NULL;
2053 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2054 f = t->tp_iter;
2055 if (f == NULL) {
2056 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002057 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002058 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002059 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002060 return NULL;
2061 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002062 else {
2063 PyObject *res = (*f)(o);
2064 if (res != NULL && !PyIter_Check(res)) {
2065 PyErr_Format(PyExc_TypeError,
2066 "iter() returned non-iterator "
2067 "of type '%.100s'",
2068 res->ob_type->tp_name);
2069 Py_DECREF(res);
2070 res = NULL;
2071 }
2072 return res;
2073 }
2074}
2075
Tim Petersf4848da2001-05-05 00:14:56 +00002076/* Return next item.
2077 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2078 * If the iteration terminates normally, return NULL and clear the
2079 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2080 * will be false.
2081 * Else return the next object. PyErr_Occurred() will be false.
2082 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002083PyObject *
2084PyIter_Next(PyObject *iter)
2085{
Tim Petersf4848da2001-05-05 00:14:56 +00002086 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002087 if (!PyIter_Check(iter)) {
2088 PyErr_Format(PyExc_TypeError,
2089 "'%.100s' object is not an iterator",
2090 iter->ob_type->tp_name);
2091 return NULL;
2092 }
Tim Petersf4848da2001-05-05 00:14:56 +00002093 result = (*iter->ob_type->tp_iternext)(iter);
2094 if (result == NULL &&
2095 PyErr_Occurred() &&
2096 PyErr_ExceptionMatches(PyExc_StopIteration))
2097 PyErr_Clear();
2098 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002099}