blob: 0ce04ef0b2154bbe997e584db1f2febc646a54b9 [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 *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000408binop_type_error(PyObject *v, PyObject *w, const char *op_name)
409{
410 PyErr_Format(PyExc_TypeError,
411 "unsupported operand type(s) for %s: '%s' and '%s'",
412 op_name,
413 v->ob_type->tp_name,
414 w->ob_type->tp_name);
415 return NULL;
416}
417
418static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000419binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
420{
421 PyObject *result = binary_op1(v, w, op_slot);
422 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000423 Py_DECREF(result);
424 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000425 }
426 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000427}
428
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000429
430/*
431 Calling scheme used for ternary operations:
432
Guido van Rossum84675ac2001-09-29 01:05:03 +0000433 *** In some cases, w.op is called before v.op; see binary_op1. ***
434
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000435 v w z Action
436 -------------------------------------------------------------------
437 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
438 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
439 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
440 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
441 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
442 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
443 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
444 old old old coerce(v,w,z), v.op(v,w,z)
445
446 Legend:
447 -------
448 * new == new style number
449 * old == old style number
450 * Action indicates the order in which operations are tried until either
451 a valid result is produced or an error occurs.
452 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
453 only if z != Py_None; if z == Py_None, then it is treated as absent
454 variable and only coerce(v,w) is tried.
455
456 */
457
458static PyObject *
459ternary_op(PyObject *v,
460 PyObject *w,
461 PyObject *z,
462 const int op_slot,
463 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000464{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000465 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000466 PyObject *x = NULL;
467 ternaryfunc slotv = NULL;
468 ternaryfunc slotw = NULL;
469 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000470
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000471 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000472 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000473 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000474 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000475 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000476 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000477 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000478 if (slotw == slotv)
479 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000480 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000481 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000482 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
483 x = slotw(v, w, z);
484 if (x != Py_NotImplemented)
485 return x;
486 Py_DECREF(x); /* can't do it */
487 slotw = NULL;
488 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000489 x = slotv(v, w, z);
490 if (x != Py_NotImplemented)
491 return x;
492 Py_DECREF(x); /* can't do it */
493 }
494 if (slotw) {
495 x = slotw(v, w, z);
496 if (x != Py_NotImplemented)
497 return x;
498 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000499 }
500 mz = z->ob_type->tp_as_number;
501 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000502 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000503 if (slotz == slotv || slotz == slotw)
504 slotz = NULL;
505 if (slotz) {
506 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000507 if (x != Py_NotImplemented)
508 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000509 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000510 }
511 }
512
513 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
514 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
515 /* we have an old style operand, coerce */
516 PyObject *v1, *z1, *w2, *z2;
517 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000518
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000519 c = PyNumber_Coerce(&v, &w);
520 if (c != 0)
521 goto error3;
522
523 /* Special case: if the third argument is None, it is
524 treated as absent argument and not coerced. */
525 if (z == Py_None) {
526 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000527 slotz = NB_TERNOP(v->ob_type->tp_as_number,
528 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000529 if (slotz)
530 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000531 else
532 c = -1;
533 }
534 else
535 c = -1;
536 goto error2;
537 }
538 v1 = v;
539 z1 = z;
540 c = PyNumber_Coerce(&v1, &z1);
541 if (c != 0)
542 goto error2;
543 w2 = w;
544 z2 = z1;
545 c = PyNumber_Coerce(&w2, &z2);
546 if (c != 0)
547 goto error1;
548
549 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000550 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
551 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000552 if (slotv)
553 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000554 else
555 c = -1;
556 }
557 else
558 c = -1;
559
560 Py_DECREF(w2);
561 Py_DECREF(z2);
562 error1:
563 Py_DECREF(v1);
564 Py_DECREF(z1);
565 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000566 Py_DECREF(v);
567 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000568 error3:
569 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000570 return x;
571 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000572
573 if (z == Py_None)
574 PyErr_Format(
575 PyExc_TypeError,
576 "unsupported operand type(s) for ** or pow(): "
577 "'%s' and '%s'",
578 v->ob_type->tp_name,
579 w->ob_type->tp_name);
580 else
581 PyErr_Format(
582 PyExc_TypeError,
583 "unsupported operand type(s) for pow(): "
584 "'%s', '%s', '%s'",
585 v->ob_type->tp_name,
586 w->ob_type->tp_name,
587 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000588 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000589}
590
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000591#define BINARY_FUNC(func, op, op_name) \
592 PyObject * \
593 func(PyObject *v, PyObject *w) { \
594 return binary_op(v, w, NB_SLOT(op), op_name); \
595 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000596
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000597BINARY_FUNC(PyNumber_Or, nb_or, "|")
598BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
599BINARY_FUNC(PyNumber_And, nb_and, "&")
600BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
601BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
602BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000603BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
604BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000605
606PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000607PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000608{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000609 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
610 if (result == Py_NotImplemented) {
611 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Jeremy Hylton0522d982002-03-08 21:28:54 +0000612 if (m && m->sq_concat) {
613 Py_DECREF(result);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000614 result = (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000615 }
Jeremy Hylton6ae6a432002-03-08 21:11:37 +0000616 if (result == Py_NotImplemented) {
Jeremy Hylton0522d982002-03-08 21:28:54 +0000617 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000618 return binop_type_error(v, w, "+");
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000619 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000620 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000621 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000622}
623
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000624static PyObject *
625sequence_repeat(intargfunc repeatfunc, PyObject *seq, PyObject *n)
626{
627 long count;
628 if (PyInt_Check(n)) {
629 count = PyInt_AsLong(n);
630 }
631 else if (PyLong_Check(n)) {
632 count = PyLong_AsLong(n);
633 if (count == -1 && PyErr_Occurred())
634 return NULL;
635 }
636 else {
637 return type_error(
638 "can't multiply sequence to non-int");
639 }
640#if LONG_MAX != INT_MAX
641 if (count > INT_MAX) {
642 PyErr_SetString(PyExc_ValueError,
643 "sequence repeat count too large");
644 return NULL;
645 }
646 else if (count < INT_MIN)
647 count = INT_MIN;
648 /* XXX Why don't I either
649
650 - set count to -1 whenever it's negative (after all,
651 sequence repeat usually treats negative numbers
652 as zero(); or
653
654 - raise an exception when it's less than INT_MIN?
655
656 I'm thinking about a hypothetical use case where some
657 sequence type might use a negative value as a flag of
658 some kind. In those cases I don't want to break the
659 code by mapping all negative values to -1. But I also
660 don't want to break e.g. []*(-sys.maxint), which is
661 perfectly safe, returning []. As a compromise, I do
662 map out-of-range negative values.
663 */
664#endif
665 return (*repeatfunc)(seq, (int)count);
666}
667
668PyObject *
669PyNumber_Multiply(PyObject *v, PyObject *w)
670{
671 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
672 if (result == Py_NotImplemented) {
673 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
674 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000675 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000676 if (mv && mv->sq_repeat) {
677 return sequence_repeat(mv->sq_repeat, v, w);
678 }
679 else if (mw && mw->sq_repeat) {
680 return sequence_repeat(mw->sq_repeat, w, v);
681 }
682 result = binop_type_error(v, w, "*");
683 }
684 return result;
685}
686
Guido van Rossume15dee51995-07-18 14:12:02 +0000687PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000688PyNumber_FloorDivide(PyObject *v, PyObject *w)
689{
690 /* XXX tp_flags test */
691 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
692}
693
694PyObject *
695PyNumber_TrueDivide(PyObject *v, PyObject *w)
696{
697 /* XXX tp_flags test */
698 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
699}
700
701PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000702PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000703{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000704 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000705}
706
707PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000708PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000709{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000710 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000711}
712
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000713/* Binary in-place operators */
714
715/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000716 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000717
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000718 - If the left hand object has the appropriate struct members, and
719 they are filled, call the appropriate function and return the
720 result. No coercion is done on the arguments; the left-hand object
721 is the one the operation is performed on, and it's up to the
722 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000723
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000724 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000725 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000726
727 */
728
Guido van Rossum77660912002-04-16 16:32:50 +0000729#define HASINPLACE(t) \
730 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000731
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000732static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000733binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000734{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000735 PyNumberMethods *mv = v->ob_type->tp_as_number;
736 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000737 binaryfunc slot = NB_BINOP(mv, iop_slot);
738 if (slot) {
739 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000740 if (x != Py_NotImplemented) {
741 return x;
742 }
743 Py_DECREF(x);
744 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000745 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000746 return binary_op1(v, w, op_slot);
747}
748
749static PyObject *
750binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
751 const char *op_name)
752{
753 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
754 if (result == Py_NotImplemented) {
755 Py_DECREF(result);
756 return binop_type_error(v, w, op_name);
757 }
758 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759}
760
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000761#define INPLACE_BINOP(func, iop, op, op_name) \
762 PyObject * \
763 func(PyObject *v, PyObject *w) { \
764 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000765 }
766
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000767INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
768INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
769INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
770INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
771INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
772INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
773INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000774
775PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000776PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
777{
778 /* XXX tp_flags test */
779 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
780 NB_SLOT(nb_floor_divide), "//=");
781}
782
783PyObject *
784PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
785{
786 /* XXX tp_flags test */
787 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
788 NB_SLOT(nb_true_divide), "/=");
789}
790
791PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000792PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
793{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000794 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
795 NB_SLOT(nb_add));
796 if (result == Py_NotImplemented) {
797 PySequenceMethods *m = v->ob_type->tp_as_sequence;
798 Py_DECREF(result);
799 if (m != NULL) {
800 binaryfunc f = NULL;
801 if (HASINPLACE(v))
802 f = m->sq_inplace_concat;
803 if (f == NULL)
804 f = m->sq_concat;
805 if (f != NULL)
806 return (*f)(v, w);
807 }
808 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000809 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000810 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000811}
812
813PyObject *
814PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
815{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000816 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
817 NB_SLOT(nb_multiply));
818 if (result == Py_NotImplemented) {
819 intargfunc f = NULL;
820 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
821 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
822 Py_DECREF(result);
823 if (mv != NULL) {
824 if (HASINPLACE(v))
825 f = mv->sq_inplace_repeat;
826 if (f == NULL)
827 f = mv->sq_repeat;
828 if (f != NULL)
829 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000830 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000831 else if (mw != NULL) {
832 /* Note that the right hand operand should not be
833 * mutated in this case so sq_inplace_repeat is not
834 * used. */
835 if (mw->sq_repeat)
836 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000837 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000838 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000839 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000840 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000841}
842
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000843PyObject *
844PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
845{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000846 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
847 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000848}
849
850PyObject *
851PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
852{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000853 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
854 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
855 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000856 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000857 else {
858 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
859 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000860}
861
862
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000864
865PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000866PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000867{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000868 PyNumberMethods *m;
869
870 if (o == NULL)
871 return null_error();
872 m = o->ob_type->tp_as_number;
873 if (m && m->nb_negative)
874 return (*m->nb_negative)(o);
875
876 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000877}
878
879PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000880PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000881{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000882 PyNumberMethods *m;
883
884 if (o == NULL)
885 return null_error();
886 m = o->ob_type->tp_as_number;
887 if (m && m->nb_positive)
888 return (*m->nb_positive)(o);
889
890 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000891}
892
893PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000894PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000895{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000896 PyNumberMethods *m;
897
898 if (o == NULL)
899 return null_error();
900 m = o->ob_type->tp_as_number;
901 if (m && m->nb_invert)
902 return (*m->nb_invert)(o);
903
904 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000905}
906
907PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000908PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000909{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000910 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000911
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000912 if (o == NULL)
913 return null_error();
914 m = o->ob_type->tp_as_number;
915 if (m && m->nb_absolute)
916 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000917
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000918 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000919}
920
Guido van Rossum9e896b32000-04-05 20:11:21 +0000921/* Add a check for embedded NULL-bytes in the argument. */
922static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000923int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000924{
925 char *end;
926 PyObject *x;
927
928 x = PyInt_FromString((char*)s, &end, 10);
929 if (x == NULL)
930 return NULL;
931 if (end != s + len) {
932 PyErr_SetString(PyExc_ValueError,
933 "null byte in argument for int()");
934 Py_DECREF(x);
935 return NULL;
936 }
937 return x;
938}
939
Guido van Rossume15dee51995-07-18 14:12:02 +0000940PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000941PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000942{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000943 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000944 const char *buffer;
945 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000946
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 if (o == NULL)
948 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000949 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000950 Py_INCREF(o);
951 return o;
952 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000953 if (PyInt_Check(o)) {
954 PyIntObject *io = (PyIntObject*)o;
955 return PyInt_FromLong(io->ob_ival);
956 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000957 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000958 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000959 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000960#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000961 if (PyUnicode_Check(o))
962 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
963 PyUnicode_GET_SIZE(o),
964 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000965#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000966 m = o->ob_type->tp_as_number;
967 if (m && m->nb_int)
968 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000969 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000970 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000971
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000972 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000973}
974
Guido van Rossum9e896b32000-04-05 20:11:21 +0000975/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000976static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000977long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000978{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000979 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000980 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000981
Guido van Rossum4c08d552000-03-10 22:55:18 +0000982 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000983 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000984 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000985 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000986 PyErr_SetString(PyExc_ValueError,
987 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000988 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000989 return NULL;
990 }
991 return x;
992}
993
Guido van Rossume15dee51995-07-18 14:12:02 +0000994PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000995PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000996{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000997 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000998 const char *buffer;
999 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001000
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001 if (o == NULL)
1002 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001003 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001004 Py_INCREF(o);
1005 return o;
1006 }
Tim Petersdb30ac42002-03-02 04:14:21 +00001007 if (PyLong_Check(o))
1008 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001009 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001010 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001011 * doesn't do. In particular long('9.5') must raise an
1012 * exception, not truncate the float.
1013 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001014 return long_from_string(PyString_AS_STRING(o),
1015 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001016#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001017 if (PyUnicode_Check(o))
1018 /* The above check is done in PyLong_FromUnicode(). */
1019 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1020 PyUnicode_GET_SIZE(o),
1021 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001022#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001023 m = o->ob_type->tp_as_number;
1024 if (m && m->nb_long)
1025 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001026 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1027 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001028
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001029 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001030}
1031
1032PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001033PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001034{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001035 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001036
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001037 if (o == NULL)
1038 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +00001039 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001040 Py_INCREF(o);
1041 return o;
1042 }
Tim Peters7a50f252001-09-10 21:28:20 +00001043 if (PyFloat_Check(o)) {
1044 PyFloatObject *po = (PyFloatObject *)o;
1045 return PyFloat_FromDouble(po->ob_fval);
1046 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001047 if (!PyString_Check(o)) {
1048 m = o->ob_type->tp_as_number;
1049 if (m && m->nb_float)
1050 return m->nb_float(o);
1051 }
1052 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001053}
1054
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001055/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001056
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001057int
Fred Drake79912472000-07-09 04:06:11 +00001058PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001059{
Guido van Rossum8700b422001-09-07 20:20:11 +00001060 return s != NULL && s->ob_type->tp_as_sequence &&
1061 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001062}
1063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001065PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001066{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001067 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001068
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001069 if (s == NULL) {
1070 null_error();
1071 return -1;
1072 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001073
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001074 m = s->ob_type->tp_as_sequence;
1075 if (m && m->sq_length)
1076 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001077
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001078 type_error("len() of unsized object");
1079 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001080}
1081
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001082#undef PySequence_Length
1083int
1084PySequence_Length(PyObject *s)
1085{
1086 return PySequence_Size(s);
1087}
1088#define PySequence_Length PySequence_Size
1089
Guido van Rossume15dee51995-07-18 14:12:02 +00001090PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001091PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001092{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001093 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001094
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001095 if (s == NULL || o == NULL)
1096 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001097
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001098 m = s->ob_type->tp_as_sequence;
1099 if (m && m->sq_concat)
1100 return m->sq_concat(s, o);
1101
1102 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001103}
1104
1105PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001106PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001107{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001109
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001110 if (o == NULL)
1111 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001112
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001113 m = o->ob_type->tp_as_sequence;
1114 if (m && m->sq_repeat)
1115 return m->sq_repeat(o, count);
1116
1117 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001118}
1119
1120PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001121PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1122{
1123 PySequenceMethods *m;
1124
1125 if (s == NULL || o == NULL)
1126 return null_error();
1127
1128 m = s->ob_type->tp_as_sequence;
1129 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1130 return m->sq_inplace_concat(s, o);
1131 if (m && m->sq_concat)
1132 return m->sq_concat(s, o);
1133
1134 return type_error("object can't be concatenated");
1135}
1136
1137PyObject *
1138PySequence_InPlaceRepeat(PyObject *o, int count)
1139{
1140 PySequenceMethods *m;
1141
1142 if (o == NULL)
1143 return null_error();
1144
1145 m = o->ob_type->tp_as_sequence;
1146 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1147 return m->sq_inplace_repeat(o, count);
1148 if (m && m->sq_repeat)
1149 return m->sq_repeat(o, count);
1150
1151 return type_error("object can't be repeated");
1152}
1153
1154PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001155PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001156{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001157 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001158
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159 if (s == NULL)
1160 return null_error();
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_item) {
1164 if (i < 0) {
1165 if (m->sq_length) {
1166 int l = (*m->sq_length)(s);
1167 if (l < 0)
1168 return NULL;
1169 i += l;
1170 }
1171 }
1172 return m->sq_item(s, i);
1173 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001174
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001175 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001176}
1177
Thomas Wouters1d75a792000-08-17 22:37:32 +00001178static PyObject *
1179sliceobj_from_intint(int i, int j)
1180{
1181 PyObject *start, *end, *slice;
1182 start = PyInt_FromLong((long)i);
1183 if (!start)
1184 return NULL;
1185 end = PyInt_FromLong((long)j);
1186 if (!end) {
1187 Py_DECREF(start);
1188 return NULL;
1189 }
1190 slice = PySlice_New(start, end, NULL);
1191 Py_DECREF(start);
1192 Py_DECREF(end);
1193 return slice;
1194}
1195
Guido van Rossume15dee51995-07-18 14:12:02 +00001196PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001197PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001198{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001199 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001200 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001201
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001203
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001204 m = s->ob_type->tp_as_sequence;
1205 if (m && m->sq_slice) {
1206 if (i1 < 0 || i2 < 0) {
1207 if (m->sq_length) {
1208 int l = (*m->sq_length)(s);
1209 if (l < 0)
1210 return NULL;
1211 if (i1 < 0)
1212 i1 += l;
1213 if (i2 < 0)
1214 i2 += l;
1215 }
1216 }
1217 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001218 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1219 PyObject *res;
1220 PyObject *slice = sliceobj_from_intint(i1, i2);
1221 if (!slice)
1222 return NULL;
1223 res = mp->mp_subscript(s, slice);
1224 Py_DECREF(slice);
1225 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001227
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001228 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001229}
1230
1231int
Fred Drake79912472000-07-09 04:06:11 +00001232PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001233{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001234 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001235
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001236 if (s == NULL) {
1237 null_error();
1238 return -1;
1239 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001240
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241 m = s->ob_type->tp_as_sequence;
1242 if (m && m->sq_ass_item) {
1243 if (i < 0) {
1244 if (m->sq_length) {
1245 int l = (*m->sq_length)(s);
1246 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001247 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 i += l;
1249 }
1250 }
1251 return m->sq_ass_item(s, i, o);
1252 }
1253
1254 type_error("object doesn't support item assignment");
1255 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001256}
1257
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001258int
Fred Drake79912472000-07-09 04:06:11 +00001259PySequence_DelItem(PyObject *s, int i)
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_item) {
1270 if (i < 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 i += l;
1276 }
1277 }
1278 return m->sq_ass_item(s, i, (PyObject *)NULL);
1279 }
1280
1281 type_error("object doesn't support item deletion");
1282 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001283}
1284
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001285int
Fred Drake79912472000-07-09 04:06:11 +00001286PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001287{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001288 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001289 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001290
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291 if (s == NULL) {
1292 null_error();
1293 return -1;
1294 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001295
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001296 m = s->ob_type->tp_as_sequence;
1297 if (m && m->sq_ass_slice) {
1298 if (i1 < 0 || i2 < 0) {
1299 if (m->sq_length) {
1300 int l = (*m->sq_length)(s);
1301 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001302 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 if (i1 < 0)
1304 i1 += l;
1305 if (i2 < 0)
1306 i2 += l;
1307 }
1308 }
1309 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001310 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1311 int res;
1312 PyObject *slice = sliceobj_from_intint(i1, i2);
1313 if (!slice)
1314 return -1;
1315 res = mp->mp_ass_subscript(s, slice, o);
1316 Py_DECREF(slice);
1317 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001319
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001320 type_error("object doesn't support slice assignment");
1321 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001322}
1323
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324int
Fred Drake79912472000-07-09 04:06:11 +00001325PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001326{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001327 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001328
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001329 if (s == NULL) {
1330 null_error();
1331 return -1;
1332 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001333
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001334 m = s->ob_type->tp_as_sequence;
1335 if (m && m->sq_ass_slice) {
1336 if (i1 < 0 || i2 < 0) {
1337 if (m->sq_length) {
1338 int l = (*m->sq_length)(s);
1339 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001340 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001341 if (i1 < 0)
1342 i1 += l;
1343 if (i2 < 0)
1344 i2 += l;
1345 }
1346 }
1347 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1348 }
1349 type_error("object doesn't support slice deletion");
1350 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001351}
1352
Guido van Rossume15dee51995-07-18 14:12:02 +00001353PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001354PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001355{
Tim Peters6912d4d2001-05-05 03:56:37 +00001356 PyObject *it; /* iter(v) */
1357 int n; /* guess for result tuple size */
1358 PyObject *result;
1359 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001360
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001361 if (v == NULL)
1362 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001363
Tim Peters6912d4d2001-05-05 03:56:37 +00001364 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001365 if (PyTuple_CheckExact(v)) {
1366 /* Note that we can't know whether it's safe to return
1367 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001368 to exact tuples here. In contrast, lists always make
1369 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001370 Py_INCREF(v);
1371 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001372 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001373 if (PyList_Check(v))
1374 return PyList_AsTuple(v);
1375
Tim Peters6912d4d2001-05-05 03:56:37 +00001376 /* Get iterator. */
1377 it = PyObject_GetIter(v);
1378 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001379 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380
Tim Peters6912d4d2001-05-05 03:56:37 +00001381 /* Guess result size and allocate space. */
1382 n = PySequence_Size(v);
1383 if (n < 0) {
1384 PyErr_Clear();
1385 n = 10; /* arbitrary */
1386 }
1387 result = PyTuple_New(n);
1388 if (result == NULL)
1389 goto Fail;
1390
1391 /* Fill the tuple. */
1392 for (j = 0; ; ++j) {
1393 PyObject *item = PyIter_Next(it);
1394 if (item == NULL) {
1395 if (PyErr_Occurred())
1396 goto Fail;
1397 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001398 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001399 if (j >= n) {
1400 if (n < 500)
1401 n += 10;
1402 else
1403 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001404 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001405 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001406 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001407 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001408 }
1409 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001410 }
1411
Tim Peters6912d4d2001-05-05 03:56:37 +00001412 /* Cut tuple back if guess was too large. */
1413 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001414 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001415 goto Fail;
1416
1417 Py_DECREF(it);
1418 return result;
1419
1420Fail:
1421 Py_XDECREF(result);
1422 Py_DECREF(it);
1423 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001424}
1425
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001426PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001427PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001428{
Tim Petersf553f892001-05-01 20:45:31 +00001429 PyObject *it; /* iter(v) */
1430 PyObject *result; /* result list */
1431 int n; /* guess for result list size */
1432 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001433
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001434 if (v == NULL)
1435 return null_error();
1436
Tim Petersf553f892001-05-01 20:45:31 +00001437 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001438 if (PyList_Check(v))
1439 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1440
Tim Petersf553f892001-05-01 20:45:31 +00001441 /* Get iterator. There may be some low-level efficiency to be gained
1442 * by caching the tp_iternext slot instead of using PyIter_Next()
1443 * later, but premature optimization is the root etc.
1444 */
1445 it = PyObject_GetIter(v);
1446 if (it == NULL)
1447 return NULL;
1448
1449 /* Guess a result list size. */
1450 n = -1; /* unknown */
1451 if (PySequence_Check(v) &&
1452 v->ob_type->tp_as_sequence->sq_length) {
1453 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001454 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001455 PyErr_Clear();
1456 }
1457 if (n < 0)
1458 n = 8; /* arbitrary */
1459 result = PyList_New(n);
1460 if (result == NULL) {
1461 Py_DECREF(it);
1462 return NULL;
1463 }
1464
1465 /* Run iterator to exhaustion. */
1466 for (i = 0; ; i++) {
1467 PyObject *item = PyIter_Next(it);
1468 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001469 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001470 Py_DECREF(result);
1471 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001472 }
Tim Petersf553f892001-05-01 20:45:31 +00001473 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001474 }
Tim Petersf553f892001-05-01 20:45:31 +00001475 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001476 PyList_SET_ITEM(result, i, item); /* steals ref */
1477 else {
1478 int status = PyList_Append(result, item);
1479 Py_DECREF(item); /* append creates a new ref */
1480 if (status < 0) {
1481 Py_DECREF(result);
1482 result = NULL;
1483 break;
1484 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001485 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001486 }
Tim Petersf553f892001-05-01 20:45:31 +00001487
1488 /* Cut back result list if initial guess was too large. */
1489 if (i < n && result != NULL) {
1490 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1491 Py_DECREF(result);
1492 result = NULL;
1493 }
1494 }
1495 Py_DECREF(it);
1496 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001497}
1498
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001499PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001500PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001501{
1502 if (v == NULL)
1503 return null_error();
1504
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001505 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001506 Py_INCREF(v);
1507 return v;
1508 }
1509
1510 v = PySequence_Tuple(v);
1511 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1512 return type_error(m);
1513
1514 return v;
1515}
1516
Tim Peters16a77ad2001-09-08 04:00:12 +00001517/* Iterate over seq. Result depends on the operation:
1518 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1519 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1520 set ValueError and return -1 if none found; also return -1 on error.
1521 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1522*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001523int
Tim Peters16a77ad2001-09-08 04:00:12 +00001524_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001525{
Tim Peters16a77ad2001-09-08 04:00:12 +00001526 int n;
1527 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1528 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001529
Tim Peters16a77ad2001-09-08 04:00:12 +00001530 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001531 null_error();
1532 return -1;
1533 }
Tim Peters75f8e352001-05-05 11:33:43 +00001534
Tim Peters16a77ad2001-09-08 04:00:12 +00001535 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001536 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001537 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001538 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001539 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001540
Tim Peters16a77ad2001-09-08 04:00:12 +00001541 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001542 for (;;) {
1543 int cmp;
1544 PyObject *item = PyIter_Next(it);
1545 if (item == NULL) {
1546 if (PyErr_Occurred())
1547 goto Fail;
1548 break;
1549 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001550
1551 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001552 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001553 if (cmp < 0)
1554 goto Fail;
1555 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001556 switch (operation) {
1557 case PY_ITERSEARCH_COUNT:
1558 ++n;
1559 if (n <= 0) {
1560 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001561 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001562 goto Fail;
1563 }
1564 break;
1565
1566 case PY_ITERSEARCH_INDEX:
1567 if (wrapped) {
1568 PyErr_SetString(PyExc_OverflowError,
1569 "index exceeds C int size");
1570 goto Fail;
1571 }
1572 goto Done;
1573
1574 case PY_ITERSEARCH_CONTAINS:
1575 n = 1;
1576 goto Done;
1577
1578 default:
1579 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001580 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001581 }
1582
1583 if (operation == PY_ITERSEARCH_INDEX) {
1584 ++n;
1585 if (n <= 0)
1586 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001587 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001588 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001589
1590 if (operation != PY_ITERSEARCH_INDEX)
1591 goto Done;
1592
1593 PyErr_SetString(PyExc_ValueError,
1594 "sequence.index(x): x not in sequence");
1595 /* fall into failure code */
1596Fail:
1597 n = -1;
1598 /* fall through */
1599Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001600 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001601 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001602
Guido van Rossume15dee51995-07-18 14:12:02 +00001603}
1604
Tim Peters16a77ad2001-09-08 04:00:12 +00001605/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001606int
Tim Peters16a77ad2001-09-08 04:00:12 +00001607PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001608{
Tim Peters16a77ad2001-09-08 04:00:12 +00001609 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001610}
1611
Tim Peterscb8d3682001-05-05 21:05:01 +00001612/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001613 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001614 */
1615int
1616PySequence_Contains(PyObject *seq, PyObject *ob)
1617{
1618 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1619 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1620 if (sqm != NULL && sqm->sq_contains != NULL)
1621 return (*sqm->sq_contains)(seq, ob);
1622 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001623 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001624}
1625
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001626/* Backwards compatibility */
1627#undef PySequence_In
1628int
Fred Drake79912472000-07-09 04:06:11 +00001629PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001630{
1631 return PySequence_Contains(w, v);
1632}
1633
1634int
Fred Drake79912472000-07-09 04:06:11 +00001635PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001636{
Tim Peters16a77ad2001-09-08 04:00:12 +00001637 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001638}
1639
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001640/* Operations on mappings */
1641
1642int
Fred Drake79912472000-07-09 04:06:11 +00001643PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001644{
Guido van Rossum8700b422001-09-07 20:20:11 +00001645 return o && o->ob_type->tp_as_mapping &&
1646 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001647}
1648
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001649int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001650PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001651{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001652 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001653
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001654 if (o == NULL) {
1655 null_error();
1656 return -1;
1657 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001658
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001659 m = o->ob_type->tp_as_mapping;
1660 if (m && m->mp_length)
1661 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001662
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001663 type_error("len() of unsized object");
1664 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001665}
1666
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001667#undef PyMapping_Length
1668int
1669PyMapping_Length(PyObject *o)
1670{
1671 return PyMapping_Size(o);
1672}
1673#define PyMapping_Length PyMapping_Size
1674
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001675PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001676PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001677{
1678 PyObject *okey, *r;
1679
1680 if (key == NULL)
1681 return null_error();
1682
1683 okey = PyString_FromString(key);
1684 if (okey == NULL)
1685 return NULL;
1686 r = PyObject_GetItem(o, okey);
1687 Py_DECREF(okey);
1688 return r;
1689}
1690
1691int
Fred Drake79912472000-07-09 04:06:11 +00001692PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001693{
1694 PyObject *okey;
1695 int r;
1696
1697 if (key == NULL) {
1698 null_error();
1699 return -1;
1700 }
1701
1702 okey = PyString_FromString(key);
1703 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001704 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001705 r = PyObject_SetItem(o, okey, value);
1706 Py_DECREF(okey);
1707 return r;
1708}
1709
1710int
Fred Drake79912472000-07-09 04:06:11 +00001711PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001712{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001713 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001714
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001715 v = PyMapping_GetItemString(o, key);
1716 if (v) {
1717 Py_DECREF(v);
1718 return 1;
1719 }
1720 PyErr_Clear();
1721 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001722}
1723
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001724int
Fred Drake79912472000-07-09 04:06:11 +00001725PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001726{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001727 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001728
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001729 v = PyObject_GetItem(o, key);
1730 if (v) {
1731 Py_DECREF(v);
1732 return 1;
1733 }
1734 PyErr_Clear();
1735 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001736}
1737
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001738/* Operations on callable objects */
1739
1740/* XXX PyCallable_Check() is in object.c */
1741
Guido van Rossume15dee51995-07-18 14:12:02 +00001742PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001743PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001744{
Guido van Rossum5560b742001-09-14 16:47:50 +00001745 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001746}
Guido van Rossume15dee51995-07-18 14:12:02 +00001747
1748PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001749PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1750{
1751 ternaryfunc call;
1752
1753 if ((call = func->ob_type->tp_call) != NULL) {
1754 PyObject *result = (*call)(func, arg, kw);
1755 if (result == NULL && !PyErr_Occurred())
1756 PyErr_SetString(
1757 PyExc_SystemError,
1758 "NULL result without error in PyObject_Call");
1759 return result;
1760 }
Fred Drake573395a2001-11-01 20:26:12 +00001761 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1762 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001763 return NULL;
1764}
1765
1766PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001767PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001768{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001769 va_list va;
1770 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001771
Fred Drakeb92cf062001-10-27 06:16:31 +00001772 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001773 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001774
Fred Drakeb92cf062001-10-27 06:16:31 +00001775 if (format && *format) {
1776 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001777 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001778 va_end(va);
1779 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001780 else
1781 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001783 if (args == NULL)
1784 return NULL;
1785
1786 if (!PyTuple_Check(args)) {
1787 PyObject *a;
1788
1789 a = PyTuple_New(1);
1790 if (a == NULL)
1791 return NULL;
1792 if (PyTuple_SetItem(a, 0, args) < 0)
1793 return NULL;
1794 args = a;
1795 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001796 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001797
1798 Py_DECREF(args);
1799
1800 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001801}
1802
1803PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001804PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001805{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001806 va_list va;
1807 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001808
Fred Drakeb92cf062001-10-27 06:16:31 +00001809 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001810 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001811
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001812 func = PyObject_GetAttrString(o, name);
1813 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001814 PyErr_SetString(PyExc_AttributeError, name);
1815 return 0;
1816 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001817
Fred Drakeb92cf062001-10-27 06:16:31 +00001818 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001819 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001820
Fred Drakeb92cf062001-10-27 06:16:31 +00001821 if (format && *format) {
1822 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001823 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001824 va_end(va);
1825 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001826 else
1827 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001828
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001829 if (!args)
1830 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001831
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001832 if (!PyTuple_Check(args)) {
1833 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001834
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001835 a = PyTuple_New(1);
1836 if (a == NULL)
1837 return NULL;
1838 if (PyTuple_SetItem(a, 0, args) < 0)
1839 return NULL;
1840 args = a;
1841 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001842
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001843 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001844
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001845 Py_DECREF(args);
1846 Py_DECREF(func);
1847
1848 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001849}
Guido van Rossum823649d2001-03-21 18:40:58 +00001850
1851
Fred Drakeb421b8c2001-10-26 16:21:32 +00001852static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001853objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001854{
1855 int i, n = 0;
1856 va_list countva;
1857 PyObject *result, *tmp;
1858
1859#ifdef VA_LIST_IS_ARRAY
1860 memcpy(countva, va, sizeof(va_list));
1861#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001862#ifdef __va_copy
1863 __va_copy(countva, va);
1864#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001865 countva = va;
1866#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001867#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001868
1869 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1870 ++n;
1871 result = PyTuple_New(n);
1872 if (result != NULL && n > 0) {
1873 for (i = 0; i < n; ++i) {
1874 tmp = (PyObject *)va_arg(va, PyObject *);
1875 PyTuple_SET_ITEM(result, i, tmp);
1876 Py_INCREF(tmp);
1877 }
1878 }
1879 return result;
1880}
1881
1882PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001883PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001884{
1885 PyObject *args, *tmp;
1886 va_list vargs;
1887
1888 if (callable == NULL || name == NULL)
1889 return null_error();
1890
1891 callable = PyObject_GetAttr(callable, name);
1892 if (callable == NULL)
1893 return NULL;
1894
1895 /* count the args */
1896 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001897 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001898 va_end(vargs);
1899 if (args == NULL) {
1900 Py_DECREF(callable);
1901 return NULL;
1902 }
1903 tmp = PyObject_Call(callable, args, NULL);
1904 Py_DECREF(args);
1905 Py_DECREF(callable);
1906
1907 return tmp;
1908}
1909
1910PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001911PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001912{
1913 PyObject *args, *tmp;
1914 va_list vargs;
1915
1916 if (callable == NULL)
1917 return null_error();
1918
1919 /* count the args */
1920 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001921 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001922 va_end(vargs);
1923 if (args == NULL)
1924 return NULL;
1925 tmp = PyObject_Call(callable, args, NULL);
1926 Py_DECREF(args);
1927
1928 return tmp;
1929}
1930
1931
Guido van Rossum823649d2001-03-21 18:40:58 +00001932/* isinstance(), issubclass() */
1933
Barry Warsawf16951c2002-04-23 22:45:44 +00001934/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1935 * state that will almost never happen.
1936 *
1937 * 0. creating the __bases__ static string could get a MemoryError
1938 * 1. getattr(cls, '__bases__') could raise an AttributeError
1939 * 2. getattr(cls, '__bases__') could raise some other exception
1940 * 3. getattr(cls, '__bases__') could return a tuple
1941 * 4. getattr(cls, '__bases__') could return something other than a tuple
1942 *
1943 * Only state #3 is a non-error state and only it returns a non-NULL object
1944 * (it returns the retrieved tuple).
1945 *
1946 * Any raised AttributeErrors are masked by clearing the exception and
1947 * returning NULL. If an object other than a tuple comes out of __bases__,
1948 * then again, the return value is NULL. So yes, these two situations
1949 * produce exactly the same results: NULL is returned and no error is set.
1950 *
1951 * If some exception other than AttributeError is raised, then NULL is also
1952 * returned, but the exception is not cleared. That's because we want the
1953 * exception to be propagated along.
1954 *
1955 * Callers are expected to test for PyErr_Occurred() when the return value
1956 * is NULL to decide whether a valid exception should be propagated or not.
1957 * When there's no exception to propagate, it's customary for the caller to
1958 * set a TypeError.
1959 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001960static PyObject *
1961abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001962{
1963 static PyObject *__bases__ = NULL;
1964 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001965
1966 if (__bases__ == NULL) {
1967 __bases__ = PyString_FromString("__bases__");
1968 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001969 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001970 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001971 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001972 if (bases == NULL) {
1973 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1974 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001975 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001976 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001977 if (!PyTuple_Check(bases)) {
1978 Py_DECREF(bases);
1979 return NULL;
1980 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001981 return bases;
1982}
1983
1984
1985static int
1986abstract_issubclass(PyObject *derived, PyObject *cls)
1987{
1988 PyObject *bases;
1989 int i, n;
1990 int r = 0;
1991
1992
Guido van Rossum823649d2001-03-21 18:40:58 +00001993 if (derived == cls)
1994 return 1;
1995
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00001996 if (PyTuple_Check(cls)) {
1997 /* Not a general sequence -- that opens up the road to
1998 recursion and stack overflow. */
1999 n = PyTuple_GET_SIZE(cls);
2000 for (i = 0; i < n; i++) {
2001 if (derived == PyTuple_GET_ITEM(cls, i))
2002 return 1;
2003 }
2004 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002005 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002006 if (bases == NULL) {
2007 if (PyErr_Occurred())
2008 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002009 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002010 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002011 n = PyTuple_GET_SIZE(bases);
2012 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002013 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002014 if (r != 0)
2015 break;
2016 }
2017
2018 Py_DECREF(bases);
2019
2020 return r;
2021}
2022
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002023static int
2024check_class(PyObject *cls, const char *error)
2025{
2026 PyObject *bases = abstract_get_bases(cls);
2027 if (bases == NULL) {
2028 /* Do not mask errors. */
2029 if (!PyErr_Occurred())
2030 PyErr_SetString(PyExc_TypeError, error);
2031 return 0;
2032 }
2033 Py_DECREF(bases);
2034 return -1;
2035}
2036
Guido van Rossum823649d2001-03-21 18:40:58 +00002037int
2038PyObject_IsInstance(PyObject *inst, PyObject *cls)
2039{
2040 PyObject *icls;
2041 static PyObject *__class__ = NULL;
2042 int retval = 0;
2043
Neil Schemenauer6b471292001-10-18 03:18:43 +00002044 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2045 PyObject *inclass =
2046 (PyObject*)((PyInstanceObject*)inst)->in_class;
2047 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002048 }
2049 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002050 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002051 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002052 else if (PyTuple_Check(cls)) {
2053 /* Not a general sequence -- that opens up the road to
2054 recursion and stack overflow. */
2055 int i, n;
2056
2057 n = PyTuple_GET_SIZE(cls);
2058 for (i = 0; i < n; i++) {
2059 retval = PyObject_IsInstance(
2060 inst, PyTuple_GET_ITEM(cls, i));
2061 if (retval != 0)
2062 break;
2063 }
2064 return retval;
2065 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002066 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002067 if (!check_class(cls,
2068 "isinstance() arg 2 must be a class, type,"
2069 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002070 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002071 if (__class__ == NULL) {
2072 __class__ = PyString_FromString("__class__");
2073 if (__class__ == NULL)
2074 return -1;
2075 }
2076 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002077 if (icls == NULL) {
2078 PyErr_Clear();
2079 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002080 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002081 else {
2082 retval = abstract_issubclass(icls, cls);
2083 Py_DECREF(icls);
2084 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002085 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002086
Guido van Rossum823649d2001-03-21 18:40:58 +00002087 return retval;
2088}
2089
2090int
2091PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2092{
2093 int retval;
2094
2095 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002096 if (!check_class(derived, "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002097 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002098
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002099 if (PyTuple_Check(cls)) {
2100 int i;
2101 int n = PyTuple_GET_SIZE(cls);
2102 for (i = 0; i < n; ++i) {
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002103 retval = PyObject_IsSubclass(derived, PyTuple_GET_ITEM(cls, i));
2104 if (retval != 0) /* either found it, or got an error */
2105 return retval;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002106 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002107 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002108 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002109 else {
2110 if (!check_class(cls,
2111 "issubclass() arg 2 must be a class"
2112 " or tuple of classes"))
2113 return -1;
2114 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002115
2116 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002117 }
2118 else {
2119 /* shortcut */
2120 if (!(retval = (derived == cls)))
2121 retval = PyClass_IsSubclass(derived, cls);
2122 }
2123
2124 return retval;
2125}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002126
2127PyObject *
2128PyObject_GetIter(PyObject *o)
2129{
2130 PyTypeObject *t = o->ob_type;
2131 getiterfunc f = NULL;
2132 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2133 f = t->tp_iter;
2134 if (f == NULL) {
2135 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002136 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002137 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002138 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002139 return NULL;
2140 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002141 else {
2142 PyObject *res = (*f)(o);
2143 if (res != NULL && !PyIter_Check(res)) {
2144 PyErr_Format(PyExc_TypeError,
2145 "iter() returned non-iterator "
2146 "of type '%.100s'",
2147 res->ob_type->tp_name);
2148 Py_DECREF(res);
2149 res = NULL;
2150 }
2151 return res;
2152 }
2153}
2154
Tim Petersf4848da2001-05-05 00:14:56 +00002155/* Return next item.
2156 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2157 * If the iteration terminates normally, return NULL and clear the
2158 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2159 * will be false.
2160 * Else return the next object. PyErr_Occurred() will be false.
2161 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002162PyObject *
2163PyIter_Next(PyObject *iter)
2164{
Tim Petersf4848da2001-05-05 00:14:56 +00002165 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002166 if (!PyIter_Check(iter)) {
2167 PyErr_Format(PyExc_TypeError,
2168 "'%.100s' object is not an iterator",
2169 iter->ob_type->tp_name);
2170 return NULL;
2171 }
Tim Petersf4848da2001-05-05 00:14:56 +00002172 result = (*iter->ob_type->tp_iternext)(iter);
2173 if (result == NULL &&
2174 PyErr_Occurred() &&
2175 PyErr_ExceptionMatches(PyExc_StopIteration))
2176 PyErr_Clear();
2177 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002178}