blob: 4ac92608ab91a128c3b8be97a9123178d54a1f14 [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
Guido van Rossume15dee51995-07-18 14:12:02 +00003#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00004#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00005#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00006#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00007
8#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +00009 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000010
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000011/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000012
13static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000014type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000015{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000016 PyErr_SetString(PyExc_TypeError, msg);
17 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000018}
19
Guido van Rossum052b7e11996-11-11 15:08:19 +000020static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000021null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000022{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000023 if (!PyErr_Occurred())
24 PyErr_SetString(PyExc_SystemError,
25 "null argument to internal routine");
26 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000027}
28
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000029/* Operations on any object */
30
31int
Fred Drake79912472000-07-09 04:06:11 +000032PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000033{
34 int r;
35
36 if (o1 == NULL || o2 == NULL) {
37 null_error();
38 return -1;
39 }
40 r = PyObject_Compare(o1, o2);
41 if (PyErr_Occurred())
42 return -1;
43 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000044 return 0;
45}
Guido van Rossume15dee51995-07-18 14:12:02 +000046
47PyObject *
Fred Drake79912472000-07-09 04:06:11 +000048PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000049{
50 PyObject *v;
51
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000052 if (o == NULL)
53 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000054 v = (PyObject *)o->ob_type;
55 Py_INCREF(v);
56 return v;
57}
58
59int
Jeremy Hylton6253f832000-07-12 12:56:19 +000060PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000064 if (o == NULL) {
65 null_error();
66 return -1;
67 }
Guido van Rossume15dee51995-07-18 14:12:02 +000068
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000069 m = o->ob_type->tp_as_sequence;
70 if (m && m->sq_length)
71 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000072
Jeremy Hylton6253f832000-07-12 12:56:19 +000073 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000074}
75
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000076#undef PyObject_Length
77int
78PyObject_Length(PyObject *o)
79{
80 return PyObject_Size(o);
81}
82#define PyObject_Length PyObject_Size
83
Guido van Rossume15dee51995-07-18 14:12:02 +000084PyObject *
Fred Drake79912472000-07-09 04:06:11 +000085PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +000086{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000087 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000088
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000089 if (o == NULL || key == NULL)
90 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000091
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000092 m = o->ob_type->tp_as_mapping;
93 if (m && m->mp_subscript)
94 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +000095
Guido van Rossum21308241998-08-13 16:44:44 +000096 if (o->ob_type->tp_as_sequence) {
97 if (PyInt_Check(key))
98 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +000099 else if (PyLong_Check(key)) {
100 long key_value = PyLong_AsLong(key);
101 if (key_value == -1 && PyErr_Occurred())
102 return NULL;
103 return PySequence_GetItem(o, key_value);
104 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000105 else if (o->ob_type->tp_as_sequence->sq_item)
106 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000107 }
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 Rossum64585f62001-11-24 18:24:47 +0000134 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
135 type_error("sequence index must be integer");
136 return -1;
137 }
Guido van Rossum21308241998-08-13 16:44:44 +0000138 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000139
140 type_error("object does not support item assignment");
141 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000142}
143
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000144int
Fred Drake79912472000-07-09 04:06:11 +0000145PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000146{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000147 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000148
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000149 if (o == NULL || key == NULL) {
150 null_error();
151 return -1;
152 }
153 m = o->ob_type->tp_as_mapping;
154 if (m && m->mp_ass_subscript)
155 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000156
Guido van Rossum21308241998-08-13 16:44:44 +0000157 if (o->ob_type->tp_as_sequence) {
158 if (PyInt_Check(key))
159 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000160 else if (PyLong_Check(key)) {
161 long key_value = PyLong_AsLong(key);
162 if (key_value == -1 && PyErr_Occurred())
163 return -1;
164 return PySequence_DelItem(o, key_value);
165 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000166 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
167 type_error("sequence index must be integer");
168 return -1;
169 }
Guido van Rossum21308241998-08-13 16:44:44 +0000170 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000171
172 type_error("object does not support item deletion");
173 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000174}
175
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000176int
177PyObject_DelItemString(PyObject *o, char *key)
178{
179 PyObject *okey;
180 int ret;
181
182 if (o == NULL || key == NULL) {
183 null_error();
184 return -1;
185 }
186 okey = PyString_FromString(key);
187 if (okey == NULL)
188 return -1;
189 ret = PyObject_DelItem(o, okey);
190 Py_DECREF(okey);
191 return ret;
192}
193
Guido van Rossum4c08d552000-03-10 22:55:18 +0000194int PyObject_AsCharBuffer(PyObject *obj,
195 const char **buffer,
196 int *buffer_len)
197{
198 PyBufferProcs *pb;
199 const char *pp;
200 int len;
201
202 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
203 null_error();
204 return -1;
205 }
206 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000207 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000208 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000209 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000210 PyErr_SetString(PyExc_TypeError,
211 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000212 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000213 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000214 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000215 PyErr_SetString(PyExc_TypeError,
216 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000217 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000218 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000219 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000220 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000221 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000222 *buffer = pp;
223 *buffer_len = len;
224 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000225}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000226
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000227int
228PyObject_CheckReadBuffer(PyObject *obj)
229{
230 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
231
232 if (pb == NULL ||
233 pb->bf_getreadbuffer == NULL ||
234 pb->bf_getsegcount == NULL ||
235 (*pb->bf_getsegcount)(obj, NULL) != 1)
236 return 0;
237 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000238}
239
240int PyObject_AsReadBuffer(PyObject *obj,
241 const void **buffer,
242 int *buffer_len)
243{
244 PyBufferProcs *pb;
245 void *pp;
246 int len;
247
248 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
249 null_error();
250 return -1;
251 }
252 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000253 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000254 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000255 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000256 PyErr_SetString(PyExc_TypeError,
257 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000258 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000259 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000260 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000261 PyErr_SetString(PyExc_TypeError,
262 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000263 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000264 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000265 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000266 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000267 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000268 *buffer = pp;
269 *buffer_len = len;
270 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271}
272
273int PyObject_AsWriteBuffer(PyObject *obj,
274 void **buffer,
275 int *buffer_len)
276{
277 PyBufferProcs *pb;
278 void*pp;
279 int len;
280
281 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
282 null_error();
283 return -1;
284 }
285 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000286 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000287 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000288 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000289 PyErr_SetString(PyExc_TypeError,
290 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000291 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000293 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000294 PyErr_SetString(PyExc_TypeError,
295 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000296 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000297 }
298 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
299 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000300 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 *buffer = pp;
302 *buffer_len = len;
303 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304}
305
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000306/* Operations on numbers */
307
308int
Fred Drake79912472000-07-09 04:06:11 +0000309PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000310{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000311 return o && o->ob_type->tp_as_number &&
312 (o->ob_type->tp_as_number->nb_int ||
313 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000314}
315
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000316/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000317
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000318/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000319
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000320#define NB_SLOT(x) offsetof(PyNumberMethods, x)
321#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000322 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000323#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000324 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000325
326/*
327 Calling scheme used for binary operations:
328
329 v w Action
330 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000331 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000332 new old v.op(v,w), coerce(v,w), v.op(v,w)
333 old new w.op(v,w), coerce(v,w), v.op(v,w)
334 old old coerce(v,w), v.op(v,w)
335
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000336 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
337 v->ob_type
338
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000339 Legend:
340 -------
341 * new == new style number
342 * old == old style number
343 * Action indicates the order in which operations are tried until either
344 a valid result is produced or an error occurs.
345
346 */
347
348static PyObject *
349binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000350{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000351 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000352 binaryfunc slotv = NULL;
353 binaryfunc slotw = NULL;
354
355 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000356 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000357 if (w->ob_type != v->ob_type &&
358 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000359 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000360 if (slotw == slotv)
361 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000362 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000363 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000364 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
365 x = slotw(v, w);
366 if (x != Py_NotImplemented)
367 return x;
368 Py_DECREF(x); /* can't do it */
369 slotw = NULL;
370 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000371 x = slotv(v, w);
372 if (x != Py_NotImplemented)
373 return x;
374 Py_DECREF(x); /* can't do it */
375 }
376 if (slotw) {
377 x = slotw(v, w);
378 if (x != Py_NotImplemented)
379 return x;
380 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000381 }
382 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
383 int err = PyNumber_CoerceEx(&v, &w);
384 if (err < 0) {
385 return NULL;
386 }
387 if (err == 0) {
388 PyNumberMethods *mv = v->ob_type->tp_as_number;
389 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000390 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000391 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000392 if (slot) {
393 PyObject *x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000394 Py_DECREF(v);
395 Py_DECREF(w);
396 return x;
397 }
398 }
399 /* CoerceEx incremented the reference counts */
400 Py_DECREF(v);
401 Py_DECREF(w);
402 }
403 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000404 Py_INCREF(Py_NotImplemented);
405 return Py_NotImplemented;
406}
Guido van Rossum77660912002-04-16 16:32:50 +0000407
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000408static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000409binop_type_error(PyObject *v, PyObject *w, const char *op_name)
410{
411 PyErr_Format(PyExc_TypeError,
412 "unsupported operand type(s) for %s: '%s' and '%s'",
413 op_name,
414 v->ob_type->tp_name,
415 w->ob_type->tp_name);
416 return NULL;
417}
418
419static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000420binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
421{
422 PyObject *result = binary_op1(v, w, op_slot);
423 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000424 Py_DECREF(result);
425 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000426 }
427 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000428}
429
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000430
431/*
432 Calling scheme used for ternary operations:
433
Guido van Rossum84675ac2001-09-29 01:05:03 +0000434 *** In some cases, w.op is called before v.op; see binary_op1. ***
435
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000436 v w z Action
437 -------------------------------------------------------------------
438 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
439 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
440 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
441 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
442 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
443 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
444 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
445 old old old coerce(v,w,z), v.op(v,w,z)
446
447 Legend:
448 -------
449 * new == new style number
450 * old == old style number
451 * Action indicates the order in which operations are tried until either
452 a valid result is produced or an error occurs.
453 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
454 only if z != Py_None; if z == Py_None, then it is treated as absent
455 variable and only coerce(v,w) is tried.
456
457 */
458
459static PyObject *
460ternary_op(PyObject *v,
461 PyObject *w,
462 PyObject *z,
463 const int op_slot,
464 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000465{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000466 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000467 PyObject *x = NULL;
468 ternaryfunc slotv = NULL;
469 ternaryfunc slotw = NULL;
470 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000471
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000472 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000473 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000474 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000475 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000476 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000477 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000478 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000479 if (slotw == slotv)
480 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000481 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000482 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000483 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
484 x = slotw(v, w, z);
485 if (x != Py_NotImplemented)
486 return x;
487 Py_DECREF(x); /* can't do it */
488 slotw = NULL;
489 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000490 x = slotv(v, w, z);
491 if (x != Py_NotImplemented)
492 return x;
493 Py_DECREF(x); /* can't do it */
494 }
495 if (slotw) {
496 x = slotw(v, w, z);
497 if (x != Py_NotImplemented)
498 return x;
499 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000500 }
501 mz = z->ob_type->tp_as_number;
502 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000503 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000504 if (slotz == slotv || slotz == slotw)
505 slotz = NULL;
506 if (slotz) {
507 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000508 if (x != Py_NotImplemented)
509 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000510 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000511 }
512 }
513
514 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
515 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
516 /* we have an old style operand, coerce */
517 PyObject *v1, *z1, *w2, *z2;
518 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000519
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000520 c = PyNumber_Coerce(&v, &w);
521 if (c != 0)
522 goto error3;
523
524 /* Special case: if the third argument is None, it is
525 treated as absent argument and not coerced. */
526 if (z == Py_None) {
527 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000528 slotz = NB_TERNOP(v->ob_type->tp_as_number,
529 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000530 if (slotz)
531 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000532 else
533 c = -1;
534 }
535 else
536 c = -1;
537 goto error2;
538 }
539 v1 = v;
540 z1 = z;
541 c = PyNumber_Coerce(&v1, &z1);
542 if (c != 0)
543 goto error2;
544 w2 = w;
545 z2 = z1;
546 c = PyNumber_Coerce(&w2, &z2);
547 if (c != 0)
548 goto error1;
549
550 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000551 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
552 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000553 if (slotv)
554 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000555 else
556 c = -1;
557 }
558 else
559 c = -1;
560
561 Py_DECREF(w2);
562 Py_DECREF(z2);
563 error1:
564 Py_DECREF(v1);
565 Py_DECREF(z1);
566 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000567 Py_DECREF(v);
568 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000569 error3:
570 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000571 return x;
572 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000573
574 if (z == Py_None)
575 PyErr_Format(
576 PyExc_TypeError,
577 "unsupported operand type(s) for ** or pow(): "
578 "'%s' and '%s'",
579 v->ob_type->tp_name,
580 w->ob_type->tp_name);
581 else
582 PyErr_Format(
583 PyExc_TypeError,
584 "unsupported operand type(s) for pow(): "
585 "'%s', '%s', '%s'",
586 v->ob_type->tp_name,
587 w->ob_type->tp_name,
588 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000589 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000590}
591
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000592#define BINARY_FUNC(func, op, op_name) \
593 PyObject * \
594 func(PyObject *v, PyObject *w) { \
595 return binary_op(v, w, NB_SLOT(op), op_name); \
596 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000597
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000598BINARY_FUNC(PyNumber_Or, nb_or, "|")
599BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
600BINARY_FUNC(PyNumber_And, nb_and, "&")
601BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
602BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
603BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000604BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
605BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000606
607PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000608PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000609{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000610 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
611 if (result == Py_NotImplemented) {
612 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Jeremy Hylton0522d982002-03-08 21:28:54 +0000613 if (m && m->sq_concat) {
614 Py_DECREF(result);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000615 result = (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000616 }
Jeremy Hylton6ae6a432002-03-08 21:11:37 +0000617 if (result == Py_NotImplemented) {
Jeremy Hylton0522d982002-03-08 21:28:54 +0000618 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000619 return binop_type_error(v, w, "+");
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000620 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000621 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000622 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000623}
624
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000625static PyObject *
626sequence_repeat(intargfunc repeatfunc, PyObject *seq, PyObject *n)
627{
628 long count;
629 if (PyInt_Check(n)) {
630 count = PyInt_AsLong(n);
631 }
632 else if (PyLong_Check(n)) {
633 count = PyLong_AsLong(n);
634 if (count == -1 && PyErr_Occurred())
635 return NULL;
636 }
637 else {
638 return type_error(
639 "can't multiply sequence to non-int");
640 }
641#if LONG_MAX != INT_MAX
642 if (count > INT_MAX) {
643 PyErr_SetString(PyExc_ValueError,
644 "sequence repeat count too large");
645 return NULL;
646 }
647 else if (count < INT_MIN)
648 count = INT_MIN;
649 /* XXX Why don't I either
650
651 - set count to -1 whenever it's negative (after all,
652 sequence repeat usually treats negative numbers
653 as zero(); or
654
655 - raise an exception when it's less than INT_MIN?
656
657 I'm thinking about a hypothetical use case where some
658 sequence type might use a negative value as a flag of
659 some kind. In those cases I don't want to break the
660 code by mapping all negative values to -1. But I also
661 don't want to break e.g. []*(-sys.maxint), which is
662 perfectly safe, returning []. As a compromise, I do
663 map out-of-range negative values.
664 */
665#endif
666 return (*repeatfunc)(seq, (int)count);
667}
668
669PyObject *
670PyNumber_Multiply(PyObject *v, PyObject *w)
671{
672 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
673 if (result == Py_NotImplemented) {
674 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
675 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000676 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000677 if (mv && mv->sq_repeat) {
678 return sequence_repeat(mv->sq_repeat, v, w);
679 }
680 else if (mw && mw->sq_repeat) {
681 return sequence_repeat(mw->sq_repeat, w, v);
682 }
683 result = binop_type_error(v, w, "*");
684 }
685 return result;
686}
687
Guido van Rossume15dee51995-07-18 14:12:02 +0000688PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000689PyNumber_FloorDivide(PyObject *v, PyObject *w)
690{
691 /* XXX tp_flags test */
692 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
693}
694
695PyObject *
696PyNumber_TrueDivide(PyObject *v, PyObject *w)
697{
698 /* XXX tp_flags test */
699 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
700}
701
702PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000703PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000704{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000705 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000706}
707
708PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000709PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000710{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000711 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000712}
713
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000714/* Binary in-place operators */
715
716/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000717 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000718
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000719 - If the left hand object has the appropriate struct members, and
720 they are filled, call the appropriate function and return the
721 result. No coercion is done on the arguments; the left-hand object
722 is the one the operation is performed on, and it's up to the
723 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000724
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000725 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000727
728 */
729
Guido van Rossum77660912002-04-16 16:32:50 +0000730#define HASINPLACE(t) \
731 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000732
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000733static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000734binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000735{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000736 PyNumberMethods *mv = v->ob_type->tp_as_number;
737 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000738 binaryfunc slot = NB_BINOP(mv, iop_slot);
739 if (slot) {
740 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000741 if (x != Py_NotImplemented) {
742 return x;
743 }
744 Py_DECREF(x);
745 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000746 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000747 return binary_op1(v, w, op_slot);
748}
749
750static PyObject *
751binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
752 const char *op_name)
753{
754 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
755 if (result == Py_NotImplemented) {
756 Py_DECREF(result);
757 return binop_type_error(v, w, op_name);
758 }
759 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000760}
761
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000762#define INPLACE_BINOP(func, iop, op, op_name) \
763 PyObject * \
764 func(PyObject *v, PyObject *w) { \
765 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000766 }
767
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000768INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
769INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
770INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
771INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
772INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
773INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
774INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000775
776PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000777PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
778{
779 /* XXX tp_flags test */
780 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
781 NB_SLOT(nb_floor_divide), "//=");
782}
783
784PyObject *
785PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
786{
787 /* XXX tp_flags test */
788 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
789 NB_SLOT(nb_true_divide), "/=");
790}
791
792PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000793PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
794{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000795 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
796 NB_SLOT(nb_add));
797 if (result == Py_NotImplemented) {
798 PySequenceMethods *m = v->ob_type->tp_as_sequence;
799 Py_DECREF(result);
800 if (m != NULL) {
801 binaryfunc f = NULL;
802 if (HASINPLACE(v))
803 f = m->sq_inplace_concat;
804 if (f == NULL)
805 f = m->sq_concat;
806 if (f != NULL)
807 return (*f)(v, w);
808 }
809 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000810 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000811 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000812}
813
814PyObject *
815PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
816{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000817 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
818 NB_SLOT(nb_multiply));
819 if (result == Py_NotImplemented) {
820 intargfunc f = NULL;
821 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
822 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
823 Py_DECREF(result);
824 if (mv != NULL) {
825 if (HASINPLACE(v))
826 f = mv->sq_inplace_repeat;
827 if (f == NULL)
828 f = mv->sq_repeat;
829 if (f != NULL)
830 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000831 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000832 else if (mw != NULL) {
833 /* Note that the right hand operand should not be
834 * mutated in this case so sq_inplace_repeat is not
835 * used. */
836 if (mw->sq_repeat)
837 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000838 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000839 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000840 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000841 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000842}
843
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000844PyObject *
845PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
846{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000847 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
848 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000849}
850
851PyObject *
852PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
853{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000854 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
855 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
856 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000857 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000858 else {
859 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
860 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000861}
862
863
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000864/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000865
866PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000867PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000868{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000869 PyNumberMethods *m;
870
871 if (o == NULL)
872 return null_error();
873 m = o->ob_type->tp_as_number;
874 if (m && m->nb_negative)
875 return (*m->nb_negative)(o);
876
877 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000878}
879
880PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000881PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000882{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 PyNumberMethods *m;
884
885 if (o == NULL)
886 return null_error();
887 m = o->ob_type->tp_as_number;
888 if (m && m->nb_positive)
889 return (*m->nb_positive)(o);
890
891 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000892}
893
894PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000895PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000896{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000897 PyNumberMethods *m;
898
899 if (o == NULL)
900 return null_error();
901 m = o->ob_type->tp_as_number;
902 if (m && m->nb_invert)
903 return (*m->nb_invert)(o);
904
905 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000906}
907
908PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000909PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000910{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000912
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000913 if (o == NULL)
914 return null_error();
915 m = o->ob_type->tp_as_number;
916 if (m && m->nb_absolute)
917 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000918
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000919 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000920}
921
Guido van Rossum9e896b32000-04-05 20:11:21 +0000922/* Add a check for embedded NULL-bytes in the argument. */
923static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000924int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000925{
926 char *end;
927 PyObject *x;
928
929 x = PyInt_FromString((char*)s, &end, 10);
930 if (x == NULL)
931 return NULL;
932 if (end != s + len) {
933 PyErr_SetString(PyExc_ValueError,
934 "null byte in argument for int()");
935 Py_DECREF(x);
936 return NULL;
937 }
938 return x;
939}
940
Guido van Rossume15dee51995-07-18 14:12:02 +0000941PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000942PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000943{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000944 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000945 const char *buffer;
946 int buffer_len;
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 Peters64b5ce32001-09-10 20:52:51 +0000950 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000951 Py_INCREF(o);
952 return o;
953 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000954 if (PyInt_Check(o)) {
955 PyIntObject *io = (PyIntObject*)o;
956 return PyInt_FromLong(io->ob_ival);
957 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000958 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000959 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000960 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000961#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000962 if (PyUnicode_Check(o))
963 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
964 PyUnicode_GET_SIZE(o),
965 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000966#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000967 m = o->ob_type->tp_as_number;
968 if (m && m->nb_int)
969 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000970 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000971 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000972
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000973 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000974}
975
Guido van Rossum9e896b32000-04-05 20:11:21 +0000976/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000977static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000978long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000979{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000980 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000981 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000982
Guido van Rossum4c08d552000-03-10 22:55:18 +0000983 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000984 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000985 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000986 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000987 PyErr_SetString(PyExc_ValueError,
988 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000989 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000990 return NULL;
991 }
992 return x;
993}
994
Guido van Rossume15dee51995-07-18 14:12:02 +0000995PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000996PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000997{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000998 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000999 const char *buffer;
1000 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001001
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001002 if (o == NULL)
1003 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001004 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001005 Py_INCREF(o);
1006 return o;
1007 }
Tim Petersdb30ac42002-03-02 04:14:21 +00001008 if (PyLong_Check(o))
1009 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001010 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001011 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001012 * doesn't do. In particular long('9.5') must raise an
1013 * exception, not truncate the float.
1014 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001015 return long_from_string(PyString_AS_STRING(o),
1016 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001017#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001018 if (PyUnicode_Check(o))
1019 /* The above check is done in PyLong_FromUnicode(). */
1020 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1021 PyUnicode_GET_SIZE(o),
1022 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001023#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001024 m = o->ob_type->tp_as_number;
1025 if (m && m->nb_long)
1026 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001027 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1028 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001029
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001030 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001031}
1032
1033PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001034PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001035{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001036 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001037
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001038 if (o == NULL)
1039 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +00001040 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001041 Py_INCREF(o);
1042 return o;
1043 }
Tim Peters7a50f252001-09-10 21:28:20 +00001044 if (PyFloat_Check(o)) {
1045 PyFloatObject *po = (PyFloatObject *)o;
1046 return PyFloat_FromDouble(po->ob_fval);
1047 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001048 if (!PyString_Check(o)) {
1049 m = o->ob_type->tp_as_number;
1050 if (m && m->nb_float)
1051 return m->nb_float(o);
1052 }
1053 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001054}
1055
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001057
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001058int
Fred Drake79912472000-07-09 04:06:11 +00001059PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001060{
Guido van Rossum8700b422001-09-07 20:20:11 +00001061 return s != NULL && s->ob_type->tp_as_sequence &&
1062 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001063}
1064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001065int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001066PySequence_Size(PyObject *s)
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 null_error();
1072 return -1;
1073 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001074
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001075 m = s->ob_type->tp_as_sequence;
1076 if (m && m->sq_length)
1077 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001078
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001079 type_error("len() of unsized object");
1080 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001081}
1082
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001083#undef PySequence_Length
1084int
1085PySequence_Length(PyObject *s)
1086{
1087 return PySequence_Size(s);
1088}
1089#define PySequence_Length PySequence_Size
1090
Guido van Rossume15dee51995-07-18 14:12:02 +00001091PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001092PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001093{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001096 if (s == NULL || o == NULL)
1097 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001098
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099 m = s->ob_type->tp_as_sequence;
1100 if (m && m->sq_concat)
1101 return m->sq_concat(s, o);
1102
1103 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001104}
1105
1106PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001107PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001108{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001110
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001111 if (o == NULL)
1112 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001113
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001114 m = o->ob_type->tp_as_sequence;
1115 if (m && m->sq_repeat)
1116 return m->sq_repeat(o, count);
1117
1118 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001119}
1120
1121PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001122PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1123{
1124 PySequenceMethods *m;
1125
1126 if (s == NULL || o == NULL)
1127 return null_error();
1128
1129 m = s->ob_type->tp_as_sequence;
1130 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1131 return m->sq_inplace_concat(s, o);
1132 if (m && m->sq_concat)
1133 return m->sq_concat(s, o);
1134
1135 return type_error("object can't be concatenated");
1136}
1137
1138PyObject *
1139PySequence_InPlaceRepeat(PyObject *o, int count)
1140{
1141 PySequenceMethods *m;
1142
1143 if (o == NULL)
1144 return null_error();
1145
1146 m = o->ob_type->tp_as_sequence;
1147 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1148 return m->sq_inplace_repeat(o, count);
1149 if (m && m->sq_repeat)
1150 return m->sq_repeat(o, count);
1151
1152 return type_error("object can't be repeated");
1153}
1154
1155PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001156PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001157{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001159
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001160 if (s == NULL)
1161 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001162
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001163 m = s->ob_type->tp_as_sequence;
1164 if (m && m->sq_item) {
1165 if (i < 0) {
1166 if (m->sq_length) {
1167 int l = (*m->sq_length)(s);
1168 if (l < 0)
1169 return NULL;
1170 i += l;
1171 }
1172 }
1173 return m->sq_item(s, i);
1174 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001175
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001176 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001177}
1178
Thomas Wouters1d75a792000-08-17 22:37:32 +00001179static PyObject *
1180sliceobj_from_intint(int i, int j)
1181{
1182 PyObject *start, *end, *slice;
1183 start = PyInt_FromLong((long)i);
1184 if (!start)
1185 return NULL;
1186 end = PyInt_FromLong((long)j);
1187 if (!end) {
1188 Py_DECREF(start);
1189 return NULL;
1190 }
1191 slice = PySlice_New(start, end, NULL);
1192 Py_DECREF(start);
1193 Py_DECREF(end);
1194 return slice;
1195}
1196
Guido van Rossume15dee51995-07-18 14:12:02 +00001197PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001198PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001199{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001200 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001201 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001202
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001203 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001204
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205 m = s->ob_type->tp_as_sequence;
1206 if (m && m->sq_slice) {
1207 if (i1 < 0 || i2 < 0) {
1208 if (m->sq_length) {
1209 int l = (*m->sq_length)(s);
1210 if (l < 0)
1211 return NULL;
1212 if (i1 < 0)
1213 i1 += l;
1214 if (i2 < 0)
1215 i2 += l;
1216 }
1217 }
1218 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001219 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1220 PyObject *res;
1221 PyObject *slice = sliceobj_from_intint(i1, i2);
1222 if (!slice)
1223 return NULL;
1224 res = mp->mp_subscript(s, slice);
1225 Py_DECREF(slice);
1226 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001228
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001229 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001230}
1231
1232int
Fred Drake79912472000-07-09 04:06:11 +00001233PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001234{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001235 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001236
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 if (s == NULL) {
1238 null_error();
1239 return -1;
1240 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001241
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242 m = s->ob_type->tp_as_sequence;
1243 if (m && m->sq_ass_item) {
1244 if (i < 0) {
1245 if (m->sq_length) {
1246 int l = (*m->sq_length)(s);
1247 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001248 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001249 i += l;
1250 }
1251 }
1252 return m->sq_ass_item(s, i, o);
1253 }
1254
Raymond Hettinger98779e02003-10-27 09:22:16 +00001255 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001256 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001257}
1258
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001259int
Fred Drake79912472000-07-09 04:06:11 +00001260PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001261{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001263
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001264 if (s == NULL) {
1265 null_error();
1266 return -1;
1267 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001268
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001269 m = s->ob_type->tp_as_sequence;
1270 if (m && m->sq_ass_item) {
1271 if (i < 0) {
1272 if (m->sq_length) {
1273 int l = (*m->sq_length)(s);
1274 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001275 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001276 i += l;
1277 }
1278 }
1279 return m->sq_ass_item(s, i, (PyObject *)NULL);
1280 }
1281
1282 type_error("object doesn't support item deletion");
1283 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001284}
1285
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001286int
Fred Drake79912472000-07-09 04:06:11 +00001287PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001288{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001289 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001290 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001291
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001292 if (s == NULL) {
1293 null_error();
1294 return -1;
1295 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297 m = s->ob_type->tp_as_sequence;
1298 if (m && m->sq_ass_slice) {
1299 if (i1 < 0 || i2 < 0) {
1300 if (m->sq_length) {
1301 int l = (*m->sq_length)(s);
1302 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001303 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 if (i1 < 0)
1305 i1 += l;
1306 if (i2 < 0)
1307 i2 += l;
1308 }
1309 }
1310 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001311 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1312 int res;
1313 PyObject *slice = sliceobj_from_intint(i1, i2);
1314 if (!slice)
1315 return -1;
1316 res = mp->mp_ass_subscript(s, slice, o);
1317 Py_DECREF(slice);
1318 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001320
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321 type_error("object doesn't support slice assignment");
1322 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001323}
1324
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001325int
Fred Drake79912472000-07-09 04:06:11 +00001326PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001327{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001329
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001330 if (s == NULL) {
1331 null_error();
1332 return -1;
1333 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001334
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335 m = s->ob_type->tp_as_sequence;
1336 if (m && m->sq_ass_slice) {
1337 if (i1 < 0 || i2 < 0) {
1338 if (m->sq_length) {
1339 int l = (*m->sq_length)(s);
1340 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001341 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342 if (i1 < 0)
1343 i1 += l;
1344 if (i2 < 0)
1345 i2 += l;
1346 }
1347 }
1348 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1349 }
1350 type_error("object doesn't support slice deletion");
1351 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001352}
1353
Guido van Rossume15dee51995-07-18 14:12:02 +00001354PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001355PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001356{
Tim Peters6912d4d2001-05-05 03:56:37 +00001357 PyObject *it; /* iter(v) */
1358 int n; /* guess for result tuple size */
1359 PyObject *result;
1360 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001361
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001362 if (v == NULL)
1363 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001364
Tim Peters6912d4d2001-05-05 03:56:37 +00001365 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001366 if (PyTuple_CheckExact(v)) {
1367 /* Note that we can't know whether it's safe to return
1368 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001369 to exact tuples here. In contrast, lists always make
1370 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001371 Py_INCREF(v);
1372 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001373 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001374 if (PyList_Check(v))
1375 return PyList_AsTuple(v);
1376
Tim Peters6912d4d2001-05-05 03:56:37 +00001377 /* Get iterator. */
1378 it = PyObject_GetIter(v);
1379 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001380 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381
Tim Peters6912d4d2001-05-05 03:56:37 +00001382 /* Guess result size and allocate space. */
Raymond Hettinger7832cd62004-01-04 06:08:16 +00001383 n = PyObject_Size(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001384 if (n < 0) {
1385 PyErr_Clear();
1386 n = 10; /* arbitrary */
1387 }
1388 result = PyTuple_New(n);
1389 if (result == NULL)
1390 goto Fail;
1391
1392 /* Fill the tuple. */
1393 for (j = 0; ; ++j) {
1394 PyObject *item = PyIter_Next(it);
1395 if (item == NULL) {
1396 if (PyErr_Occurred())
1397 goto Fail;
1398 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001400 if (j >= n) {
1401 if (n < 500)
1402 n += 10;
1403 else
1404 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001405 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001406 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001407 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001408 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001409 }
1410 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411 }
1412
Tim Peters6912d4d2001-05-05 03:56:37 +00001413 /* Cut tuple back if guess was too large. */
1414 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001415 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001416 goto Fail;
1417
1418 Py_DECREF(it);
1419 return result;
1420
1421Fail:
1422 Py_XDECREF(result);
1423 Py_DECREF(it);
1424 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001425}
1426
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001427PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001428PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001429{
Tim Petersf553f892001-05-01 20:45:31 +00001430 PyObject *it; /* iter(v) */
1431 PyObject *result; /* result list */
1432 int n; /* guess for result list size */
1433 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001434
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001435 if (v == NULL)
1436 return null_error();
1437
Tim Petersf553f892001-05-01 20:45:31 +00001438 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001439 if (PyList_Check(v))
1440 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1441
Tim Petersf553f892001-05-01 20:45:31 +00001442 /* Get iterator. There may be some low-level efficiency to be gained
1443 * by caching the tp_iternext slot instead of using PyIter_Next()
1444 * later, but premature optimization is the root etc.
1445 */
1446 it = PyObject_GetIter(v);
1447 if (it == NULL)
1448 return NULL;
1449
1450 /* Guess a result list size. */
Raymond Hettingerb86269d2004-01-04 11:00:08 +00001451 n = PyObject_Size(v);
1452 if (n < 0) {
1453 PyErr_Clear();
Tim Petersf553f892001-05-01 20:45:31 +00001454 n = 8; /* arbitrary */
Raymond Hettingerb86269d2004-01-04 11:00:08 +00001455 }
Tim Petersf553f892001-05-01 20:45:31 +00001456 result = PyList_New(n);
1457 if (result == NULL) {
1458 Py_DECREF(it);
1459 return NULL;
1460 }
1461
1462 /* Run iterator to exhaustion. */
1463 for (i = 0; ; i++) {
1464 PyObject *item = PyIter_Next(it);
1465 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001466 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001467 Py_DECREF(result);
1468 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001469 }
Tim Petersf553f892001-05-01 20:45:31 +00001470 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001471 }
Tim Petersf553f892001-05-01 20:45:31 +00001472 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001473 PyList_SET_ITEM(result, i, item); /* steals ref */
1474 else {
1475 int status = PyList_Append(result, item);
1476 Py_DECREF(item); /* append creates a new ref */
1477 if (status < 0) {
1478 Py_DECREF(result);
1479 result = NULL;
1480 break;
1481 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001482 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001483 }
Tim Petersf553f892001-05-01 20:45:31 +00001484
1485 /* Cut back result list if initial guess was too large. */
1486 if (i < n && result != NULL) {
1487 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1488 Py_DECREF(result);
1489 result = NULL;
1490 }
1491 }
1492 Py_DECREF(it);
1493 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001494}
1495
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001496PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001497PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001498{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001499 PyObject *it;
1500
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001501 if (v == NULL)
1502 return null_error();
1503
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001504 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001505 Py_INCREF(v);
1506 return v;
1507 }
1508
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001509 it = PyObject_GetIter(v);
1510 if (it == NULL) {
1511 if (PyErr_ExceptionMatches(PyExc_TypeError))
1512 return type_error(m);
1513 return NULL;
1514 }
1515
1516 v = PySequence_Tuple(it);
1517 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001518
1519 return v;
1520}
1521
Tim Peters16a77ad2001-09-08 04:00:12 +00001522/* Iterate over seq. Result depends on the operation:
1523 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1524 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1525 set ValueError and return -1 if none found; also return -1 on error.
1526 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1527*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001528int
Tim Peters16a77ad2001-09-08 04:00:12 +00001529_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001530{
Tim Peters16a77ad2001-09-08 04:00:12 +00001531 int n;
1532 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1533 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001534
Tim Peters16a77ad2001-09-08 04:00:12 +00001535 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001536 null_error();
1537 return -1;
1538 }
Tim Peters75f8e352001-05-05 11:33:43 +00001539
Tim Peters16a77ad2001-09-08 04:00:12 +00001540 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001541 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001542 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001543 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001544 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001545
Tim Peters16a77ad2001-09-08 04:00:12 +00001546 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001547 for (;;) {
1548 int cmp;
1549 PyObject *item = PyIter_Next(it);
1550 if (item == NULL) {
1551 if (PyErr_Occurred())
1552 goto Fail;
1553 break;
1554 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001555
1556 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001557 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001558 if (cmp < 0)
1559 goto Fail;
1560 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001561 switch (operation) {
1562 case PY_ITERSEARCH_COUNT:
1563 ++n;
1564 if (n <= 0) {
1565 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001566 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001567 goto Fail;
1568 }
1569 break;
1570
1571 case PY_ITERSEARCH_INDEX:
1572 if (wrapped) {
1573 PyErr_SetString(PyExc_OverflowError,
1574 "index exceeds C int size");
1575 goto Fail;
1576 }
1577 goto Done;
1578
1579 case PY_ITERSEARCH_CONTAINS:
1580 n = 1;
1581 goto Done;
1582
1583 default:
1584 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001585 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001586 }
1587
1588 if (operation == PY_ITERSEARCH_INDEX) {
1589 ++n;
1590 if (n <= 0)
1591 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001592 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001593 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001594
1595 if (operation != PY_ITERSEARCH_INDEX)
1596 goto Done;
1597
1598 PyErr_SetString(PyExc_ValueError,
1599 "sequence.index(x): x not in sequence");
1600 /* fall into failure code */
1601Fail:
1602 n = -1;
1603 /* fall through */
1604Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001605 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001606 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001607
Guido van Rossume15dee51995-07-18 14:12:02 +00001608}
1609
Tim Peters16a77ad2001-09-08 04:00:12 +00001610/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611int
Tim Peters16a77ad2001-09-08 04:00:12 +00001612PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001613{
Tim Peters16a77ad2001-09-08 04:00:12 +00001614 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001615}
1616
Tim Peterscb8d3682001-05-05 21:05:01 +00001617/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001618 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001619 */
1620int
1621PySequence_Contains(PyObject *seq, PyObject *ob)
1622{
1623 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1624 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1625 if (sqm != NULL && sqm->sq_contains != NULL)
1626 return (*sqm->sq_contains)(seq, ob);
1627 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001628 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001629}
1630
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001631/* Backwards compatibility */
1632#undef PySequence_In
1633int
Fred Drake79912472000-07-09 04:06:11 +00001634PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001635{
1636 return PySequence_Contains(w, v);
1637}
1638
1639int
Fred Drake79912472000-07-09 04:06:11 +00001640PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001641{
Tim Peters16a77ad2001-09-08 04:00:12 +00001642 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001643}
1644
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001645/* Operations on mappings */
1646
1647int
Fred Drake79912472000-07-09 04:06:11 +00001648PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001649{
Guido van Rossum8700b422001-09-07 20:20:11 +00001650 return o && o->ob_type->tp_as_mapping &&
1651 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001652}
1653
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001654int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001655PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001656{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001657 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001658
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001659 if (o == NULL) {
1660 null_error();
1661 return -1;
1662 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001663
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001664 m = o->ob_type->tp_as_mapping;
1665 if (m && m->mp_length)
1666 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001667
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001668 type_error("len() of unsized object");
1669 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001670}
1671
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001672#undef PyMapping_Length
1673int
1674PyMapping_Length(PyObject *o)
1675{
1676 return PyMapping_Size(o);
1677}
1678#define PyMapping_Length PyMapping_Size
1679
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001680PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001681PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001682{
1683 PyObject *okey, *r;
1684
1685 if (key == NULL)
1686 return null_error();
1687
1688 okey = PyString_FromString(key);
1689 if (okey == NULL)
1690 return NULL;
1691 r = PyObject_GetItem(o, okey);
1692 Py_DECREF(okey);
1693 return r;
1694}
1695
1696int
Fred Drake79912472000-07-09 04:06:11 +00001697PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001698{
1699 PyObject *okey;
1700 int r;
1701
1702 if (key == NULL) {
1703 null_error();
1704 return -1;
1705 }
1706
1707 okey = PyString_FromString(key);
1708 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001709 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001710 r = PyObject_SetItem(o, okey, value);
1711 Py_DECREF(okey);
1712 return r;
1713}
1714
1715int
Fred Drake79912472000-07-09 04:06:11 +00001716PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001717{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001718 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001720 v = PyMapping_GetItemString(o, key);
1721 if (v) {
1722 Py_DECREF(v);
1723 return 1;
1724 }
1725 PyErr_Clear();
1726 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001727}
1728
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001729int
Fred Drake79912472000-07-09 04:06:11 +00001730PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001731{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001732 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001733
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001734 v = PyObject_GetItem(o, key);
1735 if (v) {
1736 Py_DECREF(v);
1737 return 1;
1738 }
1739 PyErr_Clear();
1740 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001741}
1742
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001743/* Operations on callable objects */
1744
1745/* XXX PyCallable_Check() is in object.c */
1746
Guido van Rossume15dee51995-07-18 14:12:02 +00001747PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001748PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001749{
Guido van Rossum5560b742001-09-14 16:47:50 +00001750 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001751}
Guido van Rossume15dee51995-07-18 14:12:02 +00001752
1753PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001754PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1755{
1756 ternaryfunc call;
1757
1758 if ((call = func->ob_type->tp_call) != NULL) {
1759 PyObject *result = (*call)(func, arg, kw);
1760 if (result == NULL && !PyErr_Occurred())
1761 PyErr_SetString(
1762 PyExc_SystemError,
1763 "NULL result without error in PyObject_Call");
1764 return result;
1765 }
Fred Drake573395a2001-11-01 20:26:12 +00001766 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1767 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001768 return NULL;
1769}
1770
1771PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001772PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001773{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001774 va_list va;
1775 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001776
Fred Drakeb92cf062001-10-27 06:16:31 +00001777 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001778 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001779
Fred Drakeb92cf062001-10-27 06:16:31 +00001780 if (format && *format) {
1781 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001782 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001783 va_end(va);
1784 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001785 else
1786 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001787
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001788 if (args == NULL)
1789 return NULL;
1790
1791 if (!PyTuple_Check(args)) {
1792 PyObject *a;
1793
1794 a = PyTuple_New(1);
1795 if (a == NULL)
1796 return NULL;
1797 if (PyTuple_SetItem(a, 0, args) < 0)
1798 return NULL;
1799 args = a;
1800 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001801 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001802
1803 Py_DECREF(args);
1804
1805 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001806}
1807
1808PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001809PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001810{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001811 va_list va;
1812 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001813
Fred Drakeb92cf062001-10-27 06:16:31 +00001814 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001815 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001816
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001817 func = PyObject_GetAttrString(o, name);
1818 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001819 PyErr_SetString(PyExc_AttributeError, name);
1820 return 0;
1821 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001822
Fred Drakeb92cf062001-10-27 06:16:31 +00001823 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001824 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001825
Fred Drakeb92cf062001-10-27 06:16:31 +00001826 if (format && *format) {
1827 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001828 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001829 va_end(va);
1830 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 else
1832 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001833
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001834 if (!args)
1835 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001836
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001837 if (!PyTuple_Check(args)) {
1838 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001839
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001840 a = PyTuple_New(1);
1841 if (a == NULL)
1842 return NULL;
1843 if (PyTuple_SetItem(a, 0, args) < 0)
1844 return NULL;
1845 args = a;
1846 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001847
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001848 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001849
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001850 Py_DECREF(args);
1851 Py_DECREF(func);
1852
1853 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001854}
Guido van Rossum823649d2001-03-21 18:40:58 +00001855
1856
Fred Drakeb421b8c2001-10-26 16:21:32 +00001857static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001858objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001859{
1860 int i, n = 0;
1861 va_list countva;
1862 PyObject *result, *tmp;
1863
1864#ifdef VA_LIST_IS_ARRAY
1865 memcpy(countva, va, sizeof(va_list));
1866#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001867#ifdef __va_copy
1868 __va_copy(countva, va);
1869#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001870 countva = va;
1871#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001872#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001873
1874 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1875 ++n;
1876 result = PyTuple_New(n);
1877 if (result != NULL && n > 0) {
1878 for (i = 0; i < n; ++i) {
1879 tmp = (PyObject *)va_arg(va, PyObject *);
1880 PyTuple_SET_ITEM(result, i, tmp);
1881 Py_INCREF(tmp);
1882 }
1883 }
1884 return result;
1885}
1886
1887PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001888PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001889{
1890 PyObject *args, *tmp;
1891 va_list vargs;
1892
1893 if (callable == NULL || name == NULL)
1894 return null_error();
1895
1896 callable = PyObject_GetAttr(callable, name);
1897 if (callable == NULL)
1898 return NULL;
1899
1900 /* count the args */
1901 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001902 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001903 va_end(vargs);
1904 if (args == NULL) {
1905 Py_DECREF(callable);
1906 return NULL;
1907 }
1908 tmp = PyObject_Call(callable, args, NULL);
1909 Py_DECREF(args);
1910 Py_DECREF(callable);
1911
1912 return tmp;
1913}
1914
1915PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001916PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001917{
1918 PyObject *args, *tmp;
1919 va_list vargs;
1920
1921 if (callable == NULL)
1922 return null_error();
1923
1924 /* count the args */
1925 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001926 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001927 va_end(vargs);
1928 if (args == NULL)
1929 return NULL;
1930 tmp = PyObject_Call(callable, args, NULL);
1931 Py_DECREF(args);
1932
1933 return tmp;
1934}
1935
1936
Guido van Rossum823649d2001-03-21 18:40:58 +00001937/* isinstance(), issubclass() */
1938
Barry Warsawf16951c2002-04-23 22:45:44 +00001939/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1940 * state that will almost never happen.
1941 *
1942 * 0. creating the __bases__ static string could get a MemoryError
1943 * 1. getattr(cls, '__bases__') could raise an AttributeError
1944 * 2. getattr(cls, '__bases__') could raise some other exception
1945 * 3. getattr(cls, '__bases__') could return a tuple
1946 * 4. getattr(cls, '__bases__') could return something other than a tuple
1947 *
1948 * Only state #3 is a non-error state and only it returns a non-NULL object
1949 * (it returns the retrieved tuple).
1950 *
1951 * Any raised AttributeErrors are masked by clearing the exception and
1952 * returning NULL. If an object other than a tuple comes out of __bases__,
1953 * then again, the return value is NULL. So yes, these two situations
1954 * produce exactly the same results: NULL is returned and no error is set.
1955 *
1956 * If some exception other than AttributeError is raised, then NULL is also
1957 * returned, but the exception is not cleared. That's because we want the
1958 * exception to be propagated along.
1959 *
1960 * Callers are expected to test for PyErr_Occurred() when the return value
1961 * is NULL to decide whether a valid exception should be propagated or not.
1962 * When there's no exception to propagate, it's customary for the caller to
1963 * set a TypeError.
1964 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001965static PyObject *
1966abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001967{
1968 static PyObject *__bases__ = NULL;
1969 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001970
1971 if (__bases__ == NULL) {
1972 __bases__ = PyString_FromString("__bases__");
1973 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001974 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001975 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001976 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001977 if (bases == NULL) {
1978 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1979 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001980 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001981 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001982 if (!PyTuple_Check(bases)) {
1983 Py_DECREF(bases);
1984 return NULL;
1985 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001986 return bases;
1987}
1988
1989
1990static int
1991abstract_issubclass(PyObject *derived, PyObject *cls)
1992{
1993 PyObject *bases;
1994 int i, n;
1995 int r = 0;
1996
1997
Guido van Rossum823649d2001-03-21 18:40:58 +00001998 if (derived == cls)
1999 return 1;
2000
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002001 if (PyTuple_Check(cls)) {
2002 /* Not a general sequence -- that opens up the road to
2003 recursion and stack overflow. */
2004 n = PyTuple_GET_SIZE(cls);
2005 for (i = 0; i < n; i++) {
2006 if (derived == PyTuple_GET_ITEM(cls, i))
2007 return 1;
2008 }
2009 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002010 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002011 if (bases == NULL) {
2012 if (PyErr_Occurred())
2013 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002014 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002015 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002016 n = PyTuple_GET_SIZE(bases);
2017 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002018 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002019 if (r != 0)
2020 break;
2021 }
2022
2023 Py_DECREF(bases);
2024
2025 return r;
2026}
2027
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002028static int
2029check_class(PyObject *cls, const char *error)
2030{
2031 PyObject *bases = abstract_get_bases(cls);
2032 if (bases == NULL) {
2033 /* Do not mask errors. */
2034 if (!PyErr_Occurred())
2035 PyErr_SetString(PyExc_TypeError, error);
2036 return 0;
2037 }
2038 Py_DECREF(bases);
2039 return -1;
2040}
2041
Guido van Rossum823649d2001-03-21 18:40:58 +00002042int
2043PyObject_IsInstance(PyObject *inst, PyObject *cls)
2044{
2045 PyObject *icls;
2046 static PyObject *__class__ = NULL;
2047 int retval = 0;
2048
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002049 if (__class__ == NULL) {
2050 __class__ = PyString_FromString("__class__");
2051 if (__class__ == NULL)
2052 return -1;
2053 }
2054
Neil Schemenauer6b471292001-10-18 03:18:43 +00002055 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2056 PyObject *inclass =
2057 (PyObject*)((PyInstanceObject*)inst)->in_class;
2058 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002059 }
2060 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002061 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002062 if (retval == 0) {
2063 PyObject *c = PyObject_GetAttr(inst, __class__);
2064 if (c == NULL) {
2065 PyErr_Clear();
2066 }
2067 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002068 if (c != (PyObject *)(inst->ob_type) &&
2069 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002070 retval = PyType_IsSubtype(
2071 (PyTypeObject *)c,
2072 (PyTypeObject *)cls);
2073 Py_DECREF(c);
2074 }
2075 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002076 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002077 else if (PyTuple_Check(cls)) {
2078 /* Not a general sequence -- that opens up the road to
2079 recursion and stack overflow. */
2080 int i, n;
2081
2082 n = PyTuple_GET_SIZE(cls);
2083 for (i = 0; i < n; i++) {
2084 retval = PyObject_IsInstance(
2085 inst, PyTuple_GET_ITEM(cls, i));
2086 if (retval != 0)
2087 break;
2088 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002089 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002090 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002091 if (!check_class(cls,
2092 "isinstance() arg 2 must be a class, type,"
2093 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002094 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002095 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002096 if (icls == NULL) {
2097 PyErr_Clear();
2098 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002099 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002100 else {
2101 retval = abstract_issubclass(icls, cls);
2102 Py_DECREF(icls);
2103 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002104 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002105
Guido van Rossum823649d2001-03-21 18:40:58 +00002106 return retval;
2107}
2108
2109int
2110PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2111{
2112 int retval;
2113
2114 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002115 if (!check_class(derived,
2116 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002117 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002118
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002119 if (PyTuple_Check(cls)) {
2120 int i;
2121 int n = PyTuple_GET_SIZE(cls);
2122 for (i = 0; i < n; ++i) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002123 retval = PyObject_IsSubclass(
2124 derived, PyTuple_GET_ITEM(cls, i));
2125 if (retval != 0) {
2126 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002127 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002128 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002129 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002130 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002131 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002132 else {
2133 if (!check_class(cls,
2134 "issubclass() arg 2 must be a class"
2135 " or tuple of classes"))
2136 return -1;
2137 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002138
2139 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002140 }
2141 else {
2142 /* shortcut */
2143 if (!(retval = (derived == cls)))
2144 retval = PyClass_IsSubclass(derived, cls);
2145 }
2146
2147 return retval;
2148}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002149
2150PyObject *
2151PyObject_GetIter(PyObject *o)
2152{
2153 PyTypeObject *t = o->ob_type;
2154 getiterfunc f = NULL;
2155 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2156 f = t->tp_iter;
2157 if (f == NULL) {
2158 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002159 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002160 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002161 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002162 return NULL;
2163 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002164 else {
2165 PyObject *res = (*f)(o);
2166 if (res != NULL && !PyIter_Check(res)) {
2167 PyErr_Format(PyExc_TypeError,
2168 "iter() returned non-iterator "
2169 "of type '%.100s'",
2170 res->ob_type->tp_name);
2171 Py_DECREF(res);
2172 res = NULL;
2173 }
2174 return res;
2175 }
2176}
2177
Tim Petersf4848da2001-05-05 00:14:56 +00002178/* Return next item.
2179 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2180 * If the iteration terminates normally, return NULL and clear the
2181 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2182 * will be false.
2183 * Else return the next object. PyErr_Occurred() will be false.
2184 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002185PyObject *
2186PyIter_Next(PyObject *iter)
2187{
Tim Petersf4848da2001-05-05 00:14:56 +00002188 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002189 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002190 result = (*iter->ob_type->tp_iternext)(iter);
2191 if (result == NULL &&
2192 PyErr_Occurred() &&
2193 PyErr_ExceptionMatches(PyExc_StopIteration))
2194 PyErr_Clear();
2195 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002196}