blob: 59314497bd41231f64a8e6e13138b02f6caf1b74 [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
Guido van Rossum4c08d552000-03-10 22:55:18 +0000177int PyObject_AsCharBuffer(PyObject *obj,
178 const char **buffer,
179 int *buffer_len)
180{
181 PyBufferProcs *pb;
182 const char *pp;
183 int len;
184
185 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
186 null_error();
187 return -1;
188 }
189 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000190 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000191 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000192 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000193 PyErr_SetString(PyExc_TypeError,
194 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000195 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000196 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000197 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000198 PyErr_SetString(PyExc_TypeError,
199 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000200 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000201 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000202 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000203 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000204 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000205 *buffer = pp;
206 *buffer_len = len;
207 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000208}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000209
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000210int
211PyObject_CheckReadBuffer(PyObject *obj)
212{
213 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
214
215 if (pb == NULL ||
216 pb->bf_getreadbuffer == NULL ||
217 pb->bf_getsegcount == NULL ||
218 (*pb->bf_getsegcount)(obj, NULL) != 1)
219 return 0;
220 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000221}
222
223int PyObject_AsReadBuffer(PyObject *obj,
224 const void **buffer,
225 int *buffer_len)
226{
227 PyBufferProcs *pb;
228 void *pp;
229 int len;
230
231 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
232 null_error();
233 return -1;
234 }
235 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000236 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000237 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000238 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239 PyErr_SetString(PyExc_TypeError,
240 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000241 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000243 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000244 PyErr_SetString(PyExc_TypeError,
245 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000246 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000247 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000248 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000249 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000250 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000251 *buffer = pp;
252 *buffer_len = len;
253 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000254}
255
256int PyObject_AsWriteBuffer(PyObject *obj,
257 void **buffer,
258 int *buffer_len)
259{
260 PyBufferProcs *pb;
261 void*pp;
262 int len;
263
264 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
265 null_error();
266 return -1;
267 }
268 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000269 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000270 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000271 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000272 PyErr_SetString(PyExc_TypeError,
273 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000274 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000275 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000276 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000277 PyErr_SetString(PyExc_TypeError,
278 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000279 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000280 }
281 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
282 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000283 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000284 *buffer = pp;
285 *buffer_len = len;
286 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000287}
288
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000289/* Operations on numbers */
290
291int
Fred Drake79912472000-07-09 04:06:11 +0000292PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000293{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000294 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000295}
296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000297/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000298
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000299/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000300
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000301#define NB_SLOT(x) offsetof(PyNumberMethods, x)
302#define NB_BINOP(nb_methods, slot) \
303 ((binaryfunc*)(& ((char*)nb_methods)[slot] ))
304#define NB_TERNOP(nb_methods, slot) \
305 ((ternaryfunc*)(& ((char*)nb_methods)[slot] ))
306
307/*
308 Calling scheme used for binary operations:
309
310 v w Action
311 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000312 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000313 new old v.op(v,w), coerce(v,w), v.op(v,w)
314 old new w.op(v,w), coerce(v,w), v.op(v,w)
315 old old coerce(v,w), v.op(v,w)
316
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000317 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
318 v->ob_type
319
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000320 Legend:
321 -------
322 * new == new style number
323 * old == old style number
324 * Action indicates the order in which operations are tried until either
325 a valid result is produced or an error occurs.
326
327 */
328
329static PyObject *
330binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000331{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000332 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000333 binaryfunc slotv = NULL;
334 binaryfunc slotw = NULL;
335
336 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
337 slotv = *NB_BINOP(v->ob_type->tp_as_number, op_slot);
338 if (w->ob_type != v->ob_type &&
339 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
340 slotw = *NB_BINOP(w->ob_type->tp_as_number, op_slot);
341 if (slotw == slotv)
342 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000343 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000344 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000345 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
346 x = slotw(v, w);
347 if (x != Py_NotImplemented)
348 return x;
349 Py_DECREF(x); /* can't do it */
350 slotw = NULL;
351 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000352 x = slotv(v, w);
353 if (x != Py_NotImplemented)
354 return x;
355 Py_DECREF(x); /* can't do it */
356 }
357 if (slotw) {
358 x = slotw(v, w);
359 if (x != Py_NotImplemented)
360 return x;
361 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000362 }
363 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
364 int err = PyNumber_CoerceEx(&v, &w);
365 if (err < 0) {
366 return NULL;
367 }
368 if (err == 0) {
369 PyNumberMethods *mv = v->ob_type->tp_as_number;
370 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000371 binaryfunc slot;
372 slot = *NB_BINOP(mv, op_slot);
373 if (slot) {
374 PyObject *x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000375 Py_DECREF(v);
376 Py_DECREF(w);
377 return x;
378 }
379 }
380 /* CoerceEx incremented the reference counts */
381 Py_DECREF(v);
382 Py_DECREF(w);
383 }
384 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000385 Py_INCREF(Py_NotImplemented);
386 return Py_NotImplemented;
387}
388
389static PyObject *
390binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
391{
392 PyObject *result = binary_op1(v, w, op_slot);
393 if (result == Py_NotImplemented) {
394 Py_DECREF(Py_NotImplemented);
Guido van Rossum5c66a262001-10-22 04:12:44 +0000395 PyErr_Format(
396 PyExc_TypeError,
397 "unsupported operand type(s) for %s: '%s' and '%s'",
398 op_name,
399 v->ob_type->tp_name,
400 w->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000401 return NULL;
402 }
403 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000404}
405
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000406
407/*
408 Calling scheme used for ternary operations:
409
Guido van Rossum84675ac2001-09-29 01:05:03 +0000410 *** In some cases, w.op is called before v.op; see binary_op1. ***
411
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000412 v w z Action
413 -------------------------------------------------------------------
414 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
415 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
416 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
417 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
418 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
419 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
420 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
421 old old old coerce(v,w,z), v.op(v,w,z)
422
423 Legend:
424 -------
425 * new == new style number
426 * old == old style number
427 * Action indicates the order in which operations are tried until either
428 a valid result is produced or an error occurs.
429 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
430 only if z != Py_None; if z == Py_None, then it is treated as absent
431 variable and only coerce(v,w) is tried.
432
433 */
434
435static PyObject *
436ternary_op(PyObject *v,
437 PyObject *w,
438 PyObject *z,
439 const int op_slot,
440 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000441{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000442 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000443 PyObject *x = NULL;
444 ternaryfunc slotv = NULL;
445 ternaryfunc slotw = NULL;
446 ternaryfunc slotz = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000447
448 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000449 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000450 if (mv != NULL && NEW_STYLE_NUMBER(v))
451 slotv = *NB_TERNOP(mv, op_slot);
452 if (w->ob_type != v->ob_type &&
453 mv != NULL && NEW_STYLE_NUMBER(w)) {
454 slotw = *NB_TERNOP(mw, op_slot);
455 if (slotw == slotv)
456 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000457 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000458 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000459 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
460 x = slotw(v, w, z);
461 if (x != Py_NotImplemented)
462 return x;
463 Py_DECREF(x); /* can't do it */
464 slotw = NULL;
465 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000466 x = slotv(v, w, z);
467 if (x != Py_NotImplemented)
468 return x;
469 Py_DECREF(x); /* can't do it */
470 }
471 if (slotw) {
472 x = slotw(v, w, z);
473 if (x != Py_NotImplemented)
474 return x;
475 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000476 }
477 mz = z->ob_type->tp_as_number;
478 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000479 slotz = *NB_TERNOP(mz, op_slot);
480 if (slotz == slotv || slotz == slotw)
481 slotz = NULL;
482 if (slotz) {
483 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000484 if (x != Py_NotImplemented)
485 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000486 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000487 }
488 }
489
490 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
491 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
492 /* we have an old style operand, coerce */
493 PyObject *v1, *z1, *w2, *z2;
494 int c;
495
496 c = PyNumber_Coerce(&v, &w);
497 if (c != 0)
498 goto error3;
499
500 /* Special case: if the third argument is None, it is
501 treated as absent argument and not coerced. */
502 if (z == Py_None) {
503 if (v->ob_type->tp_as_number) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000504 slotz = *NB_TERNOP(v->ob_type->tp_as_number,
505 op_slot);
506 if (slotz)
507 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000508 else
509 c = -1;
510 }
511 else
512 c = -1;
513 goto error2;
514 }
515 v1 = v;
516 z1 = z;
517 c = PyNumber_Coerce(&v1, &z1);
518 if (c != 0)
519 goto error2;
520 w2 = w;
521 z2 = z1;
522 c = PyNumber_Coerce(&w2, &z2);
523 if (c != 0)
524 goto error1;
525
526 if (v1->ob_type->tp_as_number != NULL) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000527 slotv = *NB_TERNOP(v1->ob_type->tp_as_number,
528 op_slot);
529 if (slotv)
530 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000531 else
532 c = -1;
533 }
534 else
535 c = -1;
536
537 Py_DECREF(w2);
538 Py_DECREF(z2);
539 error1:
540 Py_DECREF(v1);
541 Py_DECREF(z1);
542 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000543 Py_DECREF(v);
544 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000545 error3:
546 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000547 return x;
548 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000549
550 if (z == Py_None)
551 PyErr_Format(
552 PyExc_TypeError,
553 "unsupported operand type(s) for ** or pow(): "
554 "'%s' and '%s'",
555 v->ob_type->tp_name,
556 w->ob_type->tp_name);
557 else
558 PyErr_Format(
559 PyExc_TypeError,
560 "unsupported operand type(s) for pow(): "
561 "'%s', '%s', '%s'",
562 v->ob_type->tp_name,
563 w->ob_type->tp_name,
564 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000565 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000566}
567
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000568#define BINARY_FUNC(func, op, op_name) \
569 PyObject * \
570 func(PyObject *v, PyObject *w) { \
571 return binary_op(v, w, NB_SLOT(op), op_name); \
572 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000573
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000574BINARY_FUNC(PyNumber_Or, nb_or, "|")
575BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
576BINARY_FUNC(PyNumber_And, nb_and, "&")
577BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
578BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
579BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
580BINARY_FUNC(PyNumber_Multiply, nb_multiply, "*")
581BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
582BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000583
584PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000585PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000586{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000587 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
588 if (result == Py_NotImplemented) {
589 PySequenceMethods *m = v->ob_type->tp_as_sequence;
590 Py_DECREF(Py_NotImplemented);
591 if (m && m->sq_concat) {
592 result = (*m->sq_concat)(v, w);
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000593 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000594 else {
Guido van Rossum5c66a262001-10-22 04:12:44 +0000595 PyErr_Format(
596 PyExc_TypeError,
597 "unsupported operand types for +: '%s' and '%s'",
598 v->ob_type->tp_name,
599 w->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000600 result = NULL;
601 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000602 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000603 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000604}
605
606PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000607PyNumber_FloorDivide(PyObject *v, PyObject *w)
608{
609 /* XXX tp_flags test */
610 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
611}
612
613PyObject *
614PyNumber_TrueDivide(PyObject *v, PyObject *w)
615{
616 /* XXX tp_flags test */
617 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
618}
619
620PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000621PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000622{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000623 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000624 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000625#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000626 else if (PyUnicode_Check(v))
627 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000628#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000629 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000630}
631
632PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000633PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000634{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000635 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000636}
637
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000638/* Binary in-place operators */
639
640/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000641 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000642
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000643 - If the left hand object has the appropriate struct members, and
644 they are filled, call the appropriate function and return the
645 result. No coercion is done on the arguments; the left-hand object
646 is the one the operation is performed on, and it's up to the
647 function to deal with the right-hand object.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000648
649 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000650 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000651
652 */
653
654#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
655
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000656static PyObject *
657binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
658 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000659{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000660 PyNumberMethods *mv = v->ob_type->tp_as_number;
661 if (mv != NULL && HASINPLACE(v)) {
662 binaryfunc *slot = NB_BINOP(mv, iop_slot);
663 if (*slot) {
664 PyObject *x = (*slot)(v, w);
665 if (x != Py_NotImplemented) {
666 return x;
667 }
668 Py_DECREF(x);
669 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000670 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000671 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000672}
673
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000674#define INPLACE_BINOP(func, iop, op, op_name) \
675 PyObject * \
676 func(PyObject *v, PyObject *w) { \
677 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000678 }
679
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000680INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
681INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
682INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
683INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
684INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
685INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
686INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000687
688PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000689PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
690{
691 /* XXX tp_flags test */
692 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
693 NB_SLOT(nb_floor_divide), "//=");
694}
695
696PyObject *
697PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
698{
699 /* XXX tp_flags test */
700 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
701 NB_SLOT(nb_true_divide), "/=");
702}
703
704PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000705PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
706{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000707 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000708
Guido van Rossumbb8be932000-09-01 23:27:32 +0000709 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000710 if (HASINPLACE(v))
711 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
712 if (f == NULL)
713 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000714 if (f != NULL)
715 return (*f)(v, w);
716 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000717 return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000718}
719
720PyObject *
721PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
722{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000723 PyObject * (*g)(PyObject *, int) = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000724 if (HASINPLACE(v) && v->ob_type->tp_as_sequence &&
725 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) {
726 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000727 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000728 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729 }
730 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000731 n = PyLong_AsLong(w);
732 if (n == -1 && PyErr_Occurred())
733 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000734 }
735 else {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000736 return type_error("can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000737 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000738 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000739 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000740 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
741 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000742}
743
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000744
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000745
746PyObject *
747PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
748{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000749 if (PyString_Check(v))
750 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000751#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000752 else if (PyUnicode_Check(v))
753 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000754#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000755 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000756 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
757 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000758}
759
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000760
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000761PyObject *
762PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
763{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000764 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
765 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
766 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000767 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000768 else {
769 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
770 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000771}
772
773
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000774/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000775
776PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000777PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000778{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000779 PyNumberMethods *m;
780
781 if (o == NULL)
782 return null_error();
783 m = o->ob_type->tp_as_number;
784 if (m && m->nb_negative)
785 return (*m->nb_negative)(o);
786
787 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000788}
789
790PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000791PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000792{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000793 PyNumberMethods *m;
794
795 if (o == NULL)
796 return null_error();
797 m = o->ob_type->tp_as_number;
798 if (m && m->nb_positive)
799 return (*m->nb_positive)(o);
800
801 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000802}
803
804PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000805PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000806{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000807 PyNumberMethods *m;
808
809 if (o == NULL)
810 return null_error();
811 m = o->ob_type->tp_as_number;
812 if (m && m->nb_invert)
813 return (*m->nb_invert)(o);
814
815 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000816}
817
818PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000819PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000820{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000821 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000822
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000823 if (o == NULL)
824 return null_error();
825 m = o->ob_type->tp_as_number;
826 if (m && m->nb_absolute)
827 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000828
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000829 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000830}
831
Guido van Rossum9e896b32000-04-05 20:11:21 +0000832/* Add a check for embedded NULL-bytes in the argument. */
833static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000834int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000835{
836 char *end;
837 PyObject *x;
838
839 x = PyInt_FromString((char*)s, &end, 10);
840 if (x == NULL)
841 return NULL;
842 if (end != s + len) {
843 PyErr_SetString(PyExc_ValueError,
844 "null byte in argument for int()");
845 Py_DECREF(x);
846 return NULL;
847 }
848 return x;
849}
850
Guido van Rossume15dee51995-07-18 14:12:02 +0000851PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000852PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000853{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000854 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000855 const char *buffer;
856 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000857
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858 if (o == NULL)
859 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000860 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000861 Py_INCREF(o);
862 return o;
863 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000864 if (PyInt_Check(o)) {
865 PyIntObject *io = (PyIntObject*)o;
866 return PyInt_FromLong(io->ob_ival);
867 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000868 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000869 return int_from_string(PyString_AS_STRING(o),
870 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000871#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000872 if (PyUnicode_Check(o))
873 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
874 PyUnicode_GET_SIZE(o),
875 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000876#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000877 m = o->ob_type->tp_as_number;
878 if (m && m->nb_int)
879 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000880 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000881 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000882
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000884}
885
Guido van Rossum9e896b32000-04-05 20:11:21 +0000886/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000887static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000888long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000889{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000890 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000891 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000892
Guido van Rossum4c08d552000-03-10 22:55:18 +0000893 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000894 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000895 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000896 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000897 PyErr_SetString(PyExc_ValueError,
898 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000899 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000900 return NULL;
901 }
902 return x;
903}
904
Guido van Rossume15dee51995-07-18 14:12:02 +0000905PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000906PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000907{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000909 const char *buffer;
910 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000911
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000912 if (o == NULL)
913 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000914 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000915 Py_INCREF(o);
916 return o;
917 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000918 if (PyLong_Check(o))
919 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000920 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000921 /* need to do extra error checking that PyLong_FromString()
922 * doesn't do. In particular long('9.5') must raise an
923 * exception, not truncate the float.
924 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000925 return long_from_string(PyString_AS_STRING(o),
926 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000927#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000928 if (PyUnicode_Check(o))
929 /* The above check is done in PyLong_FromUnicode(). */
930 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
931 PyUnicode_GET_SIZE(o),
932 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000933#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000934 m = o->ob_type->tp_as_number;
935 if (m && m->nb_long)
936 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000937 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
938 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000939
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000940 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000941}
942
943PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000944PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000945{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000947
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000948 if (o == NULL)
949 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000950 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000951 Py_INCREF(o);
952 return o;
953 }
Tim Peters7a50f252001-09-10 21:28:20 +0000954 if (PyFloat_Check(o)) {
955 PyFloatObject *po = (PyFloatObject *)o;
956 return PyFloat_FromDouble(po->ob_fval);
957 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000958 if (!PyString_Check(o)) {
959 m = o->ob_type->tp_as_number;
960 if (m && m->nb_float)
961 return m->nb_float(o);
962 }
963 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000964}
965
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000966/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000967
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000968int
Fred Drake79912472000-07-09 04:06:11 +0000969PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000970{
Guido van Rossum8700b422001-09-07 20:20:11 +0000971 return s != NULL && s->ob_type->tp_as_sequence &&
972 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000973}
974
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000976PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000977{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000978 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000979
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000980 if (s == NULL) {
981 null_error();
982 return -1;
983 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000984
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000985 m = s->ob_type->tp_as_sequence;
986 if (m && m->sq_length)
987 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000988
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000989 type_error("len() of unsized object");
990 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000991}
992
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000993#undef PySequence_Length
994int
995PySequence_Length(PyObject *s)
996{
997 return PySequence_Size(s);
998}
999#define PySequence_Length PySequence_Size
1000
Guido van Rossume15dee51995-07-18 14:12:02 +00001001PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001002PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001003{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001004 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001005
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001006 if (s == NULL || o == NULL)
1007 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001008
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001009 m = s->ob_type->tp_as_sequence;
1010 if (m && m->sq_concat)
1011 return m->sq_concat(s, o);
1012
1013 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001014}
1015
1016PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001017PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001018{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001019 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001020
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001021 if (o == NULL)
1022 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001023
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001024 m = o->ob_type->tp_as_sequence;
1025 if (m && m->sq_repeat)
1026 return m->sq_repeat(o, count);
1027
1028 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001029}
1030
1031PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001032PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1033{
1034 PySequenceMethods *m;
1035
1036 if (s == NULL || o == NULL)
1037 return null_error();
1038
1039 m = s->ob_type->tp_as_sequence;
1040 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1041 return m->sq_inplace_concat(s, o);
1042 if (m && m->sq_concat)
1043 return m->sq_concat(s, o);
1044
1045 return type_error("object can't be concatenated");
1046}
1047
1048PyObject *
1049PySequence_InPlaceRepeat(PyObject *o, int count)
1050{
1051 PySequenceMethods *m;
1052
1053 if (o == NULL)
1054 return null_error();
1055
1056 m = o->ob_type->tp_as_sequence;
1057 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1058 return m->sq_inplace_repeat(o, count);
1059 if (m && m->sq_repeat)
1060 return m->sq_repeat(o, count);
1061
1062 return type_error("object can't be repeated");
1063}
1064
1065PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001066PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001067{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001068 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001070 if (s == NULL)
1071 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001072
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001073 m = s->ob_type->tp_as_sequence;
1074 if (m && m->sq_item) {
1075 if (i < 0) {
1076 if (m->sq_length) {
1077 int l = (*m->sq_length)(s);
1078 if (l < 0)
1079 return NULL;
1080 i += l;
1081 }
1082 }
1083 return m->sq_item(s, i);
1084 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001085
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001086 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001087}
1088
Thomas Wouters1d75a792000-08-17 22:37:32 +00001089static PyObject *
1090sliceobj_from_intint(int i, int j)
1091{
1092 PyObject *start, *end, *slice;
1093 start = PyInt_FromLong((long)i);
1094 if (!start)
1095 return NULL;
1096 end = PyInt_FromLong((long)j);
1097 if (!end) {
1098 Py_DECREF(start);
1099 return NULL;
1100 }
1101 slice = PySlice_New(start, end, NULL);
1102 Py_DECREF(start);
1103 Py_DECREF(end);
1104 return slice;
1105}
1106
Guido van Rossume15dee51995-07-18 14:12:02 +00001107PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001108PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001109{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001110 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001111 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001112
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001113 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001114
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001115 m = s->ob_type->tp_as_sequence;
1116 if (m && m->sq_slice) {
1117 if (i1 < 0 || i2 < 0) {
1118 if (m->sq_length) {
1119 int l = (*m->sq_length)(s);
1120 if (l < 0)
1121 return NULL;
1122 if (i1 < 0)
1123 i1 += l;
1124 if (i2 < 0)
1125 i2 += l;
1126 }
1127 }
1128 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001129 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1130 PyObject *res;
1131 PyObject *slice = sliceobj_from_intint(i1, i2);
1132 if (!slice)
1133 return NULL;
1134 res = mp->mp_subscript(s, slice);
1135 Py_DECREF(slice);
1136 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001137 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001138
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001139 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001140}
1141
1142int
Fred Drake79912472000-07-09 04:06:11 +00001143PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001144{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001145 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001146
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001147 if (s == NULL) {
1148 null_error();
1149 return -1;
1150 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001151
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152 m = s->ob_type->tp_as_sequence;
1153 if (m && m->sq_ass_item) {
1154 if (i < 0) {
1155 if (m->sq_length) {
1156 int l = (*m->sq_length)(s);
1157 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001158 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159 i += l;
1160 }
1161 }
1162 return m->sq_ass_item(s, i, o);
1163 }
1164
1165 type_error("object doesn't support item assignment");
1166 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001167}
1168
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001169int
Fred Drake79912472000-07-09 04:06:11 +00001170PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001171{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001172 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001173
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174 if (s == NULL) {
1175 null_error();
1176 return -1;
1177 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001178
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001179 m = s->ob_type->tp_as_sequence;
1180 if (m && m->sq_ass_item) {
1181 if (i < 0) {
1182 if (m->sq_length) {
1183 int l = (*m->sq_length)(s);
1184 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001185 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001186 i += l;
1187 }
1188 }
1189 return m->sq_ass_item(s, i, (PyObject *)NULL);
1190 }
1191
1192 type_error("object doesn't support item deletion");
1193 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001194}
1195
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001196int
Fred Drake79912472000-07-09 04:06:11 +00001197PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001198{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001199 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001200 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001201
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 if (s == NULL) {
1203 null_error();
1204 return -1;
1205 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001206
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001207 m = s->ob_type->tp_as_sequence;
1208 if (m && m->sq_ass_slice) {
1209 if (i1 < 0 || i2 < 0) {
1210 if (m->sq_length) {
1211 int l = (*m->sq_length)(s);
1212 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001213 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001214 if (i1 < 0)
1215 i1 += l;
1216 if (i2 < 0)
1217 i2 += l;
1218 }
1219 }
1220 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001221 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1222 int res;
1223 PyObject *slice = sliceobj_from_intint(i1, i2);
1224 if (!slice)
1225 return -1;
1226 res = mp->mp_ass_subscript(s, slice, o);
1227 Py_DECREF(slice);
1228 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001229 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001230
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001231 type_error("object doesn't support slice assignment");
1232 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001233}
1234
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001235int
Fred Drake79912472000-07-09 04:06:11 +00001236PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001237{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001238 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001239
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 if (s == NULL) {
1241 null_error();
1242 return -1;
1243 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001244
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001245 m = s->ob_type->tp_as_sequence;
1246 if (m && m->sq_ass_slice) {
1247 if (i1 < 0 || i2 < 0) {
1248 if (m->sq_length) {
1249 int l = (*m->sq_length)(s);
1250 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001251 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001252 if (i1 < 0)
1253 i1 += l;
1254 if (i2 < 0)
1255 i2 += l;
1256 }
1257 }
1258 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1259 }
1260 type_error("object doesn't support slice deletion");
1261 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001262}
1263
Guido van Rossume15dee51995-07-18 14:12:02 +00001264PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001265PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001266{
Tim Peters6912d4d2001-05-05 03:56:37 +00001267 PyObject *it; /* iter(v) */
1268 int n; /* guess for result tuple size */
1269 PyObject *result;
1270 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001271
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001272 if (v == NULL)
1273 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001274
Tim Peters6912d4d2001-05-05 03:56:37 +00001275 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001276 if (PyTuple_CheckExact(v)) {
1277 /* Note that we can't know whether it's safe to return
1278 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001279 to exact tuples here. In contrast, lists always make
1280 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001281 Py_INCREF(v);
1282 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001283 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001284 if (PyList_Check(v))
1285 return PyList_AsTuple(v);
1286
Tim Peters6912d4d2001-05-05 03:56:37 +00001287 /* Get iterator. */
1288 it = PyObject_GetIter(v);
1289 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001290 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291
Tim Peters6912d4d2001-05-05 03:56:37 +00001292 /* Guess result size and allocate space. */
1293 n = PySequence_Size(v);
1294 if (n < 0) {
1295 PyErr_Clear();
1296 n = 10; /* arbitrary */
1297 }
1298 result = PyTuple_New(n);
1299 if (result == NULL)
1300 goto Fail;
1301
1302 /* Fill the tuple. */
1303 for (j = 0; ; ++j) {
1304 PyObject *item = PyIter_Next(it);
1305 if (item == NULL) {
1306 if (PyErr_Occurred())
1307 goto Fail;
1308 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001309 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001310 if (j >= n) {
1311 if (n < 500)
1312 n += 10;
1313 else
1314 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001315 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001316 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001317 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001318 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001319 }
1320 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321 }
1322
Tim Peters6912d4d2001-05-05 03:56:37 +00001323 /* Cut tuple back if guess was too large. */
1324 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001325 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001326 goto Fail;
1327
1328 Py_DECREF(it);
1329 return result;
1330
1331Fail:
1332 Py_XDECREF(result);
1333 Py_DECREF(it);
1334 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001335}
1336
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001337PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001338PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001339{
Tim Petersf553f892001-05-01 20:45:31 +00001340 PyObject *it; /* iter(v) */
1341 PyObject *result; /* result list */
1342 int n; /* guess for result list size */
1343 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001344
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001345 if (v == NULL)
1346 return null_error();
1347
Tim Petersf553f892001-05-01 20:45:31 +00001348 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001349 if (PyList_Check(v))
1350 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1351
Tim Petersf553f892001-05-01 20:45:31 +00001352 /* Get iterator. There may be some low-level efficiency to be gained
1353 * by caching the tp_iternext slot instead of using PyIter_Next()
1354 * later, but premature optimization is the root etc.
1355 */
1356 it = PyObject_GetIter(v);
1357 if (it == NULL)
1358 return NULL;
1359
1360 /* Guess a result list size. */
1361 n = -1; /* unknown */
1362 if (PySequence_Check(v) &&
1363 v->ob_type->tp_as_sequence->sq_length) {
1364 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001365 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001366 PyErr_Clear();
1367 }
1368 if (n < 0)
1369 n = 8; /* arbitrary */
1370 result = PyList_New(n);
1371 if (result == NULL) {
1372 Py_DECREF(it);
1373 return NULL;
1374 }
1375
1376 /* Run iterator to exhaustion. */
1377 for (i = 0; ; i++) {
1378 PyObject *item = PyIter_Next(it);
1379 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001380 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001381 Py_DECREF(result);
1382 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001383 }
Tim Petersf553f892001-05-01 20:45:31 +00001384 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001385 }
Tim Petersf553f892001-05-01 20:45:31 +00001386 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001387 PyList_SET_ITEM(result, i, item); /* steals ref */
1388 else {
1389 int status = PyList_Append(result, item);
1390 Py_DECREF(item); /* append creates a new ref */
1391 if (status < 0) {
1392 Py_DECREF(result);
1393 result = NULL;
1394 break;
1395 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001397 }
Tim Petersf553f892001-05-01 20:45:31 +00001398
1399 /* Cut back result list if initial guess was too large. */
1400 if (i < n && result != NULL) {
1401 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1402 Py_DECREF(result);
1403 result = NULL;
1404 }
1405 }
1406 Py_DECREF(it);
1407 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001408}
1409
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001410PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001411PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001412{
1413 if (v == NULL)
1414 return null_error();
1415
1416 if (PyList_Check(v) || PyTuple_Check(v)) {
1417 Py_INCREF(v);
1418 return v;
1419 }
1420
1421 v = PySequence_Tuple(v);
1422 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1423 return type_error(m);
1424
1425 return v;
1426}
1427
Tim Peters16a77ad2001-09-08 04:00:12 +00001428/* Iterate over seq. Result depends on the operation:
1429 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1430 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1431 set ValueError and return -1 if none found; also return -1 on error.
1432 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1433*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001434int
Tim Peters16a77ad2001-09-08 04:00:12 +00001435_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001436{
Tim Peters16a77ad2001-09-08 04:00:12 +00001437 int n;
1438 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1439 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001440
Tim Peters16a77ad2001-09-08 04:00:12 +00001441 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442 null_error();
1443 return -1;
1444 }
Tim Peters75f8e352001-05-05 11:33:43 +00001445
Tim Peters16a77ad2001-09-08 04:00:12 +00001446 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001447 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001448 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001449 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001450 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001451
Tim Peters16a77ad2001-09-08 04:00:12 +00001452 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001453 for (;;) {
1454 int cmp;
1455 PyObject *item = PyIter_Next(it);
1456 if (item == NULL) {
1457 if (PyErr_Occurred())
1458 goto Fail;
1459 break;
1460 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001461
1462 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001463 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001464 if (cmp < 0)
1465 goto Fail;
1466 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001467 switch (operation) {
1468 case PY_ITERSEARCH_COUNT:
1469 ++n;
1470 if (n <= 0) {
1471 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001472 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001473 goto Fail;
1474 }
1475 break;
1476
1477 case PY_ITERSEARCH_INDEX:
1478 if (wrapped) {
1479 PyErr_SetString(PyExc_OverflowError,
1480 "index exceeds C int size");
1481 goto Fail;
1482 }
1483 goto Done;
1484
1485 case PY_ITERSEARCH_CONTAINS:
1486 n = 1;
1487 goto Done;
1488
1489 default:
1490 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001491 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001492 }
1493
1494 if (operation == PY_ITERSEARCH_INDEX) {
1495 ++n;
1496 if (n <= 0)
1497 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001498 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001499 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001500
1501 if (operation != PY_ITERSEARCH_INDEX)
1502 goto Done;
1503
1504 PyErr_SetString(PyExc_ValueError,
1505 "sequence.index(x): x not in sequence");
1506 /* fall into failure code */
1507Fail:
1508 n = -1;
1509 /* fall through */
1510Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001511 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001512 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001513
Guido van Rossume15dee51995-07-18 14:12:02 +00001514}
1515
Tim Peters16a77ad2001-09-08 04:00:12 +00001516/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001517int
Tim Peters16a77ad2001-09-08 04:00:12 +00001518PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001519{
Tim Peters16a77ad2001-09-08 04:00:12 +00001520 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001521}
1522
Tim Peterscb8d3682001-05-05 21:05:01 +00001523/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001524 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001525 */
1526int
1527PySequence_Contains(PyObject *seq, PyObject *ob)
1528{
1529 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1530 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1531 if (sqm != NULL && sqm->sq_contains != NULL)
1532 return (*sqm->sq_contains)(seq, ob);
1533 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001534 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001535}
1536
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001537/* Backwards compatibility */
1538#undef PySequence_In
1539int
Fred Drake79912472000-07-09 04:06:11 +00001540PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001541{
1542 return PySequence_Contains(w, v);
1543}
1544
1545int
Fred Drake79912472000-07-09 04:06:11 +00001546PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001547{
Tim Peters16a77ad2001-09-08 04:00:12 +00001548 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001549}
1550
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001551/* Operations on mappings */
1552
1553int
Fred Drake79912472000-07-09 04:06:11 +00001554PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001555{
Guido van Rossum8700b422001-09-07 20:20:11 +00001556 return o && o->ob_type->tp_as_mapping &&
1557 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001558}
1559
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001560int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001561PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001562{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001563 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001564
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001565 if (o == NULL) {
1566 null_error();
1567 return -1;
1568 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001569
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001570 m = o->ob_type->tp_as_mapping;
1571 if (m && m->mp_length)
1572 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001573
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001574 type_error("len() of unsized object");
1575 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001576}
1577
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001578#undef PyMapping_Length
1579int
1580PyMapping_Length(PyObject *o)
1581{
1582 return PyMapping_Size(o);
1583}
1584#define PyMapping_Length PyMapping_Size
1585
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001586PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001587PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001588{
1589 PyObject *okey, *r;
1590
1591 if (key == NULL)
1592 return null_error();
1593
1594 okey = PyString_FromString(key);
1595 if (okey == NULL)
1596 return NULL;
1597 r = PyObject_GetItem(o, okey);
1598 Py_DECREF(okey);
1599 return r;
1600}
1601
1602int
Fred Drake79912472000-07-09 04:06:11 +00001603PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001604{
1605 PyObject *okey;
1606 int r;
1607
1608 if (key == NULL) {
1609 null_error();
1610 return -1;
1611 }
1612
1613 okey = PyString_FromString(key);
1614 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001615 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001616 r = PyObject_SetItem(o, okey, value);
1617 Py_DECREF(okey);
1618 return r;
1619}
1620
1621int
Fred Drake79912472000-07-09 04:06:11 +00001622PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001623{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001624 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001625
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001626 v = PyMapping_GetItemString(o, key);
1627 if (v) {
1628 Py_DECREF(v);
1629 return 1;
1630 }
1631 PyErr_Clear();
1632 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001633}
1634
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001635int
Fred Drake79912472000-07-09 04:06:11 +00001636PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001637{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001638 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001639
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001640 v = PyObject_GetItem(o, key);
1641 if (v) {
1642 Py_DECREF(v);
1643 return 1;
1644 }
1645 PyErr_Clear();
1646 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001647}
1648
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001649/* Operations on callable objects */
1650
1651/* XXX PyCallable_Check() is in object.c */
1652
Guido van Rossume15dee51995-07-18 14:12:02 +00001653PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001654PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001655{
Guido van Rossum5560b742001-09-14 16:47:50 +00001656 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001657}
Guido van Rossume15dee51995-07-18 14:12:02 +00001658
1659PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001660PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1661{
1662 ternaryfunc call;
1663
1664 if ((call = func->ob_type->tp_call) != NULL) {
1665 PyObject *result = (*call)(func, arg, kw);
1666 if (result == NULL && !PyErr_Occurred())
1667 PyErr_SetString(
1668 PyExc_SystemError,
1669 "NULL result without error in PyObject_Call");
1670 return result;
1671 }
Fred Drake573395a2001-11-01 20:26:12 +00001672 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1673 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001674 return NULL;
1675}
1676
1677PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001678PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001679{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001680 va_list va;
1681 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001682
Fred Drakeb92cf062001-10-27 06:16:31 +00001683 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001684 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001685
Fred Drakeb92cf062001-10-27 06:16:31 +00001686 if (format && *format) {
1687 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001688 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001689 va_end(va);
1690 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001691 else
1692 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001693
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001694 if (args == NULL)
1695 return NULL;
1696
1697 if (!PyTuple_Check(args)) {
1698 PyObject *a;
1699
1700 a = PyTuple_New(1);
1701 if (a == NULL)
1702 return NULL;
1703 if (PyTuple_SetItem(a, 0, args) < 0)
1704 return NULL;
1705 args = a;
1706 }
1707 retval = PyObject_CallObject(callable, args);
1708
1709 Py_DECREF(args);
1710
1711 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001712}
1713
1714PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001715PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001716{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001717 va_list va;
1718 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001719
Fred Drakeb92cf062001-10-27 06:16:31 +00001720 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001721 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001722
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001723 func = PyObject_GetAttrString(o, name);
1724 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001725 PyErr_SetString(PyExc_AttributeError, name);
1726 return 0;
1727 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001728
Fred Drakeb92cf062001-10-27 06:16:31 +00001729 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001730 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001731
Fred Drakeb92cf062001-10-27 06:16:31 +00001732 if (format && *format) {
1733 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001734 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001735 va_end(va);
1736 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001737 else
1738 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001739
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001740 if (!args)
1741 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001742
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001743 if (!PyTuple_Check(args)) {
1744 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001745
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001746 a = PyTuple_New(1);
1747 if (a == NULL)
1748 return NULL;
1749 if (PyTuple_SetItem(a, 0, args) < 0)
1750 return NULL;
1751 args = a;
1752 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001753
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001754 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001755
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001756 Py_DECREF(args);
1757 Py_DECREF(func);
1758
1759 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001760}
Guido van Rossum823649d2001-03-21 18:40:58 +00001761
1762
Fred Drakeb421b8c2001-10-26 16:21:32 +00001763static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001764objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001765{
1766 int i, n = 0;
1767 va_list countva;
1768 PyObject *result, *tmp;
1769
1770#ifdef VA_LIST_IS_ARRAY
1771 memcpy(countva, va, sizeof(va_list));
1772#else
1773 countva = va;
1774#endif
1775
1776 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1777 ++n;
1778 result = PyTuple_New(n);
1779 if (result != NULL && n > 0) {
1780 for (i = 0; i < n; ++i) {
1781 tmp = (PyObject *)va_arg(va, PyObject *);
1782 PyTuple_SET_ITEM(result, i, tmp);
1783 Py_INCREF(tmp);
1784 }
1785 }
1786 return result;
1787}
1788
1789PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001790PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001791{
1792 PyObject *args, *tmp;
1793 va_list vargs;
1794
1795 if (callable == NULL || name == NULL)
1796 return null_error();
1797
1798 callable = PyObject_GetAttr(callable, name);
1799 if (callable == NULL)
1800 return NULL;
1801
1802 /* count the args */
1803 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001804 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001805 va_end(vargs);
1806 if (args == NULL) {
1807 Py_DECREF(callable);
1808 return NULL;
1809 }
1810 tmp = PyObject_Call(callable, args, NULL);
1811 Py_DECREF(args);
1812 Py_DECREF(callable);
1813
1814 return tmp;
1815}
1816
1817PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001818PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001819{
1820 PyObject *args, *tmp;
1821 va_list vargs;
1822
1823 if (callable == NULL)
1824 return null_error();
1825
1826 /* count the args */
1827 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001828 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001829 va_end(vargs);
1830 if (args == NULL)
1831 return NULL;
1832 tmp = PyObject_Call(callable, args, NULL);
1833 Py_DECREF(args);
1834
1835 return tmp;
1836}
1837
1838
Guido van Rossum823649d2001-03-21 18:40:58 +00001839/* isinstance(), issubclass() */
1840
Neil Schemenauer6b471292001-10-18 03:18:43 +00001841static PyObject *
1842abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001843{
1844 static PyObject *__bases__ = NULL;
1845 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001846
1847 if (__bases__ == NULL) {
1848 __bases__ = PyString_FromString("__bases__");
1849 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001850 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001851 }
1852
Neil Schemenauer6b471292001-10-18 03:18:43 +00001853 bases = PyObject_GetAttr(cls, __bases__);
1854 if (bases == NULL || !PyTuple_Check(bases)) {
1855 Py_XDECREF(bases);
1856 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001857 }
1858
Neil Schemenauer6b471292001-10-18 03:18:43 +00001859 return bases;
1860}
1861
1862
1863static int
1864abstract_issubclass(PyObject *derived, PyObject *cls)
1865{
1866 PyObject *bases;
1867 int i, n;
1868 int r = 0;
1869
1870
Guido van Rossum823649d2001-03-21 18:40:58 +00001871 if (derived == cls)
1872 return 1;
1873
Neil Schemenauer6b471292001-10-18 03:18:43 +00001874 bases = abstract_get_bases(derived);
1875 if (bases == NULL)
1876 return 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001877
1878 n = PyTuple_GET_SIZE(bases);
1879 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001880 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001881 if (r != 0)
1882 break;
1883 }
1884
1885 Py_DECREF(bases);
1886
1887 return r;
1888}
1889
1890int
1891PyObject_IsInstance(PyObject *inst, PyObject *cls)
1892{
1893 PyObject *icls;
1894 static PyObject *__class__ = NULL;
1895 int retval = 0;
1896
Neil Schemenauer6b471292001-10-18 03:18:43 +00001897 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1898 PyObject *inclass =
1899 (PyObject*)((PyInstanceObject*)inst)->in_class;
1900 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001901 }
1902 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001903 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001904 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001905 else if (PyTuple_Check(cls)) {
1906 /* Not a general sequence -- that opens up the road to
1907 recursion and stack overflow. */
1908 int i, n;
1909
1910 n = PyTuple_GET_SIZE(cls);
1911 for (i = 0; i < n; i++) {
1912 retval = PyObject_IsInstance(
1913 inst, PyTuple_GET_ITEM(cls, i));
1914 if (retval != 0)
1915 break;
1916 }
1917 return retval;
1918 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001919 else {
1920 PyObject *cls_bases = abstract_get_bases(cls);
1921 if (cls_bases == NULL) {
1922 PyErr_SetString(PyExc_TypeError,
1923 "isinstance() arg 2 must be a class or type");
1924 return -1;
1925 }
1926 Py_DECREF(cls_bases);
Guido van Rossum823649d2001-03-21 18:40:58 +00001927 if (__class__ == NULL) {
1928 __class__ = PyString_FromString("__class__");
1929 if (__class__ == NULL)
1930 return -1;
1931 }
1932 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001933 if (icls == NULL) {
1934 PyErr_Clear();
1935 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001936 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001937 else {
1938 retval = abstract_issubclass(icls, cls);
1939 Py_DECREF(icls);
1940 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001941 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001942
Guido van Rossum823649d2001-03-21 18:40:58 +00001943 return retval;
1944}
1945
1946int
1947PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1948{
1949 int retval;
1950
1951 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001952 PyObject *derived_bases;
1953 PyObject *cls_bases;
1954
1955 derived_bases = abstract_get_bases(derived);
1956 if (derived_bases == NULL) {
1957 PyErr_SetString(PyExc_TypeError,
1958 "issubclass() arg 1 must be a class");
1959 return -1;
1960 }
1961 Py_DECREF(derived_bases);
1962
1963 cls_bases = abstract_get_bases(cls);
1964 if (cls_bases == NULL) {
1965 PyErr_SetString(PyExc_TypeError,
1966 "issubclass() arg 2 must be a class");
1967 return -1;
1968 }
1969 Py_DECREF(cls_bases);
1970
1971 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001972 }
1973 else {
1974 /* shortcut */
1975 if (!(retval = (derived == cls)))
1976 retval = PyClass_IsSubclass(derived, cls);
1977 }
1978
1979 return retval;
1980}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001981
1982PyObject *
1983PyObject_GetIter(PyObject *o)
1984{
1985 PyTypeObject *t = o->ob_type;
1986 getiterfunc f = NULL;
1987 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
1988 f = t->tp_iter;
1989 if (f == NULL) {
1990 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00001991 return PySeqIter_New(o);
Jeremy Hylton89c3a222001-11-09 21:59:42 +00001992 PyErr_SetString(PyExc_TypeError,
1993 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001994 return NULL;
1995 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00001996 else {
1997 PyObject *res = (*f)(o);
1998 if (res != NULL && !PyIter_Check(res)) {
1999 PyErr_Format(PyExc_TypeError,
2000 "iter() returned non-iterator "
2001 "of type '%.100s'",
2002 res->ob_type->tp_name);
2003 Py_DECREF(res);
2004 res = NULL;
2005 }
2006 return res;
2007 }
2008}
2009
Tim Petersf4848da2001-05-05 00:14:56 +00002010/* Return next item.
2011 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2012 * If the iteration terminates normally, return NULL and clear the
2013 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2014 * will be false.
2015 * Else return the next object. PyErr_Occurred() will be false.
2016 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002017PyObject *
2018PyIter_Next(PyObject *iter)
2019{
Tim Petersf4848da2001-05-05 00:14:56 +00002020 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002021 if (!PyIter_Check(iter)) {
2022 PyErr_Format(PyExc_TypeError,
2023 "'%.100s' object is not an iterator",
2024 iter->ob_type->tp_name);
2025 return NULL;
2026 }
Tim Petersf4848da2001-05-05 00:14:56 +00002027 result = (*iter->ob_type->tp_iternext)(iter);
2028 if (result == NULL &&
2029 PyErr_Occurred() &&
2030 PyErr_ExceptionMatches(PyExc_StopIteration))
2031 PyErr_Clear();
2032 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002033}
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002034