blob: cae474c1d681c04faf4cd0ef49888b1b32544dc9 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00003
Guido van Rossume15dee51995-07-18 14:12:02 +00004#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00005#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00006#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00007#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00008
9#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +000010 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000013
14static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000015type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000016{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000017 PyErr_SetString(PyExc_TypeError, msg);
18 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000019}
20
Guido van Rossum052b7e11996-11-11 15:08:19 +000021static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000022null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000023{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000024 if (!PyErr_Occurred())
25 PyErr_SetString(PyExc_SystemError,
26 "null argument to internal routine");
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000030/* Operations on any object */
31
32int
Fred Drake79912472000-07-09 04:06:11 +000033PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034{
35 int r;
36
37 if (o1 == NULL || o2 == NULL) {
38 null_error();
39 return -1;
40 }
41 r = PyObject_Compare(o1, o2);
42 if (PyErr_Occurred())
43 return -1;
44 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000045 return 0;
46}
Guido van Rossume15dee51995-07-18 14:12:02 +000047
48PyObject *
Fred Drake79912472000-07-09 04:06:11 +000049PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000050{
51 PyObject *v;
52
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000053 if (o == NULL)
54 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000055 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
58}
59
60int
Jeremy Hylton6253f832000-07-12 12:56:19 +000061PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 m = o->ob_type->tp_as_sequence;
71 if (m && m->sq_length)
72 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Jeremy Hylton6253f832000-07-12 12:56:19 +000074 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075}
76
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000077#undef PyObject_Length
78int
79PyObject_Length(PyObject *o)
80{
81 return PyObject_Size(o);
82}
83#define PyObject_Length PyObject_Size
84
Guido van Rossume15dee51995-07-18 14:12:02 +000085PyObject *
Fred Drake79912472000-07-09 04:06:11 +000086PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +000087{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000088 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000089
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000090 if (o == NULL || key == NULL)
91 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000092
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000093 m = o->ob_type->tp_as_mapping;
94 if (m && m->mp_subscript)
95 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +000096
Guido van Rossum21308241998-08-13 16:44:44 +000097 if (o->ob_type->tp_as_sequence) {
98 if (PyInt_Check(key))
99 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000100 else if (PyLong_Check(key)) {
101 long key_value = PyLong_AsLong(key);
102 if (key_value == -1 && PyErr_Occurred())
103 return NULL;
104 return PySequence_GetItem(o, key_value);
105 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000106 else if (o->ob_type->tp_as_sequence->sq_item)
107 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000108 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000109
110 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000111}
112
113int
Fred Drake79912472000-07-09 04:06:11 +0000114PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000115{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000116 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000118 if (o == NULL || key == NULL || value == NULL) {
119 null_error();
120 return -1;
121 }
122 m = o->ob_type->tp_as_mapping;
123 if (m && m->mp_ass_subscript)
124 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000125
Guido van Rossum21308241998-08-13 16:44:44 +0000126 if (o->ob_type->tp_as_sequence) {
127 if (PyInt_Check(key))
128 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000129 else if (PyLong_Check(key)) {
130 long key_value = PyLong_AsLong(key);
131 if (key_value == -1 && PyErr_Occurred())
132 return -1;
133 return PySequence_SetItem(o, key_value, value);
134 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000135 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
136 type_error("sequence index must be integer");
137 return -1;
138 }
Guido van Rossum21308241998-08-13 16:44:44 +0000139 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000140
141 type_error("object does not support item assignment");
142 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000143}
144
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000145int
Fred Drake79912472000-07-09 04:06:11 +0000146PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000147{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000148 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000149
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000150 if (o == NULL || key == NULL) {
151 null_error();
152 return -1;
153 }
154 m = o->ob_type->tp_as_mapping;
155 if (m && m->mp_ass_subscript)
156 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000157
Guido van Rossum21308241998-08-13 16:44:44 +0000158 if (o->ob_type->tp_as_sequence) {
159 if (PyInt_Check(key))
160 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000161 else if (PyLong_Check(key)) {
162 long key_value = PyLong_AsLong(key);
163 if (key_value == -1 && PyErr_Occurred())
164 return -1;
165 return PySequence_DelItem(o, key_value);
166 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000167 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
168 type_error("sequence index must be integer");
169 return -1;
170 }
Guido van Rossum21308241998-08-13 16:44:44 +0000171 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000172
173 type_error("object does not support item deletion");
174 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000175}
176
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000177int
178PyObject_DelItemString(PyObject *o, char *key)
179{
180 PyObject *okey;
181 int ret;
182
183 if (o == NULL || key == NULL) {
184 null_error();
185 return -1;
186 }
187 okey = PyString_FromString(key);
188 if (okey == NULL)
189 return -1;
190 ret = PyObject_DelItem(o, okey);
191 Py_DECREF(okey);
192 return ret;
193}
194
Guido van Rossum4c08d552000-03-10 22:55:18 +0000195int PyObject_AsCharBuffer(PyObject *obj,
196 const char **buffer,
197 int *buffer_len)
198{
199 PyBufferProcs *pb;
200 const char *pp;
201 int len;
202
203 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
204 null_error();
205 return -1;
206 }
207 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000208 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000209 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000210 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000211 PyErr_SetString(PyExc_TypeError,
212 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000213 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000214 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000215 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000216 PyErr_SetString(PyExc_TypeError,
217 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000218 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000219 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000220 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000221 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000222 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000223 *buffer = pp;
224 *buffer_len = len;
225 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000226}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000227
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000228int
229PyObject_CheckReadBuffer(PyObject *obj)
230{
231 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
232
233 if (pb == NULL ||
234 pb->bf_getreadbuffer == NULL ||
235 pb->bf_getsegcount == NULL ||
236 (*pb->bf_getsegcount)(obj, NULL) != 1)
237 return 0;
238 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239}
240
241int PyObject_AsReadBuffer(PyObject *obj,
242 const void **buffer,
243 int *buffer_len)
244{
245 PyBufferProcs *pb;
246 void *pp;
247 int len;
248
249 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
250 null_error();
251 return -1;
252 }
253 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000255 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000256 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000257 PyErr_SetString(PyExc_TypeError,
258 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000260 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000261 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000262 PyErr_SetString(PyExc_TypeError,
263 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000266 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000268 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000269 *buffer = pp;
270 *buffer_len = len;
271 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000272}
273
274int PyObject_AsWriteBuffer(PyObject *obj,
275 void **buffer,
276 int *buffer_len)
277{
278 PyBufferProcs *pb;
279 void*pp;
280 int len;
281
282 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
283 null_error();
284 return -1;
285 }
286 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000287 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000289 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 PyErr_SetString(PyExc_TypeError,
291 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000292 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000293 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000294 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000295 PyErr_SetString(PyExc_TypeError,
296 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000297 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000298 }
299 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
300 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000301 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000302 *buffer = pp;
303 *buffer_len = len;
304 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000305}
306
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000307/* Operations on numbers */
308
309int
Fred Drake79912472000-07-09 04:06:11 +0000310PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000311{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000312 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000313}
314
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000315/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000316
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000317/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000318
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000319#define NB_SLOT(x) offsetof(PyNumberMethods, x)
320#define NB_BINOP(nb_methods, slot) \
321 ((binaryfunc*)(& ((char*)nb_methods)[slot] ))
322#define NB_TERNOP(nb_methods, slot) \
323 ((ternaryfunc*)(& ((char*)nb_methods)[slot] ))
324
325/*
326 Calling scheme used for binary operations:
327
328 v w Action
329 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000330 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000331 new old v.op(v,w), coerce(v,w), v.op(v,w)
332 old new w.op(v,w), coerce(v,w), v.op(v,w)
333 old old coerce(v,w), v.op(v,w)
334
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000335 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
336 v->ob_type
337
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000338 Legend:
339 -------
340 * new == new style number
341 * old == old style number
342 * Action indicates the order in which operations are tried until either
343 a valid result is produced or an error occurs.
344
345 */
346
347static PyObject *
348binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000349{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000350 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000351 binaryfunc slotv = NULL;
352 binaryfunc slotw = NULL;
353
354 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
355 slotv = *NB_BINOP(v->ob_type->tp_as_number, op_slot);
356 if (w->ob_type != v->ob_type &&
357 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
358 slotw = *NB_BINOP(w->ob_type->tp_as_number, op_slot);
359 if (slotw == slotv)
360 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000361 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000362 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000363 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
364 x = slotw(v, w);
365 if (x != Py_NotImplemented)
366 return x;
367 Py_DECREF(x); /* can't do it */
368 slotw = NULL;
369 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000370 x = slotv(v, w);
371 if (x != Py_NotImplemented)
372 return x;
373 Py_DECREF(x); /* can't do it */
374 }
375 if (slotw) {
376 x = slotw(v, w);
377 if (x != Py_NotImplemented)
378 return x;
379 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000380 }
381 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
382 int err = PyNumber_CoerceEx(&v, &w);
383 if (err < 0) {
384 return NULL;
385 }
386 if (err == 0) {
387 PyNumberMethods *mv = v->ob_type->tp_as_number;
388 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000389 binaryfunc slot;
390 slot = *NB_BINOP(mv, op_slot);
391 if (slot) {
392 PyObject *x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000393 Py_DECREF(v);
394 Py_DECREF(w);
395 return x;
396 }
397 }
398 /* CoerceEx incremented the reference counts */
399 Py_DECREF(v);
400 Py_DECREF(w);
401 }
402 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000403 Py_INCREF(Py_NotImplemented);
404 return Py_NotImplemented;
405}
406
407static PyObject *
408binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
409{
410 PyObject *result = binary_op1(v, w, op_slot);
411 if (result == Py_NotImplemented) {
412 Py_DECREF(Py_NotImplemented);
Guido van Rossum5c66a262001-10-22 04:12:44 +0000413 PyErr_Format(
414 PyExc_TypeError,
415 "unsupported operand type(s) for %s: '%s' and '%s'",
416 op_name,
417 v->ob_type->tp_name,
418 w->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000419 return NULL;
420 }
421 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000422}
423
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000424
425/*
426 Calling scheme used for ternary operations:
427
Guido van Rossum84675ac2001-09-29 01:05:03 +0000428 *** In some cases, w.op is called before v.op; see binary_op1. ***
429
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000430 v w z Action
431 -------------------------------------------------------------------
432 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
433 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
434 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
435 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
436 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
437 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
438 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
439 old old old coerce(v,w,z), v.op(v,w,z)
440
441 Legend:
442 -------
443 * new == new style number
444 * old == old style number
445 * Action indicates the order in which operations are tried until either
446 a valid result is produced or an error occurs.
447 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
448 only if z != Py_None; if z == Py_None, then it is treated as absent
449 variable and only coerce(v,w) is tried.
450
451 */
452
453static PyObject *
454ternary_op(PyObject *v,
455 PyObject *w,
456 PyObject *z,
457 const int op_slot,
458 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000459{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000460 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000461 PyObject *x = NULL;
462 ternaryfunc slotv = NULL;
463 ternaryfunc slotw = NULL;
464 ternaryfunc slotz = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000465
466 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000467 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000468 if (mv != NULL && NEW_STYLE_NUMBER(v))
469 slotv = *NB_TERNOP(mv, op_slot);
470 if (w->ob_type != v->ob_type &&
471 mv != NULL && NEW_STYLE_NUMBER(w)) {
472 slotw = *NB_TERNOP(mw, op_slot);
473 if (slotw == slotv)
474 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000475 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000476 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000477 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
478 x = slotw(v, w, z);
479 if (x != Py_NotImplemented)
480 return x;
481 Py_DECREF(x); /* can't do it */
482 slotw = NULL;
483 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000484 x = slotv(v, w, z);
485 if (x != Py_NotImplemented)
486 return x;
487 Py_DECREF(x); /* can't do it */
488 }
489 if (slotw) {
490 x = slotw(v, w, z);
491 if (x != Py_NotImplemented)
492 return x;
493 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000494 }
495 mz = z->ob_type->tp_as_number;
496 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000497 slotz = *NB_TERNOP(mz, op_slot);
498 if (slotz == slotv || slotz == slotw)
499 slotz = NULL;
500 if (slotz) {
501 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000502 if (x != Py_NotImplemented)
503 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000504 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000505 }
506 }
507
508 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
509 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
510 /* we have an old style operand, coerce */
511 PyObject *v1, *z1, *w2, *z2;
512 int c;
513
514 c = PyNumber_Coerce(&v, &w);
515 if (c != 0)
516 goto error3;
517
518 /* Special case: if the third argument is None, it is
519 treated as absent argument and not coerced. */
520 if (z == Py_None) {
521 if (v->ob_type->tp_as_number) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000522 slotz = *NB_TERNOP(v->ob_type->tp_as_number,
523 op_slot);
524 if (slotz)
525 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000526 else
527 c = -1;
528 }
529 else
530 c = -1;
531 goto error2;
532 }
533 v1 = v;
534 z1 = z;
535 c = PyNumber_Coerce(&v1, &z1);
536 if (c != 0)
537 goto error2;
538 w2 = w;
539 z2 = z1;
540 c = PyNumber_Coerce(&w2, &z2);
541 if (c != 0)
542 goto error1;
543
544 if (v1->ob_type->tp_as_number != NULL) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000545 slotv = *NB_TERNOP(v1->ob_type->tp_as_number,
546 op_slot);
547 if (slotv)
548 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000549 else
550 c = -1;
551 }
552 else
553 c = -1;
554
555 Py_DECREF(w2);
556 Py_DECREF(z2);
557 error1:
558 Py_DECREF(v1);
559 Py_DECREF(z1);
560 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000561 Py_DECREF(v);
562 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000563 error3:
564 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000565 return x;
566 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000567
568 if (z == Py_None)
569 PyErr_Format(
570 PyExc_TypeError,
571 "unsupported operand type(s) for ** or pow(): "
572 "'%s' and '%s'",
573 v->ob_type->tp_name,
574 w->ob_type->tp_name);
575 else
576 PyErr_Format(
577 PyExc_TypeError,
578 "unsupported operand type(s) for pow(): "
579 "'%s', '%s', '%s'",
580 v->ob_type->tp_name,
581 w->ob_type->tp_name,
582 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000583 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000584}
585
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000586#define BINARY_FUNC(func, op, op_name) \
587 PyObject * \
588 func(PyObject *v, PyObject *w) { \
589 return binary_op(v, w, NB_SLOT(op), op_name); \
590 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000591
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000592BINARY_FUNC(PyNumber_Or, nb_or, "|")
593BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
594BINARY_FUNC(PyNumber_And, nb_and, "&")
595BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
596BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
597BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
598BINARY_FUNC(PyNumber_Multiply, nb_multiply, "*")
599BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
600BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000601
602PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000603PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000604{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000605 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
606 if (result == Py_NotImplemented) {
607 PySequenceMethods *m = v->ob_type->tp_as_sequence;
608 Py_DECREF(Py_NotImplemented);
609 if (m && m->sq_concat) {
610 result = (*m->sq_concat)(v, w);
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000611 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000612 else {
Guido van Rossum5c66a262001-10-22 04:12:44 +0000613 PyErr_Format(
614 PyExc_TypeError,
615 "unsupported operand types for +: '%s' and '%s'",
616 v->ob_type->tp_name,
617 w->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000618 result = NULL;
619 }
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
624PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000625PyNumber_FloorDivide(PyObject *v, PyObject *w)
626{
627 /* XXX tp_flags test */
628 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
629}
630
631PyObject *
632PyNumber_TrueDivide(PyObject *v, PyObject *w)
633{
634 /* XXX tp_flags test */
635 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
636}
637
638PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000639PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000640{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000641 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000642 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000643#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000644 else if (PyUnicode_Check(v))
645 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000646#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000647 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000648}
649
650PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000651PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000652{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000653 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000654}
655
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000656/* Binary in-place operators */
657
658/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000659 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000660
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000661 - If the left hand object has the appropriate struct members, and
662 they are filled, call the appropriate function and return the
663 result. No coercion is done on the arguments; the left-hand object
664 is the one the operation is performed on, and it's up to the
665 function to deal with the right-hand object.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000666
667 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000668 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000669
670 */
671
672#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
673
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000674static PyObject *
675binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
676 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000677{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000678 PyNumberMethods *mv = v->ob_type->tp_as_number;
679 if (mv != NULL && HASINPLACE(v)) {
680 binaryfunc *slot = NB_BINOP(mv, iop_slot);
681 if (*slot) {
682 PyObject *x = (*slot)(v, w);
683 if (x != Py_NotImplemented) {
684 return x;
685 }
686 Py_DECREF(x);
687 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000688 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000689 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000690}
691
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000692#define INPLACE_BINOP(func, iop, op, op_name) \
693 PyObject * \
694 func(PyObject *v, PyObject *w) { \
695 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000696 }
697
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000698INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
699INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
700INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
701INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
702INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
703INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
704INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000705
706PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000707PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
708{
709 /* XXX tp_flags test */
710 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
711 NB_SLOT(nb_floor_divide), "//=");
712}
713
714PyObject *
715PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
716{
717 /* XXX tp_flags test */
718 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
719 NB_SLOT(nb_true_divide), "/=");
720}
721
722PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000723PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
724{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000725 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000726
Guido van Rossumbb8be932000-09-01 23:27:32 +0000727 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000728 if (HASINPLACE(v))
729 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
730 if (f == NULL)
731 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000732 if (f != NULL)
733 return (*f)(v, w);
734 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000735 return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000736}
737
738PyObject *
739PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
740{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000741 PyObject * (*g)(PyObject *, int) = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000742 if (HASINPLACE(v) && v->ob_type->tp_as_sequence &&
743 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) {
744 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000745 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000746 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000747 }
748 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000749 n = PyLong_AsLong(w);
750 if (n == -1 && PyErr_Occurred())
751 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000752 }
753 else {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000754 return type_error("can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000755 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000756 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000757 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000758 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
759 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000760}
761
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000762
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000763
764PyObject *
765PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
766{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000767 if (PyString_Check(v))
768 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000769#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000770 else if (PyUnicode_Check(v))
771 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000772#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000773 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000774 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
775 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000776}
777
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000778
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000779PyObject *
780PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
781{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000782 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
783 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
784 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000785 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000786 else {
787 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
788 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000789}
790
791
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000792/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000793
794PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000795PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000796{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000797 PyNumberMethods *m;
798
799 if (o == NULL)
800 return null_error();
801 m = o->ob_type->tp_as_number;
802 if (m && m->nb_negative)
803 return (*m->nb_negative)(o);
804
805 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000806}
807
808PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000809PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000810{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000811 PyNumberMethods *m;
812
813 if (o == NULL)
814 return null_error();
815 m = o->ob_type->tp_as_number;
816 if (m && m->nb_positive)
817 return (*m->nb_positive)(o);
818
819 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000820}
821
822PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000823PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000824{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000825 PyNumberMethods *m;
826
827 if (o == NULL)
828 return null_error();
829 m = o->ob_type->tp_as_number;
830 if (m && m->nb_invert)
831 return (*m->nb_invert)(o);
832
833 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000834}
835
836PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000837PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000838{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000839 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000840
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000841 if (o == NULL)
842 return null_error();
843 m = o->ob_type->tp_as_number;
844 if (m && m->nb_absolute)
845 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000846
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000847 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000848}
849
Guido van Rossum9e896b32000-04-05 20:11:21 +0000850/* Add a check for embedded NULL-bytes in the argument. */
851static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000852int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000853{
854 char *end;
855 PyObject *x;
856
857 x = PyInt_FromString((char*)s, &end, 10);
858 if (x == NULL)
859 return NULL;
860 if (end != s + len) {
861 PyErr_SetString(PyExc_ValueError,
862 "null byte in argument for int()");
863 Py_DECREF(x);
864 return NULL;
865 }
866 return x;
867}
868
Guido van Rossume15dee51995-07-18 14:12:02 +0000869PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000870PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000871{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000872 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000873 const char *buffer;
874 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000875
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000876 if (o == NULL)
877 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000878 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000879 Py_INCREF(o);
880 return o;
881 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000882 if (PyInt_Check(o)) {
883 PyIntObject *io = (PyIntObject*)o;
884 return PyInt_FromLong(io->ob_ival);
885 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000886 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000887 return int_from_string(PyString_AS_STRING(o),
888 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000889#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000890 if (PyUnicode_Check(o))
891 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
892 PyUnicode_GET_SIZE(o),
893 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000894#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000895 m = o->ob_type->tp_as_number;
896 if (m && m->nb_int)
897 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000898 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000899 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000900
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000901 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000902}
903
Guido van Rossum9e896b32000-04-05 20:11:21 +0000904/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000905static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000906long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000907{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000908 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000909 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000910
Guido van Rossum4c08d552000-03-10 22:55:18 +0000911 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000912 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000913 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000914 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000915 PyErr_SetString(PyExc_ValueError,
916 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000917 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000918 return NULL;
919 }
920 return x;
921}
922
Guido van Rossume15dee51995-07-18 14:12:02 +0000923PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000924PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000925{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000926 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000927 const char *buffer;
928 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000929
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000930 if (o == NULL)
931 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000932 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000933 Py_INCREF(o);
934 return o;
935 }
Guido van Rossum2eb0b872002-03-01 22:24:49 +0000936 if (PyLong_Check(o)) {
937 PyObject *res;
938
939 res = _PyLong_Copy((PyLongObject *)o);
940 if (res != NULL)
941 ((PyLongObject *)res)->ob_size =
942 ((PyLongObject *)o)->ob_size;
943
944 return res;
945 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000947 /* need to do extra error checking that PyLong_FromString()
948 * doesn't do. In particular long('9.5') must raise an
949 * exception, not truncate the float.
950 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000951 return long_from_string(PyString_AS_STRING(o),
952 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000953#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000954 if (PyUnicode_Check(o))
955 /* The above check is done in PyLong_FromUnicode(). */
956 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
957 PyUnicode_GET_SIZE(o),
958 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000959#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000960 m = o->ob_type->tp_as_number;
961 if (m && m->nb_long)
962 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000963 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
964 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000965
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000966 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000967}
968
969PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000970PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000971{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000972 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000973
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000974 if (o == NULL)
975 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000976 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000977 Py_INCREF(o);
978 return o;
979 }
Tim Peters7a50f252001-09-10 21:28:20 +0000980 if (PyFloat_Check(o)) {
981 PyFloatObject *po = (PyFloatObject *)o;
982 return PyFloat_FromDouble(po->ob_fval);
983 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000984 if (!PyString_Check(o)) {
985 m = o->ob_type->tp_as_number;
986 if (m && m->nb_float)
987 return m->nb_float(o);
988 }
989 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000990}
991
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000992/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000993
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000994int
Fred Drake79912472000-07-09 04:06:11 +0000995PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000996{
Guido van Rossum8700b422001-09-07 20:20:11 +0000997 return s != NULL && s->ob_type->tp_as_sequence &&
998 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000999}
1000
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001002PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001003{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001004 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001005
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001006 if (s == NULL) {
1007 null_error();
1008 return -1;
1009 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001010
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001011 m = s->ob_type->tp_as_sequence;
1012 if (m && m->sq_length)
1013 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001014
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001015 type_error("len() of unsized object");
1016 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001017}
1018
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001019#undef PySequence_Length
1020int
1021PySequence_Length(PyObject *s)
1022{
1023 return PySequence_Size(s);
1024}
1025#define PySequence_Length PySequence_Size
1026
Guido van Rossume15dee51995-07-18 14:12:02 +00001027PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001028PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001029{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001030 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001031
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032 if (s == NULL || o == NULL)
1033 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001034
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001035 m = s->ob_type->tp_as_sequence;
1036 if (m && m->sq_concat)
1037 return m->sq_concat(s, o);
1038
1039 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001040}
1041
1042PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001043PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001044{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001045 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001046
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001047 if (o == NULL)
1048 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001049
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001050 m = o->ob_type->tp_as_sequence;
1051 if (m && m->sq_repeat)
1052 return m->sq_repeat(o, count);
1053
1054 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001055}
1056
1057PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001058PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1059{
1060 PySequenceMethods *m;
1061
1062 if (s == NULL || o == NULL)
1063 return null_error();
1064
1065 m = s->ob_type->tp_as_sequence;
1066 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1067 return m->sq_inplace_concat(s, o);
1068 if (m && m->sq_concat)
1069 return m->sq_concat(s, o);
1070
1071 return type_error("object can't be concatenated");
1072}
1073
1074PyObject *
1075PySequence_InPlaceRepeat(PyObject *o, int count)
1076{
1077 PySequenceMethods *m;
1078
1079 if (o == NULL)
1080 return null_error();
1081
1082 m = o->ob_type->tp_as_sequence;
1083 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1084 return m->sq_inplace_repeat(o, count);
1085 if (m && m->sq_repeat)
1086 return m->sq_repeat(o, count);
1087
1088 return type_error("object can't be repeated");
1089}
1090
1091PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001092PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001093{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001096 if (s == NULL)
1097 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001098
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099 m = s->ob_type->tp_as_sequence;
1100 if (m && m->sq_item) {
1101 if (i < 0) {
1102 if (m->sq_length) {
1103 int l = (*m->sq_length)(s);
1104 if (l < 0)
1105 return NULL;
1106 i += l;
1107 }
1108 }
1109 return m->sq_item(s, i);
1110 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001111
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001112 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001113}
1114
Thomas Wouters1d75a792000-08-17 22:37:32 +00001115static PyObject *
1116sliceobj_from_intint(int i, int j)
1117{
1118 PyObject *start, *end, *slice;
1119 start = PyInt_FromLong((long)i);
1120 if (!start)
1121 return NULL;
1122 end = PyInt_FromLong((long)j);
1123 if (!end) {
1124 Py_DECREF(start);
1125 return NULL;
1126 }
1127 slice = PySlice_New(start, end, NULL);
1128 Py_DECREF(start);
1129 Py_DECREF(end);
1130 return slice;
1131}
1132
Guido van Rossume15dee51995-07-18 14:12:02 +00001133PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001134PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001135{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001136 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001137 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001138
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001139 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001140
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001141 m = s->ob_type->tp_as_sequence;
1142 if (m && m->sq_slice) {
1143 if (i1 < 0 || i2 < 0) {
1144 if (m->sq_length) {
1145 int l = (*m->sq_length)(s);
1146 if (l < 0)
1147 return NULL;
1148 if (i1 < 0)
1149 i1 += l;
1150 if (i2 < 0)
1151 i2 += l;
1152 }
1153 }
1154 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001155 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1156 PyObject *res;
1157 PyObject *slice = sliceobj_from_intint(i1, i2);
1158 if (!slice)
1159 return NULL;
1160 res = mp->mp_subscript(s, slice);
1161 Py_DECREF(slice);
1162 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001163 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001164
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001165 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001166}
1167
1168int
Fred Drake79912472000-07-09 04:06:11 +00001169PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001170{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001171 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001172
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001173 if (s == NULL) {
1174 null_error();
1175 return -1;
1176 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001177
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178 m = s->ob_type->tp_as_sequence;
1179 if (m && m->sq_ass_item) {
1180 if (i < 0) {
1181 if (m->sq_length) {
1182 int l = (*m->sq_length)(s);
1183 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001184 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001185 i += l;
1186 }
1187 }
1188 return m->sq_ass_item(s, i, o);
1189 }
1190
1191 type_error("object doesn't support item assignment");
1192 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001193}
1194
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001195int
Fred Drake79912472000-07-09 04:06:11 +00001196PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001197{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001199
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001200 if (s == NULL) {
1201 null_error();
1202 return -1;
1203 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001204
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205 m = s->ob_type->tp_as_sequence;
1206 if (m && m->sq_ass_item) {
1207 if (i < 0) {
1208 if (m->sq_length) {
1209 int l = (*m->sq_length)(s);
1210 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001211 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001212 i += l;
1213 }
1214 }
1215 return m->sq_ass_item(s, i, (PyObject *)NULL);
1216 }
1217
1218 type_error("object doesn't support item deletion");
1219 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001220}
1221
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222int
Fred Drake79912472000-07-09 04:06:11 +00001223PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001224{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001225 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001226 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001227
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001228 if (s == NULL) {
1229 null_error();
1230 return -1;
1231 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001232
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001233 m = s->ob_type->tp_as_sequence;
1234 if (m && m->sq_ass_slice) {
1235 if (i1 < 0 || i2 < 0) {
1236 if (m->sq_length) {
1237 int l = (*m->sq_length)(s);
1238 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001239 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 if (i1 < 0)
1241 i1 += l;
1242 if (i2 < 0)
1243 i2 += l;
1244 }
1245 }
1246 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001247 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1248 int res;
1249 PyObject *slice = sliceobj_from_intint(i1, i2);
1250 if (!slice)
1251 return -1;
1252 res = mp->mp_ass_subscript(s, slice, o);
1253 Py_DECREF(slice);
1254 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001256
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257 type_error("object doesn't support slice assignment");
1258 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001259}
1260
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261int
Fred Drake79912472000-07-09 04:06:11 +00001262PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001263{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001264 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001265
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001266 if (s == NULL) {
1267 null_error();
1268 return -1;
1269 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001270
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001271 m = s->ob_type->tp_as_sequence;
1272 if (m && m->sq_ass_slice) {
1273 if (i1 < 0 || i2 < 0) {
1274 if (m->sq_length) {
1275 int l = (*m->sq_length)(s);
1276 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001277 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001278 if (i1 < 0)
1279 i1 += l;
1280 if (i2 < 0)
1281 i2 += l;
1282 }
1283 }
1284 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1285 }
1286 type_error("object doesn't support slice deletion");
1287 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001288}
1289
Guido van Rossume15dee51995-07-18 14:12:02 +00001290PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001291PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001292{
Tim Peters6912d4d2001-05-05 03:56:37 +00001293 PyObject *it; /* iter(v) */
1294 int n; /* guess for result tuple size */
1295 PyObject *result;
1296 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001297
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001298 if (v == NULL)
1299 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001300
Tim Peters6912d4d2001-05-05 03:56:37 +00001301 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001302 if (PyTuple_CheckExact(v)) {
1303 /* Note that we can't know whether it's safe to return
1304 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001305 to exact tuples here. In contrast, lists always make
1306 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307 Py_INCREF(v);
1308 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001309 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001310 if (PyList_Check(v))
1311 return PyList_AsTuple(v);
1312
Tim Peters6912d4d2001-05-05 03:56:37 +00001313 /* Get iterator. */
1314 it = PyObject_GetIter(v);
1315 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001316 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001317
Tim Peters6912d4d2001-05-05 03:56:37 +00001318 /* Guess result size and allocate space. */
1319 n = PySequence_Size(v);
1320 if (n < 0) {
1321 PyErr_Clear();
1322 n = 10; /* arbitrary */
1323 }
1324 result = PyTuple_New(n);
1325 if (result == NULL)
1326 goto Fail;
1327
1328 /* Fill the tuple. */
1329 for (j = 0; ; ++j) {
1330 PyObject *item = PyIter_Next(it);
1331 if (item == NULL) {
1332 if (PyErr_Occurred())
1333 goto Fail;
1334 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001336 if (j >= n) {
1337 if (n < 500)
1338 n += 10;
1339 else
1340 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001341 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001342 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001343 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001344 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001345 }
1346 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001347 }
1348
Tim Peters6912d4d2001-05-05 03:56:37 +00001349 /* Cut tuple back if guess was too large. */
1350 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001351 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001352 goto Fail;
1353
1354 Py_DECREF(it);
1355 return result;
1356
1357Fail:
1358 Py_XDECREF(result);
1359 Py_DECREF(it);
1360 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001361}
1362
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001363PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001364PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001365{
Tim Petersf553f892001-05-01 20:45:31 +00001366 PyObject *it; /* iter(v) */
1367 PyObject *result; /* result list */
1368 int n; /* guess for result list size */
1369 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001370
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001371 if (v == NULL)
1372 return null_error();
1373
Tim Petersf553f892001-05-01 20:45:31 +00001374 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001375 if (PyList_Check(v))
1376 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1377
Tim Petersf553f892001-05-01 20:45:31 +00001378 /* Get iterator. There may be some low-level efficiency to be gained
1379 * by caching the tp_iternext slot instead of using PyIter_Next()
1380 * later, but premature optimization is the root etc.
1381 */
1382 it = PyObject_GetIter(v);
1383 if (it == NULL)
1384 return NULL;
1385
1386 /* Guess a result list size. */
1387 n = -1; /* unknown */
1388 if (PySequence_Check(v) &&
1389 v->ob_type->tp_as_sequence->sq_length) {
1390 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001392 PyErr_Clear();
1393 }
1394 if (n < 0)
1395 n = 8; /* arbitrary */
1396 result = PyList_New(n);
1397 if (result == NULL) {
1398 Py_DECREF(it);
1399 return NULL;
1400 }
1401
1402 /* Run iterator to exhaustion. */
1403 for (i = 0; ; i++) {
1404 PyObject *item = PyIter_Next(it);
1405 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001406 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001407 Py_DECREF(result);
1408 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001409 }
Tim Petersf553f892001-05-01 20:45:31 +00001410 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001411 }
Tim Petersf553f892001-05-01 20:45:31 +00001412 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001413 PyList_SET_ITEM(result, i, item); /* steals ref */
1414 else {
1415 int status = PyList_Append(result, item);
1416 Py_DECREF(item); /* append creates a new ref */
1417 if (status < 0) {
1418 Py_DECREF(result);
1419 result = NULL;
1420 break;
1421 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001422 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001423 }
Tim Petersf553f892001-05-01 20:45:31 +00001424
1425 /* Cut back result list if initial guess was too large. */
1426 if (i < n && result != NULL) {
1427 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1428 Py_DECREF(result);
1429 result = NULL;
1430 }
1431 }
1432 Py_DECREF(it);
1433 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001434}
1435
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001436PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001437PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001438{
1439 if (v == NULL)
1440 return null_error();
1441
1442 if (PyList_Check(v) || PyTuple_Check(v)) {
1443 Py_INCREF(v);
1444 return v;
1445 }
1446
1447 v = PySequence_Tuple(v);
1448 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1449 return type_error(m);
1450
1451 return v;
1452}
1453
Tim Peters16a77ad2001-09-08 04:00:12 +00001454/* Iterate over seq. Result depends on the operation:
1455 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1456 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1457 set ValueError and return -1 if none found; also return -1 on error.
1458 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1459*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460int
Tim Peters16a77ad2001-09-08 04:00:12 +00001461_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001462{
Tim Peters16a77ad2001-09-08 04:00:12 +00001463 int n;
1464 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1465 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001466
Tim Peters16a77ad2001-09-08 04:00:12 +00001467 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001468 null_error();
1469 return -1;
1470 }
Tim Peters75f8e352001-05-05 11:33:43 +00001471
Tim Peters16a77ad2001-09-08 04:00:12 +00001472 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001473 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001474 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001475 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001476 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001477
Tim Peters16a77ad2001-09-08 04:00:12 +00001478 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001479 for (;;) {
1480 int cmp;
1481 PyObject *item = PyIter_Next(it);
1482 if (item == NULL) {
1483 if (PyErr_Occurred())
1484 goto Fail;
1485 break;
1486 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001487
1488 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001489 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001490 if (cmp < 0)
1491 goto Fail;
1492 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001493 switch (operation) {
1494 case PY_ITERSEARCH_COUNT:
1495 ++n;
1496 if (n <= 0) {
1497 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001498 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001499 goto Fail;
1500 }
1501 break;
1502
1503 case PY_ITERSEARCH_INDEX:
1504 if (wrapped) {
1505 PyErr_SetString(PyExc_OverflowError,
1506 "index exceeds C int size");
1507 goto Fail;
1508 }
1509 goto Done;
1510
1511 case PY_ITERSEARCH_CONTAINS:
1512 n = 1;
1513 goto Done;
1514
1515 default:
1516 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001517 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001518 }
1519
1520 if (operation == PY_ITERSEARCH_INDEX) {
1521 ++n;
1522 if (n <= 0)
1523 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001524 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001525 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001526
1527 if (operation != PY_ITERSEARCH_INDEX)
1528 goto Done;
1529
1530 PyErr_SetString(PyExc_ValueError,
1531 "sequence.index(x): x not in sequence");
1532 /* fall into failure code */
1533Fail:
1534 n = -1;
1535 /* fall through */
1536Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001537 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001538 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001539
Guido van Rossume15dee51995-07-18 14:12:02 +00001540}
1541
Tim Peters16a77ad2001-09-08 04:00:12 +00001542/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001543int
Tim Peters16a77ad2001-09-08 04:00:12 +00001544PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001545{
Tim Peters16a77ad2001-09-08 04:00:12 +00001546 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001547}
1548
Tim Peterscb8d3682001-05-05 21:05:01 +00001549/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001550 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001551 */
1552int
1553PySequence_Contains(PyObject *seq, PyObject *ob)
1554{
1555 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1556 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1557 if (sqm != NULL && sqm->sq_contains != NULL)
1558 return (*sqm->sq_contains)(seq, ob);
1559 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001560 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001561}
1562
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001563/* Backwards compatibility */
1564#undef PySequence_In
1565int
Fred Drake79912472000-07-09 04:06:11 +00001566PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001567{
1568 return PySequence_Contains(w, v);
1569}
1570
1571int
Fred Drake79912472000-07-09 04:06:11 +00001572PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001573{
Tim Peters16a77ad2001-09-08 04:00:12 +00001574 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001575}
1576
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001577/* Operations on mappings */
1578
1579int
Fred Drake79912472000-07-09 04:06:11 +00001580PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001581{
Guido van Rossum8700b422001-09-07 20:20:11 +00001582 return o && o->ob_type->tp_as_mapping &&
1583 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001584}
1585
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001586int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001587PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001588{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001589 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001590
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001591 if (o == NULL) {
1592 null_error();
1593 return -1;
1594 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001595
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001596 m = o->ob_type->tp_as_mapping;
1597 if (m && m->mp_length)
1598 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001599
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001600 type_error("len() of unsized object");
1601 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001602}
1603
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001604#undef PyMapping_Length
1605int
1606PyMapping_Length(PyObject *o)
1607{
1608 return PyMapping_Size(o);
1609}
1610#define PyMapping_Length PyMapping_Size
1611
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001612PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001613PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001614{
1615 PyObject *okey, *r;
1616
1617 if (key == NULL)
1618 return null_error();
1619
1620 okey = PyString_FromString(key);
1621 if (okey == NULL)
1622 return NULL;
1623 r = PyObject_GetItem(o, okey);
1624 Py_DECREF(okey);
1625 return r;
1626}
1627
1628int
Fred Drake79912472000-07-09 04:06:11 +00001629PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001630{
1631 PyObject *okey;
1632 int r;
1633
1634 if (key == NULL) {
1635 null_error();
1636 return -1;
1637 }
1638
1639 okey = PyString_FromString(key);
1640 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001641 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001642 r = PyObject_SetItem(o, okey, value);
1643 Py_DECREF(okey);
1644 return r;
1645}
1646
1647int
Fred Drake79912472000-07-09 04:06:11 +00001648PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001649{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001650 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001651
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001652 v = PyMapping_GetItemString(o, key);
1653 if (v) {
1654 Py_DECREF(v);
1655 return 1;
1656 }
1657 PyErr_Clear();
1658 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001659}
1660
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001661int
Fred Drake79912472000-07-09 04:06:11 +00001662PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001663{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001664 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001665
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001666 v = PyObject_GetItem(o, key);
1667 if (v) {
1668 Py_DECREF(v);
1669 return 1;
1670 }
1671 PyErr_Clear();
1672 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001673}
1674
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001675/* Operations on callable objects */
1676
1677/* XXX PyCallable_Check() is in object.c */
1678
Guido van Rossume15dee51995-07-18 14:12:02 +00001679PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001680PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001681{
Guido van Rossum5560b742001-09-14 16:47:50 +00001682 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001683}
Guido van Rossume15dee51995-07-18 14:12:02 +00001684
1685PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001686PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1687{
1688 ternaryfunc call;
1689
1690 if ((call = func->ob_type->tp_call) != NULL) {
1691 PyObject *result = (*call)(func, arg, kw);
1692 if (result == NULL && !PyErr_Occurred())
1693 PyErr_SetString(
1694 PyExc_SystemError,
1695 "NULL result without error in PyObject_Call");
1696 return result;
1697 }
Fred Drake573395a2001-11-01 20:26:12 +00001698 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1699 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001700 return NULL;
1701}
1702
1703PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001704PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001705{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001706 va_list va;
1707 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001708
Fred Drakeb92cf062001-10-27 06:16:31 +00001709 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001710 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001711
Fred Drakeb92cf062001-10-27 06:16:31 +00001712 if (format && *format) {
1713 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001715 va_end(va);
1716 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001717 else
1718 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001720 if (args == NULL)
1721 return NULL;
1722
1723 if (!PyTuple_Check(args)) {
1724 PyObject *a;
1725
1726 a = PyTuple_New(1);
1727 if (a == NULL)
1728 return NULL;
1729 if (PyTuple_SetItem(a, 0, args) < 0)
1730 return NULL;
1731 args = a;
1732 }
1733 retval = PyObject_CallObject(callable, args);
1734
1735 Py_DECREF(args);
1736
1737 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001738}
1739
1740PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001741PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001742{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001743 va_list va;
1744 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001745
Fred Drakeb92cf062001-10-27 06:16:31 +00001746 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001747 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001748
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001749 func = PyObject_GetAttrString(o, name);
1750 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001751 PyErr_SetString(PyExc_AttributeError, name);
1752 return 0;
1753 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001754
Fred Drakeb92cf062001-10-27 06:16:31 +00001755 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001756 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001757
Fred Drakeb92cf062001-10-27 06:16:31 +00001758 if (format && *format) {
1759 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001761 va_end(va);
1762 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001763 else
1764 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001765
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001766 if (!args)
1767 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001769 if (!PyTuple_Check(args)) {
1770 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001771
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001772 a = PyTuple_New(1);
1773 if (a == NULL)
1774 return NULL;
1775 if (PyTuple_SetItem(a, 0, args) < 0)
1776 return NULL;
1777 args = a;
1778 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001779
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001780 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001781
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001782 Py_DECREF(args);
1783 Py_DECREF(func);
1784
1785 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001786}
Guido van Rossum823649d2001-03-21 18:40:58 +00001787
1788
Fred Drakeb421b8c2001-10-26 16:21:32 +00001789static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001790objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001791{
1792 int i, n = 0;
1793 va_list countva;
1794 PyObject *result, *tmp;
1795
1796#ifdef VA_LIST_IS_ARRAY
1797 memcpy(countva, va, sizeof(va_list));
1798#else
1799 countva = va;
1800#endif
1801
1802 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1803 ++n;
1804 result = PyTuple_New(n);
1805 if (result != NULL && n > 0) {
1806 for (i = 0; i < n; ++i) {
1807 tmp = (PyObject *)va_arg(va, PyObject *);
1808 PyTuple_SET_ITEM(result, i, tmp);
1809 Py_INCREF(tmp);
1810 }
1811 }
1812 return result;
1813}
1814
1815PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001816PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001817{
1818 PyObject *args, *tmp;
1819 va_list vargs;
1820
1821 if (callable == NULL || name == NULL)
1822 return null_error();
1823
1824 callable = PyObject_GetAttr(callable, name);
1825 if (callable == NULL)
1826 return NULL;
1827
1828 /* count the args */
1829 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001830 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001831 va_end(vargs);
1832 if (args == NULL) {
1833 Py_DECREF(callable);
1834 return NULL;
1835 }
1836 tmp = PyObject_Call(callable, args, NULL);
1837 Py_DECREF(args);
1838 Py_DECREF(callable);
1839
1840 return tmp;
1841}
1842
1843PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001844PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001845{
1846 PyObject *args, *tmp;
1847 va_list vargs;
1848
1849 if (callable == NULL)
1850 return null_error();
1851
1852 /* count the args */
1853 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001854 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001855 va_end(vargs);
1856 if (args == NULL)
1857 return NULL;
1858 tmp = PyObject_Call(callable, args, NULL);
1859 Py_DECREF(args);
1860
1861 return tmp;
1862}
1863
1864
Guido van Rossum823649d2001-03-21 18:40:58 +00001865/* isinstance(), issubclass() */
1866
Neil Schemenauer6b471292001-10-18 03:18:43 +00001867static PyObject *
1868abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001869{
1870 static PyObject *__bases__ = NULL;
1871 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001872
1873 if (__bases__ == NULL) {
1874 __bases__ = PyString_FromString("__bases__");
1875 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001876 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001877 }
1878
Neil Schemenauer6b471292001-10-18 03:18:43 +00001879 bases = PyObject_GetAttr(cls, __bases__);
1880 if (bases == NULL || !PyTuple_Check(bases)) {
1881 Py_XDECREF(bases);
1882 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001883 }
1884
Neil Schemenauer6b471292001-10-18 03:18:43 +00001885 return bases;
1886}
1887
1888
1889static int
1890abstract_issubclass(PyObject *derived, PyObject *cls)
1891{
1892 PyObject *bases;
1893 int i, n;
1894 int r = 0;
1895
1896
Guido van Rossum823649d2001-03-21 18:40:58 +00001897 if (derived == cls)
1898 return 1;
1899
Neil Schemenauer6b471292001-10-18 03:18:43 +00001900 bases = abstract_get_bases(derived);
1901 if (bases == NULL)
1902 return 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001903
1904 n = PyTuple_GET_SIZE(bases);
1905 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001906 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001907 if (r != 0)
1908 break;
1909 }
1910
1911 Py_DECREF(bases);
1912
1913 return r;
1914}
1915
1916int
1917PyObject_IsInstance(PyObject *inst, PyObject *cls)
1918{
1919 PyObject *icls;
1920 static PyObject *__class__ = NULL;
1921 int retval = 0;
1922
Neil Schemenauer6b471292001-10-18 03:18:43 +00001923 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1924 PyObject *inclass =
1925 (PyObject*)((PyInstanceObject*)inst)->in_class;
1926 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001927 }
1928 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001929 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001930 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001931 else if (PyTuple_Check(cls)) {
1932 /* Not a general sequence -- that opens up the road to
1933 recursion and stack overflow. */
1934 int i, n;
1935
1936 n = PyTuple_GET_SIZE(cls);
1937 for (i = 0; i < n; i++) {
1938 retval = PyObject_IsInstance(
1939 inst, PyTuple_GET_ITEM(cls, i));
1940 if (retval != 0)
1941 break;
1942 }
1943 return retval;
1944 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001945 else {
1946 PyObject *cls_bases = abstract_get_bases(cls);
1947 if (cls_bases == NULL) {
1948 PyErr_SetString(PyExc_TypeError,
1949 "isinstance() arg 2 must be a class or type");
1950 return -1;
1951 }
1952 Py_DECREF(cls_bases);
Guido van Rossum823649d2001-03-21 18:40:58 +00001953 if (__class__ == NULL) {
1954 __class__ = PyString_FromString("__class__");
1955 if (__class__ == NULL)
1956 return -1;
1957 }
1958 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001959 if (icls == NULL) {
1960 PyErr_Clear();
1961 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001962 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001963 else {
1964 retval = abstract_issubclass(icls, cls);
1965 Py_DECREF(icls);
1966 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001967 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001968
Guido van Rossum823649d2001-03-21 18:40:58 +00001969 return retval;
1970}
1971
1972int
1973PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1974{
1975 int retval;
1976
1977 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001978 PyObject *derived_bases;
1979 PyObject *cls_bases;
1980
1981 derived_bases = abstract_get_bases(derived);
1982 if (derived_bases == NULL) {
1983 PyErr_SetString(PyExc_TypeError,
1984 "issubclass() arg 1 must be a class");
1985 return -1;
1986 }
1987 Py_DECREF(derived_bases);
1988
1989 cls_bases = abstract_get_bases(cls);
1990 if (cls_bases == NULL) {
1991 PyErr_SetString(PyExc_TypeError,
1992 "issubclass() arg 2 must be a class");
1993 return -1;
1994 }
1995 Py_DECREF(cls_bases);
1996
1997 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001998 }
1999 else {
2000 /* shortcut */
2001 if (!(retval = (derived == cls)))
2002 retval = PyClass_IsSubclass(derived, cls);
2003 }
2004
2005 return retval;
2006}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002007
2008PyObject *
2009PyObject_GetIter(PyObject *o)
2010{
2011 PyTypeObject *t = o->ob_type;
2012 getiterfunc f = NULL;
2013 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2014 f = t->tp_iter;
2015 if (f == NULL) {
2016 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002017 return PySeqIter_New(o);
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002018 PyErr_SetString(PyExc_TypeError,
2019 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002020 return NULL;
2021 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002022 else {
2023 PyObject *res = (*f)(o);
2024 if (res != NULL && !PyIter_Check(res)) {
2025 PyErr_Format(PyExc_TypeError,
2026 "iter() returned non-iterator "
2027 "of type '%.100s'",
2028 res->ob_type->tp_name);
2029 Py_DECREF(res);
2030 res = NULL;
2031 }
2032 return res;
2033 }
2034}
2035
Tim Petersf4848da2001-05-05 00:14:56 +00002036/* Return next item.
2037 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2038 * If the iteration terminates normally, return NULL and clear the
2039 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2040 * will be false.
2041 * Else return the next object. PyErr_Occurred() will be false.
2042 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002043PyObject *
2044PyIter_Next(PyObject *iter)
2045{
Tim Petersf4848da2001-05-05 00:14:56 +00002046 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002047 if (!PyIter_Check(iter)) {
2048 PyErr_Format(PyExc_TypeError,
2049 "'%.100s' object is not an iterator",
2050 iter->ob_type->tp_name);
2051 return NULL;
2052 }
Tim Petersf4848da2001-05-05 00:14:56 +00002053 result = (*iter->ob_type->tp_iternext)(iter);
2054 if (result == NULL &&
2055 PyErr_Occurred() &&
2056 PyErr_ExceptionMatches(PyExc_StopIteration))
2057 PyErr_Clear();
2058 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002059}
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002060