blob: 162c53c9b3671d74be6f2b7d4e2f416ffbe88e9f [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;
Jeremy Hylton0522d982002-03-08 21:28:54 +0000608 if (m && m->sq_concat) {
609 Py_DECREF(result);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000610 result = (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000611 }
Jeremy Hylton6ae6a432002-03-08 21:11:37 +0000612 if (result == Py_NotImplemented) {
Jeremy Hylton0522d982002-03-08 21:28:54 +0000613 Py_DECREF(result);
614 PyErr_Format(
Guido van Rossum5c66a262001-10-22 04:12:44 +0000615 PyExc_TypeError,
616 "unsupported operand types for +: '%s' and '%s'",
617 v->ob_type->tp_name,
618 w->ob_type->tp_name);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000619 result = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000620 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000621 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000622 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000623}
624
625PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000626PyNumber_FloorDivide(PyObject *v, PyObject *w)
627{
628 /* XXX tp_flags test */
629 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
630}
631
632PyObject *
633PyNumber_TrueDivide(PyObject *v, PyObject *w)
634{
635 /* XXX tp_flags test */
636 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
637}
638
639PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000640PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000641{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000642 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000643 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000644#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000645 else if (PyUnicode_Check(v))
646 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000647#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000648 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000649}
650
651PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000652PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000653{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000654 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000655}
656
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000657/* Binary in-place operators */
658
659/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000660 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000661
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000662 - If the left hand object has the appropriate struct members, and
663 they are filled, call the appropriate function and return the
664 result. No coercion is done on the arguments; the left-hand object
665 is the one the operation is performed on, and it's up to the
666 function to deal with the right-hand object.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000667
668 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000669 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000670
671 */
672
673#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
674
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000675static PyObject *
676binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
677 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000678{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000679 PyNumberMethods *mv = v->ob_type->tp_as_number;
680 if (mv != NULL && HASINPLACE(v)) {
681 binaryfunc *slot = NB_BINOP(mv, iop_slot);
682 if (*slot) {
683 PyObject *x = (*slot)(v, w);
684 if (x != Py_NotImplemented) {
685 return x;
686 }
687 Py_DECREF(x);
688 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000689 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000690 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000691}
692
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000693#define INPLACE_BINOP(func, iop, op, op_name) \
694 PyObject * \
695 func(PyObject *v, PyObject *w) { \
696 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000697 }
698
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000699INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
700INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
701INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
702INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
703INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
704INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
705INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000706
707PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000708PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
709{
710 /* XXX tp_flags test */
711 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
712 NB_SLOT(nb_floor_divide), "//=");
713}
714
715PyObject *
716PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
717{
718 /* XXX tp_flags test */
719 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
720 NB_SLOT(nb_true_divide), "/=");
721}
722
723PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000724PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
725{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000727
Guido van Rossumbb8be932000-09-01 23:27:32 +0000728 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000729 if (HASINPLACE(v))
730 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
731 if (f == NULL)
732 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000733 if (f != NULL)
734 return (*f)(v, w);
735 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000736 return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000737}
738
739PyObject *
740PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
741{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000742 PyObject * (*g)(PyObject *, int) = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000743 if (HASINPLACE(v) && v->ob_type->tp_as_sequence &&
744 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) {
745 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000746 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000747 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000748 }
749 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000750 n = PyLong_AsLong(w);
751 if (n == -1 && PyErr_Occurred())
752 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000753 }
754 else {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000755 return type_error("can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000756 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000757 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000758 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000759 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
760 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000761}
762
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000763
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000764
765PyObject *
766PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
767{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000768 if (PyString_Check(v))
769 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000770#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000771 else if (PyUnicode_Check(v))
772 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000773#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000774 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000775 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
776 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000777}
778
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000779
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000780PyObject *
781PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
782{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000783 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
784 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
785 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000786 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000787 else {
788 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
789 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000790}
791
792
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000793/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000794
795PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000796PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000797{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000798 PyNumberMethods *m;
799
800 if (o == NULL)
801 return null_error();
802 m = o->ob_type->tp_as_number;
803 if (m && m->nb_negative)
804 return (*m->nb_negative)(o);
805
806 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000807}
808
809PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000810PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000811{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000812 PyNumberMethods *m;
813
814 if (o == NULL)
815 return null_error();
816 m = o->ob_type->tp_as_number;
817 if (m && m->nb_positive)
818 return (*m->nb_positive)(o);
819
820 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000821}
822
823PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000824PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000825{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000826 PyNumberMethods *m;
827
828 if (o == NULL)
829 return null_error();
830 m = o->ob_type->tp_as_number;
831 if (m && m->nb_invert)
832 return (*m->nb_invert)(o);
833
834 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000835}
836
837PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000838PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000839{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000840 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000841
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000842 if (o == NULL)
843 return null_error();
844 m = o->ob_type->tp_as_number;
845 if (m && m->nb_absolute)
846 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000847
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000849}
850
Guido van Rossum9e896b32000-04-05 20:11:21 +0000851/* Add a check for embedded NULL-bytes in the argument. */
852static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000853int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000854{
855 char *end;
856 PyObject *x;
857
858 x = PyInt_FromString((char*)s, &end, 10);
859 if (x == NULL)
860 return NULL;
861 if (end != s + len) {
862 PyErr_SetString(PyExc_ValueError,
863 "null byte in argument for int()");
864 Py_DECREF(x);
865 return NULL;
866 }
867 return x;
868}
869
Guido van Rossume15dee51995-07-18 14:12:02 +0000870PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000871PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000872{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000873 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000874 const char *buffer;
875 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000876
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000877 if (o == NULL)
878 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000879 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000880 Py_INCREF(o);
881 return o;
882 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000883 if (PyInt_Check(o)) {
884 PyIntObject *io = (PyIntObject*)o;
885 return PyInt_FromLong(io->ob_ival);
886 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000887 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000888 return int_from_string(PyString_AS_STRING(o),
889 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000890#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000891 if (PyUnicode_Check(o))
892 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
893 PyUnicode_GET_SIZE(o),
894 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000895#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000896 m = o->ob_type->tp_as_number;
897 if (m && m->nb_int)
898 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000899 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000900 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000901
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000902 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000903}
904
Guido van Rossum9e896b32000-04-05 20:11:21 +0000905/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000906static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000907long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000908{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000909 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000910 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000911
Guido van Rossum4c08d552000-03-10 22:55:18 +0000912 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000913 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000914 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000915 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000916 PyErr_SetString(PyExc_ValueError,
917 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000918 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000919 return NULL;
920 }
921 return x;
922}
923
Guido van Rossume15dee51995-07-18 14:12:02 +0000924PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000925PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000926{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000927 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000928 const char *buffer;
929 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000930
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000931 if (o == NULL)
932 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000933 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000934 Py_INCREF(o);
935 return o;
936 }
Tim Petersdb30ac42002-03-02 04:14:21 +0000937 if (PyLong_Check(o))
938 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000939 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000940 /* need to do extra error checking that PyLong_FromString()
941 * doesn't do. In particular long('9.5') must raise an
942 * exception, not truncate the float.
943 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000944 return long_from_string(PyString_AS_STRING(o),
945 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000946#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000947 if (PyUnicode_Check(o))
948 /* The above check is done in PyLong_FromUnicode(). */
949 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
950 PyUnicode_GET_SIZE(o),
951 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000952#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000953 m = o->ob_type->tp_as_number;
954 if (m && m->nb_long)
955 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000956 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
957 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000958
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000959 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000960}
961
962PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000963PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000964{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000966
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000967 if (o == NULL)
968 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000969 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000970 Py_INCREF(o);
971 return o;
972 }
Tim Peters7a50f252001-09-10 21:28:20 +0000973 if (PyFloat_Check(o)) {
974 PyFloatObject *po = (PyFloatObject *)o;
975 return PyFloat_FromDouble(po->ob_fval);
976 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000977 if (!PyString_Check(o)) {
978 m = o->ob_type->tp_as_number;
979 if (m && m->nb_float)
980 return m->nb_float(o);
981 }
982 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000983}
984
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000985/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000986
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000987int
Fred Drake79912472000-07-09 04:06:11 +0000988PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000989{
Guido van Rossum8700b422001-09-07 20:20:11 +0000990 return s != NULL && s->ob_type->tp_as_sequence &&
991 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000992}
993
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000994int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000995PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000996{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000997 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000998
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000999 if (s == NULL) {
1000 null_error();
1001 return -1;
1002 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001003
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001004 m = s->ob_type->tp_as_sequence;
1005 if (m && m->sq_length)
1006 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001007
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 type_error("len() of unsized object");
1009 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001010}
1011
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001012#undef PySequence_Length
1013int
1014PySequence_Length(PyObject *s)
1015{
1016 return PySequence_Size(s);
1017}
1018#define PySequence_Length PySequence_Size
1019
Guido van Rossume15dee51995-07-18 14:12:02 +00001020PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001021PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001022{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001023 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001024
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001025 if (s == NULL || o == NULL)
1026 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001027
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001028 m = s->ob_type->tp_as_sequence;
1029 if (m && m->sq_concat)
1030 return m->sq_concat(s, o);
1031
1032 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001033}
1034
1035PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001036PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001037{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001038 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001039
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001040 if (o == NULL)
1041 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001042
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001043 m = o->ob_type->tp_as_sequence;
1044 if (m && m->sq_repeat)
1045 return m->sq_repeat(o, count);
1046
1047 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001048}
1049
1050PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001051PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1052{
1053 PySequenceMethods *m;
1054
1055 if (s == NULL || o == NULL)
1056 return null_error();
1057
1058 m = s->ob_type->tp_as_sequence;
1059 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1060 return m->sq_inplace_concat(s, o);
1061 if (m && m->sq_concat)
1062 return m->sq_concat(s, o);
1063
1064 return type_error("object can't be concatenated");
1065}
1066
1067PyObject *
1068PySequence_InPlaceRepeat(PyObject *o, int count)
1069{
1070 PySequenceMethods *m;
1071
1072 if (o == NULL)
1073 return null_error();
1074
1075 m = o->ob_type->tp_as_sequence;
1076 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1077 return m->sq_inplace_repeat(o, count);
1078 if (m && m->sq_repeat)
1079 return m->sq_repeat(o, count);
1080
1081 return type_error("object can't be repeated");
1082}
1083
1084PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001085PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001086{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001087 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001088
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001089 if (s == NULL)
1090 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001091
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001092 m = s->ob_type->tp_as_sequence;
1093 if (m && m->sq_item) {
1094 if (i < 0) {
1095 if (m->sq_length) {
1096 int l = (*m->sq_length)(s);
1097 if (l < 0)
1098 return NULL;
1099 i += l;
1100 }
1101 }
1102 return m->sq_item(s, i);
1103 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001104
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001105 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001106}
1107
Thomas Wouters1d75a792000-08-17 22:37:32 +00001108static PyObject *
1109sliceobj_from_intint(int i, int j)
1110{
1111 PyObject *start, *end, *slice;
1112 start = PyInt_FromLong((long)i);
1113 if (!start)
1114 return NULL;
1115 end = PyInt_FromLong((long)j);
1116 if (!end) {
1117 Py_DECREF(start);
1118 return NULL;
1119 }
1120 slice = PySlice_New(start, end, NULL);
1121 Py_DECREF(start);
1122 Py_DECREF(end);
1123 return slice;
1124}
1125
Guido van Rossume15dee51995-07-18 14:12:02 +00001126PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001127PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001128{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001129 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001130 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001131
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001134 m = s->ob_type->tp_as_sequence;
1135 if (m && m->sq_slice) {
1136 if (i1 < 0 || i2 < 0) {
1137 if (m->sq_length) {
1138 int l = (*m->sq_length)(s);
1139 if (l < 0)
1140 return NULL;
1141 if (i1 < 0)
1142 i1 += l;
1143 if (i2 < 0)
1144 i2 += l;
1145 }
1146 }
1147 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001148 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1149 PyObject *res;
1150 PyObject *slice = sliceobj_from_intint(i1, i2);
1151 if (!slice)
1152 return NULL;
1153 res = mp->mp_subscript(s, slice);
1154 Py_DECREF(slice);
1155 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001157
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001159}
1160
1161int
Fred Drake79912472000-07-09 04:06:11 +00001162PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001163{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001164 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001165
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001166 if (s == NULL) {
1167 null_error();
1168 return -1;
1169 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001170
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001171 m = s->ob_type->tp_as_sequence;
1172 if (m && m->sq_ass_item) {
1173 if (i < 0) {
1174 if (m->sq_length) {
1175 int l = (*m->sq_length)(s);
1176 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001177 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178 i += l;
1179 }
1180 }
1181 return m->sq_ass_item(s, i, o);
1182 }
1183
1184 type_error("object doesn't support item assignment");
1185 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001186}
1187
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001188int
Fred Drake79912472000-07-09 04:06:11 +00001189PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001190{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001191 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193 if (s == NULL) {
1194 null_error();
1195 return -1;
1196 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001197
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198 m = s->ob_type->tp_as_sequence;
1199 if (m && m->sq_ass_item) {
1200 if (i < 0) {
1201 if (m->sq_length) {
1202 int l = (*m->sq_length)(s);
1203 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001204 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205 i += l;
1206 }
1207 }
1208 return m->sq_ass_item(s, i, (PyObject *)NULL);
1209 }
1210
1211 type_error("object doesn't support item deletion");
1212 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001213}
1214
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001215int
Fred Drake79912472000-07-09 04:06:11 +00001216PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001217{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001218 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001219 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001220
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001221 if (s == NULL) {
1222 null_error();
1223 return -1;
1224 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001225
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226 m = s->ob_type->tp_as_sequence;
1227 if (m && m->sq_ass_slice) {
1228 if (i1 < 0 || i2 < 0) {
1229 if (m->sq_length) {
1230 int l = (*m->sq_length)(s);
1231 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001232 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001233 if (i1 < 0)
1234 i1 += l;
1235 if (i2 < 0)
1236 i2 += l;
1237 }
1238 }
1239 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001240 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1241 int res;
1242 PyObject *slice = sliceobj_from_intint(i1, i2);
1243 if (!slice)
1244 return -1;
1245 res = mp->mp_ass_subscript(s, slice, o);
1246 Py_DECREF(slice);
1247 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001249
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001250 type_error("object doesn't support slice assignment");
1251 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001252}
1253
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254int
Fred Drake79912472000-07-09 04:06:11 +00001255PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001256{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001258
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259 if (s == NULL) {
1260 null_error();
1261 return -1;
1262 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001263
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001264 m = s->ob_type->tp_as_sequence;
1265 if (m && m->sq_ass_slice) {
1266 if (i1 < 0 || i2 < 0) {
1267 if (m->sq_length) {
1268 int l = (*m->sq_length)(s);
1269 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001270 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001271 if (i1 < 0)
1272 i1 += l;
1273 if (i2 < 0)
1274 i2 += l;
1275 }
1276 }
1277 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1278 }
1279 type_error("object doesn't support slice deletion");
1280 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001281}
1282
Guido van Rossume15dee51995-07-18 14:12:02 +00001283PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001284PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001285{
Tim Peters6912d4d2001-05-05 03:56:37 +00001286 PyObject *it; /* iter(v) */
1287 int n; /* guess for result tuple size */
1288 PyObject *result;
1289 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001290
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291 if (v == NULL)
1292 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001293
Tim Peters6912d4d2001-05-05 03:56:37 +00001294 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001295 if (PyTuple_CheckExact(v)) {
1296 /* Note that we can't know whether it's safe to return
1297 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001298 to exact tuples here. In contrast, lists always make
1299 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001300 Py_INCREF(v);
1301 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001302 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 if (PyList_Check(v))
1304 return PyList_AsTuple(v);
1305
Tim Peters6912d4d2001-05-05 03:56:37 +00001306 /* Get iterator. */
1307 it = PyObject_GetIter(v);
1308 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001309 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001310
Tim Peters6912d4d2001-05-05 03:56:37 +00001311 /* Guess result size and allocate space. */
1312 n = PySequence_Size(v);
1313 if (n < 0) {
1314 PyErr_Clear();
1315 n = 10; /* arbitrary */
1316 }
1317 result = PyTuple_New(n);
1318 if (result == NULL)
1319 goto Fail;
1320
1321 /* Fill the tuple. */
1322 for (j = 0; ; ++j) {
1323 PyObject *item = PyIter_Next(it);
1324 if (item == NULL) {
1325 if (PyErr_Occurred())
1326 goto Fail;
1327 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001329 if (j >= n) {
1330 if (n < 500)
1331 n += 10;
1332 else
1333 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001334 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001335 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001336 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001337 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001338 }
1339 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001340 }
1341
Tim Peters6912d4d2001-05-05 03:56:37 +00001342 /* Cut tuple back if guess was too large. */
1343 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001344 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001345 goto Fail;
1346
1347 Py_DECREF(it);
1348 return result;
1349
1350Fail:
1351 Py_XDECREF(result);
1352 Py_DECREF(it);
1353 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001354}
1355
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001356PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001357PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001358{
Tim Petersf553f892001-05-01 20:45:31 +00001359 PyObject *it; /* iter(v) */
1360 PyObject *result; /* result list */
1361 int n; /* guess for result list size */
1362 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001363
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001364 if (v == NULL)
1365 return null_error();
1366
Tim Petersf553f892001-05-01 20:45:31 +00001367 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001368 if (PyList_Check(v))
1369 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1370
Tim Petersf553f892001-05-01 20:45:31 +00001371 /* Get iterator. There may be some low-level efficiency to be gained
1372 * by caching the tp_iternext slot instead of using PyIter_Next()
1373 * later, but premature optimization is the root etc.
1374 */
1375 it = PyObject_GetIter(v);
1376 if (it == NULL)
1377 return NULL;
1378
1379 /* Guess a result list size. */
1380 n = -1; /* unknown */
1381 if (PySequence_Check(v) &&
1382 v->ob_type->tp_as_sequence->sq_length) {
1383 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001385 PyErr_Clear();
1386 }
1387 if (n < 0)
1388 n = 8; /* arbitrary */
1389 result = PyList_New(n);
1390 if (result == NULL) {
1391 Py_DECREF(it);
1392 return NULL;
1393 }
1394
1395 /* Run iterator to exhaustion. */
1396 for (i = 0; ; i++) {
1397 PyObject *item = PyIter_Next(it);
1398 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001399 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001400 Py_DECREF(result);
1401 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001402 }
Tim Petersf553f892001-05-01 20:45:31 +00001403 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001404 }
Tim Petersf553f892001-05-01 20:45:31 +00001405 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001406 PyList_SET_ITEM(result, i, item); /* steals ref */
1407 else {
1408 int status = PyList_Append(result, item);
1409 Py_DECREF(item); /* append creates a new ref */
1410 if (status < 0) {
1411 Py_DECREF(result);
1412 result = NULL;
1413 break;
1414 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001415 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001416 }
Tim Petersf553f892001-05-01 20:45:31 +00001417
1418 /* Cut back result list if initial guess was too large. */
1419 if (i < n && result != NULL) {
1420 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1421 Py_DECREF(result);
1422 result = NULL;
1423 }
1424 }
1425 Py_DECREF(it);
1426 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001427}
1428
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001429PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001430PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001431{
1432 if (v == NULL)
1433 return null_error();
1434
1435 if (PyList_Check(v) || PyTuple_Check(v)) {
1436 Py_INCREF(v);
1437 return v;
1438 }
1439
1440 v = PySequence_Tuple(v);
1441 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1442 return type_error(m);
1443
1444 return v;
1445}
1446
Tim Peters16a77ad2001-09-08 04:00:12 +00001447/* Iterate over seq. Result depends on the operation:
1448 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1449 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1450 set ValueError and return -1 if none found; also return -1 on error.
1451 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1452*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453int
Tim Peters16a77ad2001-09-08 04:00:12 +00001454_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001455{
Tim Peters16a77ad2001-09-08 04:00:12 +00001456 int n;
1457 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1458 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001459
Tim Peters16a77ad2001-09-08 04:00:12 +00001460 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001461 null_error();
1462 return -1;
1463 }
Tim Peters75f8e352001-05-05 11:33:43 +00001464
Tim Peters16a77ad2001-09-08 04:00:12 +00001465 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001466 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001467 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001468 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001469 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001470
Tim Peters16a77ad2001-09-08 04:00:12 +00001471 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001472 for (;;) {
1473 int cmp;
1474 PyObject *item = PyIter_Next(it);
1475 if (item == NULL) {
1476 if (PyErr_Occurred())
1477 goto Fail;
1478 break;
1479 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001480
1481 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001482 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001483 if (cmp < 0)
1484 goto Fail;
1485 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001486 switch (operation) {
1487 case PY_ITERSEARCH_COUNT:
1488 ++n;
1489 if (n <= 0) {
1490 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001491 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001492 goto Fail;
1493 }
1494 break;
1495
1496 case PY_ITERSEARCH_INDEX:
1497 if (wrapped) {
1498 PyErr_SetString(PyExc_OverflowError,
1499 "index exceeds C int size");
1500 goto Fail;
1501 }
1502 goto Done;
1503
1504 case PY_ITERSEARCH_CONTAINS:
1505 n = 1;
1506 goto Done;
1507
1508 default:
1509 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001510 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001511 }
1512
1513 if (operation == PY_ITERSEARCH_INDEX) {
1514 ++n;
1515 if (n <= 0)
1516 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001517 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001518 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001519
1520 if (operation != PY_ITERSEARCH_INDEX)
1521 goto Done;
1522
1523 PyErr_SetString(PyExc_ValueError,
1524 "sequence.index(x): x not in sequence");
1525 /* fall into failure code */
1526Fail:
1527 n = -1;
1528 /* fall through */
1529Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001530 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001531 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001532
Guido van Rossume15dee51995-07-18 14:12:02 +00001533}
1534
Tim Peters16a77ad2001-09-08 04:00:12 +00001535/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001536int
Tim Peters16a77ad2001-09-08 04:00:12 +00001537PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001538{
Tim Peters16a77ad2001-09-08 04:00:12 +00001539 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001540}
1541
Tim Peterscb8d3682001-05-05 21:05:01 +00001542/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001543 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001544 */
1545int
1546PySequence_Contains(PyObject *seq, PyObject *ob)
1547{
1548 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1549 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1550 if (sqm != NULL && sqm->sq_contains != NULL)
1551 return (*sqm->sq_contains)(seq, ob);
1552 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001553 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001554}
1555
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001556/* Backwards compatibility */
1557#undef PySequence_In
1558int
Fred Drake79912472000-07-09 04:06:11 +00001559PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001560{
1561 return PySequence_Contains(w, v);
1562}
1563
1564int
Fred Drake79912472000-07-09 04:06:11 +00001565PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001566{
Tim Peters16a77ad2001-09-08 04:00:12 +00001567 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001568}
1569
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001570/* Operations on mappings */
1571
1572int
Fred Drake79912472000-07-09 04:06:11 +00001573PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001574{
Guido van Rossum8700b422001-09-07 20:20:11 +00001575 return o && o->ob_type->tp_as_mapping &&
1576 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001577}
1578
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001579int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001580PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001581{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001582 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001583
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001584 if (o == NULL) {
1585 null_error();
1586 return -1;
1587 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001588
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001589 m = o->ob_type->tp_as_mapping;
1590 if (m && m->mp_length)
1591 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001592
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001593 type_error("len() of unsized object");
1594 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001595}
1596
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001597#undef PyMapping_Length
1598int
1599PyMapping_Length(PyObject *o)
1600{
1601 return PyMapping_Size(o);
1602}
1603#define PyMapping_Length PyMapping_Size
1604
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001605PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001606PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001607{
1608 PyObject *okey, *r;
1609
1610 if (key == NULL)
1611 return null_error();
1612
1613 okey = PyString_FromString(key);
1614 if (okey == NULL)
1615 return NULL;
1616 r = PyObject_GetItem(o, okey);
1617 Py_DECREF(okey);
1618 return r;
1619}
1620
1621int
Fred Drake79912472000-07-09 04:06:11 +00001622PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001623{
1624 PyObject *okey;
1625 int r;
1626
1627 if (key == NULL) {
1628 null_error();
1629 return -1;
1630 }
1631
1632 okey = PyString_FromString(key);
1633 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001634 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001635 r = PyObject_SetItem(o, okey, value);
1636 Py_DECREF(okey);
1637 return r;
1638}
1639
1640int
Fred Drake79912472000-07-09 04:06:11 +00001641PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001642{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001643 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001644
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001645 v = PyMapping_GetItemString(o, key);
1646 if (v) {
1647 Py_DECREF(v);
1648 return 1;
1649 }
1650 PyErr_Clear();
1651 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001652}
1653
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001654int
Fred Drake79912472000-07-09 04:06:11 +00001655PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001656{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001657 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001658
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001659 v = PyObject_GetItem(o, key);
1660 if (v) {
1661 Py_DECREF(v);
1662 return 1;
1663 }
1664 PyErr_Clear();
1665 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001666}
1667
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001668/* Operations on callable objects */
1669
1670/* XXX PyCallable_Check() is in object.c */
1671
Guido van Rossume15dee51995-07-18 14:12:02 +00001672PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001673PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001674{
Guido van Rossum5560b742001-09-14 16:47:50 +00001675 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001676}
Guido van Rossume15dee51995-07-18 14:12:02 +00001677
1678PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001679PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1680{
1681 ternaryfunc call;
1682
1683 if ((call = func->ob_type->tp_call) != NULL) {
1684 PyObject *result = (*call)(func, arg, kw);
1685 if (result == NULL && !PyErr_Occurred())
1686 PyErr_SetString(
1687 PyExc_SystemError,
1688 "NULL result without error in PyObject_Call");
1689 return result;
1690 }
Fred Drake573395a2001-11-01 20:26:12 +00001691 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1692 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001693 return NULL;
1694}
1695
1696PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001697PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001698{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001699 va_list va;
1700 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001701
Fred Drakeb92cf062001-10-27 06:16:31 +00001702 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001703 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001704
Fred Drakeb92cf062001-10-27 06:16:31 +00001705 if (format && *format) {
1706 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001707 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001708 va_end(va);
1709 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001710 else
1711 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001712
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001713 if (args == NULL)
1714 return NULL;
1715
1716 if (!PyTuple_Check(args)) {
1717 PyObject *a;
1718
1719 a = PyTuple_New(1);
1720 if (a == NULL)
1721 return NULL;
1722 if (PyTuple_SetItem(a, 0, args) < 0)
1723 return NULL;
1724 args = a;
1725 }
1726 retval = PyObject_CallObject(callable, args);
1727
1728 Py_DECREF(args);
1729
1730 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001731}
1732
1733PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001734PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001735{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001736 va_list va;
1737 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001738
Fred Drakeb92cf062001-10-27 06:16:31 +00001739 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001740 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001741
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001742 func = PyObject_GetAttrString(o, name);
1743 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001744 PyErr_SetString(PyExc_AttributeError, name);
1745 return 0;
1746 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001747
Fred Drakeb92cf062001-10-27 06:16:31 +00001748 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001749 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001750
Fred Drakeb92cf062001-10-27 06:16:31 +00001751 if (format && *format) {
1752 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001753 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001754 va_end(va);
1755 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001756 else
1757 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001758
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001759 if (!args)
1760 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001761
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001762 if (!PyTuple_Check(args)) {
1763 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001764
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001765 a = PyTuple_New(1);
1766 if (a == NULL)
1767 return NULL;
1768 if (PyTuple_SetItem(a, 0, args) < 0)
1769 return NULL;
1770 args = a;
1771 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001772
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001773 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001774
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001775 Py_DECREF(args);
1776 Py_DECREF(func);
1777
1778 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001779}
Guido van Rossum823649d2001-03-21 18:40:58 +00001780
1781
Fred Drakeb421b8c2001-10-26 16:21:32 +00001782static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001783objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001784{
1785 int i, n = 0;
1786 va_list countva;
1787 PyObject *result, *tmp;
1788
1789#ifdef VA_LIST_IS_ARRAY
1790 memcpy(countva, va, sizeof(va_list));
1791#else
1792 countva = va;
1793#endif
1794
1795 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1796 ++n;
1797 result = PyTuple_New(n);
1798 if (result != NULL && n > 0) {
1799 for (i = 0; i < n; ++i) {
1800 tmp = (PyObject *)va_arg(va, PyObject *);
1801 PyTuple_SET_ITEM(result, i, tmp);
1802 Py_INCREF(tmp);
1803 }
1804 }
1805 return result;
1806}
1807
1808PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001809PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001810{
1811 PyObject *args, *tmp;
1812 va_list vargs;
1813
1814 if (callable == NULL || name == NULL)
1815 return null_error();
1816
1817 callable = PyObject_GetAttr(callable, name);
1818 if (callable == NULL)
1819 return NULL;
1820
1821 /* count the args */
1822 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001823 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001824 va_end(vargs);
1825 if (args == NULL) {
1826 Py_DECREF(callable);
1827 return NULL;
1828 }
1829 tmp = PyObject_Call(callable, args, NULL);
1830 Py_DECREF(args);
1831 Py_DECREF(callable);
1832
1833 return tmp;
1834}
1835
1836PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001837PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001838{
1839 PyObject *args, *tmp;
1840 va_list vargs;
1841
1842 if (callable == NULL)
1843 return null_error();
1844
1845 /* count the args */
1846 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001847 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001848 va_end(vargs);
1849 if (args == NULL)
1850 return NULL;
1851 tmp = PyObject_Call(callable, args, NULL);
1852 Py_DECREF(args);
1853
1854 return tmp;
1855}
1856
1857
Guido van Rossum823649d2001-03-21 18:40:58 +00001858/* isinstance(), issubclass() */
1859
Neil Schemenauer6b471292001-10-18 03:18:43 +00001860static PyObject *
1861abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001862{
1863 static PyObject *__bases__ = NULL;
1864 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001865
1866 if (__bases__ == NULL) {
1867 __bases__ = PyString_FromString("__bases__");
1868 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001869 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001870 }
1871
Neil Schemenauer6b471292001-10-18 03:18:43 +00001872 bases = PyObject_GetAttr(cls, __bases__);
1873 if (bases == NULL || !PyTuple_Check(bases)) {
1874 Py_XDECREF(bases);
1875 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001876 }
1877
Neil Schemenauer6b471292001-10-18 03:18:43 +00001878 return bases;
1879}
1880
1881
1882static int
1883abstract_issubclass(PyObject *derived, PyObject *cls)
1884{
1885 PyObject *bases;
1886 int i, n;
1887 int r = 0;
1888
1889
Guido van Rossum823649d2001-03-21 18:40:58 +00001890 if (derived == cls)
1891 return 1;
1892
Neil Schemenauer6b471292001-10-18 03:18:43 +00001893 bases = abstract_get_bases(derived);
1894 if (bases == NULL)
1895 return 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001896
1897 n = PyTuple_GET_SIZE(bases);
1898 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001899 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001900 if (r != 0)
1901 break;
1902 }
1903
1904 Py_DECREF(bases);
1905
1906 return r;
1907}
1908
1909int
1910PyObject_IsInstance(PyObject *inst, PyObject *cls)
1911{
1912 PyObject *icls;
1913 static PyObject *__class__ = NULL;
1914 int retval = 0;
1915
Neil Schemenauer6b471292001-10-18 03:18:43 +00001916 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1917 PyObject *inclass =
1918 (PyObject*)((PyInstanceObject*)inst)->in_class;
1919 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001920 }
1921 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001922 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001923 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001924 else if (PyTuple_Check(cls)) {
1925 /* Not a general sequence -- that opens up the road to
1926 recursion and stack overflow. */
1927 int i, n;
1928
1929 n = PyTuple_GET_SIZE(cls);
1930 for (i = 0; i < n; i++) {
1931 retval = PyObject_IsInstance(
1932 inst, PyTuple_GET_ITEM(cls, i));
1933 if (retval != 0)
1934 break;
1935 }
1936 return retval;
1937 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001938 else {
1939 PyObject *cls_bases = abstract_get_bases(cls);
1940 if (cls_bases == NULL) {
1941 PyErr_SetString(PyExc_TypeError,
1942 "isinstance() arg 2 must be a class or type");
1943 return -1;
1944 }
1945 Py_DECREF(cls_bases);
Guido van Rossum823649d2001-03-21 18:40:58 +00001946 if (__class__ == NULL) {
1947 __class__ = PyString_FromString("__class__");
1948 if (__class__ == NULL)
1949 return -1;
1950 }
1951 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001952 if (icls == NULL) {
1953 PyErr_Clear();
1954 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001955 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001956 else {
1957 retval = abstract_issubclass(icls, cls);
1958 Py_DECREF(icls);
1959 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001960 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001961
Guido van Rossum823649d2001-03-21 18:40:58 +00001962 return retval;
1963}
1964
1965int
1966PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1967{
1968 int retval;
1969
1970 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001971 PyObject *derived_bases;
1972 PyObject *cls_bases;
1973
1974 derived_bases = abstract_get_bases(derived);
1975 if (derived_bases == NULL) {
1976 PyErr_SetString(PyExc_TypeError,
1977 "issubclass() arg 1 must be a class");
1978 return -1;
1979 }
1980 Py_DECREF(derived_bases);
1981
1982 cls_bases = abstract_get_bases(cls);
1983 if (cls_bases == NULL) {
1984 PyErr_SetString(PyExc_TypeError,
1985 "issubclass() arg 2 must be a class");
1986 return -1;
1987 }
1988 Py_DECREF(cls_bases);
1989
1990 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001991 }
1992 else {
1993 /* shortcut */
1994 if (!(retval = (derived == cls)))
1995 retval = PyClass_IsSubclass(derived, cls);
1996 }
1997
1998 return retval;
1999}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002000
2001PyObject *
2002PyObject_GetIter(PyObject *o)
2003{
2004 PyTypeObject *t = o->ob_type;
2005 getiterfunc f = NULL;
2006 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2007 f = t->tp_iter;
2008 if (f == NULL) {
2009 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002010 return PySeqIter_New(o);
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002011 PyErr_SetString(PyExc_TypeError,
2012 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002013 return NULL;
2014 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002015 else {
2016 PyObject *res = (*f)(o);
2017 if (res != NULL && !PyIter_Check(res)) {
2018 PyErr_Format(PyExc_TypeError,
2019 "iter() returned non-iterator "
2020 "of type '%.100s'",
2021 res->ob_type->tp_name);
2022 Py_DECREF(res);
2023 res = NULL;
2024 }
2025 return res;
2026 }
2027}
2028
Tim Petersf4848da2001-05-05 00:14:56 +00002029/* Return next item.
2030 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2031 * If the iteration terminates normally, return NULL and clear the
2032 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2033 * will be false.
2034 * Else return the next object. PyErr_Occurred() will be false.
2035 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002036PyObject *
2037PyIter_Next(PyObject *iter)
2038{
Tim Petersf4848da2001-05-05 00:14:56 +00002039 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002040 if (!PyIter_Check(iter)) {
2041 PyErr_Format(PyExc_TypeError,
2042 "'%.100s' object is not an iterator",
2043 iter->ob_type->tp_name);
2044 return NULL;
2045 }
Tim Petersf4848da2001-05-05 00:14:56 +00002046 result = (*iter->ob_type->tp_iternext)(iter);
2047 if (result == NULL &&
2048 PyErr_Occurred() &&
2049 PyErr_ExceptionMatches(PyExc_StopIteration))
2050 PyErr_Clear();
2051 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002052}
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002053