blob: 4ac73422dc5cea11e4fe44a2ae4cc2edbc1a816c [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;
675 if (mv && mv->sq_repeat) {
676 return sequence_repeat(mv->sq_repeat, v, w);
677 }
678 else if (mw && mw->sq_repeat) {
679 return sequence_repeat(mw->sq_repeat, w, v);
680 }
681 result = binop_type_error(v, w, "*");
682 }
683 return result;
684}
685
Guido van Rossume15dee51995-07-18 14:12:02 +0000686PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000687PyNumber_FloorDivide(PyObject *v, PyObject *w)
688{
689 /* XXX tp_flags test */
690 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
691}
692
693PyObject *
694PyNumber_TrueDivide(PyObject *v, PyObject *w)
695{
696 /* XXX tp_flags test */
697 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
698}
699
700PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000701PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000702{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000703 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000704}
705
706PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000707PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000708{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000709 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000710}
711
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000712/* Binary in-place operators */
713
714/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000715 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000716
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000717 - If the left hand object has the appropriate struct members, and
718 they are filled, call the appropriate function and return the
719 result. No coercion is done on the arguments; the left-hand object
720 is the one the operation is performed on, and it's up to the
721 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000722
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000723 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000724 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000725
726 */
727
Guido van Rossum77660912002-04-16 16:32:50 +0000728#define HASINPLACE(t) \
729 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000730
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000731static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000732binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000733{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000734 PyNumberMethods *mv = v->ob_type->tp_as_number;
735 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000736 binaryfunc slot = NB_BINOP(mv, iop_slot);
737 if (slot) {
738 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000739 if (x != Py_NotImplemented) {
740 return x;
741 }
742 Py_DECREF(x);
743 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000744 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000745 return binary_op1(v, w, op_slot);
746}
747
748static PyObject *
749binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
750 const char *op_name)
751{
752 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
753 if (result == Py_NotImplemented) {
754 Py_DECREF(result);
755 return binop_type_error(v, w, op_name);
756 }
757 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000758}
759
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000760#define INPLACE_BINOP(func, iop, op, op_name) \
761 PyObject * \
762 func(PyObject *v, PyObject *w) { \
763 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000764 }
765
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000766INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
767INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
768INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
769INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
770INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
771INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
772INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000773
774PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000775PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
776{
777 /* XXX tp_flags test */
778 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
779 NB_SLOT(nb_floor_divide), "//=");
780}
781
782PyObject *
783PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
784{
785 /* XXX tp_flags test */
786 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
787 NB_SLOT(nb_true_divide), "/=");
788}
789
790PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000791PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
792{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000793 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
794 NB_SLOT(nb_add));
795 if (result == Py_NotImplemented) {
796 PySequenceMethods *m = v->ob_type->tp_as_sequence;
797 Py_DECREF(result);
798 if (m != NULL) {
799 binaryfunc f = NULL;
800 if (HASINPLACE(v))
801 f = m->sq_inplace_concat;
802 if (f == NULL)
803 f = m->sq_concat;
804 if (f != NULL)
805 return (*f)(v, w);
806 }
807 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000808 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000809 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000810}
811
812PyObject *
813PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
814{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000815 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
816 NB_SLOT(nb_multiply));
817 if (result == Py_NotImplemented) {
818 intargfunc f = NULL;
819 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
820 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
821 Py_DECREF(result);
822 if (mv != NULL) {
823 if (HASINPLACE(v))
824 f = mv->sq_inplace_repeat;
825 if (f == NULL)
826 f = mv->sq_repeat;
827 if (f != NULL)
828 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000829 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000830 else if (mw != NULL) {
831 /* Note that the right hand operand should not be
832 * mutated in this case so sq_inplace_repeat is not
833 * used. */
834 if (mw->sq_repeat)
835 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000836 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000837 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000838 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000839 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000840}
841
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000842PyObject *
843PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
844{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000845 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
846 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000847}
848
849PyObject *
850PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
851{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000852 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
853 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
854 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000855 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000856 else {
857 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
858 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000859}
860
861
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000863
864PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000865PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000866{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000867 PyNumberMethods *m;
868
869 if (o == NULL)
870 return null_error();
871 m = o->ob_type->tp_as_number;
872 if (m && m->nb_negative)
873 return (*m->nb_negative)(o);
874
875 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000876}
877
878PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000879PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000880{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000881 PyNumberMethods *m;
882
883 if (o == NULL)
884 return null_error();
885 m = o->ob_type->tp_as_number;
886 if (m && m->nb_positive)
887 return (*m->nb_positive)(o);
888
889 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000890}
891
892PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000893PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000894{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000895 PyNumberMethods *m;
896
897 if (o == NULL)
898 return null_error();
899 m = o->ob_type->tp_as_number;
900 if (m && m->nb_invert)
901 return (*m->nb_invert)(o);
902
903 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000904}
905
906PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000907PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000908{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000909 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000910
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 if (o == NULL)
912 return null_error();
913 m = o->ob_type->tp_as_number;
914 if (m && m->nb_absolute)
915 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000916
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000917 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000918}
919
Guido van Rossum9e896b32000-04-05 20:11:21 +0000920/* Add a check for embedded NULL-bytes in the argument. */
921static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000922int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000923{
924 char *end;
925 PyObject *x;
926
927 x = PyInt_FromString((char*)s, &end, 10);
928 if (x == NULL)
929 return NULL;
930 if (end != s + len) {
931 PyErr_SetString(PyExc_ValueError,
932 "null byte in argument for int()");
933 Py_DECREF(x);
934 return NULL;
935 }
936 return x;
937}
938
Guido van Rossume15dee51995-07-18 14:12:02 +0000939PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000940PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000941{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000942 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000943 const char *buffer;
944 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000945
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 if (o == NULL)
947 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000948 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000949 Py_INCREF(o);
950 return o;
951 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000952 if (PyInt_Check(o)) {
953 PyIntObject *io = (PyIntObject*)o;
954 return PyInt_FromLong(io->ob_ival);
955 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000956 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000957 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000958 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000959#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000960 if (PyUnicode_Check(o))
961 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
962 PyUnicode_GET_SIZE(o),
963 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000964#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965 m = o->ob_type->tp_as_number;
966 if (m && m->nb_int)
967 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000968 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000969 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000970
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000971 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000972}
973
Guido van Rossum9e896b32000-04-05 20:11:21 +0000974/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000975static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000976long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000977{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000978 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000979 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000980
Guido van Rossum4c08d552000-03-10 22:55:18 +0000981 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000982 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000983 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000984 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000985 PyErr_SetString(PyExc_ValueError,
986 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000987 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000988 return NULL;
989 }
990 return x;
991}
992
Guido van Rossume15dee51995-07-18 14:12:02 +0000993PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000994PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000995{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000996 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000997 const char *buffer;
998 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000999
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001000 if (o == NULL)
1001 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001002 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001003 Py_INCREF(o);
1004 return o;
1005 }
Tim Petersdb30ac42002-03-02 04:14:21 +00001006 if (PyLong_Check(o))
1007 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001009 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001010 * doesn't do. In particular long('9.5') must raise an
1011 * exception, not truncate the float.
1012 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001013 return long_from_string(PyString_AS_STRING(o),
1014 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001015#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001016 if (PyUnicode_Check(o))
1017 /* The above check is done in PyLong_FromUnicode(). */
1018 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1019 PyUnicode_GET_SIZE(o),
1020 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001021#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022 m = o->ob_type->tp_as_number;
1023 if (m && m->nb_long)
1024 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001025 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1026 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001027
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001028 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001029}
1030
1031PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001032PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001033{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001035
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001036 if (o == NULL)
1037 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +00001038 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001039 Py_INCREF(o);
1040 return o;
1041 }
Tim Peters7a50f252001-09-10 21:28:20 +00001042 if (PyFloat_Check(o)) {
1043 PyFloatObject *po = (PyFloatObject *)o;
1044 return PyFloat_FromDouble(po->ob_fval);
1045 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001046 if (!PyString_Check(o)) {
1047 m = o->ob_type->tp_as_number;
1048 if (m && m->nb_float)
1049 return m->nb_float(o);
1050 }
1051 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001052}
1053
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001054/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001055
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056int
Fred Drake79912472000-07-09 04:06:11 +00001057PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001058{
Guido van Rossum8700b422001-09-07 20:20:11 +00001059 return s != NULL && s->ob_type->tp_as_sequence &&
1060 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001061}
1062
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001063int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001064PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001065{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001066 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001067
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001068 if (s == NULL) {
1069 null_error();
1070 return -1;
1071 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001072
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001073 m = s->ob_type->tp_as_sequence;
1074 if (m && m->sq_length)
1075 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001076
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001077 type_error("len() of unsized object");
1078 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001079}
1080
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001081#undef PySequence_Length
1082int
1083PySequence_Length(PyObject *s)
1084{
1085 return PySequence_Size(s);
1086}
1087#define PySequence_Length PySequence_Size
1088
Guido van Rossume15dee51995-07-18 14:12:02 +00001089PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001090PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001091{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001092 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001093
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094 if (s == NULL || o == NULL)
1095 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097 m = s->ob_type->tp_as_sequence;
1098 if (m && m->sq_concat)
1099 return m->sq_concat(s, o);
1100
1101 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001102}
1103
1104PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001105PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001106{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001107 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001108
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 if (o == NULL)
1110 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001111
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001112 m = o->ob_type->tp_as_sequence;
1113 if (m && m->sq_repeat)
1114 return m->sq_repeat(o, count);
1115
1116 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001117}
1118
1119PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001120PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1121{
1122 PySequenceMethods *m;
1123
1124 if (s == NULL || o == NULL)
1125 return null_error();
1126
1127 m = s->ob_type->tp_as_sequence;
1128 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1129 return m->sq_inplace_concat(s, o);
1130 if (m && m->sq_concat)
1131 return m->sq_concat(s, o);
1132
1133 return type_error("object can't be concatenated");
1134}
1135
1136PyObject *
1137PySequence_InPlaceRepeat(PyObject *o, int count)
1138{
1139 PySequenceMethods *m;
1140
1141 if (o == NULL)
1142 return null_error();
1143
1144 m = o->ob_type->tp_as_sequence;
1145 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1146 return m->sq_inplace_repeat(o, count);
1147 if (m && m->sq_repeat)
1148 return m->sq_repeat(o, count);
1149
1150 return type_error("object can't be repeated");
1151}
1152
1153PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001154PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001155{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001157
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158 if (s == NULL)
1159 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001161 m = s->ob_type->tp_as_sequence;
1162 if (m && m->sq_item) {
1163 if (i < 0) {
1164 if (m->sq_length) {
1165 int l = (*m->sq_length)(s);
1166 if (l < 0)
1167 return NULL;
1168 i += l;
1169 }
1170 }
1171 return m->sq_item(s, i);
1172 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001173
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001175}
1176
Thomas Wouters1d75a792000-08-17 22:37:32 +00001177static PyObject *
1178sliceobj_from_intint(int i, int j)
1179{
1180 PyObject *start, *end, *slice;
1181 start = PyInt_FromLong((long)i);
1182 if (!start)
1183 return NULL;
1184 end = PyInt_FromLong((long)j);
1185 if (!end) {
1186 Py_DECREF(start);
1187 return NULL;
1188 }
1189 slice = PySlice_New(start, end, NULL);
1190 Py_DECREF(start);
1191 Py_DECREF(end);
1192 return slice;
1193}
1194
Guido van Rossume15dee51995-07-18 14:12:02 +00001195PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001196PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001197{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001199 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001200
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001201 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001202
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001203 m = s->ob_type->tp_as_sequence;
1204 if (m && m->sq_slice) {
1205 if (i1 < 0 || i2 < 0) {
1206 if (m->sq_length) {
1207 int l = (*m->sq_length)(s);
1208 if (l < 0)
1209 return NULL;
1210 if (i1 < 0)
1211 i1 += l;
1212 if (i2 < 0)
1213 i2 += l;
1214 }
1215 }
1216 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001217 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1218 PyObject *res;
1219 PyObject *slice = sliceobj_from_intint(i1, i2);
1220 if (!slice)
1221 return NULL;
1222 res = mp->mp_subscript(s, slice);
1223 Py_DECREF(slice);
1224 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001225 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001226
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001228}
1229
1230int
Fred Drake79912472000-07-09 04:06:11 +00001231PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001232{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001233 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001234
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001235 if (s == NULL) {
1236 null_error();
1237 return -1;
1238 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001239
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 m = s->ob_type->tp_as_sequence;
1241 if (m && m->sq_ass_item) {
1242 if (i < 0) {
1243 if (m->sq_length) {
1244 int l = (*m->sq_length)(s);
1245 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001246 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 i += l;
1248 }
1249 }
1250 return m->sq_ass_item(s, i, o);
1251 }
1252
1253 type_error("object doesn't support item assignment");
1254 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001255}
1256
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001257int
Fred Drake79912472000-07-09 04:06:11 +00001258PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001259{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001260 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001261
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262 if (s == NULL) {
1263 null_error();
1264 return -1;
1265 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001266
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 m = s->ob_type->tp_as_sequence;
1268 if (m && m->sq_ass_item) {
1269 if (i < 0) {
1270 if (m->sq_length) {
1271 int l = (*m->sq_length)(s);
1272 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001273 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001274 i += l;
1275 }
1276 }
1277 return m->sq_ass_item(s, i, (PyObject *)NULL);
1278 }
1279
1280 type_error("object doesn't support item deletion");
1281 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001282}
1283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001284int
Fred Drake79912472000-07-09 04:06:11 +00001285PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001286{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001287 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001288 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001289
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 if (s == NULL) {
1291 null_error();
1292 return -1;
1293 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001294
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001295 m = s->ob_type->tp_as_sequence;
1296 if (m && m->sq_ass_slice) {
1297 if (i1 < 0 || i2 < 0) {
1298 if (m->sq_length) {
1299 int l = (*m->sq_length)(s);
1300 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001301 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001302 if (i1 < 0)
1303 i1 += l;
1304 if (i2 < 0)
1305 i2 += l;
1306 }
1307 }
1308 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001309 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1310 int res;
1311 PyObject *slice = sliceobj_from_intint(i1, i2);
1312 if (!slice)
1313 return -1;
1314 res = mp->mp_ass_subscript(s, slice, o);
1315 Py_DECREF(slice);
1316 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001317 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001318
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 type_error("object doesn't support slice assignment");
1320 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001321}
1322
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323int
Fred Drake79912472000-07-09 04:06:11 +00001324PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001325{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 if (s == NULL) {
1329 null_error();
1330 return -1;
1331 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001332
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 m = s->ob_type->tp_as_sequence;
1334 if (m && m->sq_ass_slice) {
1335 if (i1 < 0 || i2 < 0) {
1336 if (m->sq_length) {
1337 int l = (*m->sq_length)(s);
1338 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001339 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001340 if (i1 < 0)
1341 i1 += l;
1342 if (i2 < 0)
1343 i2 += l;
1344 }
1345 }
1346 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1347 }
1348 type_error("object doesn't support slice deletion");
1349 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001350}
1351
Guido van Rossume15dee51995-07-18 14:12:02 +00001352PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001353PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001354{
Tim Peters6912d4d2001-05-05 03:56:37 +00001355 PyObject *it; /* iter(v) */
1356 int n; /* guess for result tuple size */
1357 PyObject *result;
1358 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001359
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 if (v == NULL)
1361 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001362
Tim Peters6912d4d2001-05-05 03:56:37 +00001363 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001364 if (PyTuple_CheckExact(v)) {
1365 /* Note that we can't know whether it's safe to return
1366 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001367 to exact tuples here. In contrast, lists always make
1368 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001369 Py_INCREF(v);
1370 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001371 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 if (PyList_Check(v))
1373 return PyList_AsTuple(v);
1374
Tim Peters6912d4d2001-05-05 03:56:37 +00001375 /* Get iterator. */
1376 it = PyObject_GetIter(v);
1377 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001378 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001379
Tim Peters6912d4d2001-05-05 03:56:37 +00001380 /* Guess result size and allocate space. */
1381 n = PySequence_Size(v);
1382 if (n < 0) {
1383 PyErr_Clear();
1384 n = 10; /* arbitrary */
1385 }
1386 result = PyTuple_New(n);
1387 if (result == NULL)
1388 goto Fail;
1389
1390 /* Fill the tuple. */
1391 for (j = 0; ; ++j) {
1392 PyObject *item = PyIter_Next(it);
1393 if (item == NULL) {
1394 if (PyErr_Occurred())
1395 goto Fail;
1396 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001398 if (j >= n) {
1399 if (n < 500)
1400 n += 10;
1401 else
1402 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001403 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001404 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001405 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001406 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001407 }
1408 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001409 }
1410
Tim Peters6912d4d2001-05-05 03:56:37 +00001411 /* Cut tuple back if guess was too large. */
1412 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001413 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001414 goto Fail;
1415
1416 Py_DECREF(it);
1417 return result;
1418
1419Fail:
1420 Py_XDECREF(result);
1421 Py_DECREF(it);
1422 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001423}
1424
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001425PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001426PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001427{
Tim Petersf553f892001-05-01 20:45:31 +00001428 PyObject *it; /* iter(v) */
1429 PyObject *result; /* result list */
1430 int n; /* guess for result list size */
1431 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001432
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001433 if (v == NULL)
1434 return null_error();
1435
Tim Petersf553f892001-05-01 20:45:31 +00001436 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001437 if (PyList_Check(v))
1438 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1439
Tim Petersf553f892001-05-01 20:45:31 +00001440 /* Get iterator. There may be some low-level efficiency to be gained
1441 * by caching the tp_iternext slot instead of using PyIter_Next()
1442 * later, but premature optimization is the root etc.
1443 */
1444 it = PyObject_GetIter(v);
1445 if (it == NULL)
1446 return NULL;
1447
1448 /* Guess a result list size. */
1449 n = -1; /* unknown */
1450 if (PySequence_Check(v) &&
1451 v->ob_type->tp_as_sequence->sq_length) {
1452 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001454 PyErr_Clear();
1455 }
1456 if (n < 0)
1457 n = 8; /* arbitrary */
1458 result = PyList_New(n);
1459 if (result == NULL) {
1460 Py_DECREF(it);
1461 return NULL;
1462 }
1463
1464 /* Run iterator to exhaustion. */
1465 for (i = 0; ; i++) {
1466 PyObject *item = PyIter_Next(it);
1467 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001468 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001469 Py_DECREF(result);
1470 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001471 }
Tim Petersf553f892001-05-01 20:45:31 +00001472 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001473 }
Tim Petersf553f892001-05-01 20:45:31 +00001474 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001475 PyList_SET_ITEM(result, i, item); /* steals ref */
1476 else {
1477 int status = PyList_Append(result, item);
1478 Py_DECREF(item); /* append creates a new ref */
1479 if (status < 0) {
1480 Py_DECREF(result);
1481 result = NULL;
1482 break;
1483 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001484 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001485 }
Tim Petersf553f892001-05-01 20:45:31 +00001486
1487 /* Cut back result list if initial guess was too large. */
1488 if (i < n && result != NULL) {
1489 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1490 Py_DECREF(result);
1491 result = NULL;
1492 }
1493 }
1494 Py_DECREF(it);
1495 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001496}
1497
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001498PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001499PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001500{
1501 if (v == NULL)
1502 return null_error();
1503
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001504 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001505 Py_INCREF(v);
1506 return v;
1507 }
1508
1509 v = PySequence_Tuple(v);
1510 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1511 return type_error(m);
1512
1513 return v;
1514}
1515
Tim Peters16a77ad2001-09-08 04:00:12 +00001516/* Iterate over seq. Result depends on the operation:
1517 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1518 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1519 set ValueError and return -1 if none found; also return -1 on error.
1520 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1521*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001522int
Tim Peters16a77ad2001-09-08 04:00:12 +00001523_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001524{
Tim Peters16a77ad2001-09-08 04:00:12 +00001525 int n;
1526 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1527 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001528
Tim Peters16a77ad2001-09-08 04:00:12 +00001529 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001530 null_error();
1531 return -1;
1532 }
Tim Peters75f8e352001-05-05 11:33:43 +00001533
Tim Peters16a77ad2001-09-08 04:00:12 +00001534 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001535 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001536 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001537 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001538 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001539
Tim Peters16a77ad2001-09-08 04:00:12 +00001540 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001541 for (;;) {
1542 int cmp;
1543 PyObject *item = PyIter_Next(it);
1544 if (item == NULL) {
1545 if (PyErr_Occurred())
1546 goto Fail;
1547 break;
1548 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001549
1550 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001551 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001552 if (cmp < 0)
1553 goto Fail;
1554 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001555 switch (operation) {
1556 case PY_ITERSEARCH_COUNT:
1557 ++n;
1558 if (n <= 0) {
1559 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001560 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001561 goto Fail;
1562 }
1563 break;
1564
1565 case PY_ITERSEARCH_INDEX:
1566 if (wrapped) {
1567 PyErr_SetString(PyExc_OverflowError,
1568 "index exceeds C int size");
1569 goto Fail;
1570 }
1571 goto Done;
1572
1573 case PY_ITERSEARCH_CONTAINS:
1574 n = 1;
1575 goto Done;
1576
1577 default:
1578 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001579 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001580 }
1581
1582 if (operation == PY_ITERSEARCH_INDEX) {
1583 ++n;
1584 if (n <= 0)
1585 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001586 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001587 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001588
1589 if (operation != PY_ITERSEARCH_INDEX)
1590 goto Done;
1591
1592 PyErr_SetString(PyExc_ValueError,
1593 "sequence.index(x): x not in sequence");
1594 /* fall into failure code */
1595Fail:
1596 n = -1;
1597 /* fall through */
1598Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001599 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001600 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001601
Guido van Rossume15dee51995-07-18 14:12:02 +00001602}
1603
Tim Peters16a77ad2001-09-08 04:00:12 +00001604/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001605int
Tim Peters16a77ad2001-09-08 04:00:12 +00001606PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001607{
Tim Peters16a77ad2001-09-08 04:00:12 +00001608 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001609}
1610
Tim Peterscb8d3682001-05-05 21:05:01 +00001611/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001612 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001613 */
1614int
1615PySequence_Contains(PyObject *seq, PyObject *ob)
1616{
1617 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1618 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1619 if (sqm != NULL && sqm->sq_contains != NULL)
1620 return (*sqm->sq_contains)(seq, ob);
1621 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001622 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001623}
1624
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001625/* Backwards compatibility */
1626#undef PySequence_In
1627int
Fred Drake79912472000-07-09 04:06:11 +00001628PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001629{
1630 return PySequence_Contains(w, v);
1631}
1632
1633int
Fred Drake79912472000-07-09 04:06:11 +00001634PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001635{
Tim Peters16a77ad2001-09-08 04:00:12 +00001636 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001637}
1638
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001639/* Operations on mappings */
1640
1641int
Fred Drake79912472000-07-09 04:06:11 +00001642PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001643{
Guido van Rossum8700b422001-09-07 20:20:11 +00001644 return o && o->ob_type->tp_as_mapping &&
1645 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001646}
1647
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001648int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001649PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001650{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001651 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001652
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001653 if (o == NULL) {
1654 null_error();
1655 return -1;
1656 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001657
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001658 m = o->ob_type->tp_as_mapping;
1659 if (m && m->mp_length)
1660 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001661
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001662 type_error("len() of unsized object");
1663 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001664}
1665
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001666#undef PyMapping_Length
1667int
1668PyMapping_Length(PyObject *o)
1669{
1670 return PyMapping_Size(o);
1671}
1672#define PyMapping_Length PyMapping_Size
1673
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001674PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001675PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001676{
1677 PyObject *okey, *r;
1678
1679 if (key == NULL)
1680 return null_error();
1681
1682 okey = PyString_FromString(key);
1683 if (okey == NULL)
1684 return NULL;
1685 r = PyObject_GetItem(o, okey);
1686 Py_DECREF(okey);
1687 return r;
1688}
1689
1690int
Fred Drake79912472000-07-09 04:06:11 +00001691PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001692{
1693 PyObject *okey;
1694 int r;
1695
1696 if (key == NULL) {
1697 null_error();
1698 return -1;
1699 }
1700
1701 okey = PyString_FromString(key);
1702 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001703 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001704 r = PyObject_SetItem(o, okey, value);
1705 Py_DECREF(okey);
1706 return r;
1707}
1708
1709int
Fred Drake79912472000-07-09 04:06:11 +00001710PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001711{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001712 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001713
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714 v = PyMapping_GetItemString(o, key);
1715 if (v) {
1716 Py_DECREF(v);
1717 return 1;
1718 }
1719 PyErr_Clear();
1720 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001721}
1722
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001723int
Fred Drake79912472000-07-09 04:06:11 +00001724PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001725{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001726 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001727
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001728 v = PyObject_GetItem(o, key);
1729 if (v) {
1730 Py_DECREF(v);
1731 return 1;
1732 }
1733 PyErr_Clear();
1734 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001735}
1736
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001737/* Operations on callable objects */
1738
1739/* XXX PyCallable_Check() is in object.c */
1740
Guido van Rossume15dee51995-07-18 14:12:02 +00001741PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001742PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001743{
Guido van Rossum5560b742001-09-14 16:47:50 +00001744 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001745}
Guido van Rossume15dee51995-07-18 14:12:02 +00001746
1747PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001748PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1749{
1750 ternaryfunc call;
1751
1752 if ((call = func->ob_type->tp_call) != NULL) {
1753 PyObject *result = (*call)(func, arg, kw);
1754 if (result == NULL && !PyErr_Occurred())
1755 PyErr_SetString(
1756 PyExc_SystemError,
1757 "NULL result without error in PyObject_Call");
1758 return result;
1759 }
Fred Drake573395a2001-11-01 20:26:12 +00001760 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1761 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001762 return NULL;
1763}
1764
1765PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001766PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001767{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001768 va_list va;
1769 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001770
Fred Drakeb92cf062001-10-27 06:16:31 +00001771 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001772 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001773
Fred Drakeb92cf062001-10-27 06:16:31 +00001774 if (format && *format) {
1775 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001776 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001777 va_end(va);
1778 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001779 else
1780 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001781
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001782 if (args == NULL)
1783 return NULL;
1784
1785 if (!PyTuple_Check(args)) {
1786 PyObject *a;
1787
1788 a = PyTuple_New(1);
1789 if (a == NULL)
1790 return NULL;
1791 if (PyTuple_SetItem(a, 0, args) < 0)
1792 return NULL;
1793 args = a;
1794 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001795 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001796
1797 Py_DECREF(args);
1798
1799 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001800}
1801
1802PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001803PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001804{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001805 va_list va;
1806 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001807
Fred Drakeb92cf062001-10-27 06:16:31 +00001808 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001809 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001810
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001811 func = PyObject_GetAttrString(o, name);
1812 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001813 PyErr_SetString(PyExc_AttributeError, name);
1814 return 0;
1815 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001816
Fred Drakeb92cf062001-10-27 06:16:31 +00001817 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001818 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001819
Fred Drakeb92cf062001-10-27 06:16:31 +00001820 if (format && *format) {
1821 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001822 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001823 va_end(va);
1824 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001825 else
1826 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001827
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001828 if (!args)
1829 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001830
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 if (!PyTuple_Check(args)) {
1832 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001833
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001834 a = PyTuple_New(1);
1835 if (a == NULL)
1836 return NULL;
1837 if (PyTuple_SetItem(a, 0, args) < 0)
1838 return NULL;
1839 args = a;
1840 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001841
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001842 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001843
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 Py_DECREF(args);
1845 Py_DECREF(func);
1846
1847 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001848}
Guido van Rossum823649d2001-03-21 18:40:58 +00001849
1850
Fred Drakeb421b8c2001-10-26 16:21:32 +00001851static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001852objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001853{
1854 int i, n = 0;
1855 va_list countva;
1856 PyObject *result, *tmp;
1857
1858#ifdef VA_LIST_IS_ARRAY
1859 memcpy(countva, va, sizeof(va_list));
1860#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001861#ifdef __va_copy
1862 __va_copy(countva, va);
1863#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001864 countva = va;
1865#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001866#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001867
1868 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1869 ++n;
1870 result = PyTuple_New(n);
1871 if (result != NULL && n > 0) {
1872 for (i = 0; i < n; ++i) {
1873 tmp = (PyObject *)va_arg(va, PyObject *);
1874 PyTuple_SET_ITEM(result, i, tmp);
1875 Py_INCREF(tmp);
1876 }
1877 }
1878 return result;
1879}
1880
1881PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001882PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001883{
1884 PyObject *args, *tmp;
1885 va_list vargs;
1886
1887 if (callable == NULL || name == NULL)
1888 return null_error();
1889
1890 callable = PyObject_GetAttr(callable, name);
1891 if (callable == NULL)
1892 return NULL;
1893
1894 /* count the args */
1895 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001896 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001897 va_end(vargs);
1898 if (args == NULL) {
1899 Py_DECREF(callable);
1900 return NULL;
1901 }
1902 tmp = PyObject_Call(callable, args, NULL);
1903 Py_DECREF(args);
1904 Py_DECREF(callable);
1905
1906 return tmp;
1907}
1908
1909PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001910PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001911{
1912 PyObject *args, *tmp;
1913 va_list vargs;
1914
1915 if (callable == NULL)
1916 return null_error();
1917
1918 /* count the args */
1919 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001920 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001921 va_end(vargs);
1922 if (args == NULL)
1923 return NULL;
1924 tmp = PyObject_Call(callable, args, NULL);
1925 Py_DECREF(args);
1926
1927 return tmp;
1928}
1929
1930
Guido van Rossum823649d2001-03-21 18:40:58 +00001931/* isinstance(), issubclass() */
1932
Barry Warsawf16951c2002-04-23 22:45:44 +00001933/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1934 * state that will almost never happen.
1935 *
1936 * 0. creating the __bases__ static string could get a MemoryError
1937 * 1. getattr(cls, '__bases__') could raise an AttributeError
1938 * 2. getattr(cls, '__bases__') could raise some other exception
1939 * 3. getattr(cls, '__bases__') could return a tuple
1940 * 4. getattr(cls, '__bases__') could return something other than a tuple
1941 *
1942 * Only state #3 is a non-error state and only it returns a non-NULL object
1943 * (it returns the retrieved tuple).
1944 *
1945 * Any raised AttributeErrors are masked by clearing the exception and
1946 * returning NULL. If an object other than a tuple comes out of __bases__,
1947 * then again, the return value is NULL. So yes, these two situations
1948 * produce exactly the same results: NULL is returned and no error is set.
1949 *
1950 * If some exception other than AttributeError is raised, then NULL is also
1951 * returned, but the exception is not cleared. That's because we want the
1952 * exception to be propagated along.
1953 *
1954 * Callers are expected to test for PyErr_Occurred() when the return value
1955 * is NULL to decide whether a valid exception should be propagated or not.
1956 * When there's no exception to propagate, it's customary for the caller to
1957 * set a TypeError.
1958 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001959static PyObject *
1960abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001961{
1962 static PyObject *__bases__ = NULL;
1963 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001964
1965 if (__bases__ == NULL) {
1966 __bases__ = PyString_FromString("__bases__");
1967 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001968 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001969 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001970 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001971 if (bases == NULL) {
1972 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1973 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001974 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001975 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001976 if (!PyTuple_Check(bases)) {
1977 Py_DECREF(bases);
1978 return NULL;
1979 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001980 return bases;
1981}
1982
1983
1984static int
1985abstract_issubclass(PyObject *derived, PyObject *cls)
1986{
1987 PyObject *bases;
1988 int i, n;
1989 int r = 0;
1990
1991
Guido van Rossum823649d2001-03-21 18:40:58 +00001992 if (derived == cls)
1993 return 1;
1994
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00001995 if (PyTuple_Check(cls)) {
1996 /* Not a general sequence -- that opens up the road to
1997 recursion and stack overflow. */
1998 n = PyTuple_GET_SIZE(cls);
1999 for (i = 0; i < n; i++) {
2000 if (derived == PyTuple_GET_ITEM(cls, i))
2001 return 1;
2002 }
2003 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002004 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002005 if (bases == NULL) {
2006 if (PyErr_Occurred())
2007 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002008 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002009 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002010 n = PyTuple_GET_SIZE(bases);
2011 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002012 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002013 if (r != 0)
2014 break;
2015 }
2016
2017 Py_DECREF(bases);
2018
2019 return r;
2020}
2021
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002022static int
2023check_class(PyObject *cls, const char *error)
2024{
2025 PyObject *bases = abstract_get_bases(cls);
2026 if (bases == NULL) {
2027 /* Do not mask errors. */
2028 if (!PyErr_Occurred())
2029 PyErr_SetString(PyExc_TypeError, error);
2030 return 0;
2031 }
2032 Py_DECREF(bases);
2033 return -1;
2034}
2035
Guido van Rossum823649d2001-03-21 18:40:58 +00002036int
2037PyObject_IsInstance(PyObject *inst, PyObject *cls)
2038{
2039 PyObject *icls;
2040 static PyObject *__class__ = NULL;
2041 int retval = 0;
2042
Neil Schemenauer6b471292001-10-18 03:18:43 +00002043 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2044 PyObject *inclass =
2045 (PyObject*)((PyInstanceObject*)inst)->in_class;
2046 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002047 }
2048 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002049 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002050 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002051 else if (PyTuple_Check(cls)) {
2052 /* Not a general sequence -- that opens up the road to
2053 recursion and stack overflow. */
2054 int i, n;
2055
2056 n = PyTuple_GET_SIZE(cls);
2057 for (i = 0; i < n; i++) {
2058 retval = PyObject_IsInstance(
2059 inst, PyTuple_GET_ITEM(cls, i));
2060 if (retval != 0)
2061 break;
2062 }
2063 return retval;
2064 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002065 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002066 if (!check_class(cls,
2067 "isinstance() arg 2 must be a class, type,"
2068 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002069 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002070 if (__class__ == NULL) {
2071 __class__ = PyString_FromString("__class__");
2072 if (__class__ == NULL)
2073 return -1;
2074 }
2075 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002076 if (icls == NULL) {
2077 PyErr_Clear();
2078 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002079 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002080 else {
2081 retval = abstract_issubclass(icls, cls);
2082 Py_DECREF(icls);
2083 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002084 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002085
Guido van Rossum823649d2001-03-21 18:40:58 +00002086 return retval;
2087}
2088
2089int
2090PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2091{
2092 int retval;
2093
2094 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002095 if (!check_class(derived, "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002096 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002097
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002098 if (PyTuple_Check(cls)) {
2099 int i;
2100 int n = PyTuple_GET_SIZE(cls);
2101 for (i = 0; i < n; ++i) {
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002102 retval = PyObject_IsSubclass(derived, PyTuple_GET_ITEM(cls, i));
2103 if (retval != 0) /* either found it, or got an error */
2104 return retval;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002105 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002106 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002107 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002108 else {
2109 if (!check_class(cls,
2110 "issubclass() arg 2 must be a class"
2111 " or tuple of classes"))
2112 return -1;
2113 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002114
2115 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002116 }
2117 else {
2118 /* shortcut */
2119 if (!(retval = (derived == cls)))
2120 retval = PyClass_IsSubclass(derived, cls);
2121 }
2122
2123 return retval;
2124}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002125
2126PyObject *
2127PyObject_GetIter(PyObject *o)
2128{
2129 PyTypeObject *t = o->ob_type;
2130 getiterfunc f = NULL;
2131 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2132 f = t->tp_iter;
2133 if (f == NULL) {
2134 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002135 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002136 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002137 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002138 return NULL;
2139 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002140 else {
2141 PyObject *res = (*f)(o);
2142 if (res != NULL && !PyIter_Check(res)) {
2143 PyErr_Format(PyExc_TypeError,
2144 "iter() returned non-iterator "
2145 "of type '%.100s'",
2146 res->ob_type->tp_name);
2147 Py_DECREF(res);
2148 res = NULL;
2149 }
2150 return res;
2151 }
2152}
2153
Tim Petersf4848da2001-05-05 00:14:56 +00002154/* Return next item.
2155 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2156 * If the iteration terminates normally, return NULL and clear the
2157 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2158 * will be false.
2159 * Else return the next object. PyErr_Occurred() will be false.
2160 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002161PyObject *
2162PyIter_Next(PyObject *iter)
2163{
Tim Petersf4848da2001-05-05 00:14:56 +00002164 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002165 if (!PyIter_Check(iter)) {
2166 PyErr_Format(PyExc_TypeError,
2167 "'%.100s' object is not an iterator",
2168 iter->ob_type->tp_name);
2169 return NULL;
2170 }
Tim Petersf4848da2001-05-05 00:14:56 +00002171 result = (*iter->ob_type->tp_iternext)(iter);
2172 if (result == NULL &&
2173 PyErr_Occurred() &&
2174 PyErr_ExceptionMatches(PyExc_StopIteration))
2175 PyErr_Clear();
2176 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002177}