blob: 94af3da039b19ab2f33a1ebae00d5cd4084039b4 [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(
Raymond Hettinger10c66062004-05-12 21:35:06 +0000639 "can't multiply sequence by non-int");
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000640 }
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 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000954 m = o->ob_type->tp_as_number;
955 if (m && m->nb_int) { /* This should include subclasses of int */
956 PyObject *res = m->nb_int(o);
957 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
958 PyErr_Format(PyExc_TypeError,
959 "__int__ returned non-int (type %.200s)",
960 res->ob_type->tp_name);
961 Py_DECREF(res);
962 return NULL;
963 }
964 return res;
965 }
966 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000967 PyIntObject *io = (PyIntObject*)o;
968 return PyInt_FromLong(io->ob_ival);
969 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000970 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000971 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000972 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000973#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000974 if (PyUnicode_Check(o))
975 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
976 PyUnicode_GET_SIZE(o),
977 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000978#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000979 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000980 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000981
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000982 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000983}
984
Guido van Rossum9e896b32000-04-05 20:11:21 +0000985/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000986static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000987long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000988{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000989 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000990 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000991
Guido van Rossum4c08d552000-03-10 22:55:18 +0000992 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000993 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000994 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000995 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000996 PyErr_SetString(PyExc_ValueError,
997 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000998 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000999 return NULL;
1000 }
1001 return x;
1002}
1003
Guido van Rossume15dee51995-07-18 14:12:02 +00001004PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001005PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001006{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001007 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001008 const char *buffer;
1009 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001010
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001011 if (o == NULL)
1012 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001013 m = o->ob_type->tp_as_number;
1014 if (m && m->nb_long) { /* This should include subclasses of long */
1015 PyObject *res = m->nb_long(o);
1016 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1017 PyErr_Format(PyExc_TypeError,
1018 "__long__ returned non-long (type %.200s)",
1019 res->ob_type->tp_name);
1020 Py_DECREF(res);
1021 return NULL;
1022 }
1023 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001024 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001025 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001026 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001027 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001028 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001029 * doesn't do. In particular long('9.5') must raise an
1030 * exception, not truncate the float.
1031 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001032 return long_from_string(PyString_AS_STRING(o),
1033 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001034#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001035 if (PyUnicode_Check(o))
1036 /* The above check is done in PyLong_FromUnicode(). */
1037 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1038 PyUnicode_GET_SIZE(o),
1039 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001040#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001041 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1042 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001043
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001044 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001045}
1046
1047PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001048PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001049{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001050 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001051
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001052 if (o == NULL)
1053 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001054 m = o->ob_type->tp_as_number;
1055 if (m && m->nb_float) { /* This should include subclasses of float */
1056 PyObject *res = m->nb_float(o);
1057 if (res && !PyFloat_Check(res)) {
1058 PyErr_Format(PyExc_TypeError,
1059 "__float__ returned non-float (type %.200s)",
1060 res->ob_type->tp_name);
1061 Py_DECREF(res);
1062 return NULL;
1063 }
1064 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001065 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001066 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001067 PyFloatObject *po = (PyFloatObject *)o;
1068 return PyFloat_FromDouble(po->ob_fval);
1069 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001070 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001071}
1072
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001073/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001074
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001075int
Fred Drake79912472000-07-09 04:06:11 +00001076PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001077{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001078 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001079 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001080 return s != NULL && s->ob_type->tp_as_sequence &&
1081 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001082}
1083
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001084int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001085PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001086{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001087 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001088
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001089 if (s == NULL) {
1090 null_error();
1091 return -1;
1092 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001093
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094 m = s->ob_type->tp_as_sequence;
1095 if (m && m->sq_length)
1096 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001097
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001098 type_error("len() of unsized object");
1099 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001100}
1101
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001102#undef PySequence_Length
1103int
1104PySequence_Length(PyObject *s)
1105{
1106 return PySequence_Size(s);
1107}
1108#define PySequence_Length PySequence_Size
1109
Guido van Rossume15dee51995-07-18 14:12:02 +00001110PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001111PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001112{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001113 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001114
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001115 if (s == NULL || o == NULL)
1116 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001118 m = s->ob_type->tp_as_sequence;
1119 if (m && m->sq_concat)
1120 return m->sq_concat(s, o);
1121
1122 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001123}
1124
1125PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001126PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001127{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001128 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001129
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 if (o == NULL)
1131 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001132
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001133 m = o->ob_type->tp_as_sequence;
1134 if (m && m->sq_repeat)
1135 return m->sq_repeat(o, count);
1136
1137 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001138}
1139
1140PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001141PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1142{
1143 PySequenceMethods *m;
1144
1145 if (s == NULL || o == NULL)
1146 return null_error();
1147
1148 m = s->ob_type->tp_as_sequence;
1149 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1150 return m->sq_inplace_concat(s, o);
1151 if (m && m->sq_concat)
1152 return m->sq_concat(s, o);
1153
1154 return type_error("object can't be concatenated");
1155}
1156
1157PyObject *
1158PySequence_InPlaceRepeat(PyObject *o, int count)
1159{
1160 PySequenceMethods *m;
1161
1162 if (o == NULL)
1163 return null_error();
1164
1165 m = o->ob_type->tp_as_sequence;
1166 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1167 return m->sq_inplace_repeat(o, count);
1168 if (m && m->sq_repeat)
1169 return m->sq_repeat(o, count);
1170
1171 return type_error("object can't be repeated");
1172}
1173
1174PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001175PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001176{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001177 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001178
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001179 if (s == NULL)
1180 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001181
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001182 m = s->ob_type->tp_as_sequence;
1183 if (m && m->sq_item) {
1184 if (i < 0) {
1185 if (m->sq_length) {
1186 int l = (*m->sq_length)(s);
1187 if (l < 0)
1188 return NULL;
1189 i += l;
1190 }
1191 }
1192 return m->sq_item(s, i);
1193 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001194
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001195 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001196}
1197
Thomas Wouters1d75a792000-08-17 22:37:32 +00001198static PyObject *
1199sliceobj_from_intint(int i, int j)
1200{
1201 PyObject *start, *end, *slice;
1202 start = PyInt_FromLong((long)i);
1203 if (!start)
1204 return NULL;
1205 end = PyInt_FromLong((long)j);
1206 if (!end) {
1207 Py_DECREF(start);
1208 return NULL;
1209 }
1210 slice = PySlice_New(start, end, NULL);
1211 Py_DECREF(start);
1212 Py_DECREF(end);
1213 return slice;
1214}
1215
Guido van Rossume15dee51995-07-18 14:12:02 +00001216PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001217PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001218{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001219 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001220 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001221
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001223
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001224 m = s->ob_type->tp_as_sequence;
1225 if (m && m->sq_slice) {
1226 if (i1 < 0 || i2 < 0) {
1227 if (m->sq_length) {
1228 int l = (*m->sq_length)(s);
1229 if (l < 0)
1230 return NULL;
1231 if (i1 < 0)
1232 i1 += l;
1233 if (i2 < 0)
1234 i2 += l;
1235 }
1236 }
1237 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001238 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1239 PyObject *res;
1240 PyObject *slice = sliceobj_from_intint(i1, i2);
1241 if (!slice)
1242 return NULL;
1243 res = mp->mp_subscript(s, slice);
1244 Py_DECREF(slice);
1245 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001246 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001247
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001249}
1250
1251int
Fred Drake79912472000-07-09 04:06:11 +00001252PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001253{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001255
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001256 if (s == NULL) {
1257 null_error();
1258 return -1;
1259 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001260
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261 m = s->ob_type->tp_as_sequence;
1262 if (m && m->sq_ass_item) {
1263 if (i < 0) {
1264 if (m->sq_length) {
1265 int l = (*m->sq_length)(s);
1266 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001267 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001268 i += l;
1269 }
1270 }
1271 return m->sq_ass_item(s, i, o);
1272 }
1273
Raymond Hettinger98779e02003-10-27 09:22:16 +00001274 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001276}
1277
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001278int
Fred Drake79912472000-07-09 04:06:11 +00001279PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001280{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001281 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001282
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283 if (s == NULL) {
1284 null_error();
1285 return -1;
1286 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001287
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001288 m = s->ob_type->tp_as_sequence;
1289 if (m && m->sq_ass_item) {
1290 if (i < 0) {
1291 if (m->sq_length) {
1292 int l = (*m->sq_length)(s);
1293 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001294 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001295 i += l;
1296 }
1297 }
1298 return m->sq_ass_item(s, i, (PyObject *)NULL);
1299 }
1300
1301 type_error("object doesn't support item deletion");
1302 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001303}
1304
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001305int
Fred Drake79912472000-07-09 04:06:11 +00001306PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001307{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001308 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001309 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001310
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 if (s == NULL) {
1312 null_error();
1313 return -1;
1314 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001315
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001316 m = s->ob_type->tp_as_sequence;
1317 if (m && m->sq_ass_slice) {
1318 if (i1 < 0 || i2 < 0) {
1319 if (m->sq_length) {
1320 int l = (*m->sq_length)(s);
1321 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001322 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323 if (i1 < 0)
1324 i1 += l;
1325 if (i2 < 0)
1326 i2 += l;
1327 }
1328 }
1329 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001330 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1331 int res;
1332 PyObject *slice = sliceobj_from_intint(i1, i2);
1333 if (!slice)
1334 return -1;
1335 res = mp->mp_ass_subscript(s, slice, o);
1336 Py_DECREF(slice);
1337 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001338 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001339
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001340 type_error("object doesn't support slice assignment");
1341 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001342}
1343
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001344int
Fred Drake79912472000-07-09 04:06:11 +00001345PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001346{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001347 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001348
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001349 if (s == NULL) {
1350 null_error();
1351 return -1;
1352 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001353
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001354 m = s->ob_type->tp_as_sequence;
1355 if (m && m->sq_ass_slice) {
1356 if (i1 < 0 || i2 < 0) {
1357 if (m->sq_length) {
1358 int l = (*m->sq_length)(s);
1359 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001360 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001361 if (i1 < 0)
1362 i1 += l;
1363 if (i2 < 0)
1364 i2 += l;
1365 }
1366 }
1367 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1368 }
1369 type_error("object doesn't support slice deletion");
1370 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001371}
1372
Guido van Rossume15dee51995-07-18 14:12:02 +00001373PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001374PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001375{
Tim Peters6912d4d2001-05-05 03:56:37 +00001376 PyObject *it; /* iter(v) */
1377 int n; /* guess for result tuple size */
1378 PyObject *result;
1379 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001380
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381 if (v == NULL)
1382 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001383
Tim Peters6912d4d2001-05-05 03:56:37 +00001384 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001385 if (PyTuple_CheckExact(v)) {
1386 /* Note that we can't know whether it's safe to return
1387 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001388 to exact tuples here. In contrast, lists always make
1389 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 Py_INCREF(v);
1391 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001392 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001393 if (PyList_Check(v))
1394 return PyList_AsTuple(v);
1395
Tim Peters6912d4d2001-05-05 03:56:37 +00001396 /* Get iterator. */
1397 it = PyObject_GetIter(v);
1398 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001399 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001400
Tim Peters6912d4d2001-05-05 03:56:37 +00001401 /* Guess result size and allocate space. */
Raymond Hettinger7832cd62004-01-04 06:08:16 +00001402 n = PyObject_Size(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001403 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001404 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1405 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1406 Py_DECREF(it);
1407 return NULL;
1408 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001409 PyErr_Clear();
1410 n = 10; /* arbitrary */
1411 }
1412 result = PyTuple_New(n);
1413 if (result == NULL)
1414 goto Fail;
1415
1416 /* Fill the tuple. */
1417 for (j = 0; ; ++j) {
1418 PyObject *item = PyIter_Next(it);
1419 if (item == NULL) {
1420 if (PyErr_Occurred())
1421 goto Fail;
1422 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001424 if (j >= n) {
Raymond Hettinger4d012592004-12-16 10:38:38 +00001425 int oldn = n;
1426 /* The over-allocation strategy can grow a bit faster
1427 than for lists because unlike lists the
1428 over-allocation isn't permanent -- we reclaim
1429 the excess before the end of this routine.
1430 So, grow by ten and then add 25%.
1431 */
1432 n += 10;
1433 n += n >> 2;
1434 if (n < oldn) {
1435 /* Check for overflow */
1436 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001437 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001438 goto Fail;
1439 }
Tim Peters4324aa32001-05-28 22:30:08 +00001440 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001441 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001442 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001443 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001444 }
1445 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001446 }
1447
Tim Peters6912d4d2001-05-05 03:56:37 +00001448 /* Cut tuple back if guess was too large. */
1449 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001450 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001451 goto Fail;
1452
1453 Py_DECREF(it);
1454 return result;
1455
1456Fail:
1457 Py_XDECREF(result);
1458 Py_DECREF(it);
1459 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001460}
1461
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001462PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001463PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001464{
Tim Petersf553f892001-05-01 20:45:31 +00001465 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001466 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001467
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001468 if (v == NULL)
1469 return null_error();
1470
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001471 result = PyList_New(0);
1472 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001473 return NULL;
1474
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001475 rv = _PyList_Extend((PyListObject *)result, v);
1476 if (rv == NULL) {
1477 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001478 return NULL;
1479 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001480 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001481 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001482}
1483
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001484PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001485PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001486{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001487 PyObject *it;
1488
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001489 if (v == NULL)
1490 return null_error();
1491
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001492 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001493 Py_INCREF(v);
1494 return v;
1495 }
1496
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001497 it = PyObject_GetIter(v);
1498 if (it == NULL) {
1499 if (PyErr_ExceptionMatches(PyExc_TypeError))
1500 return type_error(m);
1501 return NULL;
1502 }
1503
Raymond Hettinger193814c2004-12-18 19:00:59 +00001504 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001505 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001506
1507 return v;
1508}
1509
Tim Peters16a77ad2001-09-08 04:00:12 +00001510/* Iterate over seq. Result depends on the operation:
1511 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1512 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1513 set ValueError and return -1 if none found; also return -1 on error.
1514 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1515*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001516int
Tim Peters16a77ad2001-09-08 04:00:12 +00001517_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001518{
Tim Peters16a77ad2001-09-08 04:00:12 +00001519 int n;
1520 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1521 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001522
Tim Peters16a77ad2001-09-08 04:00:12 +00001523 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001524 null_error();
1525 return -1;
1526 }
Tim Peters75f8e352001-05-05 11:33:43 +00001527
Tim Peters16a77ad2001-09-08 04:00:12 +00001528 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001529 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001530 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001531 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001532 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001533
Tim Peters16a77ad2001-09-08 04:00:12 +00001534 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001535 for (;;) {
1536 int cmp;
1537 PyObject *item = PyIter_Next(it);
1538 if (item == NULL) {
1539 if (PyErr_Occurred())
1540 goto Fail;
1541 break;
1542 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001543
1544 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001545 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001546 if (cmp < 0)
1547 goto Fail;
1548 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001549 switch (operation) {
1550 case PY_ITERSEARCH_COUNT:
1551 ++n;
1552 if (n <= 0) {
1553 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001554 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001555 goto Fail;
1556 }
1557 break;
1558
1559 case PY_ITERSEARCH_INDEX:
1560 if (wrapped) {
1561 PyErr_SetString(PyExc_OverflowError,
1562 "index exceeds C int size");
1563 goto Fail;
1564 }
1565 goto Done;
1566
1567 case PY_ITERSEARCH_CONTAINS:
1568 n = 1;
1569 goto Done;
1570
1571 default:
1572 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001573 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001574 }
1575
1576 if (operation == PY_ITERSEARCH_INDEX) {
1577 ++n;
1578 if (n <= 0)
1579 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001580 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001581 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001582
1583 if (operation != PY_ITERSEARCH_INDEX)
1584 goto Done;
1585
1586 PyErr_SetString(PyExc_ValueError,
1587 "sequence.index(x): x not in sequence");
1588 /* fall into failure code */
1589Fail:
1590 n = -1;
1591 /* fall through */
1592Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001593 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001594 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001595
Guido van Rossume15dee51995-07-18 14:12:02 +00001596}
1597
Tim Peters16a77ad2001-09-08 04:00:12 +00001598/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001599int
Tim Peters16a77ad2001-09-08 04:00:12 +00001600PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001601{
Tim Peters16a77ad2001-09-08 04:00:12 +00001602 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001603}
1604
Tim Peterscb8d3682001-05-05 21:05:01 +00001605/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001606 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001607 */
1608int
1609PySequence_Contains(PyObject *seq, PyObject *ob)
1610{
1611 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1612 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1613 if (sqm != NULL && sqm->sq_contains != NULL)
1614 return (*sqm->sq_contains)(seq, ob);
1615 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001616 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001617}
1618
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001619/* Backwards compatibility */
1620#undef PySequence_In
1621int
Fred Drake79912472000-07-09 04:06:11 +00001622PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001623{
1624 return PySequence_Contains(w, v);
1625}
1626
1627int
Fred Drake79912472000-07-09 04:06:11 +00001628PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001629{
Tim Peters16a77ad2001-09-08 04:00:12 +00001630 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001631}
1632
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001633/* Operations on mappings */
1634
1635int
Fred Drake79912472000-07-09 04:06:11 +00001636PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001637{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001638 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001639 return PyObject_HasAttrString(o, "__getitem__");
1640
1641 return o && o->ob_type->tp_as_mapping &&
1642 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001643 !(o->ob_type->tp_as_sequence &&
1644 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001645}
1646
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001647int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001648PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001649{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001650 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001651
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001652 if (o == NULL) {
1653 null_error();
1654 return -1;
1655 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001656
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001657 m = o->ob_type->tp_as_mapping;
1658 if (m && m->mp_length)
1659 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001660
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001661 type_error("len() of unsized object");
1662 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001663}
1664
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001665#undef PyMapping_Length
1666int
1667PyMapping_Length(PyObject *o)
1668{
1669 return PyMapping_Size(o);
1670}
1671#define PyMapping_Length PyMapping_Size
1672
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001673PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001674PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001675{
1676 PyObject *okey, *r;
1677
1678 if (key == NULL)
1679 return null_error();
1680
1681 okey = PyString_FromString(key);
1682 if (okey == NULL)
1683 return NULL;
1684 r = PyObject_GetItem(o, okey);
1685 Py_DECREF(okey);
1686 return r;
1687}
1688
1689int
Fred Drake79912472000-07-09 04:06:11 +00001690PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001691{
1692 PyObject *okey;
1693 int r;
1694
1695 if (key == NULL) {
1696 null_error();
1697 return -1;
1698 }
1699
1700 okey = PyString_FromString(key);
1701 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001702 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001703 r = PyObject_SetItem(o, okey, value);
1704 Py_DECREF(okey);
1705 return r;
1706}
1707
1708int
Fred Drake79912472000-07-09 04:06:11 +00001709PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001710{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001711 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001712
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001713 v = PyMapping_GetItemString(o, key);
1714 if (v) {
1715 Py_DECREF(v);
1716 return 1;
1717 }
1718 PyErr_Clear();
1719 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001720}
1721
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001722int
Fred Drake79912472000-07-09 04:06:11 +00001723PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001724{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001725 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001726
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001727 v = PyObject_GetItem(o, key);
1728 if (v) {
1729 Py_DECREF(v);
1730 return 1;
1731 }
1732 PyErr_Clear();
1733 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001734}
1735
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001736/* Operations on callable objects */
1737
1738/* XXX PyCallable_Check() is in object.c */
1739
Guido van Rossume15dee51995-07-18 14:12:02 +00001740PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001741PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001742{
Guido van Rossum5560b742001-09-14 16:47:50 +00001743 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001744}
Guido van Rossume15dee51995-07-18 14:12:02 +00001745
1746PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001747PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1748{
1749 ternaryfunc call;
1750
1751 if ((call = func->ob_type->tp_call) != NULL) {
1752 PyObject *result = (*call)(func, arg, kw);
1753 if (result == NULL && !PyErr_Occurred())
1754 PyErr_SetString(
1755 PyExc_SystemError,
1756 "NULL result without error in PyObject_Call");
1757 return result;
1758 }
Fred Drake573395a2001-11-01 20:26:12 +00001759 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1760 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001761 return NULL;
1762}
1763
1764PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001765PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001766{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001767 va_list va;
1768 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001769
Fred Drakeb92cf062001-10-27 06:16:31 +00001770 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001771 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001772
Fred Drakeb92cf062001-10-27 06:16:31 +00001773 if (format && *format) {
1774 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001775 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001776 va_end(va);
1777 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001778 else
1779 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001780
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001781 if (args == NULL)
1782 return NULL;
1783
1784 if (!PyTuple_Check(args)) {
1785 PyObject *a;
1786
1787 a = PyTuple_New(1);
1788 if (a == NULL)
1789 return NULL;
1790 if (PyTuple_SetItem(a, 0, args) < 0)
1791 return NULL;
1792 args = a;
1793 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001794 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001795
1796 Py_DECREF(args);
1797
1798 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001799}
1800
1801PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001802PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001803{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001804 va_list va;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001805 PyObject *args = NULL;
1806 PyObject *func = NULL;
1807 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001808
Fred Drakeb92cf062001-10-27 06:16:31 +00001809 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001810 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001811
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001812 func = PyObject_GetAttrString(o, name);
1813 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001814 PyErr_SetString(PyExc_AttributeError, name);
1815 return 0;
1816 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001817
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001818 if (!PyCallable_Check(func)) {
1819 type_error("call of non-callable attribute");
1820 goto exit;
1821 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001822
Fred Drakeb92cf062001-10-27 06:16:31 +00001823 if (format && *format) {
1824 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001825 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001826 va_end(va);
1827 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001828 else
1829 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001830
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 if (!args)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001832 goto exit;
Guido van Rossume15dee51995-07-18 14:12:02 +00001833
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001834 if (!PyTuple_Check(args)) {
1835 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001836
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001837 a = PyTuple_New(1);
1838 if (a == NULL)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001839 goto exit;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001840 if (PyTuple_SetItem(a, 0, args) < 0)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001841 goto exit;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001842 args = a;
1843 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001844
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001845 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001846
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001847 exit:
1848 Py_XDECREF(args);
1849 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001850
1851 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001852}
Guido van Rossum823649d2001-03-21 18:40:58 +00001853
1854
Fred Drakeb421b8c2001-10-26 16:21:32 +00001855static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001856objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001857{
1858 int i, n = 0;
1859 va_list countva;
1860 PyObject *result, *tmp;
1861
1862#ifdef VA_LIST_IS_ARRAY
1863 memcpy(countva, va, sizeof(va_list));
1864#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001865#ifdef __va_copy
1866 __va_copy(countva, va);
1867#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001868 countva = va;
1869#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001870#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001871
1872 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1873 ++n;
1874 result = PyTuple_New(n);
1875 if (result != NULL && n > 0) {
1876 for (i = 0; i < n; ++i) {
1877 tmp = (PyObject *)va_arg(va, PyObject *);
1878 PyTuple_SET_ITEM(result, i, tmp);
1879 Py_INCREF(tmp);
1880 }
1881 }
1882 return result;
1883}
1884
1885PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001886PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001887{
1888 PyObject *args, *tmp;
1889 va_list vargs;
1890
1891 if (callable == NULL || name == NULL)
1892 return null_error();
1893
1894 callable = PyObject_GetAttr(callable, name);
1895 if (callable == NULL)
1896 return NULL;
1897
1898 /* count the args */
1899 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001900 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001901 va_end(vargs);
1902 if (args == NULL) {
1903 Py_DECREF(callable);
1904 return NULL;
1905 }
1906 tmp = PyObject_Call(callable, args, NULL);
1907 Py_DECREF(args);
1908 Py_DECREF(callable);
1909
1910 return tmp;
1911}
1912
1913PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001914PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001915{
1916 PyObject *args, *tmp;
1917 va_list vargs;
1918
1919 if (callable == NULL)
1920 return null_error();
1921
1922 /* count the args */
1923 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001924 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001925 va_end(vargs);
1926 if (args == NULL)
1927 return NULL;
1928 tmp = PyObject_Call(callable, args, NULL);
1929 Py_DECREF(args);
1930
1931 return tmp;
1932}
1933
1934
Guido van Rossum823649d2001-03-21 18:40:58 +00001935/* isinstance(), issubclass() */
1936
Barry Warsawf16951c2002-04-23 22:45:44 +00001937/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1938 * state that will almost never happen.
1939 *
1940 * 0. creating the __bases__ static string could get a MemoryError
1941 * 1. getattr(cls, '__bases__') could raise an AttributeError
1942 * 2. getattr(cls, '__bases__') could raise some other exception
1943 * 3. getattr(cls, '__bases__') could return a tuple
1944 * 4. getattr(cls, '__bases__') could return something other than a tuple
1945 *
1946 * Only state #3 is a non-error state and only it returns a non-NULL object
1947 * (it returns the retrieved tuple).
1948 *
1949 * Any raised AttributeErrors are masked by clearing the exception and
1950 * returning NULL. If an object other than a tuple comes out of __bases__,
1951 * then again, the return value is NULL. So yes, these two situations
1952 * produce exactly the same results: NULL is returned and no error is set.
1953 *
1954 * If some exception other than AttributeError is raised, then NULL is also
1955 * returned, but the exception is not cleared. That's because we want the
1956 * exception to be propagated along.
1957 *
1958 * Callers are expected to test for PyErr_Occurred() when the return value
1959 * is NULL to decide whether a valid exception should be propagated or not.
1960 * When there's no exception to propagate, it's customary for the caller to
1961 * set a TypeError.
1962 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001963static PyObject *
1964abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001965{
1966 static PyObject *__bases__ = NULL;
1967 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001968
1969 if (__bases__ == NULL) {
1970 __bases__ = PyString_FromString("__bases__");
1971 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001972 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001973 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001974 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001975 if (bases == NULL) {
1976 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1977 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001978 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001979 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001980 if (!PyTuple_Check(bases)) {
1981 Py_DECREF(bases);
1982 return NULL;
1983 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001984 return bases;
1985}
1986
1987
1988static int
1989abstract_issubclass(PyObject *derived, PyObject *cls)
1990{
1991 PyObject *bases;
1992 int i, n;
1993 int r = 0;
1994
1995
Guido van Rossum823649d2001-03-21 18:40:58 +00001996 if (derived == cls)
1997 return 1;
1998
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00001999 if (PyTuple_Check(cls)) {
2000 /* Not a general sequence -- that opens up the road to
2001 recursion and stack overflow. */
2002 n = PyTuple_GET_SIZE(cls);
2003 for (i = 0; i < n; i++) {
2004 if (derived == PyTuple_GET_ITEM(cls, i))
2005 return 1;
2006 }
2007 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002008 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002009 if (bases == NULL) {
2010 if (PyErr_Occurred())
2011 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002012 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002013 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002014 n = PyTuple_GET_SIZE(bases);
2015 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002016 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002017 if (r != 0)
2018 break;
2019 }
2020
2021 Py_DECREF(bases);
2022
2023 return r;
2024}
2025
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002026static int
2027check_class(PyObject *cls, const char *error)
2028{
2029 PyObject *bases = abstract_get_bases(cls);
2030 if (bases == NULL) {
2031 /* Do not mask errors. */
2032 if (!PyErr_Occurred())
2033 PyErr_SetString(PyExc_TypeError, error);
2034 return 0;
2035 }
2036 Py_DECREF(bases);
2037 return -1;
2038}
2039
Brett Cannon4f653312004-03-20 22:52:14 +00002040static int
2041recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002042{
2043 PyObject *icls;
2044 static PyObject *__class__ = NULL;
2045 int retval = 0;
2046
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002047 if (__class__ == NULL) {
2048 __class__ = PyString_FromString("__class__");
2049 if (__class__ == NULL)
2050 return -1;
2051 }
2052
Neil Schemenauer6b471292001-10-18 03:18:43 +00002053 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2054 PyObject *inclass =
2055 (PyObject*)((PyInstanceObject*)inst)->in_class;
2056 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002057 }
2058 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002059 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002060 if (retval == 0) {
2061 PyObject *c = PyObject_GetAttr(inst, __class__);
2062 if (c == NULL) {
2063 PyErr_Clear();
2064 }
2065 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002066 if (c != (PyObject *)(inst->ob_type) &&
2067 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002068 retval = PyType_IsSubtype(
2069 (PyTypeObject *)c,
2070 (PyTypeObject *)cls);
2071 Py_DECREF(c);
2072 }
2073 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002074 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002075 else if (PyTuple_Check(cls)) {
Guido van Rossum03290ec2001-10-07 20:54:12 +00002076 int i, n;
2077
Brett Cannon4f653312004-03-20 22:52:14 +00002078 if (!recursion_depth) {
2079 PyErr_SetString(PyExc_RuntimeError,
2080 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002081 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002082 }
2083
Guido van Rossum03290ec2001-10-07 20:54:12 +00002084 n = PyTuple_GET_SIZE(cls);
2085 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002086 retval = recursive_isinstance(
2087 inst,
2088 PyTuple_GET_ITEM(cls, i),
2089 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002090 if (retval != 0)
2091 break;
2092 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002093 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002094 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002095 if (!check_class(cls,
2096 "isinstance() arg 2 must be a class, type,"
2097 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002098 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002099 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002100 if (icls == NULL) {
2101 PyErr_Clear();
2102 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002103 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002104 else {
2105 retval = abstract_issubclass(icls, cls);
2106 Py_DECREF(icls);
2107 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002108 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002109
Guido van Rossum823649d2001-03-21 18:40:58 +00002110 return retval;
2111}
2112
2113int
Brett Cannon4f653312004-03-20 22:52:14 +00002114PyObject_IsInstance(PyObject *inst, PyObject *cls)
2115{
2116 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2117}
2118
2119static int
2120recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002121{
2122 int retval;
2123
2124 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002125 if (!check_class(derived,
2126 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002127 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002128
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002129 if (PyTuple_Check(cls)) {
2130 int i;
2131 int n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002132
2133 if (!recursion_depth) {
2134 PyErr_SetString(PyExc_RuntimeError,
2135 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002136 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002137 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002138 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002139 retval = recursive_issubclass(
2140 derived,
2141 PyTuple_GET_ITEM(cls, i),
2142 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002143 if (retval != 0) {
2144 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002145 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002146 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002147 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002148 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002149 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002150 else {
2151 if (!check_class(cls,
2152 "issubclass() arg 2 must be a class"
2153 " or tuple of classes"))
2154 return -1;
2155 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002156
2157 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002158 }
2159 else {
2160 /* shortcut */
2161 if (!(retval = (derived == cls)))
2162 retval = PyClass_IsSubclass(derived, cls);
2163 }
2164
2165 return retval;
2166}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002167
Brett Cannon4f653312004-03-20 22:52:14 +00002168int
2169PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2170{
2171 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2172}
2173
2174
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002175PyObject *
2176PyObject_GetIter(PyObject *o)
2177{
2178 PyTypeObject *t = o->ob_type;
2179 getiterfunc f = NULL;
2180 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2181 f = t->tp_iter;
2182 if (f == NULL) {
2183 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002184 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002185 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002186 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002187 return NULL;
2188 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002189 else {
2190 PyObject *res = (*f)(o);
2191 if (res != NULL && !PyIter_Check(res)) {
2192 PyErr_Format(PyExc_TypeError,
2193 "iter() returned non-iterator "
2194 "of type '%.100s'",
2195 res->ob_type->tp_name);
2196 Py_DECREF(res);
2197 res = NULL;
2198 }
2199 return res;
2200 }
2201}
2202
Tim Petersf4848da2001-05-05 00:14:56 +00002203/* Return next item.
2204 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2205 * If the iteration terminates normally, return NULL and clear the
2206 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2207 * will be false.
2208 * Else return the next object. PyErr_Occurred() will be false.
2209 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002210PyObject *
2211PyIter_Next(PyObject *iter)
2212{
Tim Petersf4848da2001-05-05 00:14:56 +00002213 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002214 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002215 result = (*iter->ob_type->tp_iternext)(iter);
2216 if (result == NULL &&
2217 PyErr_Occurred() &&
2218 PyErr_ExceptionMatches(PyExc_StopIteration))
2219 PyErr_Clear();
2220 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002221}