blob: 638e41787d07acd39e8cd365c4ef4a9dc6c7d634 [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 *
Georg Brandlccff7852006-06-18 22:17:29 +000017type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000018{
Georg Brandlccff7852006-06-18 22:17:29 +000019 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000020 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)
Georg Brandlccff7852006-06-18 22:17:29 +0000133 return type_error("sequence index must "
134 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000135 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000136
Georg Brandlccff7852006-06-18 22:17:29 +0000137 return type_error("'%.200s' object is unsubscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000138}
139
140int
Fred Drake79912472000-07-09 04:06:11 +0000141PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000142{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000143 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000144
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000145 if (o == NULL || key == NULL || value == NULL) {
146 null_error();
147 return -1;
148 }
149 m = o->ob_type->tp_as_mapping;
150 if (m && m->mp_ass_subscript)
151 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000152
Guido van Rossum21308241998-08-13 16:44:44 +0000153 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000154 PyNumberMethods *nb = key->ob_type->tp_as_number;
155 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
156 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000157 if (key_value == -1 && PyErr_Occurred())
158 return -1;
159 return PySequence_SetItem(o, key_value, value);
160 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000161 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000162 type_error("sequence index must be "
163 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000164 return -1;
165 }
Guido van Rossum21308241998-08-13 16:44:44 +0000166 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000167
Georg Brandlccff7852006-06-18 22:17:29 +0000168 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000169 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000170}
171
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000172int
Fred Drake79912472000-07-09 04:06:11 +0000173PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000174{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000175 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000176
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000177 if (o == NULL || key == NULL) {
178 null_error();
179 return -1;
180 }
181 m = o->ob_type->tp_as_mapping;
182 if (m && m->mp_ass_subscript)
183 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000184
Guido van Rossum21308241998-08-13 16:44:44 +0000185 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000186 PyNumberMethods *nb = key->ob_type->tp_as_number;
187 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
188 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000189 if (key_value == -1 && PyErr_Occurred())
190 return -1;
191 return PySequence_DelItem(o, key_value);
192 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000193 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000194 type_error("sequence index must be "
195 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000196 return -1;
197 }
Guido van Rossum21308241998-08-13 16:44:44 +0000198 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000199
Georg Brandlccff7852006-06-18 22:17:29 +0000200 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000201 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000202}
203
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000204int
205PyObject_DelItemString(PyObject *o, char *key)
206{
207 PyObject *okey;
208 int ret;
209
210 if (o == NULL || key == NULL) {
211 null_error();
212 return -1;
213 }
214 okey = PyString_FromString(key);
215 if (okey == NULL)
216 return -1;
217 ret = PyObject_DelItem(o, okey);
218 Py_DECREF(okey);
219 return ret;
220}
221
Brett Cannonea229bd2006-06-06 18:08:16 +0000222int
223PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000224 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000225 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000226{
227 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000228 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000229 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000230
231 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
232 null_error();
233 return -1;
234 }
235 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000236 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000237 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000238 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239 PyErr_SetString(PyExc_TypeError,
240 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000241 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000243 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000244 PyErr_SetString(PyExc_TypeError,
245 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000246 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000247 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000248 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000249 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000250 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000251 *buffer = pp;
252 *buffer_len = len;
253 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000255
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000256int
257PyObject_CheckReadBuffer(PyObject *obj)
258{
259 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
260
261 if (pb == NULL ||
262 pb->bf_getreadbuffer == NULL ||
263 pb->bf_getsegcount == NULL ||
264 (*pb->bf_getsegcount)(obj, NULL) != 1)
265 return 0;
266 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267}
268
269int PyObject_AsReadBuffer(PyObject *obj,
270 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000271 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000272{
273 PyBufferProcs *pb;
274 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000275 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000276
277 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
278 null_error();
279 return -1;
280 }
281 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000282 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000284 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000285 PyErr_SetString(PyExc_TypeError,
286 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000287 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000289 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 PyErr_SetString(PyExc_TypeError,
291 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000292 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000293 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000294 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000295 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000296 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000297 *buffer = pp;
298 *buffer_len = len;
299 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000300}
301
302int PyObject_AsWriteBuffer(PyObject *obj,
303 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000305{
306 PyBufferProcs *pb;
307 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000308 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000309
310 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
311 null_error();
312 return -1;
313 }
314 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000315 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000317 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000318 PyErr_SetString(PyExc_TypeError,
319 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000320 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000322 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000323 PyErr_SetString(PyExc_TypeError,
324 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000325 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000326 }
327 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
328 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000329 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000330 *buffer = pp;
331 *buffer_len = len;
332 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000333}
334
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000335/* Operations on numbers */
336
337int
Fred Drake79912472000-07-09 04:06:11 +0000338PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000339{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000340 return o && o->ob_type->tp_as_number &&
341 (o->ob_type->tp_as_number->nb_int ||
342 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000343}
344
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000345/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000346
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000347/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000348
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000349#define NB_SLOT(x) offsetof(PyNumberMethods, x)
350#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000351 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000352#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000353 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000354
355/*
356 Calling scheme used for binary operations:
357
358 v w Action
359 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000360 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000361 new old v.op(v,w), coerce(v,w), v.op(v,w)
362 old new w.op(v,w), coerce(v,w), v.op(v,w)
363 old old coerce(v,w), v.op(v,w)
364
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000365 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
366 v->ob_type
367
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000368 Legend:
369 -------
370 * new == new style number
371 * old == old style number
372 * Action indicates the order in which operations are tried until either
373 a valid result is produced or an error occurs.
374
375 */
376
377static PyObject *
378binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000379{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000380 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000381 binaryfunc slotv = NULL;
382 binaryfunc slotw = NULL;
383
384 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000385 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000386 if (w->ob_type != v->ob_type &&
387 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000388 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000389 if (slotw == slotv)
390 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000391 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000392 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000393 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
394 x = slotw(v, w);
395 if (x != Py_NotImplemented)
396 return x;
397 Py_DECREF(x); /* can't do it */
398 slotw = NULL;
399 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000400 x = slotv(v, w);
401 if (x != Py_NotImplemented)
402 return x;
403 Py_DECREF(x); /* can't do it */
404 }
405 if (slotw) {
406 x = slotw(v, w);
407 if (x != Py_NotImplemented)
408 return x;
409 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000410 }
411 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
412 int err = PyNumber_CoerceEx(&v, &w);
413 if (err < 0) {
414 return NULL;
415 }
416 if (err == 0) {
417 PyNumberMethods *mv = v->ob_type->tp_as_number;
418 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000419 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000420 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000421 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000422 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000423 Py_DECREF(v);
424 Py_DECREF(w);
425 return x;
426 }
427 }
428 /* CoerceEx incremented the reference counts */
429 Py_DECREF(v);
430 Py_DECREF(w);
431 }
432 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000433 Py_INCREF(Py_NotImplemented);
434 return Py_NotImplemented;
435}
Guido van Rossum77660912002-04-16 16:32:50 +0000436
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000437static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000438binop_type_error(PyObject *v, PyObject *w, const char *op_name)
439{
440 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000441 "unsupported operand type(s) for %.100s: "
442 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000443 op_name,
444 v->ob_type->tp_name,
445 w->ob_type->tp_name);
446 return NULL;
447}
448
449static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000450binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
451{
452 PyObject *result = binary_op1(v, w, op_slot);
453 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000454 Py_DECREF(result);
455 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000456 }
457 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000458}
459
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000460
461/*
462 Calling scheme used for ternary operations:
463
Guido van Rossum84675ac2001-09-29 01:05:03 +0000464 *** In some cases, w.op is called before v.op; see binary_op1. ***
465
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000466 v w z Action
467 -------------------------------------------------------------------
468 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
469 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
470 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
471 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
472 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
473 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
474 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
475 old old old coerce(v,w,z), v.op(v,w,z)
476
477 Legend:
478 -------
479 * new == new style number
480 * old == old style number
481 * Action indicates the order in which operations are tried until either
482 a valid result is produced or an error occurs.
483 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
484 only if z != Py_None; if z == Py_None, then it is treated as absent
485 variable and only coerce(v,w) is tried.
486
487 */
488
489static PyObject *
490ternary_op(PyObject *v,
491 PyObject *w,
492 PyObject *z,
493 const int op_slot,
494 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000495{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000496 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000497 PyObject *x = NULL;
498 ternaryfunc slotv = NULL;
499 ternaryfunc slotw = NULL;
500 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000501
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000502 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000503 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000504 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000505 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000506 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000507 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000508 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000509 if (slotw == slotv)
510 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000511 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000512 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000513 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
514 x = slotw(v, w, z);
515 if (x != Py_NotImplemented)
516 return x;
517 Py_DECREF(x); /* can't do it */
518 slotw = NULL;
519 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000520 x = slotv(v, w, z);
521 if (x != Py_NotImplemented)
522 return x;
523 Py_DECREF(x); /* can't do it */
524 }
525 if (slotw) {
526 x = slotw(v, w, z);
527 if (x != Py_NotImplemented)
528 return x;
529 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000530 }
531 mz = z->ob_type->tp_as_number;
532 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000533 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000534 if (slotz == slotv || slotz == slotw)
535 slotz = NULL;
536 if (slotz) {
537 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000538 if (x != Py_NotImplemented)
539 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000540 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000541 }
542 }
543
544 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
545 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
546 /* we have an old style operand, coerce */
547 PyObject *v1, *z1, *w2, *z2;
548 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000549
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000550 c = PyNumber_Coerce(&v, &w);
551 if (c != 0)
552 goto error3;
553
554 /* Special case: if the third argument is None, it is
555 treated as absent argument and not coerced. */
556 if (z == Py_None) {
557 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000558 slotz = NB_TERNOP(v->ob_type->tp_as_number,
559 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000560 if (slotz)
561 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000562 else
563 c = -1;
564 }
565 else
566 c = -1;
567 goto error2;
568 }
569 v1 = v;
570 z1 = z;
571 c = PyNumber_Coerce(&v1, &z1);
572 if (c != 0)
573 goto error2;
574 w2 = w;
575 z2 = z1;
576 c = PyNumber_Coerce(&w2, &z2);
577 if (c != 0)
578 goto error1;
579
580 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000581 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
582 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000583 if (slotv)
584 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000585 else
586 c = -1;
587 }
588 else
589 c = -1;
590
591 Py_DECREF(w2);
592 Py_DECREF(z2);
593 error1:
594 Py_DECREF(v1);
595 Py_DECREF(z1);
596 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000597 Py_DECREF(v);
598 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000599 error3:
600 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000601 return x;
602 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000603
604 if (z == Py_None)
605 PyErr_Format(
606 PyExc_TypeError,
607 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000608 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000609 v->ob_type->tp_name,
610 w->ob_type->tp_name);
611 else
612 PyErr_Format(
613 PyExc_TypeError,
614 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000615 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000616 v->ob_type->tp_name,
617 w->ob_type->tp_name,
618 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000619 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000620}
621
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000622#define BINARY_FUNC(func, op, op_name) \
623 PyObject * \
624 func(PyObject *v, PyObject *w) { \
625 return binary_op(v, w, NB_SLOT(op), op_name); \
626 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000627
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000628BINARY_FUNC(PyNumber_Or, nb_or, "|")
629BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
630BINARY_FUNC(PyNumber_And, nb_and, "&")
631BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
632BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
633BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000634BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
635BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000636
637PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000638PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000639{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000640 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
641 if (result == Py_NotImplemented) {
642 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000643 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000644 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000645 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000646 }
Armin Rigofd163f92005-12-29 15:59:19 +0000647 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000648 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000649 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000650}
651
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000652static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000653sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000654{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000655 Py_ssize_t count;
656 PyNumberMethods *nb = n->ob_type->tp_as_number;
657 if (nb != NULL && HASINDEX(n) && nb->nb_index != NULL) {
658 count = nb->nb_index(n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000659 if (count == -1 && PyErr_Occurred())
660 return NULL;
661 }
662 else {
Georg Brandlccff7852006-06-18 22:17:29 +0000663 return type_error("can't multiply sequence by "
664 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000665 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000666 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000667}
668
669PyObject *
670PyNumber_Multiply(PyObject *v, PyObject *w)
671{
672 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
673 if (result == Py_NotImplemented) {
674 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
675 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000676 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000677 if (mv && mv->sq_repeat) {
678 return sequence_repeat(mv->sq_repeat, v, w);
679 }
680 else if (mw && mw->sq_repeat) {
681 return sequence_repeat(mw->sq_repeat, w, v);
682 }
683 result = binop_type_error(v, w, "*");
684 }
685 return result;
686}
687
Guido van Rossume15dee51995-07-18 14:12:02 +0000688PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000689PyNumber_FloorDivide(PyObject *v, PyObject *w)
690{
691 /* XXX tp_flags test */
692 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
693}
694
695PyObject *
696PyNumber_TrueDivide(PyObject *v, PyObject *w)
697{
698 /* XXX tp_flags test */
699 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
700}
701
702PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000703PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000704{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000705 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000706}
707
708PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000709PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000710{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000711 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000712}
713
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000714/* Binary in-place operators */
715
716/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000717 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000718
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000719 - If the left hand object has the appropriate struct members, and
720 they are filled, call the appropriate function and return the
721 result. No coercion is done on the arguments; the left-hand object
722 is the one the operation is performed on, and it's up to the
723 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000724
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000725 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000727
728 */
729
Guido van Rossum77660912002-04-16 16:32:50 +0000730#define HASINPLACE(t) \
731 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000732
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000733static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000734binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000735{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000736 PyNumberMethods *mv = v->ob_type->tp_as_number;
737 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000738 binaryfunc slot = NB_BINOP(mv, iop_slot);
739 if (slot) {
740 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000741 if (x != Py_NotImplemented) {
742 return x;
743 }
744 Py_DECREF(x);
745 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000746 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000747 return binary_op1(v, w, op_slot);
748}
749
750static PyObject *
751binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
752 const char *op_name)
753{
754 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
755 if (result == Py_NotImplemented) {
756 Py_DECREF(result);
757 return binop_type_error(v, w, op_name);
758 }
759 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000760}
761
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000762#define INPLACE_BINOP(func, iop, op, op_name) \
763 PyObject * \
764 func(PyObject *v, PyObject *w) { \
765 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000766 }
767
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000768INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
769INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
770INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
771INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
772INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
773INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
774INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000775
776PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000777PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
778{
779 /* XXX tp_flags test */
780 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
781 NB_SLOT(nb_floor_divide), "//=");
782}
783
784PyObject *
785PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
786{
787 /* XXX tp_flags test */
788 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
789 NB_SLOT(nb_true_divide), "/=");
790}
791
792PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000793PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
794{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000795 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
796 NB_SLOT(nb_add));
797 if (result == Py_NotImplemented) {
798 PySequenceMethods *m = v->ob_type->tp_as_sequence;
799 Py_DECREF(result);
800 if (m != NULL) {
801 binaryfunc f = NULL;
802 if (HASINPLACE(v))
803 f = m->sq_inplace_concat;
804 if (f == NULL)
805 f = m->sq_concat;
806 if (f != NULL)
807 return (*f)(v, w);
808 }
809 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000810 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000811 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000812}
813
814PyObject *
815PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
816{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000817 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
818 NB_SLOT(nb_multiply));
819 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000820 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000821 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
822 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
823 Py_DECREF(result);
824 if (mv != NULL) {
825 if (HASINPLACE(v))
826 f = mv->sq_inplace_repeat;
827 if (f == NULL)
828 f = mv->sq_repeat;
829 if (f != NULL)
830 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000831 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000832 else if (mw != NULL) {
833 /* Note that the right hand operand should not be
834 * mutated in this case so sq_inplace_repeat is not
835 * used. */
836 if (mw->sq_repeat)
837 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000838 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000839 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000840 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000841 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000842}
843
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000844PyObject *
845PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
846{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000847 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
848 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000849}
850
851PyObject *
852PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
853{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000854 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
855 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
856 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000857 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000858 else {
859 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
860 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000861}
862
863
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000864/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000865
866PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000867PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000868{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000869 PyNumberMethods *m;
870
871 if (o == NULL)
872 return null_error();
873 m = o->ob_type->tp_as_number;
874 if (m && m->nb_negative)
875 return (*m->nb_negative)(o);
876
Georg Brandlccff7852006-06-18 22:17:29 +0000877 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000878}
879
880PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000881PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000882{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 PyNumberMethods *m;
884
885 if (o == NULL)
886 return null_error();
887 m = o->ob_type->tp_as_number;
888 if (m && m->nb_positive)
889 return (*m->nb_positive)(o);
890
Georg Brandlccff7852006-06-18 22:17:29 +0000891 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000892}
893
894PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000895PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000896{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000897 PyNumberMethods *m;
898
899 if (o == NULL)
900 return null_error();
901 m = o->ob_type->tp_as_number;
902 if (m && m->nb_invert)
903 return (*m->nb_invert)(o);
904
Georg Brandlccff7852006-06-18 22:17:29 +0000905 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000906}
907
908PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000909PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000910{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000912
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000913 if (o == NULL)
914 return null_error();
915 m = o->ob_type->tp_as_number;
916 if (m && m->nb_absolute)
917 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000918
Georg Brandlccff7852006-06-18 22:17:29 +0000919 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000920}
921
Guido van Rossum9e896b32000-04-05 20:11:21 +0000922/* Add a check for embedded NULL-bytes in the argument. */
923static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000924int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000925{
926 char *end;
927 PyObject *x;
928
929 x = PyInt_FromString((char*)s, &end, 10);
930 if (x == NULL)
931 return NULL;
932 if (end != s + len) {
933 PyErr_SetString(PyExc_ValueError,
934 "null byte in argument for int()");
935 Py_DECREF(x);
936 return NULL;
937 }
938 return x;
939}
940
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000941/* Return a Py_ssize_t integer from the object item */
942Py_ssize_t
943PyNumber_Index(PyObject *item)
944{
945 Py_ssize_t value = -1;
946 PyNumberMethods *nb = item->ob_type->tp_as_number;
947 if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) {
948 value = nb->nb_index(item);
949 }
950 else {
Armin Rigo314861c2006-03-30 14:04:02 +0000951 PyErr_Format(PyExc_TypeError,
952 "'%.200s' object cannot be interpreted "
953 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000954 }
955 return value;
956}
957
Guido van Rossume15dee51995-07-18 14:12:02 +0000958PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000959PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000960{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000961 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000962 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000963 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000964
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965 if (o == NULL)
966 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000967 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000968 Py_INCREF(o);
969 return o;
970 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000971 m = o->ob_type->tp_as_number;
972 if (m && m->nb_int) { /* This should include subclasses of int */
973 PyObject *res = m->nb_int(o);
974 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
975 PyErr_Format(PyExc_TypeError,
976 "__int__ returned non-int (type %.200s)",
977 res->ob_type->tp_name);
978 Py_DECREF(res);
979 return NULL;
980 }
981 return res;
982 }
983 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000984 PyIntObject *io = (PyIntObject*)o;
985 return PyInt_FromLong(io->ob_ival);
986 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000987 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000988 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000989 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000990#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000991 if (PyUnicode_Check(o))
992 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
993 PyUnicode_GET_SIZE(o),
994 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000995#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000996 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000997 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000998
Georg Brandlccff7852006-06-18 22:17:29 +0000999 return type_error("int() argument must be a string or a "
1000 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001001}
1002
Guido van Rossum9e896b32000-04-05 20:11:21 +00001003/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001004static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001005long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001006{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001007 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001008 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001009
Guido van Rossum4c08d552000-03-10 22:55:18 +00001010 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001011 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001012 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001013 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001014 PyErr_SetString(PyExc_ValueError,
1015 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001016 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001017 return NULL;
1018 }
1019 return x;
1020}
1021
Guido van Rossume15dee51995-07-18 14:12:02 +00001022PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001023PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001024{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001025 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001026 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001027 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001028
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001029 if (o == NULL)
1030 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001031 m = o->ob_type->tp_as_number;
1032 if (m && m->nb_long) { /* This should include subclasses of long */
1033 PyObject *res = m->nb_long(o);
1034 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1035 PyErr_Format(PyExc_TypeError,
1036 "__long__ returned non-long (type %.200s)",
1037 res->ob_type->tp_name);
1038 Py_DECREF(res);
1039 return NULL;
1040 }
1041 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001042 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001043 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001044 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001045 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001046 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001047 * doesn't do. In particular long('9.5') must raise an
1048 * exception, not truncate the float.
1049 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001050 return long_from_string(PyString_AS_STRING(o),
1051 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001052#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001053 if (PyUnicode_Check(o))
1054 /* The above check is done in PyLong_FromUnicode(). */
1055 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1056 PyUnicode_GET_SIZE(o),
1057 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001058#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001059 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1060 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001061
Georg Brandlccff7852006-06-18 22:17:29 +00001062 return type_error("long() argument must be a string or a "
1063 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001064}
1065
1066PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001067PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001068{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001069 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001070
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001071 if (o == NULL)
1072 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001073 m = o->ob_type->tp_as_number;
1074 if (m && m->nb_float) { /* This should include subclasses of float */
1075 PyObject *res = m->nb_float(o);
1076 if (res && !PyFloat_Check(res)) {
1077 PyErr_Format(PyExc_TypeError,
1078 "__float__ returned non-float (type %.200s)",
1079 res->ob_type->tp_name);
1080 Py_DECREF(res);
1081 return NULL;
1082 }
1083 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001084 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001085 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001086 PyFloatObject *po = (PyFloatObject *)o;
1087 return PyFloat_FromDouble(po->ob_fval);
1088 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001089 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001090}
1091
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001092/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001093
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094int
Fred Drake79912472000-07-09 04:06:11 +00001095PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001096{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001097 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001098 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001099 return s != NULL && s->ob_type->tp_as_sequence &&
1100 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001101}
1102
Martin v. Löwis18e16552006-02-15 17:27:45 +00001103Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001104PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001105{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001107
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 if (s == NULL) {
1109 null_error();
1110 return -1;
1111 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001112
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001113 m = s->ob_type->tp_as_sequence;
1114 if (m && m->sq_length)
1115 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001116
Georg Brandlccff7852006-06-18 22:17:29 +00001117 type_error("non-sequence object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001118 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001119}
1120
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001121#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001122Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001123PySequence_Length(PyObject *s)
1124{
1125 return PySequence_Size(s);
1126}
1127#define PySequence_Length PySequence_Size
1128
Guido van Rossume15dee51995-07-18 14:12:02 +00001129PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001130PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001131{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001134 if (s == NULL || o == NULL)
1135 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001136
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001137 m = s->ob_type->tp_as_sequence;
1138 if (m && m->sq_concat)
1139 return m->sq_concat(s, o);
1140
Armin Rigofd163f92005-12-29 15:59:19 +00001141 /* Instances of user classes defining an __add__() method only
1142 have an nb_add slot, not an sq_concat slot. So we fall back
1143 to nb_add if both arguments appear to be sequences. */
1144 if (PySequence_Check(s) && PySequence_Check(o)) {
1145 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1146 if (result != Py_NotImplemented)
1147 return result;
1148 Py_DECREF(result);
1149 }
Georg Brandlccff7852006-06-18 22:17:29 +00001150 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001151}
1152
1153PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001154PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001155{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001157
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158 if (o == NULL)
1159 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001161 m = o->ob_type->tp_as_sequence;
1162 if (m && m->sq_repeat)
1163 return m->sq_repeat(o, count);
1164
Armin Rigofd163f92005-12-29 15:59:19 +00001165 /* Instances of user classes defining a __mul__() method only
1166 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1167 to nb_multiply if o appears to be a sequence. */
1168 if (PySequence_Check(o)) {
1169 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001170 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001171 if (n == NULL)
1172 return NULL;
1173 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1174 Py_DECREF(n);
1175 if (result != Py_NotImplemented)
1176 return result;
1177 Py_DECREF(result);
1178 }
Georg Brandlccff7852006-06-18 22:17:29 +00001179 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001180}
1181
1182PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001183PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1184{
1185 PySequenceMethods *m;
1186
1187 if (s == NULL || o == NULL)
1188 return null_error();
1189
1190 m = s->ob_type->tp_as_sequence;
1191 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1192 return m->sq_inplace_concat(s, o);
1193 if (m && m->sq_concat)
1194 return m->sq_concat(s, o);
1195
Armin Rigofd163f92005-12-29 15:59:19 +00001196 if (PySequence_Check(s) && PySequence_Check(o)) {
1197 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1198 NB_SLOT(nb_add));
1199 if (result != Py_NotImplemented)
1200 return result;
1201 Py_DECREF(result);
1202 }
Georg Brandlccff7852006-06-18 22:17:29 +00001203 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001204}
1205
1206PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001207PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001208{
1209 PySequenceMethods *m;
1210
1211 if (o == NULL)
1212 return null_error();
1213
1214 m = o->ob_type->tp_as_sequence;
1215 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1216 return m->sq_inplace_repeat(o, count);
1217 if (m && m->sq_repeat)
1218 return m->sq_repeat(o, count);
1219
Armin Rigofd163f92005-12-29 15:59:19 +00001220 if (PySequence_Check(o)) {
1221 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001222 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001223 if (n == NULL)
1224 return NULL;
1225 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1226 NB_SLOT(nb_multiply));
1227 Py_DECREF(n);
1228 if (result != Py_NotImplemented)
1229 return result;
1230 Py_DECREF(result);
1231 }
Georg Brandlccff7852006-06-18 22:17:29 +00001232 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001233}
1234
1235PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001236PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001237{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001238 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001239
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 if (s == NULL)
1241 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001242
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 m = s->ob_type->tp_as_sequence;
1244 if (m && m->sq_item) {
1245 if (i < 0) {
1246 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001247 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 if (l < 0)
1249 return NULL;
1250 i += l;
1251 }
1252 }
1253 return m->sq_item(s, i);
1254 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001255
Georg Brandlccff7852006-06-18 22:17:29 +00001256 return type_error("'%.200s' object is unindexable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001257}
1258
1259PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001260PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001261{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001263 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001264
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001266
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 m = s->ob_type->tp_as_sequence;
1268 if (m && m->sq_slice) {
1269 if (i1 < 0 || i2 < 0) {
1270 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001271 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001272 if (l < 0)
1273 return NULL;
1274 if (i1 < 0)
1275 i1 += l;
1276 if (i2 < 0)
1277 i2 += l;
1278 }
1279 }
1280 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001281 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1282 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001283 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001284 if (!slice)
1285 return NULL;
1286 res = mp->mp_subscript(s, slice);
1287 Py_DECREF(slice);
1288 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001289 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001290
Georg Brandlccff7852006-06-18 22:17:29 +00001291 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001292}
1293
1294int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001295PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001296{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001298
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001299 if (s == NULL) {
1300 null_error();
1301 return -1;
1302 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001303
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 m = s->ob_type->tp_as_sequence;
1305 if (m && m->sq_ass_item) {
1306 if (i < 0) {
1307 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001308 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001309 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001310 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 i += l;
1312 }
1313 }
1314 return m->sq_ass_item(s, i, o);
1315 }
1316
Georg Brandlccff7852006-06-18 22:17:29 +00001317 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001319}
1320
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001321int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001322PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001323{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001325
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 if (s == NULL) {
1327 null_error();
1328 return -1;
1329 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 m = s->ob_type->tp_as_sequence;
1332 if (m && m->sq_ass_item) {
1333 if (i < 0) {
1334 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001335 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001336 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001337 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001338 i += l;
1339 }
1340 }
1341 return m->sq_ass_item(s, i, (PyObject *)NULL);
1342 }
1343
Georg Brandlccff7852006-06-18 22:17:29 +00001344 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001345 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001346}
1347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001348int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001349PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001350{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001351 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001352 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001353
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001354 if (s == NULL) {
1355 null_error();
1356 return -1;
1357 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001358
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359 m = s->ob_type->tp_as_sequence;
1360 if (m && m->sq_ass_slice) {
1361 if (i1 < 0 || i2 < 0) {
1362 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001363 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001364 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001365 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001366 if (i1 < 0)
1367 i1 += l;
1368 if (i2 < 0)
1369 i2 += l;
1370 }
1371 }
1372 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001373 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1374 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001375 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001376 if (!slice)
1377 return -1;
1378 res = mp->mp_ass_subscript(s, slice, o);
1379 Py_DECREF(slice);
1380 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001382
Georg Brandlccff7852006-06-18 22:17:29 +00001383 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001385}
1386
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001387int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001388PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001389{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001391
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 if (s == NULL) {
1393 null_error();
1394 return -1;
1395 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001396
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 m = s->ob_type->tp_as_sequence;
1398 if (m && m->sq_ass_slice) {
1399 if (i1 < 0 || i2 < 0) {
1400 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001401 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001402 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001403 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001404 if (i1 < 0)
1405 i1 += l;
1406 if (i2 < 0)
1407 i2 += l;
1408 }
1409 }
1410 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1411 }
Georg Brandlccff7852006-06-18 22:17:29 +00001412 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001414}
1415
Guido van Rossume15dee51995-07-18 14:12:02 +00001416PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001417PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001418{
Tim Peters6912d4d2001-05-05 03:56:37 +00001419 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001420 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001421 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001422 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001423
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 if (v == NULL)
1425 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001426
Tim Peters6912d4d2001-05-05 03:56:37 +00001427 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001428 if (PyTuple_CheckExact(v)) {
1429 /* Note that we can't know whether it's safe to return
1430 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001431 to exact tuples here. In contrast, lists always make
1432 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 Py_INCREF(v);
1434 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001435 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001436 if (PyList_Check(v))
1437 return PyList_AsTuple(v);
1438
Tim Peters6912d4d2001-05-05 03:56:37 +00001439 /* Get iterator. */
1440 it = PyObject_GetIter(v);
1441 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001442 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001443
Tim Peters6912d4d2001-05-05 03:56:37 +00001444 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001445 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001446 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001447 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1448 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1449 Py_DECREF(it);
1450 return NULL;
1451 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001452 PyErr_Clear();
1453 n = 10; /* arbitrary */
1454 }
1455 result = PyTuple_New(n);
1456 if (result == NULL)
1457 goto Fail;
1458
1459 /* Fill the tuple. */
1460 for (j = 0; ; ++j) {
1461 PyObject *item = PyIter_Next(it);
1462 if (item == NULL) {
1463 if (PyErr_Occurred())
1464 goto Fail;
1465 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001467 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001468 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001469 /* The over-allocation strategy can grow a bit faster
1470 than for lists because unlike lists the
1471 over-allocation isn't permanent -- we reclaim
1472 the excess before the end of this routine.
1473 So, grow by ten and then add 25%.
1474 */
1475 n += 10;
1476 n += n >> 2;
1477 if (n < oldn) {
1478 /* Check for overflow */
1479 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001480 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001481 goto Fail;
1482 }
Tim Peters4324aa32001-05-28 22:30:08 +00001483 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001484 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001485 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001486 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001487 }
1488 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001489 }
1490
Tim Peters6912d4d2001-05-05 03:56:37 +00001491 /* Cut tuple back if guess was too large. */
1492 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001493 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001494 goto Fail;
1495
1496 Py_DECREF(it);
1497 return result;
1498
1499Fail:
1500 Py_XDECREF(result);
1501 Py_DECREF(it);
1502 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001503}
1504
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001505PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001506PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001507{
Tim Petersf553f892001-05-01 20:45:31 +00001508 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001509 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001510
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001511 if (v == NULL)
1512 return null_error();
1513
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001514 result = PyList_New(0);
1515 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001516 return NULL;
1517
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001518 rv = _PyList_Extend((PyListObject *)result, v);
1519 if (rv == NULL) {
1520 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001521 return NULL;
1522 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001523 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001524 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001525}
1526
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001527PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001528PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001529{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001530 PyObject *it;
1531
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001532 if (v == NULL)
1533 return null_error();
1534
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001535 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001536 Py_INCREF(v);
1537 return v;
1538 }
1539
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001540 it = PyObject_GetIter(v);
1541 if (it == NULL) {
1542 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00001543 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001544 return NULL;
1545 }
1546
Raymond Hettinger193814c2004-12-18 19:00:59 +00001547 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001548 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001549
1550 return v;
1551}
1552
Tim Peters16a77ad2001-09-08 04:00:12 +00001553/* Iterate over seq. Result depends on the operation:
1554 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1555 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1556 set ValueError and return -1 if none found; also return -1 on error.
1557 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1558*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001559Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001560_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001561{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001562 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001563 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1564 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001565
Tim Peters16a77ad2001-09-08 04:00:12 +00001566 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001567 null_error();
1568 return -1;
1569 }
Tim Peters75f8e352001-05-05 11:33:43 +00001570
Tim Peters16a77ad2001-09-08 04:00:12 +00001571 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001572 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00001573 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001574 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001575 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001576
Tim Peters16a77ad2001-09-08 04:00:12 +00001577 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001578 for (;;) {
1579 int cmp;
1580 PyObject *item = PyIter_Next(it);
1581 if (item == NULL) {
1582 if (PyErr_Occurred())
1583 goto Fail;
1584 break;
1585 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001586
1587 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001588 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001589 if (cmp < 0)
1590 goto Fail;
1591 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001592 switch (operation) {
1593 case PY_ITERSEARCH_COUNT:
1594 ++n;
1595 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001596 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001597 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001598 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001599 goto Fail;
1600 }
1601 break;
1602
1603 case PY_ITERSEARCH_INDEX:
1604 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001605 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001606 PyErr_SetString(PyExc_OverflowError,
1607 "index exceeds C int size");
1608 goto Fail;
1609 }
1610 goto Done;
1611
1612 case PY_ITERSEARCH_CONTAINS:
1613 n = 1;
1614 goto Done;
1615
1616 default:
1617 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001618 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001619 }
1620
1621 if (operation == PY_ITERSEARCH_INDEX) {
1622 ++n;
1623 if (n <= 0)
1624 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001625 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001626 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001627
1628 if (operation != PY_ITERSEARCH_INDEX)
1629 goto Done;
1630
1631 PyErr_SetString(PyExc_ValueError,
1632 "sequence.index(x): x not in sequence");
1633 /* fall into failure code */
1634Fail:
1635 n = -1;
1636 /* fall through */
1637Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001638 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001639 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001640
Guido van Rossume15dee51995-07-18 14:12:02 +00001641}
1642
Tim Peters16a77ad2001-09-08 04:00:12 +00001643/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001644Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001645PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001646{
Tim Peters16a77ad2001-09-08 04:00:12 +00001647 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001648}
1649
Tim Peterscb8d3682001-05-05 21:05:01 +00001650/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001651 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001652 */
1653int
1654PySequence_Contains(PyObject *seq, PyObject *ob)
1655{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001656 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001657 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1658 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1659 if (sqm != NULL && sqm->sq_contains != NULL)
1660 return (*sqm->sq_contains)(seq, ob);
1661 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001662 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1663 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001664}
1665
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001666/* Backwards compatibility */
1667#undef PySequence_In
1668int
Fred Drake79912472000-07-09 04:06:11 +00001669PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001670{
1671 return PySequence_Contains(w, v);
1672}
1673
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001674Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001675PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001676{
Tim Peters16a77ad2001-09-08 04:00:12 +00001677 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001678}
1679
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001680/* Operations on mappings */
1681
1682int
Fred Drake79912472000-07-09 04:06:11 +00001683PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001684{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001685 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001686 return PyObject_HasAttrString(o, "__getitem__");
1687
1688 return o && o->ob_type->tp_as_mapping &&
1689 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001690 !(o->ob_type->tp_as_sequence &&
1691 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001692}
1693
Martin v. Löwis18e16552006-02-15 17:27:45 +00001694Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001695PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001696{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001697 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001698
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001699 if (o == NULL) {
1700 null_error();
1701 return -1;
1702 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001703
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001704 m = o->ob_type->tp_as_mapping;
1705 if (m && m->mp_length)
1706 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001707
Georg Brandlccff7852006-06-18 22:17:29 +00001708 type_error("non-mapping object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001709 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001710}
1711
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001712#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001713Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001714PyMapping_Length(PyObject *o)
1715{
1716 return PyMapping_Size(o);
1717}
1718#define PyMapping_Length PyMapping_Size
1719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001720PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001721PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001722{
1723 PyObject *okey, *r;
1724
1725 if (key == NULL)
1726 return null_error();
1727
1728 okey = PyString_FromString(key);
1729 if (okey == NULL)
1730 return NULL;
1731 r = PyObject_GetItem(o, okey);
1732 Py_DECREF(okey);
1733 return r;
1734}
1735
1736int
Fred Drake79912472000-07-09 04:06:11 +00001737PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001738{
1739 PyObject *okey;
1740 int r;
1741
1742 if (key == NULL) {
1743 null_error();
1744 return -1;
1745 }
1746
1747 okey = PyString_FromString(key);
1748 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001749 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001750 r = PyObject_SetItem(o, okey, value);
1751 Py_DECREF(okey);
1752 return r;
1753}
1754
1755int
Fred Drake79912472000-07-09 04:06:11 +00001756PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001757{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001758 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001759
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760 v = PyMapping_GetItemString(o, key);
1761 if (v) {
1762 Py_DECREF(v);
1763 return 1;
1764 }
1765 PyErr_Clear();
1766 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001767}
1768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001769int
Fred Drake79912472000-07-09 04:06:11 +00001770PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001771{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001772 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001773
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001774 v = PyObject_GetItem(o, key);
1775 if (v) {
1776 Py_DECREF(v);
1777 return 1;
1778 }
1779 PyErr_Clear();
1780 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001781}
1782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001783/* Operations on callable objects */
1784
1785/* XXX PyCallable_Check() is in object.c */
1786
Guido van Rossume15dee51995-07-18 14:12:02 +00001787PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001788PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001789{
Guido van Rossum5560b742001-09-14 16:47:50 +00001790 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001791}
Guido van Rossume15dee51995-07-18 14:12:02 +00001792
1793PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001794PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1795{
1796 ternaryfunc call;
1797
1798 if ((call = func->ob_type->tp_call) != NULL) {
Armin Rigo53c1692f2006-06-21 21:58:50 +00001799 PyObject *result = (*call)(func, arg, kw);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001800 if (result == NULL && !PyErr_Occurred())
1801 PyErr_SetString(
1802 PyExc_SystemError,
1803 "NULL result without error in PyObject_Call");
1804 return result;
1805 }
Georg Brandlccff7852006-06-18 22:17:29 +00001806 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00001807 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001808 return NULL;
1809}
1810
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001811static PyObject*
1812call_function_tail(PyObject *callable, PyObject *args)
1813{
1814 PyObject *retval;
1815
1816 if (args == NULL)
1817 return NULL;
1818
1819 if (!PyTuple_Check(args)) {
1820 PyObject *a;
1821
1822 a = PyTuple_New(1);
1823 if (a == NULL) {
1824 Py_DECREF(args);
1825 return NULL;
1826 }
1827 PyTuple_SET_ITEM(a, 0, args);
1828 args = a;
1829 }
1830 retval = PyObject_Call(callable, args, NULL);
1831
1832 Py_DECREF(args);
1833
1834 return retval;
1835}
1836
Tim Peters6d6c1a32001-08-02 04:15:00 +00001837PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001838PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001839{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001840 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001841 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001842
Fred Drakeb92cf062001-10-27 06:16:31 +00001843 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001845
Fred Drakeb92cf062001-10-27 06:16:31 +00001846 if (format && *format) {
1847 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001848 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001849 va_end(va);
1850 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001851 else
1852 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001853
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001854 return call_function_tail(callable, args);
1855}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001856
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001857PyObject *
1858_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1859{
1860 va_list va;
1861 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001862
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001863 if (callable == NULL)
1864 return null_error();
1865
1866 if (format && *format) {
1867 va_start(va, format);
1868 args = _Py_VaBuildValue_SizeT(format, va);
1869 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001870 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001871 else
1872 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001873
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001874 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001875}
1876
1877PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001878PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001879{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001880 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001881 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001882 PyObject *func = NULL;
1883 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001884
Fred Drakeb92cf062001-10-27 06:16:31 +00001885 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001886 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001887
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001888 func = PyObject_GetAttrString(o, name);
1889 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001890 PyErr_SetString(PyExc_AttributeError, name);
1891 return 0;
1892 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001893
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001894 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00001895 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001896 goto exit;
1897 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001898
Fred Drakeb92cf062001-10-27 06:16:31 +00001899 if (format && *format) {
1900 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001901 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001902 va_end(va);
1903 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001904 else
1905 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001906
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001907 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001908
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001909 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001910 /* args gets consumed in call_function_tail */
1911 Py_XDECREF(func);
1912
1913 return retval;
1914}
1915
1916PyObject *
1917_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1918{
1919 va_list va;
1920 PyObject *args;
1921 PyObject *func = NULL;
1922 PyObject *retval = NULL;
1923
1924 if (o == NULL || name == NULL)
1925 return null_error();
1926
1927 func = PyObject_GetAttrString(o, name);
1928 if (func == NULL) {
1929 PyErr_SetString(PyExc_AttributeError, name);
1930 return 0;
1931 }
1932
1933 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00001934 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001935 goto exit;
1936 }
1937
1938 if (format && *format) {
1939 va_start(va, format);
1940 args = _Py_VaBuildValue_SizeT(format, va);
1941 va_end(va);
1942 }
1943 else
1944 args = PyTuple_New(0);
1945
1946 retval = call_function_tail(func, args);
1947
1948 exit:
1949 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001950 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001951
1952 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001953}
Guido van Rossum823649d2001-03-21 18:40:58 +00001954
1955
Fred Drakeb421b8c2001-10-26 16:21:32 +00001956static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001957objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001958{
1959 int i, n = 0;
1960 va_list countva;
1961 PyObject *result, *tmp;
1962
1963#ifdef VA_LIST_IS_ARRAY
1964 memcpy(countva, va, sizeof(va_list));
1965#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001966#ifdef __va_copy
1967 __va_copy(countva, va);
1968#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001969 countva = va;
1970#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001971#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001972
1973 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1974 ++n;
1975 result = PyTuple_New(n);
1976 if (result != NULL && n > 0) {
1977 for (i = 0; i < n; ++i) {
1978 tmp = (PyObject *)va_arg(va, PyObject *);
1979 PyTuple_SET_ITEM(result, i, tmp);
1980 Py_INCREF(tmp);
1981 }
1982 }
1983 return result;
1984}
1985
1986PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001987PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001988{
1989 PyObject *args, *tmp;
1990 va_list vargs;
1991
1992 if (callable == NULL || name == NULL)
1993 return null_error();
1994
1995 callable = PyObject_GetAttr(callable, name);
1996 if (callable == NULL)
1997 return NULL;
1998
1999 /* count the args */
2000 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002001 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002002 va_end(vargs);
2003 if (args == NULL) {
2004 Py_DECREF(callable);
2005 return NULL;
2006 }
2007 tmp = PyObject_Call(callable, args, NULL);
2008 Py_DECREF(args);
2009 Py_DECREF(callable);
2010
2011 return tmp;
2012}
2013
2014PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002015PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002016{
2017 PyObject *args, *tmp;
2018 va_list vargs;
2019
2020 if (callable == NULL)
2021 return null_error();
2022
2023 /* count the args */
2024 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002025 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002026 va_end(vargs);
2027 if (args == NULL)
2028 return NULL;
2029 tmp = PyObject_Call(callable, args, NULL);
2030 Py_DECREF(args);
2031
2032 return tmp;
2033}
2034
2035
Guido van Rossum823649d2001-03-21 18:40:58 +00002036/* isinstance(), issubclass() */
2037
Barry Warsawf16951c2002-04-23 22:45:44 +00002038/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2039 * state that will almost never happen.
2040 *
2041 * 0. creating the __bases__ static string could get a MemoryError
2042 * 1. getattr(cls, '__bases__') could raise an AttributeError
2043 * 2. getattr(cls, '__bases__') could raise some other exception
2044 * 3. getattr(cls, '__bases__') could return a tuple
2045 * 4. getattr(cls, '__bases__') could return something other than a tuple
2046 *
2047 * Only state #3 is a non-error state and only it returns a non-NULL object
2048 * (it returns the retrieved tuple).
2049 *
2050 * Any raised AttributeErrors are masked by clearing the exception and
2051 * returning NULL. If an object other than a tuple comes out of __bases__,
2052 * then again, the return value is NULL. So yes, these two situations
2053 * produce exactly the same results: NULL is returned and no error is set.
2054 *
2055 * If some exception other than AttributeError is raised, then NULL is also
2056 * returned, but the exception is not cleared. That's because we want the
2057 * exception to be propagated along.
2058 *
2059 * Callers are expected to test for PyErr_Occurred() when the return value
2060 * is NULL to decide whether a valid exception should be propagated or not.
2061 * When there's no exception to propagate, it's customary for the caller to
2062 * set a TypeError.
2063 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002064static PyObject *
2065abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002066{
2067 static PyObject *__bases__ = NULL;
2068 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002069
2070 if (__bases__ == NULL) {
2071 __bases__ = PyString_FromString("__bases__");
2072 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002073 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002074 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002075 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002076 if (bases == NULL) {
2077 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2078 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002079 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002080 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002081 if (!PyTuple_Check(bases)) {
2082 Py_DECREF(bases);
2083 return NULL;
2084 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002085 return bases;
2086}
2087
2088
2089static int
2090abstract_issubclass(PyObject *derived, PyObject *cls)
2091{
2092 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002093 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002094 int r = 0;
2095
2096
Guido van Rossum823649d2001-03-21 18:40:58 +00002097 if (derived == cls)
2098 return 1;
2099
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002100 if (PyTuple_Check(cls)) {
2101 /* Not a general sequence -- that opens up the road to
2102 recursion and stack overflow. */
2103 n = PyTuple_GET_SIZE(cls);
2104 for (i = 0; i < n; i++) {
2105 if (derived == PyTuple_GET_ITEM(cls, i))
2106 return 1;
2107 }
2108 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002109 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002110 if (bases == NULL) {
2111 if (PyErr_Occurred())
2112 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002113 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002114 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002115 n = PyTuple_GET_SIZE(bases);
2116 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002117 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002118 if (r != 0)
2119 break;
2120 }
2121
2122 Py_DECREF(bases);
2123
2124 return r;
2125}
2126
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002127static int
2128check_class(PyObject *cls, const char *error)
2129{
2130 PyObject *bases = abstract_get_bases(cls);
2131 if (bases == NULL) {
2132 /* Do not mask errors. */
2133 if (!PyErr_Occurred())
2134 PyErr_SetString(PyExc_TypeError, error);
2135 return 0;
2136 }
2137 Py_DECREF(bases);
2138 return -1;
2139}
2140
Brett Cannon4f653312004-03-20 22:52:14 +00002141static int
2142recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002143{
2144 PyObject *icls;
2145 static PyObject *__class__ = NULL;
2146 int retval = 0;
2147
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002148 if (__class__ == NULL) {
2149 __class__ = PyString_FromString("__class__");
2150 if (__class__ == NULL)
2151 return -1;
2152 }
2153
Neil Schemenauer6b471292001-10-18 03:18:43 +00002154 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2155 PyObject *inclass =
2156 (PyObject*)((PyInstanceObject*)inst)->in_class;
2157 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002158 }
2159 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002160 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002161 if (retval == 0) {
2162 PyObject *c = PyObject_GetAttr(inst, __class__);
2163 if (c == NULL) {
2164 PyErr_Clear();
2165 }
2166 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002167 if (c != (PyObject *)(inst->ob_type) &&
2168 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002169 retval = PyType_IsSubtype(
2170 (PyTypeObject *)c,
2171 (PyTypeObject *)cls);
2172 Py_DECREF(c);
2173 }
2174 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002175 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002176 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002177 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002178
Brett Cannon4f653312004-03-20 22:52:14 +00002179 if (!recursion_depth) {
2180 PyErr_SetString(PyExc_RuntimeError,
2181 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002182 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002183 }
2184
Guido van Rossum03290ec2001-10-07 20:54:12 +00002185 n = PyTuple_GET_SIZE(cls);
2186 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002187 retval = recursive_isinstance(
2188 inst,
2189 PyTuple_GET_ITEM(cls, i),
2190 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002191 if (retval != 0)
2192 break;
2193 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002194 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002195 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002196 if (!check_class(cls,
2197 "isinstance() arg 2 must be a class, type,"
2198 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002199 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002200 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002201 if (icls == NULL) {
2202 PyErr_Clear();
2203 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002204 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002205 else {
2206 retval = abstract_issubclass(icls, cls);
2207 Py_DECREF(icls);
2208 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002209 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002210
Guido van Rossum823649d2001-03-21 18:40:58 +00002211 return retval;
2212}
2213
2214int
Brett Cannon4f653312004-03-20 22:52:14 +00002215PyObject_IsInstance(PyObject *inst, PyObject *cls)
2216{
2217 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2218}
2219
2220static int
2221recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002222{
2223 int retval;
2224
2225 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002226 if (!check_class(derived,
2227 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002228 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002229
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002230 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002231 Py_ssize_t i;
2232 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002233
2234 if (!recursion_depth) {
2235 PyErr_SetString(PyExc_RuntimeError,
2236 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002237 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002238 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002239 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002240 retval = recursive_issubclass(
2241 derived,
2242 PyTuple_GET_ITEM(cls, i),
2243 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002244 if (retval != 0) {
2245 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002246 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002247 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002248 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002249 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002250 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002251 else {
2252 if (!check_class(cls,
2253 "issubclass() arg 2 must be a class"
2254 " or tuple of classes"))
2255 return -1;
2256 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002257
2258 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002259 }
2260 else {
2261 /* shortcut */
2262 if (!(retval = (derived == cls)))
2263 retval = PyClass_IsSubclass(derived, cls);
2264 }
2265
2266 return retval;
2267}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002268
Brett Cannon4f653312004-03-20 22:52:14 +00002269int
2270PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2271{
2272 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2273}
2274
2275
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002276PyObject *
2277PyObject_GetIter(PyObject *o)
2278{
2279 PyTypeObject *t = o->ob_type;
2280 getiterfunc f = NULL;
2281 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2282 f = t->tp_iter;
2283 if (f == NULL) {
2284 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002285 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00002286 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002287 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002288 else {
2289 PyObject *res = (*f)(o);
2290 if (res != NULL && !PyIter_Check(res)) {
2291 PyErr_Format(PyExc_TypeError,
2292 "iter() returned non-iterator "
2293 "of type '%.100s'",
2294 res->ob_type->tp_name);
2295 Py_DECREF(res);
2296 res = NULL;
2297 }
2298 return res;
2299 }
2300}
2301
Tim Petersf4848da2001-05-05 00:14:56 +00002302/* Return next item.
2303 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2304 * If the iteration terminates normally, return NULL and clear the
2305 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2306 * will be false.
2307 * Else return the next object. PyErr_Occurred() will be false.
2308 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002309PyObject *
2310PyIter_Next(PyObject *iter)
2311{
Tim Petersf4848da2001-05-05 00:14:56 +00002312 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002313 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002314 result = (*iter->ob_type->tp_iternext)(iter);
2315 if (result == NULL &&
2316 PyErr_Occurred() &&
2317 PyErr_ExceptionMatches(PyExc_StopIteration))
2318 PyErr_Clear();
2319 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002320}