blob: 7e2cdbcfa09b86d0f010400f4b7a6b07a640752d [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 Rossum38fff8c2006-03-07 18:50:55 +000011#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX)
12
Martin v. Löwis5cb69362006-04-14 09:08:42 +000013#ifdef HAVE_DECLSPEC_DLL
14PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable_object,
15 char *format, ...);
16PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *o, char *m,
17 char *format, ...);
18#endif
19
20
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000021/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000022
23static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000024type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000025{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000026 PyErr_SetString(PyExc_TypeError, msg);
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossum052b7e11996-11-11 15:08:19 +000030static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000031null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000032{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000033 if (!PyErr_Occurred())
34 PyErr_SetString(PyExc_SystemError,
35 "null argument to internal routine");
36 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000037}
38
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000039/* Operations on any object */
40
41int
Fred Drake79912472000-07-09 04:06:11 +000042PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000043{
44 int r;
45
46 if (o1 == NULL || o2 == NULL) {
47 null_error();
48 return -1;
49 }
50 r = PyObject_Compare(o1, o2);
51 if (PyErr_Occurred())
52 return -1;
53 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000054 return 0;
55}
Guido van Rossume15dee51995-07-18 14:12:02 +000056
57PyObject *
Fred Drake79912472000-07-09 04:06:11 +000058PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000059{
60 PyObject *v;
61
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 if (o == NULL)
63 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000064 v = (PyObject *)o->ob_type;
65 Py_INCREF(v);
66 return v;
67}
68
Martin v. Löwis18e16552006-02-15 17:27:45 +000069Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000070PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000071{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000072 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000074 if (o == NULL) {
75 null_error();
76 return -1;
77 }
Guido van Rossume15dee51995-07-18 14:12:02 +000078
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000079 m = o->ob_type->tp_as_sequence;
80 if (m && m->sq_length)
81 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000082
Jeremy Hylton6253f832000-07-12 12:56:19 +000083 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000084}
85
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000086#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000087Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000088PyObject_Length(PyObject *o)
89{
90 return PyObject_Size(o);
91}
92#define PyObject_Length PyObject_Size
93
Martin v. Löwis18e16552006-02-15 17:27:45 +000094Py_ssize_t
Armin Rigof5b3e362006-02-11 21:32:43 +000095_PyObject_LengthHint(PyObject *o)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000096{
Martin v. Löwis18e16552006-02-15 17:27:45 +000097 Py_ssize_t rv = PyObject_Size(o);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000098 if (rv != -1)
99 return rv;
100 if (PyErr_ExceptionMatches(PyExc_TypeError) ||
101 PyErr_ExceptionMatches(PyExc_AttributeError)) {
102 PyObject *err_type, *err_value, *err_tb, *ro;
103
104 PyErr_Fetch(&err_type, &err_value, &err_tb);
Armin Rigof5b3e362006-02-11 21:32:43 +0000105 ro = PyObject_CallMethod(o, "__length_hint__", NULL);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000106 if (ro != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000107 rv = PyInt_AsLong(ro);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000108 Py_DECREF(ro);
109 Py_XDECREF(err_type);
110 Py_XDECREF(err_value);
111 Py_XDECREF(err_tb);
112 return rv;
113 }
114 PyErr_Restore(err_type, err_value, err_tb);
115 }
116 return -1;
117}
118
Guido van Rossume15dee51995-07-18 14:12:02 +0000119PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000120PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000121{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000122 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000123
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000124 if (o == NULL || key == NULL)
125 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000126
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000127 m = o->ob_type->tp_as_mapping;
128 if (m && m->mp_subscript)
129 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000130
Guido van Rossum21308241998-08-13 16:44:44 +0000131 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000132 PyNumberMethods *nb = key->ob_type->tp_as_number;
133 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
134 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000135 if (key_value == -1 && PyErr_Occurred())
136 return NULL;
137 return PySequence_GetItem(o, key_value);
138 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000139 else if (o->ob_type->tp_as_sequence->sq_item)
140 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000141 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000142
143 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000144}
145
146int
Fred Drake79912472000-07-09 04:06:11 +0000147PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000148{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000149 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000150
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000151 if (o == NULL || key == NULL || value == NULL) {
152 null_error();
153 return -1;
154 }
155 m = o->ob_type->tp_as_mapping;
156 if (m && m->mp_ass_subscript)
157 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000158
Guido van Rossum21308241998-08-13 16:44:44 +0000159 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000160 PyNumberMethods *nb = key->ob_type->tp_as_number;
161 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
162 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000163 if (key_value == -1 && PyErr_Occurred())
164 return -1;
165 return PySequence_SetItem(o, key_value, value);
166 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000167 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
168 type_error("sequence index must be integer");
169 return -1;
170 }
Guido van Rossum21308241998-08-13 16:44:44 +0000171 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000172
173 type_error("object does not support item assignment");
174 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000175}
176
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000177int
Fred Drake79912472000-07-09 04:06:11 +0000178PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000179{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000180 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000181
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000182 if (o == NULL || key == NULL) {
183 null_error();
184 return -1;
185 }
186 m = o->ob_type->tp_as_mapping;
187 if (m && m->mp_ass_subscript)
188 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000189
Guido van Rossum21308241998-08-13 16:44:44 +0000190 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000191 PyNumberMethods *nb = key->ob_type->tp_as_number;
192 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
193 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000194 if (key_value == -1 && PyErr_Occurred())
195 return -1;
196 return PySequence_DelItem(o, key_value);
197 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000198 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
199 type_error("sequence index must be integer");
200 return -1;
201 }
Guido van Rossum21308241998-08-13 16:44:44 +0000202 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000203
204 type_error("object does not support item deletion");
205 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000206}
207
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000208int
209PyObject_DelItemString(PyObject *o, char *key)
210{
211 PyObject *okey;
212 int ret;
213
214 if (o == NULL || key == NULL) {
215 null_error();
216 return -1;
217 }
218 okey = PyString_FromString(key);
219 if (okey == NULL)
220 return -1;
221 ret = PyObject_DelItem(o, okey);
222 Py_DECREF(okey);
223 return ret;
224}
225
Guido van Rossum4c08d552000-03-10 22:55:18 +0000226int PyObject_AsCharBuffer(PyObject *obj,
227 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000228 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000229{
230 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000231 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000232 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000233
234 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
235 null_error();
236 return -1;
237 }
238 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000239 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000241 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242 PyErr_SetString(PyExc_TypeError,
243 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000244 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000245 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000246 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000247 PyErr_SetString(PyExc_TypeError,
248 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000249 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000250 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000251 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000252 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000253 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000254 *buffer = pp;
255 *buffer_len = len;
256 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000257}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000258
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259int
260PyObject_CheckReadBuffer(PyObject *obj)
261{
262 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
263
264 if (pb == NULL ||
265 pb->bf_getreadbuffer == NULL ||
266 pb->bf_getsegcount == NULL ||
267 (*pb->bf_getsegcount)(obj, NULL) != 1)
268 return 0;
269 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000270}
271
272int PyObject_AsReadBuffer(PyObject *obj,
273 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000274 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000275{
276 PyBufferProcs *pb;
277 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000278 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000279
280 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
281 null_error();
282 return -1;
283 }
284 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000285 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000286 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000287 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288 PyErr_SetString(PyExc_TypeError,
289 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000290 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000291 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000292 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000293 PyErr_SetString(PyExc_TypeError,
294 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000295 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000296 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000297 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000298 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000299 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000300 *buffer = pp;
301 *buffer_len = len;
302 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000303}
304
305int PyObject_AsWriteBuffer(PyObject *obj,
306 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000307 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000308{
309 PyBufferProcs *pb;
310 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000311 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000312
313 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
314 null_error();
315 return -1;
316 }
317 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000318 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000319 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000320 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321 PyErr_SetString(PyExc_TypeError,
322 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000323 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000324 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000325 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000326 PyErr_SetString(PyExc_TypeError,
327 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000328 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000329 }
330 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
331 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000332 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000333 *buffer = pp;
334 *buffer_len = len;
335 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000336}
337
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000338/* Operations on numbers */
339
340int
Fred Drake79912472000-07-09 04:06:11 +0000341PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000342{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000343 return o && o->ob_type->tp_as_number &&
344 (o->ob_type->tp_as_number->nb_int ||
345 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000346}
347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000348/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000349
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000350/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000351
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000352#define NB_SLOT(x) offsetof(PyNumberMethods, x)
353#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000354 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000355#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000356 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000357
358/*
359 Calling scheme used for binary operations:
360
361 v w Action
362 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000363 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000364 new old v.op(v,w), coerce(v,w), v.op(v,w)
365 old new w.op(v,w), coerce(v,w), v.op(v,w)
366 old old coerce(v,w), v.op(v,w)
367
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000368 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
369 v->ob_type
370
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000371 Legend:
372 -------
373 * new == new style number
374 * old == old style number
375 * Action indicates the order in which operations are tried until either
376 a valid result is produced or an error occurs.
377
378 */
379
380static PyObject *
381binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000382{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000383 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000384 binaryfunc slotv = NULL;
385 binaryfunc slotw = NULL;
386
387 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000388 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000389 if (w->ob_type != v->ob_type &&
390 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000391 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000392 if (slotw == slotv)
393 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000394 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000395 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000396 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
397 x = slotw(v, w);
398 if (x != Py_NotImplemented)
399 return x;
400 Py_DECREF(x); /* can't do it */
401 slotw = NULL;
402 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000403 x = slotv(v, w);
404 if (x != Py_NotImplemented)
405 return x;
406 Py_DECREF(x); /* can't do it */
407 }
408 if (slotw) {
409 x = slotw(v, w);
410 if (x != Py_NotImplemented)
411 return x;
412 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000413 }
414 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
415 int err = PyNumber_CoerceEx(&v, &w);
416 if (err < 0) {
417 return NULL;
418 }
419 if (err == 0) {
420 PyNumberMethods *mv = v->ob_type->tp_as_number;
421 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000422 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000423 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000424 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000425 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000426 Py_DECREF(v);
427 Py_DECREF(w);
428 return x;
429 }
430 }
431 /* CoerceEx incremented the reference counts */
432 Py_DECREF(v);
433 Py_DECREF(w);
434 }
435 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000436 Py_INCREF(Py_NotImplemented);
437 return Py_NotImplemented;
438}
Guido van Rossum77660912002-04-16 16:32:50 +0000439
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000440static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000441binop_type_error(PyObject *v, PyObject *w, const char *op_name)
442{
443 PyErr_Format(PyExc_TypeError,
444 "unsupported operand type(s) for %s: '%s' and '%s'",
445 op_name,
446 v->ob_type->tp_name,
447 w->ob_type->tp_name);
448 return NULL;
449}
450
451static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000452binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
453{
454 PyObject *result = binary_op1(v, w, op_slot);
455 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000456 Py_DECREF(result);
457 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000458 }
459 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000460}
461
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000462
463/*
464 Calling scheme used for ternary operations:
465
Guido van Rossum84675ac2001-09-29 01:05:03 +0000466 *** In some cases, w.op is called before v.op; see binary_op1. ***
467
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000468 v w z Action
469 -------------------------------------------------------------------
470 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
471 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
472 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
473 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
474 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
475 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
476 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
477 old old old coerce(v,w,z), v.op(v,w,z)
478
479 Legend:
480 -------
481 * new == new style number
482 * old == old style number
483 * Action indicates the order in which operations are tried until either
484 a valid result is produced or an error occurs.
485 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
486 only if z != Py_None; if z == Py_None, then it is treated as absent
487 variable and only coerce(v,w) is tried.
488
489 */
490
491static PyObject *
492ternary_op(PyObject *v,
493 PyObject *w,
494 PyObject *z,
495 const int op_slot,
496 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000497{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000498 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000499 PyObject *x = NULL;
500 ternaryfunc slotv = NULL;
501 ternaryfunc slotw = NULL;
502 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000503
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000504 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000505 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000506 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000507 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000508 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000509 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000510 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000511 if (slotw == slotv)
512 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000513 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000514 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000515 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
516 x = slotw(v, w, z);
517 if (x != Py_NotImplemented)
518 return x;
519 Py_DECREF(x); /* can't do it */
520 slotw = NULL;
521 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000522 x = slotv(v, w, z);
523 if (x != Py_NotImplemented)
524 return x;
525 Py_DECREF(x); /* can't do it */
526 }
527 if (slotw) {
528 x = slotw(v, w, z);
529 if (x != Py_NotImplemented)
530 return x;
531 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000532 }
533 mz = z->ob_type->tp_as_number;
534 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000535 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000536 if (slotz == slotv || slotz == slotw)
537 slotz = NULL;
538 if (slotz) {
539 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000540 if (x != Py_NotImplemented)
541 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000542 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000543 }
544 }
545
546 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
547 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
548 /* we have an old style operand, coerce */
549 PyObject *v1, *z1, *w2, *z2;
550 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000551
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000552 c = PyNumber_Coerce(&v, &w);
553 if (c != 0)
554 goto error3;
555
556 /* Special case: if the third argument is None, it is
557 treated as absent argument and not coerced. */
558 if (z == Py_None) {
559 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000560 slotz = NB_TERNOP(v->ob_type->tp_as_number,
561 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000562 if (slotz)
563 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000564 else
565 c = -1;
566 }
567 else
568 c = -1;
569 goto error2;
570 }
571 v1 = v;
572 z1 = z;
573 c = PyNumber_Coerce(&v1, &z1);
574 if (c != 0)
575 goto error2;
576 w2 = w;
577 z2 = z1;
578 c = PyNumber_Coerce(&w2, &z2);
579 if (c != 0)
580 goto error1;
581
582 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000583 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
584 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000585 if (slotv)
586 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000587 else
588 c = -1;
589 }
590 else
591 c = -1;
592
593 Py_DECREF(w2);
594 Py_DECREF(z2);
595 error1:
596 Py_DECREF(v1);
597 Py_DECREF(z1);
598 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000599 Py_DECREF(v);
600 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000601 error3:
602 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000603 return x;
604 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000605
606 if (z == Py_None)
607 PyErr_Format(
608 PyExc_TypeError,
609 "unsupported operand type(s) for ** or pow(): "
610 "'%s' and '%s'",
611 v->ob_type->tp_name,
612 w->ob_type->tp_name);
613 else
614 PyErr_Format(
615 PyExc_TypeError,
616 "unsupported operand type(s) for pow(): "
617 "'%s', '%s', '%s'",
618 v->ob_type->tp_name,
619 w->ob_type->tp_name,
620 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000621 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000622}
623
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000624#define BINARY_FUNC(func, op, op_name) \
625 PyObject * \
626 func(PyObject *v, PyObject *w) { \
627 return binary_op(v, w, NB_SLOT(op), op_name); \
628 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000629
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000630BINARY_FUNC(PyNumber_Or, nb_or, "|")
631BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
632BINARY_FUNC(PyNumber_And, nb_and, "&")
633BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
634BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
635BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000636BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
637BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000638
639PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000640PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000641{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000642 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
643 if (result == Py_NotImplemented) {
644 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000645 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000646 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000647 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000648 }
Armin Rigofd163f92005-12-29 15:59:19 +0000649 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000650 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000651 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000652}
653
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000654static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000655sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000656{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000657 Py_ssize_t count;
658 PyNumberMethods *nb = n->ob_type->tp_as_number;
659 if (nb != NULL && HASINDEX(n) && nb->nb_index != NULL) {
660 count = nb->nb_index(n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000661 if (count == -1 && PyErr_Occurred())
662 return NULL;
663 }
664 else {
665 return type_error(
Raymond Hettinger10c66062004-05-12 21:35:06 +0000666 "can't multiply sequence by non-int");
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000667 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000668 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000669}
670
671PyObject *
672PyNumber_Multiply(PyObject *v, PyObject *w)
673{
674 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
675 if (result == Py_NotImplemented) {
676 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
677 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000678 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000679 if (mv && mv->sq_repeat) {
680 return sequence_repeat(mv->sq_repeat, v, w);
681 }
682 else if (mw && mw->sq_repeat) {
683 return sequence_repeat(mw->sq_repeat, w, v);
684 }
685 result = binop_type_error(v, w, "*");
686 }
687 return result;
688}
689
Guido van Rossume15dee51995-07-18 14:12:02 +0000690PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000691PyNumber_FloorDivide(PyObject *v, PyObject *w)
692{
693 /* XXX tp_flags test */
694 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
695}
696
697PyObject *
698PyNumber_TrueDivide(PyObject *v, PyObject *w)
699{
700 /* XXX tp_flags test */
701 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
702}
703
704PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000705PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000706{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000707 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000708}
709
710PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000711PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000712{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000713 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000714}
715
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000716/* Binary in-place operators */
717
718/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000719 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000720
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000721 - If the left hand object has the appropriate struct members, and
722 they are filled, call the appropriate function and return the
723 result. No coercion is done on the arguments; the left-hand object
724 is the one the operation is performed on, and it's up to the
725 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000726
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000727 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000728 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729
730 */
731
Guido van Rossum77660912002-04-16 16:32:50 +0000732#define HASINPLACE(t) \
733 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000734
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000735static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000736binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000737{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000738 PyNumberMethods *mv = v->ob_type->tp_as_number;
739 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000740 binaryfunc slot = NB_BINOP(mv, iop_slot);
741 if (slot) {
742 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000743 if (x != Py_NotImplemented) {
744 return x;
745 }
746 Py_DECREF(x);
747 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000748 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000749 return binary_op1(v, w, op_slot);
750}
751
752static PyObject *
753binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
754 const char *op_name)
755{
756 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
757 if (result == Py_NotImplemented) {
758 Py_DECREF(result);
759 return binop_type_error(v, w, op_name);
760 }
761 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000762}
763
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000764#define INPLACE_BINOP(func, iop, op, op_name) \
765 PyObject * \
766 func(PyObject *v, PyObject *w) { \
767 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000768 }
769
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000770INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
771INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
772INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
773INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
774INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
775INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
776INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000777
778PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000779PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
780{
781 /* XXX tp_flags test */
782 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
783 NB_SLOT(nb_floor_divide), "//=");
784}
785
786PyObject *
787PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
788{
789 /* XXX tp_flags test */
790 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
791 NB_SLOT(nb_true_divide), "/=");
792}
793
794PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000795PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
796{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000797 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
798 NB_SLOT(nb_add));
799 if (result == Py_NotImplemented) {
800 PySequenceMethods *m = v->ob_type->tp_as_sequence;
801 Py_DECREF(result);
802 if (m != NULL) {
803 binaryfunc f = NULL;
804 if (HASINPLACE(v))
805 f = m->sq_inplace_concat;
806 if (f == NULL)
807 f = m->sq_concat;
808 if (f != NULL)
809 return (*f)(v, w);
810 }
811 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000812 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000813 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000814}
815
816PyObject *
817PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
818{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000819 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
820 NB_SLOT(nb_multiply));
821 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000822 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000823 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
824 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
825 Py_DECREF(result);
826 if (mv != NULL) {
827 if (HASINPLACE(v))
828 f = mv->sq_inplace_repeat;
829 if (f == NULL)
830 f = mv->sq_repeat;
831 if (f != NULL)
832 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000833 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000834 else if (mw != NULL) {
835 /* Note that the right hand operand should not be
836 * mutated in this case so sq_inplace_repeat is not
837 * used. */
838 if (mw->sq_repeat)
839 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000840 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000841 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000842 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000843 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000844}
845
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000846PyObject *
847PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
848{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000849 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
850 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000851}
852
853PyObject *
854PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
855{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000856 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
857 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
858 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000859 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000860 else {
861 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
862 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000863}
864
865
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000866/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000867
868PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000869PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000870{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000871 PyNumberMethods *m;
872
873 if (o == NULL)
874 return null_error();
875 m = o->ob_type->tp_as_number;
876 if (m && m->nb_negative)
877 return (*m->nb_negative)(o);
878
879 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000880}
881
882PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000883PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000884{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000885 PyNumberMethods *m;
886
887 if (o == NULL)
888 return null_error();
889 m = o->ob_type->tp_as_number;
890 if (m && m->nb_positive)
891 return (*m->nb_positive)(o);
892
893 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000894}
895
896PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000897PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000898{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000899 PyNumberMethods *m;
900
901 if (o == NULL)
902 return null_error();
903 m = o->ob_type->tp_as_number;
904 if (m && m->nb_invert)
905 return (*m->nb_invert)(o);
906
907 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000908}
909
910PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000911PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000912{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000913 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000914
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000915 if (o == NULL)
916 return null_error();
917 m = o->ob_type->tp_as_number;
918 if (m && m->nb_absolute)
919 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000920
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000921 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000922}
923
Guido van Rossum9e896b32000-04-05 20:11:21 +0000924/* Add a check for embedded NULL-bytes in the argument. */
925static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000926int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000927{
928 char *end;
929 PyObject *x;
930
931 x = PyInt_FromString((char*)s, &end, 10);
932 if (x == NULL)
933 return NULL;
934 if (end != s + len) {
935 PyErr_SetString(PyExc_ValueError,
936 "null byte in argument for int()");
937 Py_DECREF(x);
938 return NULL;
939 }
940 return x;
941}
942
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000943/* Return a Py_ssize_t integer from the object item */
944Py_ssize_t
945PyNumber_Index(PyObject *item)
946{
947 Py_ssize_t value = -1;
948 PyNumberMethods *nb = item->ob_type->tp_as_number;
949 if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) {
950 value = nb->nb_index(item);
951 }
952 else {
Armin Rigo314861c2006-03-30 14:04:02 +0000953 PyErr_Format(PyExc_TypeError,
954 "'%.200s' object cannot be interpreted "
955 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000956 }
957 return value;
958}
959
Guido van Rossume15dee51995-07-18 14:12:02 +0000960PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000961PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000962{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000963 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000964 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000965 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000966
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000967 if (o == NULL)
968 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000969 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000970 Py_INCREF(o);
971 return o;
972 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000973 m = o->ob_type->tp_as_number;
974 if (m && m->nb_int) { /* This should include subclasses of int */
975 PyObject *res = m->nb_int(o);
976 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
977 PyErr_Format(PyExc_TypeError,
978 "__int__ returned non-int (type %.200s)",
979 res->ob_type->tp_name);
980 Py_DECREF(res);
981 return NULL;
982 }
983 return res;
984 }
985 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000986 PyIntObject *io = (PyIntObject*)o;
987 return PyInt_FromLong(io->ob_ival);
988 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000989 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000990 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000991 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000992#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000993 if (PyUnicode_Check(o))
994 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
995 PyUnicode_GET_SIZE(o),
996 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000997#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000998 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000999 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001000
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001001 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001002}
1003
Guido van Rossum9e896b32000-04-05 20:11:21 +00001004/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001005static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001006long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001007{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001008 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001009 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001010
Guido van Rossum4c08d552000-03-10 22:55:18 +00001011 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001012 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001013 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001014 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001015 PyErr_SetString(PyExc_ValueError,
1016 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001017 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001018 return NULL;
1019 }
1020 return x;
1021}
1022
Guido van Rossume15dee51995-07-18 14:12:02 +00001023PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001024PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001025{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001026 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001027 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001028 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001029
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001030 if (o == NULL)
1031 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001032 m = o->ob_type->tp_as_number;
1033 if (m && m->nb_long) { /* This should include subclasses of long */
1034 PyObject *res = m->nb_long(o);
1035 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1036 PyErr_Format(PyExc_TypeError,
1037 "__long__ returned non-long (type %.200s)",
1038 res->ob_type->tp_name);
1039 Py_DECREF(res);
1040 return NULL;
1041 }
1042 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001043 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001044 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001045 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001046 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001047 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001048 * doesn't do. In particular long('9.5') must raise an
1049 * exception, not truncate the float.
1050 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001051 return long_from_string(PyString_AS_STRING(o),
1052 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001053#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001054 if (PyUnicode_Check(o))
1055 /* The above check is done in PyLong_FromUnicode(). */
1056 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1057 PyUnicode_GET_SIZE(o),
1058 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001059#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001060 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1061 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001062
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001063 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001064}
1065
1066PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001067PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001068{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001069 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001070
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001071 if (o == NULL)
1072 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001073 m = o->ob_type->tp_as_number;
1074 if (m && m->nb_float) { /* This should include subclasses of float */
1075 PyObject *res = m->nb_float(o);
1076 if (res && !PyFloat_Check(res)) {
1077 PyErr_Format(PyExc_TypeError,
1078 "__float__ returned non-float (type %.200s)",
1079 res->ob_type->tp_name);
1080 Py_DECREF(res);
1081 return NULL;
1082 }
1083 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001084 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001085 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001086 PyFloatObject *po = (PyFloatObject *)o;
1087 return PyFloat_FromDouble(po->ob_fval);
1088 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001089 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001090}
1091
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001092/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001093
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094int
Fred Drake79912472000-07-09 04:06:11 +00001095PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001096{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001097 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001098 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001099 return s != NULL && s->ob_type->tp_as_sequence &&
1100 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001101}
1102
Martin v. Löwis18e16552006-02-15 17:27:45 +00001103Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001104PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001105{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001107
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 if (s == NULL) {
1109 null_error();
1110 return -1;
1111 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001112
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001113 m = s->ob_type->tp_as_sequence;
1114 if (m && m->sq_length)
1115 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001117 type_error("len() of unsized object");
1118 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001119}
1120
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001121#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001122Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001123PySequence_Length(PyObject *s)
1124{
1125 return PySequence_Size(s);
1126}
1127#define PySequence_Length PySequence_Size
1128
Guido van Rossume15dee51995-07-18 14:12:02 +00001129PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001130PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001131{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001134 if (s == NULL || o == NULL)
1135 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001136
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001137 m = s->ob_type->tp_as_sequence;
1138 if (m && m->sq_concat)
1139 return m->sq_concat(s, o);
1140
Armin Rigofd163f92005-12-29 15:59:19 +00001141 /* Instances of user classes defining an __add__() method only
1142 have an nb_add slot, not an sq_concat slot. So we fall back
1143 to nb_add if both arguments appear to be sequences. */
1144 if (PySequence_Check(s) && PySequence_Check(o)) {
1145 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1146 if (result != Py_NotImplemented)
1147 return result;
1148 Py_DECREF(result);
1149 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001151}
1152
1153PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001154PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001155{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001157
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158 if (o == NULL)
1159 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001161 m = o->ob_type->tp_as_sequence;
1162 if (m && m->sq_repeat)
1163 return m->sq_repeat(o, count);
1164
Armin Rigofd163f92005-12-29 15:59:19 +00001165 /* Instances of user classes defining a __mul__() method only
1166 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1167 to nb_multiply if o appears to be a sequence. */
1168 if (PySequence_Check(o)) {
1169 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001170 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001171 if (n == NULL)
1172 return NULL;
1173 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1174 Py_DECREF(n);
1175 if (result != Py_NotImplemented)
1176 return result;
1177 Py_DECREF(result);
1178 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001179 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001180}
1181
1182PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001183PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1184{
1185 PySequenceMethods *m;
1186
1187 if (s == NULL || o == NULL)
1188 return null_error();
1189
1190 m = s->ob_type->tp_as_sequence;
1191 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1192 return m->sq_inplace_concat(s, o);
1193 if (m && m->sq_concat)
1194 return m->sq_concat(s, o);
1195
Armin Rigofd163f92005-12-29 15:59:19 +00001196 if (PySequence_Check(s) && PySequence_Check(o)) {
1197 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1198 NB_SLOT(nb_add));
1199 if (result != Py_NotImplemented)
1200 return result;
1201 Py_DECREF(result);
1202 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001203 return type_error("object can't be concatenated");
1204}
1205
1206PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001207PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001208{
1209 PySequenceMethods *m;
1210
1211 if (o == NULL)
1212 return null_error();
1213
1214 m = o->ob_type->tp_as_sequence;
1215 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1216 return m->sq_inplace_repeat(o, count);
1217 if (m && m->sq_repeat)
1218 return m->sq_repeat(o, count);
1219
Armin Rigofd163f92005-12-29 15:59:19 +00001220 if (PySequence_Check(o)) {
1221 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001222 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001223 if (n == NULL)
1224 return NULL;
1225 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1226 NB_SLOT(nb_multiply));
1227 Py_DECREF(n);
1228 if (result != Py_NotImplemented)
1229 return result;
1230 Py_DECREF(result);
1231 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001232 return type_error("object can't be repeated");
1233}
1234
1235PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001236PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001237{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001238 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001239
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 if (s == NULL)
1241 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001242
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 m = s->ob_type->tp_as_sequence;
1244 if (m && m->sq_item) {
1245 if (i < 0) {
1246 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001247 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 if (l < 0)
1249 return NULL;
1250 i += l;
1251 }
1252 }
1253 return m->sq_item(s, i);
1254 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001255
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001256 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001257}
1258
1259PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001260PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001261{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001263 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001264
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001266
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 m = s->ob_type->tp_as_sequence;
1268 if (m && m->sq_slice) {
1269 if (i1 < 0 || i2 < 0) {
1270 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001271 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001272 if (l < 0)
1273 return NULL;
1274 if (i1 < 0)
1275 i1 += l;
1276 if (i2 < 0)
1277 i2 += l;
1278 }
1279 }
1280 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001281 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1282 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001283 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001284 if (!slice)
1285 return NULL;
1286 res = mp->mp_subscript(s, slice);
1287 Py_DECREF(slice);
1288 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001289 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001290
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001292}
1293
1294int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001295PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001296{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001298
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001299 if (s == NULL) {
1300 null_error();
1301 return -1;
1302 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001303
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 m = s->ob_type->tp_as_sequence;
1305 if (m && m->sq_ass_item) {
1306 if (i < 0) {
1307 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001308 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001309 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001310 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 i += l;
1312 }
1313 }
1314 return m->sq_ass_item(s, i, o);
1315 }
1316
Raymond Hettinger98779e02003-10-27 09:22:16 +00001317 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001319}
1320
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001321int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001322PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001323{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001325
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 if (s == NULL) {
1327 null_error();
1328 return -1;
1329 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 m = s->ob_type->tp_as_sequence;
1332 if (m && m->sq_ass_item) {
1333 if (i < 0) {
1334 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001335 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001336 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001337 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001338 i += l;
1339 }
1340 }
1341 return m->sq_ass_item(s, i, (PyObject *)NULL);
1342 }
1343
1344 type_error("object doesn't support item deletion");
1345 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001346}
1347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001348int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001349PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001350{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001351 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001352 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001353
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001354 if (s == NULL) {
1355 null_error();
1356 return -1;
1357 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001358
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359 m = s->ob_type->tp_as_sequence;
1360 if (m && m->sq_ass_slice) {
1361 if (i1 < 0 || i2 < 0) {
1362 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001363 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001364 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001365 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001366 if (i1 < 0)
1367 i1 += l;
1368 if (i2 < 0)
1369 i2 += l;
1370 }
1371 }
1372 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001373 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1374 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001375 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001376 if (!slice)
1377 return -1;
1378 res = mp->mp_ass_subscript(s, slice, o);
1379 Py_DECREF(slice);
1380 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001382
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001383 type_error("object doesn't support slice assignment");
1384 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001385}
1386
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001387int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001388PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001389{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001391
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 if (s == NULL) {
1393 null_error();
1394 return -1;
1395 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001396
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 m = s->ob_type->tp_as_sequence;
1398 if (m && m->sq_ass_slice) {
1399 if (i1 < 0 || i2 < 0) {
1400 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001401 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001402 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001403 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001404 if (i1 < 0)
1405 i1 += l;
1406 if (i2 < 0)
1407 i2 += l;
1408 }
1409 }
1410 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1411 }
1412 type_error("object doesn't support slice deletion");
1413 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001414}
1415
Guido van Rossume15dee51995-07-18 14:12:02 +00001416PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001417PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001418{
Tim Peters6912d4d2001-05-05 03:56:37 +00001419 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001420 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001421 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001422 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001423
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 if (v == NULL)
1425 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001426
Tim Peters6912d4d2001-05-05 03:56:37 +00001427 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001428 if (PyTuple_CheckExact(v)) {
1429 /* Note that we can't know whether it's safe to return
1430 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001431 to exact tuples here. In contrast, lists always make
1432 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 Py_INCREF(v);
1434 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001435 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001436 if (PyList_Check(v))
1437 return PyList_AsTuple(v);
1438
Tim Peters6912d4d2001-05-05 03:56:37 +00001439 /* Get iterator. */
1440 it = PyObject_GetIter(v);
1441 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001442 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001443
Tim Peters6912d4d2001-05-05 03:56:37 +00001444 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001445 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001446 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001447 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1448 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1449 Py_DECREF(it);
1450 return NULL;
1451 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001452 PyErr_Clear();
1453 n = 10; /* arbitrary */
1454 }
1455 result = PyTuple_New(n);
1456 if (result == NULL)
1457 goto Fail;
1458
1459 /* Fill the tuple. */
1460 for (j = 0; ; ++j) {
1461 PyObject *item = PyIter_Next(it);
1462 if (item == NULL) {
1463 if (PyErr_Occurred())
1464 goto Fail;
1465 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001467 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001468 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001469 /* The over-allocation strategy can grow a bit faster
1470 than for lists because unlike lists the
1471 over-allocation isn't permanent -- we reclaim
1472 the excess before the end of this routine.
1473 So, grow by ten and then add 25%.
1474 */
1475 n += 10;
1476 n += n >> 2;
1477 if (n < oldn) {
1478 /* Check for overflow */
1479 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001480 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001481 goto Fail;
1482 }
Tim Peters4324aa32001-05-28 22:30:08 +00001483 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001484 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001485 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001486 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001487 }
1488 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001489 }
1490
Tim Peters6912d4d2001-05-05 03:56:37 +00001491 /* Cut tuple back if guess was too large. */
1492 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001493 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001494 goto Fail;
1495
1496 Py_DECREF(it);
1497 return result;
1498
1499Fail:
1500 Py_XDECREF(result);
1501 Py_DECREF(it);
1502 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001503}
1504
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001505PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001506PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001507{
Tim Petersf553f892001-05-01 20:45:31 +00001508 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001509 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001510
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001511 if (v == NULL)
1512 return null_error();
1513
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001514 result = PyList_New(0);
1515 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001516 return NULL;
1517
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001518 rv = _PyList_Extend((PyListObject *)result, v);
1519 if (rv == NULL) {
1520 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001521 return NULL;
1522 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001523 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001524 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001525}
1526
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001527PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001528PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001529{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001530 PyObject *it;
1531
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001532 if (v == NULL)
1533 return null_error();
1534
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001535 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001536 Py_INCREF(v);
1537 return v;
1538 }
1539
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001540 it = PyObject_GetIter(v);
1541 if (it == NULL) {
1542 if (PyErr_ExceptionMatches(PyExc_TypeError))
1543 return type_error(m);
1544 return NULL;
1545 }
1546
Raymond Hettinger193814c2004-12-18 19:00:59 +00001547 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001548 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001549
1550 return v;
1551}
1552
Tim Peters16a77ad2001-09-08 04:00:12 +00001553/* Iterate over seq. Result depends on the operation:
1554 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1555 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1556 set ValueError and return -1 if none found; also return -1 on error.
1557 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1558*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001559Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001560_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001561{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001562 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001563 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1564 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001565
Tim Peters16a77ad2001-09-08 04:00:12 +00001566 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001567 null_error();
1568 return -1;
1569 }
Tim Peters75f8e352001-05-05 11:33:43 +00001570
Tim Peters16a77ad2001-09-08 04:00:12 +00001571 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001572 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001573 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001574 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001575 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001576
Tim Peters16a77ad2001-09-08 04:00:12 +00001577 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001578 for (;;) {
1579 int cmp;
1580 PyObject *item = PyIter_Next(it);
1581 if (item == NULL) {
1582 if (PyErr_Occurred())
1583 goto Fail;
1584 break;
1585 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001586
1587 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001588 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001589 if (cmp < 0)
1590 goto Fail;
1591 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001592 switch (operation) {
1593 case PY_ITERSEARCH_COUNT:
1594 ++n;
1595 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001596 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001597 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001598 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001599 goto Fail;
1600 }
1601 break;
1602
1603 case PY_ITERSEARCH_INDEX:
1604 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001605 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001606 PyErr_SetString(PyExc_OverflowError,
1607 "index exceeds C int size");
1608 goto Fail;
1609 }
1610 goto Done;
1611
1612 case PY_ITERSEARCH_CONTAINS:
1613 n = 1;
1614 goto Done;
1615
1616 default:
1617 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001618 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001619 }
1620
1621 if (operation == PY_ITERSEARCH_INDEX) {
1622 ++n;
1623 if (n <= 0)
1624 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001625 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001626 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001627
1628 if (operation != PY_ITERSEARCH_INDEX)
1629 goto Done;
1630
1631 PyErr_SetString(PyExc_ValueError,
1632 "sequence.index(x): x not in sequence");
1633 /* fall into failure code */
1634Fail:
1635 n = -1;
1636 /* fall through */
1637Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001638 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001639 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001640
Guido van Rossume15dee51995-07-18 14:12:02 +00001641}
1642
Tim Peters16a77ad2001-09-08 04:00:12 +00001643/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001644Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001645PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001646{
Tim Peters16a77ad2001-09-08 04:00:12 +00001647 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001648}
1649
Tim Peterscb8d3682001-05-05 21:05:01 +00001650/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001651 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001652 */
1653int
1654PySequence_Contains(PyObject *seq, PyObject *ob)
1655{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001656 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001657 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1658 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1659 if (sqm != NULL && sqm->sq_contains != NULL)
1660 return (*sqm->sq_contains)(seq, ob);
1661 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001662 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1663 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001664}
1665
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001666/* Backwards compatibility */
1667#undef PySequence_In
1668int
Fred Drake79912472000-07-09 04:06:11 +00001669PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001670{
1671 return PySequence_Contains(w, v);
1672}
1673
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001674Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001675PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001676{
Tim Peters16a77ad2001-09-08 04:00:12 +00001677 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001678}
1679
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001680/* Operations on mappings */
1681
1682int
Fred Drake79912472000-07-09 04:06:11 +00001683PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001684{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001685 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001686 return PyObject_HasAttrString(o, "__getitem__");
1687
1688 return o && o->ob_type->tp_as_mapping &&
1689 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001690 !(o->ob_type->tp_as_sequence &&
1691 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001692}
1693
Martin v. Löwis18e16552006-02-15 17:27:45 +00001694Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001695PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001696{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001697 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001698
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001699 if (o == NULL) {
1700 null_error();
1701 return -1;
1702 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001703
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001704 m = o->ob_type->tp_as_mapping;
1705 if (m && m->mp_length)
1706 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001707
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001708 type_error("len() of unsized object");
1709 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001710}
1711
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001712#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001713Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001714PyMapping_Length(PyObject *o)
1715{
1716 return PyMapping_Size(o);
1717}
1718#define PyMapping_Length PyMapping_Size
1719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001720PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001721PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001722{
1723 PyObject *okey, *r;
1724
1725 if (key == NULL)
1726 return null_error();
1727
1728 okey = PyString_FromString(key);
1729 if (okey == NULL)
1730 return NULL;
1731 r = PyObject_GetItem(o, okey);
1732 Py_DECREF(okey);
1733 return r;
1734}
1735
1736int
Fred Drake79912472000-07-09 04:06:11 +00001737PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001738{
1739 PyObject *okey;
1740 int r;
1741
1742 if (key == NULL) {
1743 null_error();
1744 return -1;
1745 }
1746
1747 okey = PyString_FromString(key);
1748 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001749 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001750 r = PyObject_SetItem(o, okey, value);
1751 Py_DECREF(okey);
1752 return r;
1753}
1754
1755int
Fred Drake79912472000-07-09 04:06:11 +00001756PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001757{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001758 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001759
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760 v = PyMapping_GetItemString(o, key);
1761 if (v) {
1762 Py_DECREF(v);
1763 return 1;
1764 }
1765 PyErr_Clear();
1766 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001767}
1768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001769int
Fred Drake79912472000-07-09 04:06:11 +00001770PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001771{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001772 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001773
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001774 v = PyObject_GetItem(o, key);
1775 if (v) {
1776 Py_DECREF(v);
1777 return 1;
1778 }
1779 PyErr_Clear();
1780 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001781}
1782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001783/* Operations on callable objects */
1784
1785/* XXX PyCallable_Check() is in object.c */
1786
Guido van Rossume15dee51995-07-18 14:12:02 +00001787PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001788PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001789{
Guido van Rossum5560b742001-09-14 16:47:50 +00001790 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001791}
Guido van Rossume15dee51995-07-18 14:12:02 +00001792
1793PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001794PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1795{
1796 ternaryfunc call;
1797
1798 if ((call = func->ob_type->tp_call) != NULL) {
1799 PyObject *result = (*call)(func, arg, kw);
1800 if (result == NULL && !PyErr_Occurred())
1801 PyErr_SetString(
1802 PyExc_SystemError,
1803 "NULL result without error in PyObject_Call");
1804 return result;
1805 }
Fred Drake573395a2001-11-01 20:26:12 +00001806 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1807 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001808 return NULL;
1809}
1810
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001811static PyObject*
1812call_function_tail(PyObject *callable, PyObject *args)
1813{
1814 PyObject *retval;
1815
1816 if (args == NULL)
1817 return NULL;
1818
1819 if (!PyTuple_Check(args)) {
1820 PyObject *a;
1821
1822 a = PyTuple_New(1);
1823 if (a == NULL) {
1824 Py_DECREF(args);
1825 return NULL;
1826 }
1827 PyTuple_SET_ITEM(a, 0, args);
1828 args = a;
1829 }
1830 retval = PyObject_Call(callable, args, NULL);
1831
1832 Py_DECREF(args);
1833
1834 return retval;
1835}
1836
Tim Peters6d6c1a32001-08-02 04:15:00 +00001837PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001838PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001839{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001840 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001841 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001842
Fred Drakeb92cf062001-10-27 06:16:31 +00001843 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001845
Fred Drakeb92cf062001-10-27 06:16:31 +00001846 if (format && *format) {
1847 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001848 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001849 va_end(va);
1850 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001851 else
1852 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001853
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001854 return call_function_tail(callable, args);
1855}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001856
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001857PyObject *
1858_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1859{
1860 va_list va;
1861 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001862
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001863 if (callable == NULL)
1864 return null_error();
1865
1866 if (format && *format) {
1867 va_start(va, format);
1868 args = _Py_VaBuildValue_SizeT(format, va);
1869 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001870 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001871 else
1872 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001873
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001874 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001875}
1876
1877PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001878PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001879{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001880 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001881 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001882 PyObject *func = NULL;
1883 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001884
Fred Drakeb92cf062001-10-27 06:16:31 +00001885 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001886 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001887
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001888 func = PyObject_GetAttrString(o, name);
1889 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001890 PyErr_SetString(PyExc_AttributeError, name);
1891 return 0;
1892 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001893
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001894 if (!PyCallable_Check(func)) {
1895 type_error("call of non-callable attribute");
1896 goto exit;
1897 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001898
Fred Drakeb92cf062001-10-27 06:16:31 +00001899 if (format && *format) {
1900 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001901 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001902 va_end(va);
1903 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001904 else
1905 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001906
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001907 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001908
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001909 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001910 /* args gets consumed in call_function_tail */
1911 Py_XDECREF(func);
1912
1913 return retval;
1914}
1915
1916PyObject *
1917_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1918{
1919 va_list va;
1920 PyObject *args;
1921 PyObject *func = NULL;
1922 PyObject *retval = NULL;
1923
1924 if (o == NULL || name == NULL)
1925 return null_error();
1926
1927 func = PyObject_GetAttrString(o, name);
1928 if (func == NULL) {
1929 PyErr_SetString(PyExc_AttributeError, name);
1930 return 0;
1931 }
1932
1933 if (!PyCallable_Check(func)) {
1934 type_error("call of non-callable attribute");
1935 goto exit;
1936 }
1937
1938 if (format && *format) {
1939 va_start(va, format);
1940 args = _Py_VaBuildValue_SizeT(format, va);
1941 va_end(va);
1942 }
1943 else
1944 args = PyTuple_New(0);
1945
1946 retval = call_function_tail(func, args);
1947
1948 exit:
1949 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001950 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001951
1952 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001953}
Guido van Rossum823649d2001-03-21 18:40:58 +00001954
1955
Fred Drakeb421b8c2001-10-26 16:21:32 +00001956static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001957objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001958{
1959 int i, n = 0;
1960 va_list countva;
1961 PyObject *result, *tmp;
1962
1963#ifdef VA_LIST_IS_ARRAY
1964 memcpy(countva, va, sizeof(va_list));
1965#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001966#ifdef __va_copy
1967 __va_copy(countva, va);
1968#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001969 countva = va;
1970#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001971#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001972
1973 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1974 ++n;
1975 result = PyTuple_New(n);
1976 if (result != NULL && n > 0) {
1977 for (i = 0; i < n; ++i) {
1978 tmp = (PyObject *)va_arg(va, PyObject *);
1979 PyTuple_SET_ITEM(result, i, tmp);
1980 Py_INCREF(tmp);
1981 }
1982 }
1983 return result;
1984}
1985
1986PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001987PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001988{
1989 PyObject *args, *tmp;
1990 va_list vargs;
1991
1992 if (callable == NULL || name == NULL)
1993 return null_error();
1994
1995 callable = PyObject_GetAttr(callable, name);
1996 if (callable == NULL)
1997 return NULL;
1998
1999 /* count the args */
2000 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002001 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002002 va_end(vargs);
2003 if (args == NULL) {
2004 Py_DECREF(callable);
2005 return NULL;
2006 }
2007 tmp = PyObject_Call(callable, args, NULL);
2008 Py_DECREF(args);
2009 Py_DECREF(callable);
2010
2011 return tmp;
2012}
2013
2014PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002015PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002016{
2017 PyObject *args, *tmp;
2018 va_list vargs;
2019
2020 if (callable == NULL)
2021 return null_error();
2022
2023 /* count the args */
2024 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002025 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002026 va_end(vargs);
2027 if (args == NULL)
2028 return NULL;
2029 tmp = PyObject_Call(callable, args, NULL);
2030 Py_DECREF(args);
2031
2032 return tmp;
2033}
2034
2035
Guido van Rossum823649d2001-03-21 18:40:58 +00002036/* isinstance(), issubclass() */
2037
Barry Warsawf16951c2002-04-23 22:45:44 +00002038/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2039 * state that will almost never happen.
2040 *
2041 * 0. creating the __bases__ static string could get a MemoryError
2042 * 1. getattr(cls, '__bases__') could raise an AttributeError
2043 * 2. getattr(cls, '__bases__') could raise some other exception
2044 * 3. getattr(cls, '__bases__') could return a tuple
2045 * 4. getattr(cls, '__bases__') could return something other than a tuple
2046 *
2047 * Only state #3 is a non-error state and only it returns a non-NULL object
2048 * (it returns the retrieved tuple).
2049 *
2050 * Any raised AttributeErrors are masked by clearing the exception and
2051 * returning NULL. If an object other than a tuple comes out of __bases__,
2052 * then again, the return value is NULL. So yes, these two situations
2053 * produce exactly the same results: NULL is returned and no error is set.
2054 *
2055 * If some exception other than AttributeError is raised, then NULL is also
2056 * returned, but the exception is not cleared. That's because we want the
2057 * exception to be propagated along.
2058 *
2059 * Callers are expected to test for PyErr_Occurred() when the return value
2060 * is NULL to decide whether a valid exception should be propagated or not.
2061 * When there's no exception to propagate, it's customary for the caller to
2062 * set a TypeError.
2063 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002064static PyObject *
2065abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002066{
2067 static PyObject *__bases__ = NULL;
2068 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002069
2070 if (__bases__ == NULL) {
2071 __bases__ = PyString_FromString("__bases__");
2072 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002073 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002074 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002075 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002076 if (bases == NULL) {
2077 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2078 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002079 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002080 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002081 if (!PyTuple_Check(bases)) {
2082 Py_DECREF(bases);
2083 return NULL;
2084 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002085 return bases;
2086}
2087
2088
2089static int
2090abstract_issubclass(PyObject *derived, PyObject *cls)
2091{
2092 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002093 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002094 int r = 0;
2095
2096
Guido van Rossum823649d2001-03-21 18:40:58 +00002097 if (derived == cls)
2098 return 1;
2099
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002100 if (PyTuple_Check(cls)) {
2101 /* Not a general sequence -- that opens up the road to
2102 recursion and stack overflow. */
2103 n = PyTuple_GET_SIZE(cls);
2104 for (i = 0; i < n; i++) {
2105 if (derived == PyTuple_GET_ITEM(cls, i))
2106 return 1;
2107 }
2108 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002109 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002110 if (bases == NULL) {
2111 if (PyErr_Occurred())
2112 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002113 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002114 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002115 n = PyTuple_GET_SIZE(bases);
2116 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002117 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002118 if (r != 0)
2119 break;
2120 }
2121
2122 Py_DECREF(bases);
2123
2124 return r;
2125}
2126
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002127static int
2128check_class(PyObject *cls, const char *error)
2129{
2130 PyObject *bases = abstract_get_bases(cls);
2131 if (bases == NULL) {
2132 /* Do not mask errors. */
2133 if (!PyErr_Occurred())
2134 PyErr_SetString(PyExc_TypeError, error);
2135 return 0;
2136 }
2137 Py_DECREF(bases);
2138 return -1;
2139}
2140
Brett Cannon4f653312004-03-20 22:52:14 +00002141static int
2142recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002143{
2144 PyObject *icls;
2145 static PyObject *__class__ = NULL;
2146 int retval = 0;
2147
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002148 if (__class__ == NULL) {
2149 __class__ = PyString_FromString("__class__");
2150 if (__class__ == NULL)
2151 return -1;
2152 }
2153
Neil Schemenauer6b471292001-10-18 03:18:43 +00002154 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2155 PyObject *inclass =
2156 (PyObject*)((PyInstanceObject*)inst)->in_class;
2157 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002158 }
2159 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002160 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002161 if (retval == 0) {
2162 PyObject *c = PyObject_GetAttr(inst, __class__);
2163 if (c == NULL) {
2164 PyErr_Clear();
2165 }
2166 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002167 if (c != (PyObject *)(inst->ob_type) &&
2168 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002169 retval = PyType_IsSubtype(
2170 (PyTypeObject *)c,
2171 (PyTypeObject *)cls);
2172 Py_DECREF(c);
2173 }
2174 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002175 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002176 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002177 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002178
Brett Cannon4f653312004-03-20 22:52:14 +00002179 if (!recursion_depth) {
2180 PyErr_SetString(PyExc_RuntimeError,
2181 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002182 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002183 }
2184
Guido van Rossum03290ec2001-10-07 20:54:12 +00002185 n = PyTuple_GET_SIZE(cls);
2186 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002187 retval = recursive_isinstance(
2188 inst,
2189 PyTuple_GET_ITEM(cls, i),
2190 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002191 if (retval != 0)
2192 break;
2193 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002194 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002195 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002196 if (!check_class(cls,
2197 "isinstance() arg 2 must be a class, type,"
2198 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002199 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002200 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002201 if (icls == NULL) {
2202 PyErr_Clear();
2203 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002204 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002205 else {
2206 retval = abstract_issubclass(icls, cls);
2207 Py_DECREF(icls);
2208 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002209 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002210
Guido van Rossum823649d2001-03-21 18:40:58 +00002211 return retval;
2212}
2213
2214int
Brett Cannon4f653312004-03-20 22:52:14 +00002215PyObject_IsInstance(PyObject *inst, PyObject *cls)
2216{
2217 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2218}
2219
2220static int
2221recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002222{
2223 int retval;
2224
2225 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002226 if (!check_class(derived,
2227 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002228 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002229
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002230 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002231 Py_ssize_t i;
2232 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002233
2234 if (!recursion_depth) {
2235 PyErr_SetString(PyExc_RuntimeError,
2236 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002237 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002238 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002239 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002240 retval = recursive_issubclass(
2241 derived,
2242 PyTuple_GET_ITEM(cls, i),
2243 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002244 if (retval != 0) {
2245 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002246 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002247 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002248 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002249 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002250 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002251 else {
2252 if (!check_class(cls,
2253 "issubclass() arg 2 must be a class"
2254 " or tuple of classes"))
2255 return -1;
2256 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002257
2258 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002259 }
2260 else {
2261 /* shortcut */
2262 if (!(retval = (derived == cls)))
2263 retval = PyClass_IsSubclass(derived, cls);
2264 }
2265
2266 return retval;
2267}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002268
Brett Cannon4f653312004-03-20 22:52:14 +00002269int
2270PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2271{
2272 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2273}
2274
2275
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002276PyObject *
2277PyObject_GetIter(PyObject *o)
2278{
2279 PyTypeObject *t = o->ob_type;
2280 getiterfunc f = NULL;
2281 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2282 f = t->tp_iter;
2283 if (f == NULL) {
2284 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002285 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002286 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002287 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002288 return NULL;
2289 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002290 else {
2291 PyObject *res = (*f)(o);
2292 if (res != NULL && !PyIter_Check(res)) {
2293 PyErr_Format(PyExc_TypeError,
2294 "iter() returned non-iterator "
2295 "of type '%.100s'",
2296 res->ob_type->tp_name);
2297 Py_DECREF(res);
2298 res = NULL;
2299 }
2300 return res;
2301 }
2302}
2303
Tim Petersf4848da2001-05-05 00:14:56 +00002304/* Return next item.
2305 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2306 * If the iteration terminates normally, return NULL and clear the
2307 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2308 * will be false.
2309 * Else return the next object. PyErr_Occurred() will be false.
2310 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002311PyObject *
2312PyIter_Next(PyObject *iter)
2313{
Tim Petersf4848da2001-05-05 00:14:56 +00002314 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002315 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002316 result = (*iter->ob_type->tp_iternext)(iter);
2317 if (result == NULL &&
2318 PyErr_Occurred() &&
2319 PyErr_ExceptionMatches(PyExc_StopIteration))
2320 PyErr_Clear();
2321 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002322}