blob: e85fe208721937994e00f7806a3470de5ab0e987 [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
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000014/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000015
16static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000017type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000018{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000019 PyErr_SetString(PyExc_TypeError, msg);
20 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000021}
22
Guido van Rossum052b7e11996-11-11 15:08:19 +000023static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000024null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000025{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000026 if (!PyErr_Occurred())
27 PyErr_SetString(PyExc_SystemError,
28 "null argument to internal routine");
29 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000030}
31
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000032/* Operations on any object */
33
34int
Fred Drake79912472000-07-09 04:06:11 +000035PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000036{
37 int r;
38
39 if (o1 == NULL || o2 == NULL) {
40 null_error();
41 return -1;
42 }
43 r = PyObject_Compare(o1, o2);
44 if (PyErr_Occurred())
45 return -1;
46 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000047 return 0;
48}
Guido van Rossume15dee51995-07-18 14:12:02 +000049
50PyObject *
Fred Drake79912472000-07-09 04:06:11 +000051PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000052{
53 PyObject *v;
54
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000055 if (o == NULL)
56 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000057 v = (PyObject *)o->ob_type;
58 Py_INCREF(v);
59 return v;
60}
61
Martin v. Löwis18e16552006-02-15 17:27:45 +000062Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000063PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000064{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000066
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000067 if (o == NULL) {
68 null_error();
69 return -1;
70 }
Guido van Rossume15dee51995-07-18 14:12:02 +000071
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000072 m = o->ob_type->tp_as_sequence;
73 if (m && m->sq_length)
74 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075
Jeremy Hylton6253f832000-07-12 12:56:19 +000076 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000077}
78
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000079#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000080Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000081PyObject_Length(PyObject *o)
82{
83 return PyObject_Size(o);
84}
85#define PyObject_Length PyObject_Size
86
Martin v. Löwis18e16552006-02-15 17:27:45 +000087Py_ssize_t
Armin Rigof5b3e362006-02-11 21:32:43 +000088_PyObject_LengthHint(PyObject *o)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000089{
Martin v. Löwis18e16552006-02-15 17:27:45 +000090 Py_ssize_t rv = PyObject_Size(o);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000091 if (rv != -1)
92 return rv;
93 if (PyErr_ExceptionMatches(PyExc_TypeError) ||
94 PyErr_ExceptionMatches(PyExc_AttributeError)) {
95 PyObject *err_type, *err_value, *err_tb, *ro;
96
97 PyErr_Fetch(&err_type, &err_value, &err_tb);
Armin Rigof5b3e362006-02-11 21:32:43 +000098 ro = PyObject_CallMethod(o, "__length_hint__", NULL);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000099 if (ro != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000100 rv = PyInt_AsLong(ro);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000101 Py_DECREF(ro);
102 Py_XDECREF(err_type);
103 Py_XDECREF(err_value);
104 Py_XDECREF(err_tb);
105 return rv;
106 }
107 PyErr_Restore(err_type, err_value, err_tb);
108 }
109 return -1;
110}
111
Guido van Rossume15dee51995-07-18 14:12:02 +0000112PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000113PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000114{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000117 if (o == NULL || key == NULL)
118 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000119
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000120 m = o->ob_type->tp_as_mapping;
121 if (m && m->mp_subscript)
122 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000123
Guido van Rossum21308241998-08-13 16:44:44 +0000124 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000125 PyNumberMethods *nb = key->ob_type->tp_as_number;
126 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
127 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000128 if (key_value == -1 && PyErr_Occurred())
129 return NULL;
130 return PySequence_GetItem(o, key_value);
131 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000132 else if (o->ob_type->tp_as_sequence->sq_item)
133 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000134 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000135
136 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000137}
138
139int
Fred Drake79912472000-07-09 04:06:11 +0000140PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000141{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000142 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000143
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000144 if (o == NULL || key == NULL || value == NULL) {
145 null_error();
146 return -1;
147 }
148 m = o->ob_type->tp_as_mapping;
149 if (m && m->mp_ass_subscript)
150 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000151
Guido van Rossum21308241998-08-13 16:44:44 +0000152 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000153 PyNumberMethods *nb = key->ob_type->tp_as_number;
154 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
155 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000156 if (key_value == -1 && PyErr_Occurred())
157 return -1;
158 return PySequence_SetItem(o, key_value, value);
159 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000160 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
161 type_error("sequence index must be integer");
162 return -1;
163 }
Guido van Rossum21308241998-08-13 16:44:44 +0000164 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000165
166 type_error("object does not support item assignment");
167 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000168}
169
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000170int
Fred Drake79912472000-07-09 04:06:11 +0000171PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000172{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000173 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000174
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000175 if (o == NULL || key == NULL) {
176 null_error();
177 return -1;
178 }
179 m = o->ob_type->tp_as_mapping;
180 if (m && m->mp_ass_subscript)
181 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000182
Guido van Rossum21308241998-08-13 16:44:44 +0000183 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000184 PyNumberMethods *nb = key->ob_type->tp_as_number;
185 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
186 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000187 if (key_value == -1 && PyErr_Occurred())
188 return -1;
189 return PySequence_DelItem(o, key_value);
190 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000191 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
192 type_error("sequence index must be integer");
193 return -1;
194 }
Guido van Rossum21308241998-08-13 16:44:44 +0000195 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000196
197 type_error("object does not support item deletion");
198 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000199}
200
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000201int
202PyObject_DelItemString(PyObject *o, char *key)
203{
204 PyObject *okey;
205 int ret;
206
207 if (o == NULL || key == NULL) {
208 null_error();
209 return -1;
210 }
211 okey = PyString_FromString(key);
212 if (okey == NULL)
213 return -1;
214 ret = PyObject_DelItem(o, okey);
215 Py_DECREF(okey);
216 return ret;
217}
218
Brett Cannonea229bd2006-06-06 18:08:16 +0000219int
220PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000221 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000222 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000223{
224 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000225 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000226 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000227
228 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
229 null_error();
230 return -1;
231 }
232 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000233 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000234 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000235 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000236 PyErr_SetString(PyExc_TypeError,
237 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000238 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000240 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000241 PyErr_SetString(PyExc_TypeError,
242 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000243 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000244 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000245 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000247 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000248 *buffer = pp;
249 *buffer_len = len;
250 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000251}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000252
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000253int
254PyObject_CheckReadBuffer(PyObject *obj)
255{
256 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
257
258 if (pb == NULL ||
259 pb->bf_getreadbuffer == NULL ||
260 pb->bf_getsegcount == NULL ||
261 (*pb->bf_getsegcount)(obj, NULL) != 1)
262 return 0;
263 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000264}
265
266int PyObject_AsReadBuffer(PyObject *obj,
267 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000268 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000269{
270 PyBufferProcs *pb;
271 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000272 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000273
274 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
275 null_error();
276 return -1;
277 }
278 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000279 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000280 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000281 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000282 PyErr_SetString(PyExc_TypeError,
283 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000284 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000285 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000286 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000287 PyErr_SetString(PyExc_TypeError,
288 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000289 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000291 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000293 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000294 *buffer = pp;
295 *buffer_len = len;
296 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000297}
298
299int PyObject_AsWriteBuffer(PyObject *obj,
300 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000301 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000302{
303 PyBufferProcs *pb;
304 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000305 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000306
307 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
308 null_error();
309 return -1;
310 }
311 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000314 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000315 PyErr_SetString(PyExc_TypeError,
316 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000317 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000318 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000319 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000320 PyErr_SetString(PyExc_TypeError,
321 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000322 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000323 }
324 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
325 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000326 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000327 *buffer = pp;
328 *buffer_len = len;
329 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000330}
331
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000332/* Operations on numbers */
333
334int
Fred Drake79912472000-07-09 04:06:11 +0000335PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000336{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000337 return o && o->ob_type->tp_as_number &&
338 (o->ob_type->tp_as_number->nb_int ||
339 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000340}
341
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000342/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000343
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000344/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000345
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000346#define NB_SLOT(x) offsetof(PyNumberMethods, x)
347#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000348 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000349#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000350 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000351
352/*
353 Calling scheme used for binary operations:
354
355 v w Action
356 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000357 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000358 new old v.op(v,w), coerce(v,w), v.op(v,w)
359 old new w.op(v,w), coerce(v,w), v.op(v,w)
360 old old coerce(v,w), v.op(v,w)
361
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000362 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
363 v->ob_type
364
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000365 Legend:
366 -------
367 * new == new style number
368 * old == old style number
369 * Action indicates the order in which operations are tried until either
370 a valid result is produced or an error occurs.
371
372 */
373
374static PyObject *
375binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000376{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000377 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000378 binaryfunc slotv = NULL;
379 binaryfunc slotw = NULL;
380
381 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000382 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000383 if (w->ob_type != v->ob_type &&
384 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000385 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000386 if (slotw == slotv)
387 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000388 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000389 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000390 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
391 x = slotw(v, w);
392 if (x != Py_NotImplemented)
393 return x;
394 Py_DECREF(x); /* can't do it */
395 slotw = NULL;
396 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000397 x = slotv(v, w);
398 if (x != Py_NotImplemented)
399 return x;
400 Py_DECREF(x); /* can't do it */
401 }
402 if (slotw) {
403 x = slotw(v, w);
404 if (x != Py_NotImplemented)
405 return x;
406 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000407 }
408 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
409 int err = PyNumber_CoerceEx(&v, &w);
410 if (err < 0) {
411 return NULL;
412 }
413 if (err == 0) {
414 PyNumberMethods *mv = v->ob_type->tp_as_number;
415 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000416 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000417 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000418 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000419 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000420 Py_DECREF(v);
421 Py_DECREF(w);
422 return x;
423 }
424 }
425 /* CoerceEx incremented the reference counts */
426 Py_DECREF(v);
427 Py_DECREF(w);
428 }
429 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000430 Py_INCREF(Py_NotImplemented);
431 return Py_NotImplemented;
432}
Guido van Rossum77660912002-04-16 16:32:50 +0000433
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000434static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000435binop_type_error(PyObject *v, PyObject *w, const char *op_name)
436{
437 PyErr_Format(PyExc_TypeError,
438 "unsupported operand type(s) for %s: '%s' and '%s'",
439 op_name,
440 v->ob_type->tp_name,
441 w->ob_type->tp_name);
442 return NULL;
443}
444
445static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000446binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
447{
448 PyObject *result = binary_op1(v, w, op_slot);
449 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000450 Py_DECREF(result);
451 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000452 }
453 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000454}
455
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000456
457/*
458 Calling scheme used for ternary operations:
459
Guido van Rossum84675ac2001-09-29 01:05:03 +0000460 *** In some cases, w.op is called before v.op; see binary_op1. ***
461
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000462 v w z Action
463 -------------------------------------------------------------------
464 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
465 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
466 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
467 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
468 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
469 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
470 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
471 old old old coerce(v,w,z), v.op(v,w,z)
472
473 Legend:
474 -------
475 * new == new style number
476 * old == old style number
477 * Action indicates the order in which operations are tried until either
478 a valid result is produced or an error occurs.
479 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
480 only if z != Py_None; if z == Py_None, then it is treated as absent
481 variable and only coerce(v,w) is tried.
482
483 */
484
485static PyObject *
486ternary_op(PyObject *v,
487 PyObject *w,
488 PyObject *z,
489 const int op_slot,
490 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000491{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000492 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000493 PyObject *x = NULL;
494 ternaryfunc slotv = NULL;
495 ternaryfunc slotw = NULL;
496 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000497
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000498 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000499 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000500 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000501 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000502 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000503 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000504 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000505 if (slotw == slotv)
506 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000507 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000508 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000509 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
510 x = slotw(v, w, z);
511 if (x != Py_NotImplemented)
512 return x;
513 Py_DECREF(x); /* can't do it */
514 slotw = NULL;
515 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000516 x = slotv(v, w, z);
517 if (x != Py_NotImplemented)
518 return x;
519 Py_DECREF(x); /* can't do it */
520 }
521 if (slotw) {
522 x = slotw(v, w, z);
523 if (x != Py_NotImplemented)
524 return x;
525 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000526 }
527 mz = z->ob_type->tp_as_number;
528 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000529 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000530 if (slotz == slotv || slotz == slotw)
531 slotz = NULL;
532 if (slotz) {
533 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000534 if (x != Py_NotImplemented)
535 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000536 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000537 }
538 }
539
540 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
541 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
542 /* we have an old style operand, coerce */
543 PyObject *v1, *z1, *w2, *z2;
544 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000545
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000546 c = PyNumber_Coerce(&v, &w);
547 if (c != 0)
548 goto error3;
549
550 /* Special case: if the third argument is None, it is
551 treated as absent argument and not coerced. */
552 if (z == Py_None) {
553 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000554 slotz = NB_TERNOP(v->ob_type->tp_as_number,
555 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000556 if (slotz)
557 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000558 else
559 c = -1;
560 }
561 else
562 c = -1;
563 goto error2;
564 }
565 v1 = v;
566 z1 = z;
567 c = PyNumber_Coerce(&v1, &z1);
568 if (c != 0)
569 goto error2;
570 w2 = w;
571 z2 = z1;
572 c = PyNumber_Coerce(&w2, &z2);
573 if (c != 0)
574 goto error1;
575
576 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000577 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
578 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000579 if (slotv)
580 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000581 else
582 c = -1;
583 }
584 else
585 c = -1;
586
587 Py_DECREF(w2);
588 Py_DECREF(z2);
589 error1:
590 Py_DECREF(v1);
591 Py_DECREF(z1);
592 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000593 Py_DECREF(v);
594 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000595 error3:
596 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000597 return x;
598 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000599
600 if (z == Py_None)
601 PyErr_Format(
602 PyExc_TypeError,
603 "unsupported operand type(s) for ** or pow(): "
604 "'%s' and '%s'",
605 v->ob_type->tp_name,
606 w->ob_type->tp_name);
607 else
608 PyErr_Format(
609 PyExc_TypeError,
610 "unsupported operand type(s) for pow(): "
611 "'%s', '%s', '%s'",
612 v->ob_type->tp_name,
613 w->ob_type->tp_name,
614 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000615 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000616}
617
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000618#define BINARY_FUNC(func, op, op_name) \
619 PyObject * \
620 func(PyObject *v, PyObject *w) { \
621 return binary_op(v, w, NB_SLOT(op), op_name); \
622 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000623
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000624BINARY_FUNC(PyNumber_Or, nb_or, "|")
625BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
626BINARY_FUNC(PyNumber_And, nb_and, "&")
627BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
628BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
629BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000630BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
631BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000632
633PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000634PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000635{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000636 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
637 if (result == Py_NotImplemented) {
638 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000639 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000640 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000641 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000642 }
Armin Rigofd163f92005-12-29 15:59:19 +0000643 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000644 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000645 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000646}
647
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000648static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000649sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000650{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000651 Py_ssize_t count;
652 PyNumberMethods *nb = n->ob_type->tp_as_number;
653 if (nb != NULL && HASINDEX(n) && nb->nb_index != NULL) {
654 count = nb->nb_index(n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000655 if (count == -1 && PyErr_Occurred())
656 return NULL;
657 }
658 else {
659 return type_error(
Raymond Hettinger10c66062004-05-12 21:35:06 +0000660 "can't multiply sequence by non-int");
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000661 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000662 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000663}
664
665PyObject *
666PyNumber_Multiply(PyObject *v, PyObject *w)
667{
668 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
669 if (result == Py_NotImplemented) {
670 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
671 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000672 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000673 if (mv && mv->sq_repeat) {
674 return sequence_repeat(mv->sq_repeat, v, w);
675 }
676 else if (mw && mw->sq_repeat) {
677 return sequence_repeat(mw->sq_repeat, w, v);
678 }
679 result = binop_type_error(v, w, "*");
680 }
681 return result;
682}
683
Guido van Rossume15dee51995-07-18 14:12:02 +0000684PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000685PyNumber_FloorDivide(PyObject *v, PyObject *w)
686{
687 /* XXX tp_flags test */
688 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
689}
690
691PyObject *
692PyNumber_TrueDivide(PyObject *v, PyObject *w)
693{
694 /* XXX tp_flags test */
695 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
696}
697
698PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000699PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000700{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000701 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000702}
703
704PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000705PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000706{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000707 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000708}
709
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000710/* Binary in-place operators */
711
712/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000713 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000714
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000715 - If the left hand object has the appropriate struct members, and
716 they are filled, call the appropriate function and return the
717 result. No coercion is done on the arguments; the left-hand object
718 is the one the operation is performed on, and it's up to the
719 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000720
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000721 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000722 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000723
724 */
725
Guido van Rossum77660912002-04-16 16:32:50 +0000726#define HASINPLACE(t) \
727 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000728
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000729static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000730binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000731{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000732 PyNumberMethods *mv = v->ob_type->tp_as_number;
733 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000734 binaryfunc slot = NB_BINOP(mv, iop_slot);
735 if (slot) {
736 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000737 if (x != Py_NotImplemented) {
738 return x;
739 }
740 Py_DECREF(x);
741 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000742 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000743 return binary_op1(v, w, op_slot);
744}
745
746static PyObject *
747binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
748 const char *op_name)
749{
750 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
751 if (result == Py_NotImplemented) {
752 Py_DECREF(result);
753 return binop_type_error(v, w, op_name);
754 }
755 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000756}
757
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000758#define INPLACE_BINOP(func, iop, op, op_name) \
759 PyObject * \
760 func(PyObject *v, PyObject *w) { \
761 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000762 }
763
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000764INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
765INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
766INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
767INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
768INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
769INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
770INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000771
772PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000773PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
774{
775 /* XXX tp_flags test */
776 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
777 NB_SLOT(nb_floor_divide), "//=");
778}
779
780PyObject *
781PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
782{
783 /* XXX tp_flags test */
784 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
785 NB_SLOT(nb_true_divide), "/=");
786}
787
788PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000789PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
790{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000791 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
792 NB_SLOT(nb_add));
793 if (result == Py_NotImplemented) {
794 PySequenceMethods *m = v->ob_type->tp_as_sequence;
795 Py_DECREF(result);
796 if (m != NULL) {
797 binaryfunc f = NULL;
798 if (HASINPLACE(v))
799 f = m->sq_inplace_concat;
800 if (f == NULL)
801 f = m->sq_concat;
802 if (f != NULL)
803 return (*f)(v, w);
804 }
805 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000806 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000807 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000808}
809
810PyObject *
811PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
812{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000813 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
814 NB_SLOT(nb_multiply));
815 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000816 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000817 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
818 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
819 Py_DECREF(result);
820 if (mv != NULL) {
821 if (HASINPLACE(v))
822 f = mv->sq_inplace_repeat;
823 if (f == NULL)
824 f = mv->sq_repeat;
825 if (f != NULL)
826 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000827 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000828 else if (mw != NULL) {
829 /* Note that the right hand operand should not be
830 * mutated in this case so sq_inplace_repeat is not
831 * used. */
832 if (mw->sq_repeat)
833 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000834 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000835 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000836 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000837 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000838}
839
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000840PyObject *
841PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
842{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000843 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
844 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000845}
846
847PyObject *
848PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
849{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000850 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
851 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
852 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000853 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000854 else {
855 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
856 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000857}
858
859
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000860/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000861
862PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000863PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000864{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000865 PyNumberMethods *m;
866
867 if (o == NULL)
868 return null_error();
869 m = o->ob_type->tp_as_number;
870 if (m && m->nb_negative)
871 return (*m->nb_negative)(o);
872
873 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000874}
875
876PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000877PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000878{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000879 PyNumberMethods *m;
880
881 if (o == NULL)
882 return null_error();
883 m = o->ob_type->tp_as_number;
884 if (m && m->nb_positive)
885 return (*m->nb_positive)(o);
886
887 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000888}
889
890PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000891PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000892{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000893 PyNumberMethods *m;
894
895 if (o == NULL)
896 return null_error();
897 m = o->ob_type->tp_as_number;
898 if (m && m->nb_invert)
899 return (*m->nb_invert)(o);
900
901 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000902}
903
904PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000905PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000906{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000907 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000908
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000909 if (o == NULL)
910 return null_error();
911 m = o->ob_type->tp_as_number;
912 if (m && m->nb_absolute)
913 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000914
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000915 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000916}
917
Guido van Rossum9e896b32000-04-05 20:11:21 +0000918/* Add a check for embedded NULL-bytes in the argument. */
919static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000920int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000921{
922 char *end;
923 PyObject *x;
924
925 x = PyInt_FromString((char*)s, &end, 10);
926 if (x == NULL)
927 return NULL;
928 if (end != s + len) {
929 PyErr_SetString(PyExc_ValueError,
930 "null byte in argument for int()");
931 Py_DECREF(x);
932 return NULL;
933 }
934 return x;
935}
936
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000937/* Return a Py_ssize_t integer from the object item */
938Py_ssize_t
939PyNumber_Index(PyObject *item)
940{
941 Py_ssize_t value = -1;
942 PyNumberMethods *nb = item->ob_type->tp_as_number;
943 if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) {
944 value = nb->nb_index(item);
945 }
946 else {
Armin Rigo314861c2006-03-30 14:04:02 +0000947 PyErr_Format(PyExc_TypeError,
948 "'%.200s' object cannot be interpreted "
949 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000950 }
951 return value;
952}
953
Guido van Rossume15dee51995-07-18 14:12:02 +0000954PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000955PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000956{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000957 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000958 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000959 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000960
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000961 if (o == NULL)
962 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000963 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000964 Py_INCREF(o);
965 return o;
966 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000967 m = o->ob_type->tp_as_number;
968 if (m && m->nb_int) { /* This should include subclasses of int */
969 PyObject *res = m->nb_int(o);
970 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
971 PyErr_Format(PyExc_TypeError,
972 "__int__ returned non-int (type %.200s)",
973 res->ob_type->tp_name);
974 Py_DECREF(res);
975 return NULL;
976 }
977 return res;
978 }
979 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000980 PyIntObject *io = (PyIntObject*)o;
981 return PyInt_FromLong(io->ob_ival);
982 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000983 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000984 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000985 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000986#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000987 if (PyUnicode_Check(o))
988 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
989 PyUnicode_GET_SIZE(o),
990 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000991#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000992 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000993 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000994
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000995 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000996}
997
Guido van Rossum9e896b32000-04-05 20:11:21 +0000998/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000999static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001000long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001001{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001002 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001003 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001004
Guido van Rossum4c08d552000-03-10 22:55:18 +00001005 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001006 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001007 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001008 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001009 PyErr_SetString(PyExc_ValueError,
1010 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001011 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001012 return NULL;
1013 }
1014 return x;
1015}
1016
Guido van Rossume15dee51995-07-18 14:12:02 +00001017PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001018PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001019{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001020 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001021 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001022 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001023
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001024 if (o == NULL)
1025 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001026 m = o->ob_type->tp_as_number;
1027 if (m && m->nb_long) { /* This should include subclasses of long */
1028 PyObject *res = m->nb_long(o);
1029 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1030 PyErr_Format(PyExc_TypeError,
1031 "__long__ returned non-long (type %.200s)",
1032 res->ob_type->tp_name);
1033 Py_DECREF(res);
1034 return NULL;
1035 }
1036 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001037 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001038 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001039 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001040 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001041 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001042 * doesn't do. In particular long('9.5') must raise an
1043 * exception, not truncate the float.
1044 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001045 return long_from_string(PyString_AS_STRING(o),
1046 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001047#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001048 if (PyUnicode_Check(o))
1049 /* The above check is done in PyLong_FromUnicode(). */
1050 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1051 PyUnicode_GET_SIZE(o),
1052 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001053#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001054 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1055 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001056
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001057 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001058}
1059
1060PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001061PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001063 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001065 if (o == NULL)
1066 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001067 m = o->ob_type->tp_as_number;
1068 if (m && m->nb_float) { /* This should include subclasses of float */
1069 PyObject *res = m->nb_float(o);
1070 if (res && !PyFloat_Check(res)) {
1071 PyErr_Format(PyExc_TypeError,
1072 "__float__ returned non-float (type %.200s)",
1073 res->ob_type->tp_name);
1074 Py_DECREF(res);
1075 return NULL;
1076 }
1077 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001078 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001079 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001080 PyFloatObject *po = (PyFloatObject *)o;
1081 return PyFloat_FromDouble(po->ob_fval);
1082 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001083 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001084}
1085
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001086/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001087
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001088int
Fred Drake79912472000-07-09 04:06:11 +00001089PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001090{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001091 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001092 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001093 return s != NULL && s->ob_type->tp_as_sequence &&
1094 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001095}
1096
Martin v. Löwis18e16552006-02-15 17:27:45 +00001097Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001098PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001099{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001100 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001101
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001102 if (s == NULL) {
1103 null_error();
1104 return -1;
1105 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001106
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001107 m = s->ob_type->tp_as_sequence;
1108 if (m && m->sq_length)
1109 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001110
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001111 type_error("len() of unsized object");
1112 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001113}
1114
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001115#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001116Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001117PySequence_Length(PyObject *s)
1118{
1119 return PySequence_Size(s);
1120}
1121#define PySequence_Length PySequence_Size
1122
Guido van Rossume15dee51995-07-18 14:12:02 +00001123PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001124PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001125{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001126 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001127
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001128 if (s == NULL || o == NULL)
1129 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001130
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001131 m = s->ob_type->tp_as_sequence;
1132 if (m && m->sq_concat)
1133 return m->sq_concat(s, o);
1134
Armin Rigofd163f92005-12-29 15:59:19 +00001135 /* Instances of user classes defining an __add__() method only
1136 have an nb_add slot, not an sq_concat slot. So we fall back
1137 to nb_add if both arguments appear to be sequences. */
1138 if (PySequence_Check(s) && PySequence_Check(o)) {
1139 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1140 if (result != Py_NotImplemented)
1141 return result;
1142 Py_DECREF(result);
1143 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001145}
1146
1147PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001148PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001149{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001151
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152 if (o == NULL)
1153 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001154
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001155 m = o->ob_type->tp_as_sequence;
1156 if (m && m->sq_repeat)
1157 return m->sq_repeat(o, count);
1158
Armin Rigofd163f92005-12-29 15:59:19 +00001159 /* Instances of user classes defining a __mul__() method only
1160 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1161 to nb_multiply if o appears to be a sequence. */
1162 if (PySequence_Check(o)) {
1163 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001164 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001165 if (n == NULL)
1166 return NULL;
1167 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1168 Py_DECREF(n);
1169 if (result != Py_NotImplemented)
1170 return result;
1171 Py_DECREF(result);
1172 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001173 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001174}
1175
1176PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001177PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1178{
1179 PySequenceMethods *m;
1180
1181 if (s == NULL || o == NULL)
1182 return null_error();
1183
1184 m = s->ob_type->tp_as_sequence;
1185 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1186 return m->sq_inplace_concat(s, o);
1187 if (m && m->sq_concat)
1188 return m->sq_concat(s, o);
1189
Armin Rigofd163f92005-12-29 15:59:19 +00001190 if (PySequence_Check(s) && PySequence_Check(o)) {
1191 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1192 NB_SLOT(nb_add));
1193 if (result != Py_NotImplemented)
1194 return result;
1195 Py_DECREF(result);
1196 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001197 return type_error("object can't be concatenated");
1198}
1199
1200PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001201PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001202{
1203 PySequenceMethods *m;
1204
1205 if (o == NULL)
1206 return null_error();
1207
1208 m = o->ob_type->tp_as_sequence;
1209 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1210 return m->sq_inplace_repeat(o, count);
1211 if (m && m->sq_repeat)
1212 return m->sq_repeat(o, count);
1213
Armin Rigofd163f92005-12-29 15:59:19 +00001214 if (PySequence_Check(o)) {
1215 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001216 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001217 if (n == NULL)
1218 return NULL;
1219 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1220 NB_SLOT(nb_multiply));
1221 Py_DECREF(n);
1222 if (result != Py_NotImplemented)
1223 return result;
1224 Py_DECREF(result);
1225 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001226 return type_error("object can't be repeated");
1227}
1228
1229PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001230PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001231{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001233
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001234 if (s == NULL)
1235 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001236
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 m = s->ob_type->tp_as_sequence;
1238 if (m && m->sq_item) {
1239 if (i < 0) {
1240 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001241 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242 if (l < 0)
1243 return NULL;
1244 i += l;
1245 }
1246 }
1247 return m->sq_item(s, i);
1248 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001249
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001250 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001251}
1252
1253PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001254PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001255{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001256 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001257 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001258
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001260
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261 m = s->ob_type->tp_as_sequence;
1262 if (m && m->sq_slice) {
1263 if (i1 < 0 || i2 < 0) {
1264 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001265 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001266 if (l < 0)
1267 return NULL;
1268 if (i1 < 0)
1269 i1 += l;
1270 if (i2 < 0)
1271 i2 += l;
1272 }
1273 }
1274 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001275 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1276 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001277 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001278 if (!slice)
1279 return NULL;
1280 res = mp->mp_subscript(s, slice);
1281 Py_DECREF(slice);
1282 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001284
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001285 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001286}
1287
1288int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001289PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001290{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001292
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001293 if (s == NULL) {
1294 null_error();
1295 return -1;
1296 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001297
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001298 m = s->ob_type->tp_as_sequence;
1299 if (m && m->sq_ass_item) {
1300 if (i < 0) {
1301 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001302 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001304 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001305 i += l;
1306 }
1307 }
1308 return m->sq_ass_item(s, i, o);
1309 }
1310
Raymond Hettinger98779e02003-10-27 09:22:16 +00001311 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001313}
1314
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001315int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001316PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001317{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001319
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001320 if (s == NULL) {
1321 null_error();
1322 return -1;
1323 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001324
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001325 m = s->ob_type->tp_as_sequence;
1326 if (m && m->sq_ass_item) {
1327 if (i < 0) {
1328 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001329 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001330 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001331 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001332 i += l;
1333 }
1334 }
1335 return m->sq_ass_item(s, i, (PyObject *)NULL);
1336 }
1337
1338 type_error("object doesn't support item deletion");
1339 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001340}
1341
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001343PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001344{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001345 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001346 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001348 if (s == NULL) {
1349 null_error();
1350 return -1;
1351 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001352
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001353 m = s->ob_type->tp_as_sequence;
1354 if (m && m->sq_ass_slice) {
1355 if (i1 < 0 || i2 < 0) {
1356 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001357 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001358 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001359 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 if (i1 < 0)
1361 i1 += l;
1362 if (i2 < 0)
1363 i2 += l;
1364 }
1365 }
1366 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001367 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1368 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001369 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001370 if (!slice)
1371 return -1;
1372 res = mp->mp_ass_subscript(s, slice, o);
1373 Py_DECREF(slice);
1374 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001376
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001377 type_error("object doesn't support slice assignment");
1378 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001379}
1380
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001382PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001383{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001385
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001386 if (s == NULL) {
1387 null_error();
1388 return -1;
1389 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001390
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391 m = s->ob_type->tp_as_sequence;
1392 if (m && m->sq_ass_slice) {
1393 if (i1 < 0 || i2 < 0) {
1394 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001395 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001397 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001398 if (i1 < 0)
1399 i1 += l;
1400 if (i2 < 0)
1401 i2 += l;
1402 }
1403 }
1404 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1405 }
1406 type_error("object doesn't support slice deletion");
1407 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001408}
1409
Guido van Rossume15dee51995-07-18 14:12:02 +00001410PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001411PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001412{
Tim Peters6912d4d2001-05-05 03:56:37 +00001413 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001414 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001415 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001416 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001417
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001418 if (v == NULL)
1419 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001420
Tim Peters6912d4d2001-05-05 03:56:37 +00001421 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001422 if (PyTuple_CheckExact(v)) {
1423 /* Note that we can't know whether it's safe to return
1424 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001425 to exact tuples here. In contrast, lists always make
1426 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 Py_INCREF(v);
1428 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001429 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001430 if (PyList_Check(v))
1431 return PyList_AsTuple(v);
1432
Tim Peters6912d4d2001-05-05 03:56:37 +00001433 /* Get iterator. */
1434 it = PyObject_GetIter(v);
1435 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001436 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437
Tim Peters6912d4d2001-05-05 03:56:37 +00001438 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001439 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001440 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001441 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1442 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1443 Py_DECREF(it);
1444 return NULL;
1445 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001446 PyErr_Clear();
1447 n = 10; /* arbitrary */
1448 }
1449 result = PyTuple_New(n);
1450 if (result == NULL)
1451 goto Fail;
1452
1453 /* Fill the tuple. */
1454 for (j = 0; ; ++j) {
1455 PyObject *item = PyIter_Next(it);
1456 if (item == NULL) {
1457 if (PyErr_Occurred())
1458 goto Fail;
1459 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001461 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001462 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001463 /* The over-allocation strategy can grow a bit faster
1464 than for lists because unlike lists the
1465 over-allocation isn't permanent -- we reclaim
1466 the excess before the end of this routine.
1467 So, grow by ten and then add 25%.
1468 */
1469 n += 10;
1470 n += n >> 2;
1471 if (n < oldn) {
1472 /* Check for overflow */
1473 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001474 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001475 goto Fail;
1476 }
Tim Peters4324aa32001-05-28 22:30:08 +00001477 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001478 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001479 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001480 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001481 }
1482 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001483 }
1484
Tim Peters6912d4d2001-05-05 03:56:37 +00001485 /* Cut tuple back if guess was too large. */
1486 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001487 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001488 goto Fail;
1489
1490 Py_DECREF(it);
1491 return result;
1492
1493Fail:
1494 Py_XDECREF(result);
1495 Py_DECREF(it);
1496 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001497}
1498
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001499PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001500PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001501{
Tim Petersf553f892001-05-01 20:45:31 +00001502 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001503 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001504
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001505 if (v == NULL)
1506 return null_error();
1507
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001508 result = PyList_New(0);
1509 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001510 return NULL;
1511
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001512 rv = _PyList_Extend((PyListObject *)result, v);
1513 if (rv == NULL) {
1514 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001515 return NULL;
1516 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001517 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001518 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001519}
1520
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001521PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001522PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001523{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001524 PyObject *it;
1525
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001526 if (v == NULL)
1527 return null_error();
1528
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001529 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001530 Py_INCREF(v);
1531 return v;
1532 }
1533
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001534 it = PyObject_GetIter(v);
1535 if (it == NULL) {
1536 if (PyErr_ExceptionMatches(PyExc_TypeError))
1537 return type_error(m);
1538 return NULL;
1539 }
1540
Raymond Hettinger193814c2004-12-18 19:00:59 +00001541 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001542 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001543
1544 return v;
1545}
1546
Tim Peters16a77ad2001-09-08 04:00:12 +00001547/* Iterate over seq. Result depends on the operation:
1548 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1549 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1550 set ValueError and return -1 if none found; also return -1 on error.
1551 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1552*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001553Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001554_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001555{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001556 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001557 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1558 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001559
Tim Peters16a77ad2001-09-08 04:00:12 +00001560 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001561 null_error();
1562 return -1;
1563 }
Tim Peters75f8e352001-05-05 11:33:43 +00001564
Tim Peters16a77ad2001-09-08 04:00:12 +00001565 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001566 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001567 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001568 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001569 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001570
Tim Peters16a77ad2001-09-08 04:00:12 +00001571 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001572 for (;;) {
1573 int cmp;
1574 PyObject *item = PyIter_Next(it);
1575 if (item == NULL) {
1576 if (PyErr_Occurred())
1577 goto Fail;
1578 break;
1579 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001580
1581 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001582 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001583 if (cmp < 0)
1584 goto Fail;
1585 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001586 switch (operation) {
1587 case PY_ITERSEARCH_COUNT:
1588 ++n;
1589 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001590 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001591 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001592 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001593 goto Fail;
1594 }
1595 break;
1596
1597 case PY_ITERSEARCH_INDEX:
1598 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001599 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001600 PyErr_SetString(PyExc_OverflowError,
1601 "index exceeds C int size");
1602 goto Fail;
1603 }
1604 goto Done;
1605
1606 case PY_ITERSEARCH_CONTAINS:
1607 n = 1;
1608 goto Done;
1609
1610 default:
1611 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001612 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001613 }
1614
1615 if (operation == PY_ITERSEARCH_INDEX) {
1616 ++n;
1617 if (n <= 0)
1618 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001619 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001620 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001621
1622 if (operation != PY_ITERSEARCH_INDEX)
1623 goto Done;
1624
1625 PyErr_SetString(PyExc_ValueError,
1626 "sequence.index(x): x not in sequence");
1627 /* fall into failure code */
1628Fail:
1629 n = -1;
1630 /* fall through */
1631Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001632 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001633 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001634
Guido van Rossume15dee51995-07-18 14:12:02 +00001635}
1636
Tim Peters16a77ad2001-09-08 04:00:12 +00001637/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001638Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001639PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001640{
Tim Peters16a77ad2001-09-08 04:00:12 +00001641 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001642}
1643
Tim Peterscb8d3682001-05-05 21:05:01 +00001644/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001645 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001646 */
1647int
1648PySequence_Contains(PyObject *seq, PyObject *ob)
1649{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001650 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001651 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1652 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1653 if (sqm != NULL && sqm->sq_contains != NULL)
1654 return (*sqm->sq_contains)(seq, ob);
1655 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001656 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1657 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001658}
1659
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001660/* Backwards compatibility */
1661#undef PySequence_In
1662int
Fred Drake79912472000-07-09 04:06:11 +00001663PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001664{
1665 return PySequence_Contains(w, v);
1666}
1667
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001668Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001669PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001670{
Tim Peters16a77ad2001-09-08 04:00:12 +00001671 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001672}
1673
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001674/* Operations on mappings */
1675
1676int
Fred Drake79912472000-07-09 04:06:11 +00001677PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001678{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001679 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001680 return PyObject_HasAttrString(o, "__getitem__");
1681
1682 return o && o->ob_type->tp_as_mapping &&
1683 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001684 !(o->ob_type->tp_as_sequence &&
1685 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001686}
1687
Martin v. Löwis18e16552006-02-15 17:27:45 +00001688Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001689PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001690{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001691 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001692
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001693 if (o == NULL) {
1694 null_error();
1695 return -1;
1696 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001697
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001698 m = o->ob_type->tp_as_mapping;
1699 if (m && m->mp_length)
1700 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001701
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001702 type_error("len() of unsized object");
1703 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001704}
1705
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001706#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001707Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001708PyMapping_Length(PyObject *o)
1709{
1710 return PyMapping_Size(o);
1711}
1712#define PyMapping_Length PyMapping_Size
1713
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001715PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001716{
1717 PyObject *okey, *r;
1718
1719 if (key == NULL)
1720 return null_error();
1721
1722 okey = PyString_FromString(key);
1723 if (okey == NULL)
1724 return NULL;
1725 r = PyObject_GetItem(o, okey);
1726 Py_DECREF(okey);
1727 return r;
1728}
1729
1730int
Fred Drake79912472000-07-09 04:06:11 +00001731PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001732{
1733 PyObject *okey;
1734 int r;
1735
1736 if (key == NULL) {
1737 null_error();
1738 return -1;
1739 }
1740
1741 okey = PyString_FromString(key);
1742 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001743 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001744 r = PyObject_SetItem(o, okey, value);
1745 Py_DECREF(okey);
1746 return r;
1747}
1748
1749int
Fred Drake79912472000-07-09 04:06:11 +00001750PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001751{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001752 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001753
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001754 v = PyMapping_GetItemString(o, key);
1755 if (v) {
1756 Py_DECREF(v);
1757 return 1;
1758 }
1759 PyErr_Clear();
1760 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001761}
1762
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001763int
Fred Drake79912472000-07-09 04:06:11 +00001764PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001765{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001766 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001767
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001768 v = PyObject_GetItem(o, key);
1769 if (v) {
1770 Py_DECREF(v);
1771 return 1;
1772 }
1773 PyErr_Clear();
1774 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001775}
1776
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001777/* Operations on callable objects */
1778
1779/* XXX PyCallable_Check() is in object.c */
1780
Guido van Rossume15dee51995-07-18 14:12:02 +00001781PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001782PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001783{
Guido van Rossum5560b742001-09-14 16:47:50 +00001784 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001785}
Guido van Rossume15dee51995-07-18 14:12:02 +00001786
1787PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001788PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1789{
1790 ternaryfunc call;
1791
1792 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon6946ea02006-06-09 22:45:54 +00001793 PyObject *result = NULL;
Brett Cannon22565aa2006-06-09 22:31:23 +00001794 /* slot_tp_call() will be called and ends up calling
1795 PyObject_Call() if the object returned for __call__ has
1796 __call__ itself defined upon it. This can be an infinite
1797 recursion if you set __call__ in a class to an instance of
1798 it. */
Brett Cannon6946ea02006-06-09 22:45:54 +00001799 if (Py_EnterRecursiveCall(" in __call__")) {
Brett Cannon22565aa2006-06-09 22:31:23 +00001800 return NULL;
Brett Cannon6946ea02006-06-09 22:45:54 +00001801 }
1802 result = (*call)(func, arg, kw);
Brett Cannon22565aa2006-06-09 22:31:23 +00001803 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001804 if (result == NULL && !PyErr_Occurred())
1805 PyErr_SetString(
1806 PyExc_SystemError,
1807 "NULL result without error in PyObject_Call");
1808 return result;
1809 }
Fred Drake573395a2001-11-01 20:26:12 +00001810 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1811 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001812 return NULL;
1813}
1814
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001815static PyObject*
1816call_function_tail(PyObject *callable, PyObject *args)
1817{
1818 PyObject *retval;
1819
1820 if (args == NULL)
1821 return NULL;
1822
1823 if (!PyTuple_Check(args)) {
1824 PyObject *a;
1825
1826 a = PyTuple_New(1);
1827 if (a == NULL) {
1828 Py_DECREF(args);
1829 return NULL;
1830 }
1831 PyTuple_SET_ITEM(a, 0, args);
1832 args = a;
1833 }
1834 retval = PyObject_Call(callable, args, NULL);
1835
1836 Py_DECREF(args);
1837
1838 return retval;
1839}
1840
Tim Peters6d6c1a32001-08-02 04:15:00 +00001841PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001842PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001843{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001845 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001846
Fred Drakeb92cf062001-10-27 06:16:31 +00001847 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001848 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001849
Fred Drakeb92cf062001-10-27 06:16:31 +00001850 if (format && *format) {
1851 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001852 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001853 va_end(va);
1854 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001855 else
1856 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001857
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001858 return call_function_tail(callable, args);
1859}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001860
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001861PyObject *
1862_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1863{
1864 va_list va;
1865 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001866
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001867 if (callable == NULL)
1868 return null_error();
1869
1870 if (format && *format) {
1871 va_start(va, format);
1872 args = _Py_VaBuildValue_SizeT(format, va);
1873 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001874 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001875 else
1876 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001877
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001878 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001879}
1880
1881PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001882PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001883{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001884 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001885 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001886 PyObject *func = NULL;
1887 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001888
Fred Drakeb92cf062001-10-27 06:16:31 +00001889 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001890 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001891
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001892 func = PyObject_GetAttrString(o, name);
1893 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001894 PyErr_SetString(PyExc_AttributeError, name);
1895 return 0;
1896 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001897
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001898 if (!PyCallable_Check(func)) {
1899 type_error("call of non-callable attribute");
1900 goto exit;
1901 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001902
Fred Drakeb92cf062001-10-27 06:16:31 +00001903 if (format && *format) {
1904 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001905 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001906 va_end(va);
1907 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001908 else
1909 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001910
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001911 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001912
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001913 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001914 /* args gets consumed in call_function_tail */
1915 Py_XDECREF(func);
1916
1917 return retval;
1918}
1919
1920PyObject *
1921_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1922{
1923 va_list va;
1924 PyObject *args;
1925 PyObject *func = NULL;
1926 PyObject *retval = NULL;
1927
1928 if (o == NULL || name == NULL)
1929 return null_error();
1930
1931 func = PyObject_GetAttrString(o, name);
1932 if (func == NULL) {
1933 PyErr_SetString(PyExc_AttributeError, name);
1934 return 0;
1935 }
1936
1937 if (!PyCallable_Check(func)) {
1938 type_error("call of non-callable attribute");
1939 goto exit;
1940 }
1941
1942 if (format && *format) {
1943 va_start(va, format);
1944 args = _Py_VaBuildValue_SizeT(format, va);
1945 va_end(va);
1946 }
1947 else
1948 args = PyTuple_New(0);
1949
1950 retval = call_function_tail(func, args);
1951
1952 exit:
1953 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001954 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001955
1956 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001957}
Guido van Rossum823649d2001-03-21 18:40:58 +00001958
1959
Fred Drakeb421b8c2001-10-26 16:21:32 +00001960static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001961objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001962{
1963 int i, n = 0;
1964 va_list countva;
1965 PyObject *result, *tmp;
1966
1967#ifdef VA_LIST_IS_ARRAY
1968 memcpy(countva, va, sizeof(va_list));
1969#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001970#ifdef __va_copy
1971 __va_copy(countva, va);
1972#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001973 countva = va;
1974#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001975#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001976
1977 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1978 ++n;
1979 result = PyTuple_New(n);
1980 if (result != NULL && n > 0) {
1981 for (i = 0; i < n; ++i) {
1982 tmp = (PyObject *)va_arg(va, PyObject *);
1983 PyTuple_SET_ITEM(result, i, tmp);
1984 Py_INCREF(tmp);
1985 }
1986 }
1987 return result;
1988}
1989
1990PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001991PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001992{
1993 PyObject *args, *tmp;
1994 va_list vargs;
1995
1996 if (callable == NULL || name == NULL)
1997 return null_error();
1998
1999 callable = PyObject_GetAttr(callable, name);
2000 if (callable == NULL)
2001 return NULL;
2002
2003 /* count the args */
2004 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002005 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002006 va_end(vargs);
2007 if (args == NULL) {
2008 Py_DECREF(callable);
2009 return NULL;
2010 }
2011 tmp = PyObject_Call(callable, args, NULL);
2012 Py_DECREF(args);
2013 Py_DECREF(callable);
2014
2015 return tmp;
2016}
2017
2018PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002019PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002020{
2021 PyObject *args, *tmp;
2022 va_list vargs;
2023
2024 if (callable == NULL)
2025 return null_error();
2026
2027 /* count the args */
2028 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002029 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002030 va_end(vargs);
2031 if (args == NULL)
2032 return NULL;
2033 tmp = PyObject_Call(callable, args, NULL);
2034 Py_DECREF(args);
2035
2036 return tmp;
2037}
2038
2039
Guido van Rossum823649d2001-03-21 18:40:58 +00002040/* isinstance(), issubclass() */
2041
Barry Warsawf16951c2002-04-23 22:45:44 +00002042/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2043 * state that will almost never happen.
2044 *
2045 * 0. creating the __bases__ static string could get a MemoryError
2046 * 1. getattr(cls, '__bases__') could raise an AttributeError
2047 * 2. getattr(cls, '__bases__') could raise some other exception
2048 * 3. getattr(cls, '__bases__') could return a tuple
2049 * 4. getattr(cls, '__bases__') could return something other than a tuple
2050 *
2051 * Only state #3 is a non-error state and only it returns a non-NULL object
2052 * (it returns the retrieved tuple).
2053 *
2054 * Any raised AttributeErrors are masked by clearing the exception and
2055 * returning NULL. If an object other than a tuple comes out of __bases__,
2056 * then again, the return value is NULL. So yes, these two situations
2057 * produce exactly the same results: NULL is returned and no error is set.
2058 *
2059 * If some exception other than AttributeError is raised, then NULL is also
2060 * returned, but the exception is not cleared. That's because we want the
2061 * exception to be propagated along.
2062 *
2063 * Callers are expected to test for PyErr_Occurred() when the return value
2064 * is NULL to decide whether a valid exception should be propagated or not.
2065 * When there's no exception to propagate, it's customary for the caller to
2066 * set a TypeError.
2067 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002068static PyObject *
2069abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002070{
2071 static PyObject *__bases__ = NULL;
2072 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002073
2074 if (__bases__ == NULL) {
2075 __bases__ = PyString_FromString("__bases__");
2076 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002077 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002078 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002079 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002080 if (bases == NULL) {
2081 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2082 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002083 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002084 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002085 if (!PyTuple_Check(bases)) {
2086 Py_DECREF(bases);
2087 return NULL;
2088 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002089 return bases;
2090}
2091
2092
2093static int
2094abstract_issubclass(PyObject *derived, PyObject *cls)
2095{
2096 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002097 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002098 int r = 0;
2099
2100
Guido van Rossum823649d2001-03-21 18:40:58 +00002101 if (derived == cls)
2102 return 1;
2103
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002104 if (PyTuple_Check(cls)) {
2105 /* Not a general sequence -- that opens up the road to
2106 recursion and stack overflow. */
2107 n = PyTuple_GET_SIZE(cls);
2108 for (i = 0; i < n; i++) {
2109 if (derived == PyTuple_GET_ITEM(cls, i))
2110 return 1;
2111 }
2112 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002113 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002114 if (bases == NULL) {
2115 if (PyErr_Occurred())
2116 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002117 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002118 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002119 n = PyTuple_GET_SIZE(bases);
2120 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002121 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002122 if (r != 0)
2123 break;
2124 }
2125
2126 Py_DECREF(bases);
2127
2128 return r;
2129}
2130
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002131static int
2132check_class(PyObject *cls, const char *error)
2133{
2134 PyObject *bases = abstract_get_bases(cls);
2135 if (bases == NULL) {
2136 /* Do not mask errors. */
2137 if (!PyErr_Occurred())
2138 PyErr_SetString(PyExc_TypeError, error);
2139 return 0;
2140 }
2141 Py_DECREF(bases);
2142 return -1;
2143}
2144
Brett Cannon4f653312004-03-20 22:52:14 +00002145static int
2146recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002147{
2148 PyObject *icls;
2149 static PyObject *__class__ = NULL;
2150 int retval = 0;
2151
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002152 if (__class__ == NULL) {
2153 __class__ = PyString_FromString("__class__");
2154 if (__class__ == NULL)
2155 return -1;
2156 }
2157
Neil Schemenauer6b471292001-10-18 03:18:43 +00002158 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2159 PyObject *inclass =
2160 (PyObject*)((PyInstanceObject*)inst)->in_class;
2161 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002162 }
2163 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002164 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002165 if (retval == 0) {
2166 PyObject *c = PyObject_GetAttr(inst, __class__);
2167 if (c == NULL) {
2168 PyErr_Clear();
2169 }
2170 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002171 if (c != (PyObject *)(inst->ob_type) &&
2172 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002173 retval = PyType_IsSubtype(
2174 (PyTypeObject *)c,
2175 (PyTypeObject *)cls);
2176 Py_DECREF(c);
2177 }
2178 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002179 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002180 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002181 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002182
Brett Cannon4f653312004-03-20 22:52:14 +00002183 if (!recursion_depth) {
2184 PyErr_SetString(PyExc_RuntimeError,
2185 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002186 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002187 }
2188
Guido van Rossum03290ec2001-10-07 20:54:12 +00002189 n = PyTuple_GET_SIZE(cls);
2190 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002191 retval = recursive_isinstance(
2192 inst,
2193 PyTuple_GET_ITEM(cls, i),
2194 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002195 if (retval != 0)
2196 break;
2197 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002198 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002199 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002200 if (!check_class(cls,
2201 "isinstance() arg 2 must be a class, type,"
2202 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002203 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002204 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002205 if (icls == NULL) {
2206 PyErr_Clear();
2207 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002208 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002209 else {
2210 retval = abstract_issubclass(icls, cls);
2211 Py_DECREF(icls);
2212 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002213 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002214
Guido van Rossum823649d2001-03-21 18:40:58 +00002215 return retval;
2216}
2217
2218int
Brett Cannon4f653312004-03-20 22:52:14 +00002219PyObject_IsInstance(PyObject *inst, PyObject *cls)
2220{
2221 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2222}
2223
2224static int
2225recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002226{
2227 int retval;
2228
2229 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002230 if (!check_class(derived,
2231 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002232 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002233
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002234 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002235 Py_ssize_t i;
2236 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002237
2238 if (!recursion_depth) {
2239 PyErr_SetString(PyExc_RuntimeError,
2240 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002241 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002242 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002243 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002244 retval = recursive_issubclass(
2245 derived,
2246 PyTuple_GET_ITEM(cls, i),
2247 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002248 if (retval != 0) {
2249 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002250 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002251 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002252 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002253 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002254 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002255 else {
2256 if (!check_class(cls,
2257 "issubclass() arg 2 must be a class"
2258 " or tuple of classes"))
2259 return -1;
2260 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002261
2262 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002263 }
2264 else {
2265 /* shortcut */
2266 if (!(retval = (derived == cls)))
2267 retval = PyClass_IsSubclass(derived, cls);
2268 }
2269
2270 return retval;
2271}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002272
Brett Cannon4f653312004-03-20 22:52:14 +00002273int
2274PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2275{
2276 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2277}
2278
2279
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002280PyObject *
2281PyObject_GetIter(PyObject *o)
2282{
2283 PyTypeObject *t = o->ob_type;
2284 getiterfunc f = NULL;
2285 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2286 f = t->tp_iter;
2287 if (f == NULL) {
2288 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002289 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002290 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002291 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002292 return NULL;
2293 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002294 else {
2295 PyObject *res = (*f)(o);
2296 if (res != NULL && !PyIter_Check(res)) {
2297 PyErr_Format(PyExc_TypeError,
2298 "iter() returned non-iterator "
2299 "of type '%.100s'",
2300 res->ob_type->tp_name);
2301 Py_DECREF(res);
2302 res = NULL;
2303 }
2304 return res;
2305 }
2306}
2307
Tim Petersf4848da2001-05-05 00:14:56 +00002308/* Return next item.
2309 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2310 * If the iteration terminates normally, return NULL and clear the
2311 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2312 * will be false.
2313 * Else return the next object. PyErr_Occurred() will be false.
2314 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002315PyObject *
2316PyIter_Next(PyObject *iter)
2317{
Tim Petersf4848da2001-05-05 00:14:56 +00002318 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002319 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002320 result = (*iter->ob_type->tp_iternext)(iter);
2321 if (result == NULL &&
2322 PyErr_Occurred() &&
2323 PyErr_ExceptionMatches(PyExc_StopIteration))
2324 PyErr_Clear();
2325 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002326}