blob: 0856f19676c365babca046014541640d3d24eaa6 [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 Rossum21308241998-08-13 16:44:44 +0000106 return type_error("sequence index must be integer");
107 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000108
109 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000110}
111
112int
Fred Drake79912472000-07-09 04:06:11 +0000113PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000114{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000117 if (o == NULL || key == NULL || value == NULL) {
118 null_error();
119 return -1;
120 }
121 m = o->ob_type->tp_as_mapping;
122 if (m && m->mp_ass_subscript)
123 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000124
Guido van Rossum21308241998-08-13 16:44:44 +0000125 if (o->ob_type->tp_as_sequence) {
126 if (PyInt_Check(key))
127 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000128 else if (PyLong_Check(key)) {
129 long key_value = PyLong_AsLong(key);
130 if (key_value == -1 && PyErr_Occurred())
131 return -1;
132 return PySequence_SetItem(o, key_value, value);
133 }
Guido van Rossum21308241998-08-13 16:44:44 +0000134 type_error("sequence index must be integer");
135 return -1;
136 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000137
138 type_error("object does not support item assignment");
139 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000140}
141
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000142int
Fred Drake79912472000-07-09 04:06:11 +0000143PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000144{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000145 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000146
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000147 if (o == NULL || key == NULL) {
148 null_error();
149 return -1;
150 }
151 m = o->ob_type->tp_as_mapping;
152 if (m && m->mp_ass_subscript)
153 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000154
Guido van Rossum21308241998-08-13 16:44:44 +0000155 if (o->ob_type->tp_as_sequence) {
156 if (PyInt_Check(key))
157 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000158 else if (PyLong_Check(key)) {
159 long key_value = PyLong_AsLong(key);
160 if (key_value == -1 && PyErr_Occurred())
161 return -1;
162 return PySequence_DelItem(o, key_value);
163 }
Guido van Rossum21308241998-08-13 16:44:44 +0000164 type_error("sequence index must be integer");
165 return -1;
166 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000167
168 type_error("object does not support item deletion");
169 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000170}
171
Guido van Rossum4c08d552000-03-10 22:55:18 +0000172int PyObject_AsCharBuffer(PyObject *obj,
173 const char **buffer,
174 int *buffer_len)
175{
176 PyBufferProcs *pb;
177 const char *pp;
178 int len;
179
180 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
181 null_error();
182 return -1;
183 }
184 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000185 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000186 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000187 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000188 PyErr_SetString(PyExc_TypeError,
189 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000190 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000191 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000192 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000193 PyErr_SetString(PyExc_TypeError,
194 "expected a single-segment 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 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000198 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000199 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000200 *buffer = pp;
201 *buffer_len = len;
202 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000203}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000204
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000205int
206PyObject_CheckReadBuffer(PyObject *obj)
207{
208 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
209
210 if (pb == NULL ||
211 pb->bf_getreadbuffer == NULL ||
212 pb->bf_getsegcount == NULL ||
213 (*pb->bf_getsegcount)(obj, NULL) != 1)
214 return 0;
215 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000216}
217
218int PyObject_AsReadBuffer(PyObject *obj,
219 const void **buffer,
220 int *buffer_len)
221{
222 PyBufferProcs *pb;
223 void *pp;
224 int len;
225
226 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
227 null_error();
228 return -1;
229 }
230 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000231 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000232 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000233 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000234 PyErr_SetString(PyExc_TypeError,
235 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000236 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000237 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000238 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239 PyErr_SetString(PyExc_TypeError,
240 "expected a single-segment 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 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000244 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000245 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246 *buffer = pp;
247 *buffer_len = len;
248 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000249}
250
251int PyObject_AsWriteBuffer(PyObject *obj,
252 void **buffer,
253 int *buffer_len)
254{
255 PyBufferProcs *pb;
256 void*pp;
257 int len;
258
259 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
260 null_error();
261 return -1;
262 }
263 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000266 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267 PyErr_SetString(PyExc_TypeError,
268 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000269 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000270 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000271 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000272 PyErr_SetString(PyExc_TypeError,
273 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000274 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000275 }
276 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
277 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000278 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000279 *buffer = pp;
280 *buffer_len = len;
281 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000282}
283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000284/* Operations on numbers */
285
286int
Fred Drake79912472000-07-09 04:06:11 +0000287PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000288{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000289 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000290}
291
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000292/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000293
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000294/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000295
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000296#define NB_SLOT(x) offsetof(PyNumberMethods, x)
297#define NB_BINOP(nb_methods, slot) \
298 ((binaryfunc*)(& ((char*)nb_methods)[slot] ))
299#define NB_TERNOP(nb_methods, slot) \
300 ((ternaryfunc*)(& ((char*)nb_methods)[slot] ))
301
302/*
303 Calling scheme used for binary operations:
304
305 v w Action
306 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000307 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000308 new old v.op(v,w), coerce(v,w), v.op(v,w)
309 old new w.op(v,w), coerce(v,w), v.op(v,w)
310 old old coerce(v,w), v.op(v,w)
311
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000312 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
313 v->ob_type
314
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000315 Legend:
316 -------
317 * new == new style number
318 * old == old style number
319 * Action indicates the order in which operations are tried until either
320 a valid result is produced or an error occurs.
321
322 */
323
324static PyObject *
325binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000326{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000327 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000328 binaryfunc slotv = NULL;
329 binaryfunc slotw = NULL;
330
331 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
332 slotv = *NB_BINOP(v->ob_type->tp_as_number, op_slot);
333 if (w->ob_type != v->ob_type &&
334 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
335 slotw = *NB_BINOP(w->ob_type->tp_as_number, op_slot);
336 if (slotw == slotv)
337 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000338 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000339 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000340 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
341 x = slotw(v, w);
342 if (x != Py_NotImplemented)
343 return x;
344 Py_DECREF(x); /* can't do it */
345 slotw = NULL;
346 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000347 x = slotv(v, w);
348 if (x != Py_NotImplemented)
349 return x;
350 Py_DECREF(x); /* can't do it */
351 }
352 if (slotw) {
353 x = slotw(v, w);
354 if (x != Py_NotImplemented)
355 return x;
356 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000357 }
358 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
359 int err = PyNumber_CoerceEx(&v, &w);
360 if (err < 0) {
361 return NULL;
362 }
363 if (err == 0) {
364 PyNumberMethods *mv = v->ob_type->tp_as_number;
365 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000366 binaryfunc slot;
367 slot = *NB_BINOP(mv, op_slot);
368 if (slot) {
369 PyObject *x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000370 Py_DECREF(v);
371 Py_DECREF(w);
372 return x;
373 }
374 }
375 /* CoerceEx incremented the reference counts */
376 Py_DECREF(v);
377 Py_DECREF(w);
378 }
379 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000380 Py_INCREF(Py_NotImplemented);
381 return Py_NotImplemented;
382}
383
384static PyObject *
385binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
386{
387 PyObject *result = binary_op1(v, w, op_slot);
388 if (result == Py_NotImplemented) {
389 Py_DECREF(Py_NotImplemented);
Guido van Rossum5c66a262001-10-22 04:12:44 +0000390 PyErr_Format(
391 PyExc_TypeError,
392 "unsupported operand type(s) for %s: '%s' and '%s'",
393 op_name,
394 v->ob_type->tp_name,
395 w->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000396 return NULL;
397 }
398 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000399}
400
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000401
402/*
403 Calling scheme used for ternary operations:
404
Guido van Rossum84675ac2001-09-29 01:05:03 +0000405 *** In some cases, w.op is called before v.op; see binary_op1. ***
406
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000407 v w z Action
408 -------------------------------------------------------------------
409 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
410 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
411 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
412 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
413 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
414 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
415 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
416 old old old coerce(v,w,z), v.op(v,w,z)
417
418 Legend:
419 -------
420 * new == new style number
421 * old == old style number
422 * Action indicates the order in which operations are tried until either
423 a valid result is produced or an error occurs.
424 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
425 only if z != Py_None; if z == Py_None, then it is treated as absent
426 variable and only coerce(v,w) is tried.
427
428 */
429
430static PyObject *
431ternary_op(PyObject *v,
432 PyObject *w,
433 PyObject *z,
434 const int op_slot,
435 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000436{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000437 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000438 PyObject *x = NULL;
439 ternaryfunc slotv = NULL;
440 ternaryfunc slotw = NULL;
441 ternaryfunc slotz = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000442
443 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000444 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000445 if (mv != NULL && NEW_STYLE_NUMBER(v))
446 slotv = *NB_TERNOP(mv, op_slot);
447 if (w->ob_type != v->ob_type &&
448 mv != NULL && NEW_STYLE_NUMBER(w)) {
449 slotw = *NB_TERNOP(mw, op_slot);
450 if (slotw == slotv)
451 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000452 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000453 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000454 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
455 x = slotw(v, w, z);
456 if (x != Py_NotImplemented)
457 return x;
458 Py_DECREF(x); /* can't do it */
459 slotw = NULL;
460 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000461 x = slotv(v, w, z);
462 if (x != Py_NotImplemented)
463 return x;
464 Py_DECREF(x); /* can't do it */
465 }
466 if (slotw) {
467 x = slotw(v, w, z);
468 if (x != Py_NotImplemented)
469 return x;
470 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000471 }
472 mz = z->ob_type->tp_as_number;
473 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000474 slotz = *NB_TERNOP(mz, op_slot);
475 if (slotz == slotv || slotz == slotw)
476 slotz = NULL;
477 if (slotz) {
478 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000479 if (x != Py_NotImplemented)
480 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000481 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000482 }
483 }
484
485 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
486 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
487 /* we have an old style operand, coerce */
488 PyObject *v1, *z1, *w2, *z2;
489 int c;
490
491 c = PyNumber_Coerce(&v, &w);
492 if (c != 0)
493 goto error3;
494
495 /* Special case: if the third argument is None, it is
496 treated as absent argument and not coerced. */
497 if (z == Py_None) {
498 if (v->ob_type->tp_as_number) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000499 slotz = *NB_TERNOP(v->ob_type->tp_as_number,
500 op_slot);
501 if (slotz)
502 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000503 else
504 c = -1;
505 }
506 else
507 c = -1;
508 goto error2;
509 }
510 v1 = v;
511 z1 = z;
512 c = PyNumber_Coerce(&v1, &z1);
513 if (c != 0)
514 goto error2;
515 w2 = w;
516 z2 = z1;
517 c = PyNumber_Coerce(&w2, &z2);
518 if (c != 0)
519 goto error1;
520
521 if (v1->ob_type->tp_as_number != NULL) {
Guido van Rossum84675ac2001-09-29 01:05:03 +0000522 slotv = *NB_TERNOP(v1->ob_type->tp_as_number,
523 op_slot);
524 if (slotv)
525 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000526 else
527 c = -1;
528 }
529 else
530 c = -1;
531
532 Py_DECREF(w2);
533 Py_DECREF(z2);
534 error1:
535 Py_DECREF(v1);
536 Py_DECREF(z1);
537 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000538 Py_DECREF(v);
539 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000540 error3:
541 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000542 return x;
543 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000544
545 if (z == Py_None)
546 PyErr_Format(
547 PyExc_TypeError,
548 "unsupported operand type(s) for ** or pow(): "
549 "'%s' and '%s'",
550 v->ob_type->tp_name,
551 w->ob_type->tp_name);
552 else
553 PyErr_Format(
554 PyExc_TypeError,
555 "unsupported operand type(s) for pow(): "
556 "'%s', '%s', '%s'",
557 v->ob_type->tp_name,
558 w->ob_type->tp_name,
559 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000560 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000561}
562
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000563#define BINARY_FUNC(func, op, op_name) \
564 PyObject * \
565 func(PyObject *v, PyObject *w) { \
566 return binary_op(v, w, NB_SLOT(op), op_name); \
567 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000568
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000569BINARY_FUNC(PyNumber_Or, nb_or, "|")
570BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
571BINARY_FUNC(PyNumber_And, nb_and, "&")
572BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
573BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
574BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
575BINARY_FUNC(PyNumber_Multiply, nb_multiply, "*")
576BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
577BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000578
579PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000580PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000581{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000582 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
583 if (result == Py_NotImplemented) {
584 PySequenceMethods *m = v->ob_type->tp_as_sequence;
585 Py_DECREF(Py_NotImplemented);
586 if (m && m->sq_concat) {
587 result = (*m->sq_concat)(v, w);
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000588 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000589 else {
Guido van Rossum5c66a262001-10-22 04:12:44 +0000590 PyErr_Format(
591 PyExc_TypeError,
592 "unsupported operand types for +: '%s' and '%s'",
593 v->ob_type->tp_name,
594 w->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000595 result = NULL;
596 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000597 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000598 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000599}
600
601PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000602PyNumber_FloorDivide(PyObject *v, PyObject *w)
603{
604 /* XXX tp_flags test */
605 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
606}
607
608PyObject *
609PyNumber_TrueDivide(PyObject *v, PyObject *w)
610{
611 /* XXX tp_flags test */
612 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
613}
614
615PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000616PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000617{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000618 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000619 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000620#ifdef Py_USING_UNICODE
Guido van Rossum4c08d552000-03-10 22:55:18 +0000621 else if (PyUnicode_Check(v))
622 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000623#endif
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000624 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000625}
626
627PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000628PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000629{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000630 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000631}
632
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000633/* Binary in-place operators */
634
635/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000636 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000637
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000638 - If the left hand object has the appropriate struct members, and
639 they are filled, call the appropriate function and return the
640 result. No coercion is done on the arguments; the left-hand object
641 is the one the operation is performed on, and it's up to the
642 function to deal with the right-hand object.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000643
644 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000645 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000646
647 */
648
649#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
650
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000651static PyObject *
652binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
653 const char *op_name)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000654{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000655 PyNumberMethods *mv = v->ob_type->tp_as_number;
656 if (mv != NULL && HASINPLACE(v)) {
657 binaryfunc *slot = NB_BINOP(mv, iop_slot);
658 if (*slot) {
659 PyObject *x = (*slot)(v, w);
660 if (x != Py_NotImplemented) {
661 return x;
662 }
663 Py_DECREF(x);
664 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000665 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000666 return binary_op(v, w, op_slot, op_name);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000667}
668
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000669#define INPLACE_BINOP(func, iop, op, op_name) \
670 PyObject * \
671 func(PyObject *v, PyObject *w) { \
672 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000673 }
674
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000675INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
676INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
677INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
678INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
679INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
680INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
681INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000682
683PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000684PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
685{
686 /* XXX tp_flags test */
687 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
688 NB_SLOT(nb_floor_divide), "//=");
689}
690
691PyObject *
692PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
693{
694 /* XXX tp_flags test */
695 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
696 NB_SLOT(nb_true_divide), "/=");
697}
698
699PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000700PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
701{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000702 binaryfunc f = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000703
Guido van Rossumbb8be932000-09-01 23:27:32 +0000704 if (v->ob_type->tp_as_sequence != NULL) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000705 if (HASINPLACE(v))
706 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
707 if (f == NULL)
708 f = v->ob_type->tp_as_sequence->sq_concat;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000709 if (f != NULL)
710 return (*f)(v, w);
711 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000712 return binary_iop(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add), "+=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000713}
714
715PyObject *
716PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
717{
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000718 PyObject * (*g)(PyObject *, int) = NULL;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000719 if (HASINPLACE(v) && v->ob_type->tp_as_sequence &&
720 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat)) {
721 long n;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000722 if (PyInt_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000723 n = PyInt_AsLong(w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000724 }
725 else if (PyLong_Check(w)) {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726 n = PyLong_AsLong(w);
727 if (n == -1 && PyErr_Occurred())
728 return NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729 }
730 else {
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000731 return type_error("can't multiply sequence to non-int");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000732 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000733 return (*g)(v, (int)n);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000734 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000735 return binary_iop(v, w, NB_SLOT(nb_inplace_multiply),
736 NB_SLOT(nb_multiply), "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000737}
738
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000739
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000740
741PyObject *
742PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
743{
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000744 if (PyString_Check(v))
745 return PyString_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000746#ifdef Py_USING_UNICODE
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000747 else if (PyUnicode_Check(v))
748 return PyUnicode_Format(v, w);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000749#endif
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000750 else
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000751 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
752 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000753}
754
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000755
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000756PyObject *
757PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
758{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000759 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
760 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
761 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000762 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000763 else {
764 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
765 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000766}
767
768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000769/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000770
771PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000772PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000773{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000774 PyNumberMethods *m;
775
776 if (o == NULL)
777 return null_error();
778 m = o->ob_type->tp_as_number;
779 if (m && m->nb_negative)
780 return (*m->nb_negative)(o);
781
782 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000783}
784
785PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000786PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000787{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000788 PyNumberMethods *m;
789
790 if (o == NULL)
791 return null_error();
792 m = o->ob_type->tp_as_number;
793 if (m && m->nb_positive)
794 return (*m->nb_positive)(o);
795
796 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000797}
798
799PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000800PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000801{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000802 PyNumberMethods *m;
803
804 if (o == NULL)
805 return null_error();
806 m = o->ob_type->tp_as_number;
807 if (m && m->nb_invert)
808 return (*m->nb_invert)(o);
809
810 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000811}
812
813PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000814PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000815{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000816 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000817
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000818 if (o == NULL)
819 return null_error();
820 m = o->ob_type->tp_as_number;
821 if (m && m->nb_absolute)
822 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000823
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000824 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000825}
826
Guido van Rossum9e896b32000-04-05 20:11:21 +0000827/* Add a check for embedded NULL-bytes in the argument. */
828static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000829int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000830{
831 char *end;
832 PyObject *x;
833
834 x = PyInt_FromString((char*)s, &end, 10);
835 if (x == NULL)
836 return NULL;
837 if (end != s + len) {
838 PyErr_SetString(PyExc_ValueError,
839 "null byte in argument for int()");
840 Py_DECREF(x);
841 return NULL;
842 }
843 return x;
844}
845
Guido van Rossume15dee51995-07-18 14:12:02 +0000846PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000847PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000848{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000849 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000850 const char *buffer;
851 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000852
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000853 if (o == NULL)
854 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000855 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000856 Py_INCREF(o);
857 return o;
858 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000859 if (PyInt_Check(o)) {
860 PyIntObject *io = (PyIntObject*)o;
861 return PyInt_FromLong(io->ob_ival);
862 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000864 return int_from_string(PyString_AS_STRING(o),
865 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000866#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000867 if (PyUnicode_Check(o))
868 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
869 PyUnicode_GET_SIZE(o),
870 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000871#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000872 m = o->ob_type->tp_as_number;
873 if (m && m->nb_int)
874 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000875 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000876 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000877
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000878 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000879}
880
Guido van Rossum9e896b32000-04-05 20:11:21 +0000881/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000882static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000883long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000884{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000885 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000886 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000887
Guido van Rossum4c08d552000-03-10 22:55:18 +0000888 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000889 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000890 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000891 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000892 PyErr_SetString(PyExc_ValueError,
893 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000894 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000895 return NULL;
896 }
897 return x;
898}
899
Guido van Rossume15dee51995-07-18 14:12:02 +0000900PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000901PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000902{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000903 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000904 const char *buffer;
905 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000906
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000907 if (o == NULL)
908 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000909 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000910 Py_INCREF(o);
911 return o;
912 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000913 if (PyLong_Check(o))
914 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000915 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000916 /* need to do extra error checking that PyLong_FromString()
917 * doesn't do. In particular long('9.5') must raise an
918 * exception, not truncate the float.
919 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000920 return long_from_string(PyString_AS_STRING(o),
921 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000922#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000923 if (PyUnicode_Check(o))
924 /* The above check is done in PyLong_FromUnicode(). */
925 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
926 PyUnicode_GET_SIZE(o),
927 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000928#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000929 m = o->ob_type->tp_as_number;
930 if (m && m->nb_long)
931 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000932 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
933 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000934
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000936}
937
938PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000939PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000940{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000941 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000942
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000943 if (o == NULL)
944 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +0000945 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000946 Py_INCREF(o);
947 return o;
948 }
Tim Peters7a50f252001-09-10 21:28:20 +0000949 if (PyFloat_Check(o)) {
950 PyFloatObject *po = (PyFloatObject *)o;
951 return PyFloat_FromDouble(po->ob_fval);
952 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000953 if (!PyString_Check(o)) {
954 m = o->ob_type->tp_as_number;
955 if (m && m->nb_float)
956 return m->nb_float(o);
957 }
958 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000959}
960
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000961/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000962
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000963int
Fred Drake79912472000-07-09 04:06:11 +0000964PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000965{
Guido van Rossum8700b422001-09-07 20:20:11 +0000966 return s != NULL && s->ob_type->tp_as_sequence &&
967 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000968}
969
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000970int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000971PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000972{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000973 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000974
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975 if (s == NULL) {
976 null_error();
977 return -1;
978 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000979
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000980 m = s->ob_type->tp_as_sequence;
981 if (m && m->sq_length)
982 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000983
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000984 type_error("len() of unsized object");
985 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000986}
987
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000988#undef PySequence_Length
989int
990PySequence_Length(PyObject *s)
991{
992 return PySequence_Size(s);
993}
994#define PySequence_Length PySequence_Size
995
Guido van Rossume15dee51995-07-18 14:12:02 +0000996PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000997PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000998{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000999 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001000
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001 if (s == NULL || o == NULL)
1002 return null_error();
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_concat)
1006 return m->sq_concat(s, o);
1007
1008 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001009}
1010
1011PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001012PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001013{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001014 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001015
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001016 if (o == NULL)
1017 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001018
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001019 m = o->ob_type->tp_as_sequence;
1020 if (m && m->sq_repeat)
1021 return m->sq_repeat(o, count);
1022
1023 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001024}
1025
1026PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001027PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1028{
1029 PySequenceMethods *m;
1030
1031 if (s == NULL || o == NULL)
1032 return null_error();
1033
1034 m = s->ob_type->tp_as_sequence;
1035 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1036 return m->sq_inplace_concat(s, o);
1037 if (m && m->sq_concat)
1038 return m->sq_concat(s, o);
1039
1040 return type_error("object can't be concatenated");
1041}
1042
1043PyObject *
1044PySequence_InPlaceRepeat(PyObject *o, int count)
1045{
1046 PySequenceMethods *m;
1047
1048 if (o == NULL)
1049 return null_error();
1050
1051 m = o->ob_type->tp_as_sequence;
1052 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1053 return m->sq_inplace_repeat(o, count);
1054 if (m && m->sq_repeat)
1055 return m->sq_repeat(o, count);
1056
1057 return type_error("object can't be repeated");
1058}
1059
1060PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001061PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001065 if (s == NULL)
1066 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001067
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001068 m = s->ob_type->tp_as_sequence;
1069 if (m && m->sq_item) {
1070 if (i < 0) {
1071 if (m->sq_length) {
1072 int l = (*m->sq_length)(s);
1073 if (l < 0)
1074 return NULL;
1075 i += l;
1076 }
1077 }
1078 return m->sq_item(s, i);
1079 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001080
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001081 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001082}
1083
Thomas Wouters1d75a792000-08-17 22:37:32 +00001084static PyObject *
1085sliceobj_from_intint(int i, int j)
1086{
1087 PyObject *start, *end, *slice;
1088 start = PyInt_FromLong((long)i);
1089 if (!start)
1090 return NULL;
1091 end = PyInt_FromLong((long)j);
1092 if (!end) {
1093 Py_DECREF(start);
1094 return NULL;
1095 }
1096 slice = PySlice_New(start, end, NULL);
1097 Py_DECREF(start);
1098 Py_DECREF(end);
1099 return slice;
1100}
1101
Guido van Rossume15dee51995-07-18 14:12:02 +00001102PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001103PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001104{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001105 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001106 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001107
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001109
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001110 m = s->ob_type->tp_as_sequence;
1111 if (m && m->sq_slice) {
1112 if (i1 < 0 || i2 < 0) {
1113 if (m->sq_length) {
1114 int l = (*m->sq_length)(s);
1115 if (l < 0)
1116 return NULL;
1117 if (i1 < 0)
1118 i1 += l;
1119 if (i2 < 0)
1120 i2 += l;
1121 }
1122 }
1123 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001124 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1125 PyObject *res;
1126 PyObject *slice = sliceobj_from_intint(i1, i2);
1127 if (!slice)
1128 return NULL;
1129 res = mp->mp_subscript(s, slice);
1130 Py_DECREF(slice);
1131 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001134 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001135}
1136
1137int
Fred Drake79912472000-07-09 04:06:11 +00001138PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001139{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001140 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001141
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001142 if (s == NULL) {
1143 null_error();
1144 return -1;
1145 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001146
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001147 m = s->ob_type->tp_as_sequence;
1148 if (m && m->sq_ass_item) {
1149 if (i < 0) {
1150 if (m->sq_length) {
1151 int l = (*m->sq_length)(s);
1152 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001153 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154 i += l;
1155 }
1156 }
1157 return m->sq_ass_item(s, i, o);
1158 }
1159
1160 type_error("object doesn't support item assignment");
1161 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001162}
1163
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001164int
Fred Drake79912472000-07-09 04:06:11 +00001165PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001166{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001167 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001168
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001169 if (s == NULL) {
1170 null_error();
1171 return -1;
1172 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001173
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174 m = s->ob_type->tp_as_sequence;
1175 if (m && m->sq_ass_item) {
1176 if (i < 0) {
1177 if (m->sq_length) {
1178 int l = (*m->sq_length)(s);
1179 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001180 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001181 i += l;
1182 }
1183 }
1184 return m->sq_ass_item(s, i, (PyObject *)NULL);
1185 }
1186
1187 type_error("object doesn't support item deletion");
1188 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001189}
1190
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001191int
Fred Drake79912472000-07-09 04:06:11 +00001192PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001193{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001194 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001195 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001196
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197 if (s == NULL) {
1198 null_error();
1199 return -1;
1200 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001201
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 m = s->ob_type->tp_as_sequence;
1203 if (m && m->sq_ass_slice) {
1204 if (i1 < 0 || i2 < 0) {
1205 if (m->sq_length) {
1206 int l = (*m->sq_length)(s);
1207 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001208 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001209 if (i1 < 0)
1210 i1 += l;
1211 if (i2 < 0)
1212 i2 += l;
1213 }
1214 }
1215 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001216 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1217 int res;
1218 PyObject *slice = sliceobj_from_intint(i1, i2);
1219 if (!slice)
1220 return -1;
1221 res = mp->mp_ass_subscript(s, slice, o);
1222 Py_DECREF(slice);
1223 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001224 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001225
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226 type_error("object doesn't support slice assignment");
1227 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001228}
1229
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230int
Fred Drake79912472000-07-09 04:06:11 +00001231PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001232{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001233 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001234
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001235 if (s == NULL) {
1236 null_error();
1237 return -1;
1238 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001239
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 m = s->ob_type->tp_as_sequence;
1241 if (m && m->sq_ass_slice) {
1242 if (i1 < 0 || i2 < 0) {
1243 if (m->sq_length) {
1244 int l = (*m->sq_length)(s);
1245 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001246 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 if (i1 < 0)
1248 i1 += l;
1249 if (i2 < 0)
1250 i2 += l;
1251 }
1252 }
1253 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1254 }
1255 type_error("object doesn't support slice deletion");
1256 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001257}
1258
Guido van Rossume15dee51995-07-18 14:12:02 +00001259PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001260PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001261{
Tim Peters6912d4d2001-05-05 03:56:37 +00001262 PyObject *it; /* iter(v) */
1263 int n; /* guess for result tuple size */
1264 PyObject *result;
1265 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001266
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 if (v == NULL)
1268 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001269
Tim Peters6912d4d2001-05-05 03:56:37 +00001270 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001271 if (PyTuple_CheckExact(v)) {
1272 /* Note that we can't know whether it's safe to return
1273 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001274 to exact tuples here. In contrast, lists always make
1275 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001276 Py_INCREF(v);
1277 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001278 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279 if (PyList_Check(v))
1280 return PyList_AsTuple(v);
1281
Tim Peters6912d4d2001-05-05 03:56:37 +00001282 /* Get iterator. */
1283 it = PyObject_GetIter(v);
1284 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001285 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001286
Tim Peters6912d4d2001-05-05 03:56:37 +00001287 /* Guess result size and allocate space. */
1288 n = PySequence_Size(v);
1289 if (n < 0) {
1290 PyErr_Clear();
1291 n = 10; /* arbitrary */
1292 }
1293 result = PyTuple_New(n);
1294 if (result == NULL)
1295 goto Fail;
1296
1297 /* Fill the tuple. */
1298 for (j = 0; ; ++j) {
1299 PyObject *item = PyIter_Next(it);
1300 if (item == NULL) {
1301 if (PyErr_Occurred())
1302 goto Fail;
1303 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001305 if (j >= n) {
1306 if (n < 500)
1307 n += 10;
1308 else
1309 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001310 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001311 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001312 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001313 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001314 }
1315 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001316 }
1317
Tim Peters6912d4d2001-05-05 03:56:37 +00001318 /* Cut tuple back if guess was too large. */
1319 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001320 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001321 goto Fail;
1322
1323 Py_DECREF(it);
1324 return result;
1325
1326Fail:
1327 Py_XDECREF(result);
1328 Py_DECREF(it);
1329 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001330}
1331
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001332PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001333PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001334{
Tim Petersf553f892001-05-01 20:45:31 +00001335 PyObject *it; /* iter(v) */
1336 PyObject *result; /* result list */
1337 int n; /* guess for result list size */
1338 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001339
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001340 if (v == NULL)
1341 return null_error();
1342
Tim Petersf553f892001-05-01 20:45:31 +00001343 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001344 if (PyList_Check(v))
1345 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1346
Tim Petersf553f892001-05-01 20:45:31 +00001347 /* Get iterator. There may be some low-level efficiency to be gained
1348 * by caching the tp_iternext slot instead of using PyIter_Next()
1349 * later, but premature optimization is the root etc.
1350 */
1351 it = PyObject_GetIter(v);
1352 if (it == NULL)
1353 return NULL;
1354
1355 /* Guess a result list size. */
1356 n = -1; /* unknown */
1357 if (PySequence_Check(v) &&
1358 v->ob_type->tp_as_sequence->sq_length) {
1359 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001361 PyErr_Clear();
1362 }
1363 if (n < 0)
1364 n = 8; /* arbitrary */
1365 result = PyList_New(n);
1366 if (result == NULL) {
1367 Py_DECREF(it);
1368 return NULL;
1369 }
1370
1371 /* Run iterator to exhaustion. */
1372 for (i = 0; ; i++) {
1373 PyObject *item = PyIter_Next(it);
1374 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001375 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001376 Py_DECREF(result);
1377 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001378 }
Tim Petersf553f892001-05-01 20:45:31 +00001379 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001380 }
Tim Petersf553f892001-05-01 20:45:31 +00001381 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001382 PyList_SET_ITEM(result, i, item); /* steals ref */
1383 else {
1384 int status = PyList_Append(result, item);
1385 Py_DECREF(item); /* append creates a new ref */
1386 if (status < 0) {
1387 Py_DECREF(result);
1388 result = NULL;
1389 break;
1390 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001392 }
Tim Petersf553f892001-05-01 20:45:31 +00001393
1394 /* Cut back result list if initial guess was too large. */
1395 if (i < n && result != NULL) {
1396 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1397 Py_DECREF(result);
1398 result = NULL;
1399 }
1400 }
1401 Py_DECREF(it);
1402 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001403}
1404
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001405PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001406PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001407{
1408 if (v == NULL)
1409 return null_error();
1410
1411 if (PyList_Check(v) || PyTuple_Check(v)) {
1412 Py_INCREF(v);
1413 return v;
1414 }
1415
1416 v = PySequence_Tuple(v);
1417 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1418 return type_error(m);
1419
1420 return v;
1421}
1422
Tim Peters16a77ad2001-09-08 04:00:12 +00001423/* Iterate over seq. Result depends on the operation:
1424 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1425 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1426 set ValueError and return -1 if none found; also return -1 on error.
1427 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1428*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001429int
Tim Peters16a77ad2001-09-08 04:00:12 +00001430_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001431{
Tim Peters16a77ad2001-09-08 04:00:12 +00001432 int n;
1433 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1434 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001435
Tim Peters16a77ad2001-09-08 04:00:12 +00001436 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 null_error();
1438 return -1;
1439 }
Tim Peters75f8e352001-05-05 11:33:43 +00001440
Tim Peters16a77ad2001-09-08 04:00:12 +00001441 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001442 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001443 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001444 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001445 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001446
Tim Peters16a77ad2001-09-08 04:00:12 +00001447 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001448 for (;;) {
1449 int cmp;
1450 PyObject *item = PyIter_Next(it);
1451 if (item == NULL) {
1452 if (PyErr_Occurred())
1453 goto Fail;
1454 break;
1455 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001456
1457 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001458 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001459 if (cmp < 0)
1460 goto Fail;
1461 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001462 switch (operation) {
1463 case PY_ITERSEARCH_COUNT:
1464 ++n;
1465 if (n <= 0) {
1466 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001467 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001468 goto Fail;
1469 }
1470 break;
1471
1472 case PY_ITERSEARCH_INDEX:
1473 if (wrapped) {
1474 PyErr_SetString(PyExc_OverflowError,
1475 "index exceeds C int size");
1476 goto Fail;
1477 }
1478 goto Done;
1479
1480 case PY_ITERSEARCH_CONTAINS:
1481 n = 1;
1482 goto Done;
1483
1484 default:
1485 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001486 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001487 }
1488
1489 if (operation == PY_ITERSEARCH_INDEX) {
1490 ++n;
1491 if (n <= 0)
1492 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001493 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001494 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001495
1496 if (operation != PY_ITERSEARCH_INDEX)
1497 goto Done;
1498
1499 PyErr_SetString(PyExc_ValueError,
1500 "sequence.index(x): x not in sequence");
1501 /* fall into failure code */
1502Fail:
1503 n = -1;
1504 /* fall through */
1505Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001506 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001507 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001508
Guido van Rossume15dee51995-07-18 14:12:02 +00001509}
1510
Tim Peters16a77ad2001-09-08 04:00:12 +00001511/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001512int
Tim Peters16a77ad2001-09-08 04:00:12 +00001513PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001514{
Tim Peters16a77ad2001-09-08 04:00:12 +00001515 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001516}
1517
Tim Peterscb8d3682001-05-05 21:05:01 +00001518/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001519 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001520 */
1521int
1522PySequence_Contains(PyObject *seq, PyObject *ob)
1523{
1524 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1525 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1526 if (sqm != NULL && sqm->sq_contains != NULL)
1527 return (*sqm->sq_contains)(seq, ob);
1528 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001529 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001530}
1531
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001532/* Backwards compatibility */
1533#undef PySequence_In
1534int
Fred Drake79912472000-07-09 04:06:11 +00001535PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001536{
1537 return PySequence_Contains(w, v);
1538}
1539
1540int
Fred Drake79912472000-07-09 04:06:11 +00001541PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001542{
Tim Peters16a77ad2001-09-08 04:00:12 +00001543 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001544}
1545
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001546/* Operations on mappings */
1547
1548int
Fred Drake79912472000-07-09 04:06:11 +00001549PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001550{
Guido van Rossum8700b422001-09-07 20:20:11 +00001551 return o && o->ob_type->tp_as_mapping &&
1552 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001553}
1554
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001555int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001556PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001557{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001558 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001559
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001560 if (o == NULL) {
1561 null_error();
1562 return -1;
1563 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001564
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001565 m = o->ob_type->tp_as_mapping;
1566 if (m && m->mp_length)
1567 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001568
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001569 type_error("len() of unsized object");
1570 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001571}
1572
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001573#undef PyMapping_Length
1574int
1575PyMapping_Length(PyObject *o)
1576{
1577 return PyMapping_Size(o);
1578}
1579#define PyMapping_Length PyMapping_Size
1580
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001581PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001582PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001583{
1584 PyObject *okey, *r;
1585
1586 if (key == NULL)
1587 return null_error();
1588
1589 okey = PyString_FromString(key);
1590 if (okey == NULL)
1591 return NULL;
1592 r = PyObject_GetItem(o, okey);
1593 Py_DECREF(okey);
1594 return r;
1595}
1596
1597int
Fred Drake79912472000-07-09 04:06:11 +00001598PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001599{
1600 PyObject *okey;
1601 int r;
1602
1603 if (key == NULL) {
1604 null_error();
1605 return -1;
1606 }
1607
1608 okey = PyString_FromString(key);
1609 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001610 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611 r = PyObject_SetItem(o, okey, value);
1612 Py_DECREF(okey);
1613 return r;
1614}
1615
1616int
Fred Drake79912472000-07-09 04:06:11 +00001617PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001618{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001619 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001620
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001621 v = PyMapping_GetItemString(o, key);
1622 if (v) {
1623 Py_DECREF(v);
1624 return 1;
1625 }
1626 PyErr_Clear();
1627 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001628}
1629
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001630int
Fred Drake79912472000-07-09 04:06:11 +00001631PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001632{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001633 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001634
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001635 v = PyObject_GetItem(o, key);
1636 if (v) {
1637 Py_DECREF(v);
1638 return 1;
1639 }
1640 PyErr_Clear();
1641 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001642}
1643
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001644/* Operations on callable objects */
1645
1646/* XXX PyCallable_Check() is in object.c */
1647
Guido van Rossume15dee51995-07-18 14:12:02 +00001648PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001649PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001650{
Guido van Rossum5560b742001-09-14 16:47:50 +00001651 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001652}
Guido van Rossume15dee51995-07-18 14:12:02 +00001653
1654PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001655PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1656{
1657 ternaryfunc call;
1658
1659 if ((call = func->ob_type->tp_call) != NULL) {
1660 PyObject *result = (*call)(func, arg, kw);
1661 if (result == NULL && !PyErr_Occurred())
1662 PyErr_SetString(
1663 PyExc_SystemError,
1664 "NULL result without error in PyObject_Call");
1665 return result;
1666 }
Fred Drake573395a2001-11-01 20:26:12 +00001667 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1668 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001669 return NULL;
1670}
1671
1672PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001673PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001674{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001675 va_list va;
1676 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001677
Fred Drakeb92cf062001-10-27 06:16:31 +00001678 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001679 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001680
Fred Drakeb92cf062001-10-27 06:16:31 +00001681 if (format && *format) {
1682 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001683 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001684 va_end(va);
1685 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001686 else
1687 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001688
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001689 if (args == NULL)
1690 return NULL;
1691
1692 if (!PyTuple_Check(args)) {
1693 PyObject *a;
1694
1695 a = PyTuple_New(1);
1696 if (a == NULL)
1697 return NULL;
1698 if (PyTuple_SetItem(a, 0, args) < 0)
1699 return NULL;
1700 args = a;
1701 }
1702 retval = PyObject_CallObject(callable, args);
1703
1704 Py_DECREF(args);
1705
1706 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001707}
1708
1709PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001710PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001711{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001712 va_list va;
1713 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001714
Fred Drakeb92cf062001-10-27 06:16:31 +00001715 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001716 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001717
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001718 func = PyObject_GetAttrString(o, name);
1719 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001720 PyErr_SetString(PyExc_AttributeError, name);
1721 return 0;
1722 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001723
Fred Drakeb92cf062001-10-27 06:16:31 +00001724 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001725 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001726
Fred Drakeb92cf062001-10-27 06:16:31 +00001727 if (format && *format) {
1728 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001729 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001730 va_end(va);
1731 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001732 else
1733 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001734
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001735 if (!args)
1736 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001737
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001738 if (!PyTuple_Check(args)) {
1739 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001740
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001741 a = PyTuple_New(1);
1742 if (a == NULL)
1743 return NULL;
1744 if (PyTuple_SetItem(a, 0, args) < 0)
1745 return NULL;
1746 args = a;
1747 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001748
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001749 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001750
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001751 Py_DECREF(args);
1752 Py_DECREF(func);
1753
1754 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001755}
Guido van Rossum823649d2001-03-21 18:40:58 +00001756
1757
Fred Drakeb421b8c2001-10-26 16:21:32 +00001758static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001759objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001760{
1761 int i, n = 0;
1762 va_list countva;
1763 PyObject *result, *tmp;
1764
1765#ifdef VA_LIST_IS_ARRAY
1766 memcpy(countva, va, sizeof(va_list));
1767#else
1768 countva = va;
1769#endif
1770
1771 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1772 ++n;
1773 result = PyTuple_New(n);
1774 if (result != NULL && n > 0) {
1775 for (i = 0; i < n; ++i) {
1776 tmp = (PyObject *)va_arg(va, PyObject *);
1777 PyTuple_SET_ITEM(result, i, tmp);
1778 Py_INCREF(tmp);
1779 }
1780 }
1781 return result;
1782}
1783
1784PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001785PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001786{
1787 PyObject *args, *tmp;
1788 va_list vargs;
1789
1790 if (callable == NULL || name == NULL)
1791 return null_error();
1792
1793 callable = PyObject_GetAttr(callable, name);
1794 if (callable == NULL)
1795 return NULL;
1796
1797 /* count the args */
1798 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001799 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001800 va_end(vargs);
1801 if (args == NULL) {
1802 Py_DECREF(callable);
1803 return NULL;
1804 }
1805 tmp = PyObject_Call(callable, args, NULL);
1806 Py_DECREF(args);
1807 Py_DECREF(callable);
1808
1809 return tmp;
1810}
1811
1812PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001813PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001814{
1815 PyObject *args, *tmp;
1816 va_list vargs;
1817
1818 if (callable == NULL)
1819 return null_error();
1820
1821 /* count the args */
1822 va_start(vargs, callable);
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 return NULL;
1827 tmp = PyObject_Call(callable, args, NULL);
1828 Py_DECREF(args);
1829
1830 return tmp;
1831}
1832
1833
Guido van Rossum823649d2001-03-21 18:40:58 +00001834/* isinstance(), issubclass() */
1835
Neil Schemenauer6b471292001-10-18 03:18:43 +00001836static PyObject *
1837abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001838{
1839 static PyObject *__bases__ = NULL;
1840 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001841
1842 if (__bases__ == NULL) {
1843 __bases__ = PyString_FromString("__bases__");
1844 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001845 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001846 }
1847
Neil Schemenauer6b471292001-10-18 03:18:43 +00001848 bases = PyObject_GetAttr(cls, __bases__);
1849 if (bases == NULL || !PyTuple_Check(bases)) {
1850 Py_XDECREF(bases);
1851 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001852 }
1853
Neil Schemenauer6b471292001-10-18 03:18:43 +00001854 return bases;
1855}
1856
1857
1858static int
1859abstract_issubclass(PyObject *derived, PyObject *cls)
1860{
1861 PyObject *bases;
1862 int i, n;
1863 int r = 0;
1864
1865
Guido van Rossum823649d2001-03-21 18:40:58 +00001866 if (derived == cls)
1867 return 1;
1868
Neil Schemenauer6b471292001-10-18 03:18:43 +00001869 bases = abstract_get_bases(derived);
1870 if (bases == NULL)
1871 return 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001872
1873 n = PyTuple_GET_SIZE(bases);
1874 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001875 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001876 if (r != 0)
1877 break;
1878 }
1879
1880 Py_DECREF(bases);
1881
1882 return r;
1883}
1884
1885int
1886PyObject_IsInstance(PyObject *inst, PyObject *cls)
1887{
1888 PyObject *icls;
1889 static PyObject *__class__ = NULL;
1890 int retval = 0;
1891
Neil Schemenauer6b471292001-10-18 03:18:43 +00001892 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
1893 PyObject *inclass =
1894 (PyObject*)((PyInstanceObject*)inst)->in_class;
1895 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001896 }
1897 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001898 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001899 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00001900 else if (PyTuple_Check(cls)) {
1901 /* Not a general sequence -- that opens up the road to
1902 recursion and stack overflow. */
1903 int i, n;
1904
1905 n = PyTuple_GET_SIZE(cls);
1906 for (i = 0; i < n; i++) {
1907 retval = PyObject_IsInstance(
1908 inst, PyTuple_GET_ITEM(cls, i));
1909 if (retval != 0)
1910 break;
1911 }
1912 return retval;
1913 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001914 else {
1915 PyObject *cls_bases = abstract_get_bases(cls);
1916 if (cls_bases == NULL) {
1917 PyErr_SetString(PyExc_TypeError,
1918 "isinstance() arg 2 must be a class or type");
1919 return -1;
1920 }
1921 Py_DECREF(cls_bases);
Guido van Rossum823649d2001-03-21 18:40:58 +00001922 if (__class__ == NULL) {
1923 __class__ = PyString_FromString("__class__");
1924 if (__class__ == NULL)
1925 return -1;
1926 }
1927 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00001928 if (icls == NULL) {
1929 PyErr_Clear();
1930 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00001931 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001932 else {
1933 retval = abstract_issubclass(icls, cls);
1934 Py_DECREF(icls);
1935 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001936 }
Guido van Rossum823649d2001-03-21 18:40:58 +00001937
Guido van Rossum823649d2001-03-21 18:40:58 +00001938 return retval;
1939}
1940
1941int
1942PyObject_IsSubclass(PyObject *derived, PyObject *cls)
1943{
1944 int retval;
1945
1946 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00001947 PyObject *derived_bases;
1948 PyObject *cls_bases;
1949
1950 derived_bases = abstract_get_bases(derived);
1951 if (derived_bases == NULL) {
1952 PyErr_SetString(PyExc_TypeError,
1953 "issubclass() arg 1 must be a class");
1954 return -1;
1955 }
1956 Py_DECREF(derived_bases);
1957
1958 cls_bases = abstract_get_bases(cls);
1959 if (cls_bases == NULL) {
1960 PyErr_SetString(PyExc_TypeError,
1961 "issubclass() arg 2 must be a class");
1962 return -1;
1963 }
1964 Py_DECREF(cls_bases);
1965
1966 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00001967 }
1968 else {
1969 /* shortcut */
1970 if (!(retval = (derived == cls)))
1971 retval = PyClass_IsSubclass(derived, cls);
1972 }
1973
1974 return retval;
1975}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001976
1977PyObject *
1978PyObject_GetIter(PyObject *o)
1979{
1980 PyTypeObject *t = o->ob_type;
1981 getiterfunc f = NULL;
1982 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
1983 f = t->tp_iter;
1984 if (f == NULL) {
1985 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00001986 return PySeqIter_New(o);
Jeremy Hylton89c3a222001-11-09 21:59:42 +00001987 PyErr_SetString(PyExc_TypeError,
1988 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001989 return NULL;
1990 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00001991 else {
1992 PyObject *res = (*f)(o);
1993 if (res != NULL && !PyIter_Check(res)) {
1994 PyErr_Format(PyExc_TypeError,
1995 "iter() returned non-iterator "
1996 "of type '%.100s'",
1997 res->ob_type->tp_name);
1998 Py_DECREF(res);
1999 res = NULL;
2000 }
2001 return res;
2002 }
2003}
2004
Tim Petersf4848da2001-05-05 00:14:56 +00002005/* Return next item.
2006 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2007 * If the iteration terminates normally, return NULL and clear the
2008 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2009 * will be false.
2010 * Else return the next object. PyErr_Occurred() will be false.
2011 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002012PyObject *
2013PyIter_Next(PyObject *iter)
2014{
Tim Petersf4848da2001-05-05 00:14:56 +00002015 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002016 if (!PyIter_Check(iter)) {
2017 PyErr_Format(PyExc_TypeError,
2018 "'%.100s' object is not an iterator",
2019 iter->ob_type->tp_name);
2020 return NULL;
2021 }
Tim Petersf4848da2001-05-05 00:14:56 +00002022 result = (*iter->ob_type->tp_iternext)(iter);
2023 if (result == NULL &&
2024 PyErr_Occurred() &&
2025 PyErr_ExceptionMatches(PyExc_StopIteration))
2026 PyErr_Clear();
2027 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002028}
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002029