blob: 2acfd0865cecec9b75e025dfd04f2adc97c8d65a [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 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000936 if (PyLong_Check(o))
937 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000938 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000939 /* need to do extra error checking that PyLong_FromString()
940 * doesn't do. In particular long('9.5') must raise an
941 * exception, not truncate the float.
942 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000943 return long_from_string(PyString_AS_STRING(o),
944 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000945#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000946 if (PyUnicode_Check(o))
947 /* The above check is done in PyLong_FromUnicode(). */
948 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
949 PyUnicode_GET_SIZE(o),
950 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000951#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000952 m = o->ob_type->tp_as_number;
953 if (m && m->nb_long)
954 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000955 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
956 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000957
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000958 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000959}
960
961PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000962PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000963{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000964 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000965
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000966 if (o == NULL)
967 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000968 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000969 Py_INCREF(o);
970 return o;
971 }
Tim Peters7a50f252001-09-10 21:28:20 +0000972 if (PyFloat_Check(o)) {
973 PyFloatObject *po = (PyFloatObject *)o;
974 return PyFloat_FromDouble(po->ob_fval);
975 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000976 if (!PyString_Check(o)) {
977 m = o->ob_type->tp_as_number;
978 if (m && m->nb_float)
979 return m->nb_float(o);
980 }
981 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000982}
983
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000984/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000985
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986int
Fred Drake79912472000-07-09 04:06:11 +0000987PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000988{
Guido van Rossum8700b422001-09-07 20:20:11 +0000989 return s != NULL && s->ob_type->tp_as_sequence &&
990 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000991}
992
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000993int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000994PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000995{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000996 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000997
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000998 if (s == NULL) {
999 null_error();
1000 return -1;
1001 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001002
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003 m = s->ob_type->tp_as_sequence;
1004 if (m && m->sq_length)
1005 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001006
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001007 type_error("len() of unsized object");
1008 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001009}
1010
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001011#undef PySequence_Length
1012int
1013PySequence_Length(PyObject *s)
1014{
1015 return PySequence_Size(s);
1016}
1017#define PySequence_Length PySequence_Size
1018
Guido van Rossume15dee51995-07-18 14:12:02 +00001019PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001020PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001021{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001023
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001024 if (s == NULL || o == NULL)
1025 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001026
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001027 m = s->ob_type->tp_as_sequence;
1028 if (m && m->sq_concat)
1029 return m->sq_concat(s, o);
1030
1031 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001032}
1033
1034PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001035PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001036{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001037 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001038
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 if (o == NULL)
1040 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001041
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001042 m = o->ob_type->tp_as_sequence;
1043 if (m && m->sq_repeat)
1044 return m->sq_repeat(o, count);
1045
1046 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001047}
1048
1049PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001050PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1051{
1052 PySequenceMethods *m;
1053
1054 if (s == NULL || o == NULL)
1055 return null_error();
1056
1057 m = s->ob_type->tp_as_sequence;
1058 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1059 return m->sq_inplace_concat(s, o);
1060 if (m && m->sq_concat)
1061 return m->sq_concat(s, o);
1062
1063 return type_error("object can't be concatenated");
1064}
1065
1066PyObject *
1067PySequence_InPlaceRepeat(PyObject *o, int count)
1068{
1069 PySequenceMethods *m;
1070
1071 if (o == NULL)
1072 return null_error();
1073
1074 m = o->ob_type->tp_as_sequence;
1075 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1076 return m->sq_inplace_repeat(o, count);
1077 if (m && m->sq_repeat)
1078 return m->sq_repeat(o, count);
1079
1080 return type_error("object can't be repeated");
1081}
1082
1083PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001084PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001085{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001086 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001087
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001088 if (s == NULL)
1089 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001090
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001091 m = s->ob_type->tp_as_sequence;
1092 if (m && m->sq_item) {
1093 if (i < 0) {
1094 if (m->sq_length) {
1095 int l = (*m->sq_length)(s);
1096 if (l < 0)
1097 return NULL;
1098 i += l;
1099 }
1100 }
1101 return m->sq_item(s, i);
1102 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001103
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001105}
1106
Thomas Wouters1d75a792000-08-17 22:37:32 +00001107static PyObject *
1108sliceobj_from_intint(int i, int j)
1109{
1110 PyObject *start, *end, *slice;
1111 start = PyInt_FromLong((long)i);
1112 if (!start)
1113 return NULL;
1114 end = PyInt_FromLong((long)j);
1115 if (!end) {
1116 Py_DECREF(start);
1117 return NULL;
1118 }
1119 slice = PySlice_New(start, end, NULL);
1120 Py_DECREF(start);
1121 Py_DECREF(end);
1122 return slice;
1123}
1124
Guido van Rossume15dee51995-07-18 14:12:02 +00001125PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001126PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001127{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001128 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001129 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001130
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001131 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001132
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001133 m = s->ob_type->tp_as_sequence;
1134 if (m && m->sq_slice) {
1135 if (i1 < 0 || i2 < 0) {
1136 if (m->sq_length) {
1137 int l = (*m->sq_length)(s);
1138 if (l < 0)
1139 return NULL;
1140 if (i1 < 0)
1141 i1 += l;
1142 if (i2 < 0)
1143 i2 += l;
1144 }
1145 }
1146 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001147 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1148 PyObject *res;
1149 PyObject *slice = sliceobj_from_intint(i1, i2);
1150 if (!slice)
1151 return NULL;
1152 res = mp->mp_subscript(s, slice);
1153 Py_DECREF(slice);
1154 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001155 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001156
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001157 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001158}
1159
1160int
Fred Drake79912472000-07-09 04:06:11 +00001161PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001162{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001163 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001164
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001165 if (s == NULL) {
1166 null_error();
1167 return -1;
1168 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001169
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170 m = s->ob_type->tp_as_sequence;
1171 if (m && m->sq_ass_item) {
1172 if (i < 0) {
1173 if (m->sq_length) {
1174 int l = (*m->sq_length)(s);
1175 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001176 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001177 i += l;
1178 }
1179 }
1180 return m->sq_ass_item(s, i, o);
1181 }
1182
1183 type_error("object doesn't support item assignment");
1184 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001185}
1186
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001187int
Fred Drake79912472000-07-09 04:06:11 +00001188PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001189{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001190 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001191
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001192 if (s == NULL) {
1193 null_error();
1194 return -1;
1195 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001196
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197 m = s->ob_type->tp_as_sequence;
1198 if (m && m->sq_ass_item) {
1199 if (i < 0) {
1200 if (m->sq_length) {
1201 int l = (*m->sq_length)(s);
1202 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001203 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001204 i += l;
1205 }
1206 }
1207 return m->sq_ass_item(s, i, (PyObject *)NULL);
1208 }
1209
1210 type_error("object doesn't support item deletion");
1211 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001212}
1213
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001214int
Fred Drake79912472000-07-09 04:06:11 +00001215PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001216{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001218 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001219
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001220 if (s == NULL) {
1221 null_error();
1222 return -1;
1223 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001224
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001225 m = s->ob_type->tp_as_sequence;
1226 if (m && m->sq_ass_slice) {
1227 if (i1 < 0 || i2 < 0) {
1228 if (m->sq_length) {
1229 int l = (*m->sq_length)(s);
1230 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001231 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 if (i1 < 0)
1233 i1 += l;
1234 if (i2 < 0)
1235 i2 += l;
1236 }
1237 }
1238 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001239 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1240 int res;
1241 PyObject *slice = sliceobj_from_intint(i1, i2);
1242 if (!slice)
1243 return -1;
1244 res = mp->mp_ass_subscript(s, slice, o);
1245 Py_DECREF(slice);
1246 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001248
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001249 type_error("object doesn't support slice assignment");
1250 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001251}
1252
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001253int
Fred Drake79912472000-07-09 04:06:11 +00001254PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001255{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001256 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001257
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001258 if (s == NULL) {
1259 null_error();
1260 return -1;
1261 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001262
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263 m = s->ob_type->tp_as_sequence;
1264 if (m && m->sq_ass_slice) {
1265 if (i1 < 0 || i2 < 0) {
1266 if (m->sq_length) {
1267 int l = (*m->sq_length)(s);
1268 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001269 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001270 if (i1 < 0)
1271 i1 += l;
1272 if (i2 < 0)
1273 i2 += l;
1274 }
1275 }
1276 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1277 }
1278 type_error("object doesn't support slice deletion");
1279 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001280}
1281
Guido van Rossume15dee51995-07-18 14:12:02 +00001282PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001283PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001284{
Tim Peters6912d4d2001-05-05 03:56:37 +00001285 PyObject *it; /* iter(v) */
1286 int n; /* guess for result tuple size */
1287 PyObject *result;
1288 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001289
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 if (v == NULL)
1291 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001292
Tim Peters6912d4d2001-05-05 03:56:37 +00001293 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001294 if (PyTuple_CheckExact(v)) {
1295 /* Note that we can't know whether it's safe to return
1296 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001297 to exact tuples here. In contrast, lists always make
1298 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001299 Py_INCREF(v);
1300 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001301 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001302 if (PyList_Check(v))
1303 return PyList_AsTuple(v);
1304
Tim Peters6912d4d2001-05-05 03:56:37 +00001305 /* Get iterator. */
1306 it = PyObject_GetIter(v);
1307 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001308 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001309
Tim Peters6912d4d2001-05-05 03:56:37 +00001310 /* Guess result size and allocate space. */
1311 n = PySequence_Size(v);
1312 if (n < 0) {
1313 PyErr_Clear();
1314 n = 10; /* arbitrary */
1315 }
1316 result = PyTuple_New(n);
1317 if (result == NULL)
1318 goto Fail;
1319
1320 /* Fill the tuple. */
1321 for (j = 0; ; ++j) {
1322 PyObject *item = PyIter_Next(it);
1323 if (item == NULL) {
1324 if (PyErr_Occurred())
1325 goto Fail;
1326 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001327 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001328 if (j >= n) {
1329 if (n < 500)
1330 n += 10;
1331 else
1332 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001333 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001334 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001335 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001336 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001337 }
1338 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001339 }
1340
Tim Peters6912d4d2001-05-05 03:56:37 +00001341 /* Cut tuple back if guess was too large. */
1342 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001343 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001344 goto Fail;
1345
1346 Py_DECREF(it);
1347 return result;
1348
1349Fail:
1350 Py_XDECREF(result);
1351 Py_DECREF(it);
1352 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001353}
1354
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001355PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001356PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001357{
Tim Petersf553f892001-05-01 20:45:31 +00001358 PyObject *it; /* iter(v) */
1359 PyObject *result; /* result list */
1360 int n; /* guess for result list size */
1361 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001362
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001363 if (v == NULL)
1364 return null_error();
1365
Tim Petersf553f892001-05-01 20:45:31 +00001366 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001367 if (PyList_Check(v))
1368 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1369
Tim Petersf553f892001-05-01 20:45:31 +00001370 /* Get iterator. There may be some low-level efficiency to be gained
1371 * by caching the tp_iternext slot instead of using PyIter_Next()
1372 * later, but premature optimization is the root etc.
1373 */
1374 it = PyObject_GetIter(v);
1375 if (it == NULL)
1376 return NULL;
1377
1378 /* Guess a result list size. */
1379 n = -1; /* unknown */
1380 if (PySequence_Check(v) &&
1381 v->ob_type->tp_as_sequence->sq_length) {
1382 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001383 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001384 PyErr_Clear();
1385 }
1386 if (n < 0)
1387 n = 8; /* arbitrary */
1388 result = PyList_New(n);
1389 if (result == NULL) {
1390 Py_DECREF(it);
1391 return NULL;
1392 }
1393
1394 /* Run iterator to exhaustion. */
1395 for (i = 0; ; i++) {
1396 PyObject *item = PyIter_Next(it);
1397 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001398 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001399 Py_DECREF(result);
1400 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001401 }
Tim Petersf553f892001-05-01 20:45:31 +00001402 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001403 }
Tim Petersf553f892001-05-01 20:45:31 +00001404 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001405 PyList_SET_ITEM(result, i, item); /* steals ref */
1406 else {
1407 int status = PyList_Append(result, item);
1408 Py_DECREF(item); /* append creates a new ref */
1409 if (status < 0) {
1410 Py_DECREF(result);
1411 result = NULL;
1412 break;
1413 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001414 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001415 }
Tim Petersf553f892001-05-01 20:45:31 +00001416
1417 /* Cut back result list if initial guess was too large. */
1418 if (i < n && result != NULL) {
1419 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1420 Py_DECREF(result);
1421 result = NULL;
1422 }
1423 }
1424 Py_DECREF(it);
1425 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001426}
1427
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001428PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001429PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001430{
1431 if (v == NULL)
1432 return null_error();
1433
1434 if (PyList_Check(v) || PyTuple_Check(v)) {
1435 Py_INCREF(v);
1436 return v;
1437 }
1438
1439 v = PySequence_Tuple(v);
1440 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1441 return type_error(m);
1442
1443 return v;
1444}
1445
Tim Peters16a77ad2001-09-08 04:00:12 +00001446/* Iterate over seq. Result depends on the operation:
1447 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1448 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1449 set ValueError and return -1 if none found; also return -1 on error.
1450 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1451*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001452int
Tim Peters16a77ad2001-09-08 04:00:12 +00001453_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001454{
Tim Peters16a77ad2001-09-08 04:00:12 +00001455 int n;
1456 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1457 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001458
Tim Peters16a77ad2001-09-08 04:00:12 +00001459 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 null_error();
1461 return -1;
1462 }
Tim Peters75f8e352001-05-05 11:33:43 +00001463
Tim Peters16a77ad2001-09-08 04:00:12 +00001464 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001465 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001466 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001468 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001469
Tim Peters16a77ad2001-09-08 04:00:12 +00001470 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001471 for (;;) {
1472 int cmp;
1473 PyObject *item = PyIter_Next(it);
1474 if (item == NULL) {
1475 if (PyErr_Occurred())
1476 goto Fail;
1477 break;
1478 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001479
1480 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001481 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001482 if (cmp < 0)
1483 goto Fail;
1484 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001485 switch (operation) {
1486 case PY_ITERSEARCH_COUNT:
1487 ++n;
1488 if (n <= 0) {
1489 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001490 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001491 goto Fail;
1492 }
1493 break;
1494
1495 case PY_ITERSEARCH_INDEX:
1496 if (wrapped) {
1497 PyErr_SetString(PyExc_OverflowError,
1498 "index exceeds C int size");
1499 goto Fail;
1500 }
1501 goto Done;
1502
1503 case PY_ITERSEARCH_CONTAINS:
1504 n = 1;
1505 goto Done;
1506
1507 default:
1508 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001509 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001510 }
1511
1512 if (operation == PY_ITERSEARCH_INDEX) {
1513 ++n;
1514 if (n <= 0)
1515 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001516 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001517 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001518
1519 if (operation != PY_ITERSEARCH_INDEX)
1520 goto Done;
1521
1522 PyErr_SetString(PyExc_ValueError,
1523 "sequence.index(x): x not in sequence");
1524 /* fall into failure code */
1525Fail:
1526 n = -1;
1527 /* fall through */
1528Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001529 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001530 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001531
Guido van Rossume15dee51995-07-18 14:12:02 +00001532}
1533
Tim Peters16a77ad2001-09-08 04:00:12 +00001534/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001535int
Tim Peters16a77ad2001-09-08 04:00:12 +00001536PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001537{
Tim Peters16a77ad2001-09-08 04:00:12 +00001538 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001539}
1540
Tim Peterscb8d3682001-05-05 21:05:01 +00001541/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001542 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001543 */
1544int
1545PySequence_Contains(PyObject *seq, PyObject *ob)
1546{
1547 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1548 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1549 if (sqm != NULL && sqm->sq_contains != NULL)
1550 return (*sqm->sq_contains)(seq, ob);
1551 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001552 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001553}
1554
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001555/* Backwards compatibility */
1556#undef PySequence_In
1557int
Fred Drake79912472000-07-09 04:06:11 +00001558PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001559{
1560 return PySequence_Contains(w, v);
1561}
1562
1563int
Fred Drake79912472000-07-09 04:06:11 +00001564PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001565{
Tim Peters16a77ad2001-09-08 04:00:12 +00001566 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001567}
1568
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001569/* Operations on mappings */
1570
1571int
Fred Drake79912472000-07-09 04:06:11 +00001572PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001573{
Guido van Rossum8700b422001-09-07 20:20:11 +00001574 return o && o->ob_type->tp_as_mapping &&
1575 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001576}
1577
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001578int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001579PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001580{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001581 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001582
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001583 if (o == NULL) {
1584 null_error();
1585 return -1;
1586 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001587
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001588 m = o->ob_type->tp_as_mapping;
1589 if (m && m->mp_length)
1590 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001591
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001592 type_error("len() of unsized object");
1593 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001594}
1595
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001596#undef PyMapping_Length
1597int
1598PyMapping_Length(PyObject *o)
1599{
1600 return PyMapping_Size(o);
1601}
1602#define PyMapping_Length PyMapping_Size
1603
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001604PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001605PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001606{
1607 PyObject *okey, *r;
1608
1609 if (key == NULL)
1610 return null_error();
1611
1612 okey = PyString_FromString(key);
1613 if (okey == NULL)
1614 return NULL;
1615 r = PyObject_GetItem(o, okey);
1616 Py_DECREF(okey);
1617 return r;
1618}
1619
1620int
Fred Drake79912472000-07-09 04:06:11 +00001621PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001622{
1623 PyObject *okey;
1624 int r;
1625
1626 if (key == NULL) {
1627 null_error();
1628 return -1;
1629 }
1630
1631 okey = PyString_FromString(key);
1632 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001633 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001634 r = PyObject_SetItem(o, okey, value);
1635 Py_DECREF(okey);
1636 return r;
1637}
1638
1639int
Fred Drake79912472000-07-09 04:06:11 +00001640PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001641{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001642 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001643
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001644 v = PyMapping_GetItemString(o, key);
1645 if (v) {
1646 Py_DECREF(v);
1647 return 1;
1648 }
1649 PyErr_Clear();
1650 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001651}
1652
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001653int
Fred Drake79912472000-07-09 04:06:11 +00001654PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001655{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001656 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001657
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001658 v = PyObject_GetItem(o, key);
1659 if (v) {
1660 Py_DECREF(v);
1661 return 1;
1662 }
1663 PyErr_Clear();
1664 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001665}
1666
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001667/* Operations on callable objects */
1668
1669/* XXX PyCallable_Check() is in object.c */
1670
Guido van Rossume15dee51995-07-18 14:12:02 +00001671PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001672PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001673{
Guido van Rossum5560b742001-09-14 16:47:50 +00001674 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001675}
Guido van Rossume15dee51995-07-18 14:12:02 +00001676
1677PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001678PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1679{
1680 ternaryfunc call;
1681
1682 if ((call = func->ob_type->tp_call) != NULL) {
1683 PyObject *result = (*call)(func, arg, kw);
1684 if (result == NULL && !PyErr_Occurred())
1685 PyErr_SetString(
1686 PyExc_SystemError,
1687 "NULL result without error in PyObject_Call");
1688 return result;
1689 }
Fred Drake573395a2001-11-01 20:26:12 +00001690 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1691 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001692 return NULL;
1693}
1694
1695PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001696PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001697{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001698 va_list va;
1699 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001700
Fred Drakeb92cf062001-10-27 06:16:31 +00001701 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001702 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001703
Fred Drakeb92cf062001-10-27 06:16:31 +00001704 if (format && *format) {
1705 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001706 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001707 va_end(va);
1708 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001709 else
1710 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001711
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001712 if (args == NULL)
1713 return NULL;
1714
1715 if (!PyTuple_Check(args)) {
1716 PyObject *a;
1717
1718 a = PyTuple_New(1);
1719 if (a == NULL)
1720 return NULL;
1721 if (PyTuple_SetItem(a, 0, args) < 0)
1722 return NULL;
1723 args = a;
1724 }
1725 retval = PyObject_CallObject(callable, args);
1726
1727 Py_DECREF(args);
1728
1729 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001730}
1731
1732PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001733PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001734{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001735 va_list va;
1736 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001737
Fred Drakeb92cf062001-10-27 06:16:31 +00001738 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001739 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001740
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001741 func = PyObject_GetAttrString(o, name);
1742 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001743 PyErr_SetString(PyExc_AttributeError, name);
1744 return 0;
1745 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001746
Fred Drakeb92cf062001-10-27 06:16:31 +00001747 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001748 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001749
Fred Drakeb92cf062001-10-27 06:16:31 +00001750 if (format && *format) {
1751 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001752 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001753 va_end(va);
1754 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001755 else
1756 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001757
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001758 if (!args)
1759 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001760
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001761 if (!PyTuple_Check(args)) {
1762 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001763
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001764 a = PyTuple_New(1);
1765 if (a == NULL)
1766 return NULL;
1767 if (PyTuple_SetItem(a, 0, args) < 0)
1768 return NULL;
1769 args = a;
1770 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001771
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001772 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001773
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001774 Py_DECREF(args);
1775 Py_DECREF(func);
1776
1777 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001778}
Guido van Rossum823649d2001-03-21 18:40:58 +00001779
1780
Fred Drakeb421b8c2001-10-26 16:21:32 +00001781static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001782objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001783{
1784 int i, n = 0;
1785 va_list countva;
1786 PyObject *result, *tmp;
1787
1788#ifdef VA_LIST_IS_ARRAY
1789 memcpy(countva, va, sizeof(va_list));
1790#else
1791 countva = va;
1792#endif
1793
1794 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1795 ++n;
1796 result = PyTuple_New(n);
1797 if (result != NULL && n > 0) {
1798 for (i = 0; i < n; ++i) {
1799 tmp = (PyObject *)va_arg(va, PyObject *);
1800 PyTuple_SET_ITEM(result, i, tmp);
1801 Py_INCREF(tmp);
1802 }
1803 }
1804 return result;
1805}
1806
1807PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001808PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001809{
1810 PyObject *args, *tmp;
1811 va_list vargs;
1812
1813 if (callable == NULL || name == NULL)
1814 return null_error();
1815
1816 callable = PyObject_GetAttr(callable, name);
1817 if (callable == NULL)
1818 return NULL;
1819
1820 /* count the args */
1821 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001822 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001823 va_end(vargs);
1824 if (args == NULL) {
1825 Py_DECREF(callable);
1826 return NULL;
1827 }
1828 tmp = PyObject_Call(callable, args, NULL);
1829 Py_DECREF(args);
1830 Py_DECREF(callable);
1831
1832 return tmp;
1833}
1834
1835PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001836PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001837{
1838 PyObject *args, *tmp;
1839 va_list vargs;
1840
1841 if (callable == NULL)
1842 return null_error();
1843
1844 /* count the args */
1845 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001846 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001847 va_end(vargs);
1848 if (args == NULL)
1849 return NULL;
1850 tmp = PyObject_Call(callable, args, NULL);
1851 Py_DECREF(args);
1852
1853 return tmp;
1854}
1855
1856
Guido van Rossum823649d2001-03-21 18:40:58 +00001857/* isinstance(), issubclass() */
1858
Neil Schemenauer6b471292001-10-18 03:18:43 +00001859static PyObject *
1860abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001861{
1862 static PyObject *__bases__ = NULL;
1863 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001864
1865 if (__bases__ == NULL) {
1866 __bases__ = PyString_FromString("__bases__");
1867 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001868 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001869 }
1870
Neil Schemenauer6b471292001-10-18 03:18:43 +00001871 bases = PyObject_GetAttr(cls, __bases__);
1872 if (bases == NULL || !PyTuple_Check(bases)) {
1873 Py_XDECREF(bases);
1874 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001875 }
1876
Neil Schemenauer6b471292001-10-18 03:18:43 +00001877 return bases;
1878}
1879
1880
1881static int
1882abstract_issubclass(PyObject *derived, PyObject *cls)
1883{
1884 PyObject *bases;
1885 int i, n;
1886 int r = 0;
1887
1888
Guido van Rossum823649d2001-03-21 18:40:58 +00001889 if (derived == cls)
1890 return 1;
1891
Neil Schemenauer6b471292001-10-18 03:18:43 +00001892 bases = abstract_get_bases(derived);
1893 if (bases == NULL)
1894 return 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001895
1896 n = PyTuple_GET_SIZE(bases);
1897 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001898 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001899 if (r != 0)
1900 break;
1901 }
1902
1903 Py_DECREF(bases);
1904
1905 return r;
1906}
1907
1908int
1909PyObject_IsInstance(PyObject *inst, PyObject *cls)
1910{
1911 PyObject *icls;
1912 static PyObject *__class__ = NULL;
1913 int retval = 0;
1914
Neil Schemenauer6b471292001-10-18 03:18:43 +00001915 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1916 PyObject *inclass =
1917 (PyObject*)((PyInstanceObject*)inst)->in_class;
1918 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001919 }
1920 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001921 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001922 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001923 else if (PyTuple_Check(cls)) {
1924 /* Not a general sequence -- that opens up the road to
1925 recursion and stack overflow. */
1926 int i, n;
1927
1928 n = PyTuple_GET_SIZE(cls);
1929 for (i = 0; i < n; i++) {
1930 retval = PyObject_IsInstance(
1931 inst, PyTuple_GET_ITEM(cls, i));
1932 if (retval != 0)
1933 break;
1934 }
1935 return retval;
1936 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001937 else {
1938 PyObject *cls_bases = abstract_get_bases(cls);
1939 if (cls_bases == NULL) {
1940 PyErr_SetString(PyExc_TypeError,
1941 "isinstance() arg 2 must be a class or type");
1942 return -1;
1943 }
1944 Py_DECREF(cls_bases);
Guido van Rossum823649d2001-03-21 18:40:58 +00001945 if (__class__ == NULL) {
1946 __class__ = PyString_FromString("__class__");
1947 if (__class__ == NULL)
1948 return -1;
1949 }
1950 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001951 if (icls == NULL) {
1952 PyErr_Clear();
1953 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001954 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001955 else {
1956 retval = abstract_issubclass(icls, cls);
1957 Py_DECREF(icls);
1958 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001959 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001960
Guido van Rossum823649d2001-03-21 18:40:58 +00001961 return retval;
1962}
1963
1964int
1965PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1966{
1967 int retval;
1968
1969 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001970 PyObject *derived_bases;
1971 PyObject *cls_bases;
1972
1973 derived_bases = abstract_get_bases(derived);
1974 if (derived_bases == NULL) {
1975 PyErr_SetString(PyExc_TypeError,
1976 "issubclass() arg 1 must be a class");
1977 return -1;
1978 }
1979 Py_DECREF(derived_bases);
1980
1981 cls_bases = abstract_get_bases(cls);
1982 if (cls_bases == NULL) {
1983 PyErr_SetString(PyExc_TypeError,
1984 "issubclass() arg 2 must be a class");
1985 return -1;
1986 }
1987 Py_DECREF(cls_bases);
1988
1989 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001990 }
1991 else {
1992 /* shortcut */
1993 if (!(retval = (derived == cls)))
1994 retval = PyClass_IsSubclass(derived, cls);
1995 }
1996
1997 return retval;
1998}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001999
2000PyObject *
2001PyObject_GetIter(PyObject *o)
2002{
2003 PyTypeObject *t = o->ob_type;
2004 getiterfunc f = NULL;
2005 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2006 f = t->tp_iter;
2007 if (f == NULL) {
2008 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002009 return PySeqIter_New(o);
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002010 PyErr_SetString(PyExc_TypeError,
2011 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002012 return NULL;
2013 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002014 else {
2015 PyObject *res = (*f)(o);
2016 if (res != NULL && !PyIter_Check(res)) {
2017 PyErr_Format(PyExc_TypeError,
2018 "iter() returned non-iterator "
2019 "of type '%.100s'",
2020 res->ob_type->tp_name);
2021 Py_DECREF(res);
2022 res = NULL;
2023 }
2024 return res;
2025 }
2026}
2027
Tim Petersf4848da2001-05-05 00:14:56 +00002028/* Return next item.
2029 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2030 * If the iteration terminates normally, return NULL and clear the
2031 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2032 * will be false.
2033 * Else return the next object. PyErr_Occurred() will be false.
2034 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002035PyObject *
2036PyIter_Next(PyObject *iter)
2037{
Tim Petersf4848da2001-05-05 00:14:56 +00002038 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002039 if (!PyIter_Check(iter)) {
2040 PyErr_Format(PyExc_TypeError,
2041 "'%.100s' object is not an iterator",
2042 iter->ob_type->tp_name);
2043 return NULL;
2044 }
Tim Petersf4848da2001-05-05 00:14:56 +00002045 result = (*iter->ob_type->tp_iternext)(iter);
2046 if (result == NULL &&
2047 PyErr_Occurred() &&
2048 PyErr_ExceptionMatches(PyExc_StopIteration))
2049 PyErr_Clear();
2050 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002051}
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002052