blob: f7d6f5ac6a615379edf937929328bed2463af1c2 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Guido van Rossume15dee51995-07-18 14:12:02 +00003#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00004#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00005#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00006#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00007
8#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +00009 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000010
Guido van Rossum38fff8c2006-03-07 18:50:55 +000011#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX)
12
Martin v. Löwis5cb69362006-04-14 09:08:42 +000013
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000014/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000015
16static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000017type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000018{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000019 PyErr_SetString(PyExc_TypeError, msg);
20 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000021}
22
Guido van Rossum052b7e11996-11-11 15:08:19 +000023static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000024null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000025{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000026 if (!PyErr_Occurred())
27 PyErr_SetString(PyExc_SystemError,
28 "null argument to internal routine");
29 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000030}
31
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000032/* Operations on any object */
33
34int
Fred Drake79912472000-07-09 04:06:11 +000035PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000036{
37 int r;
38
39 if (o1 == NULL || o2 == NULL) {
40 null_error();
41 return -1;
42 }
43 r = PyObject_Compare(o1, o2);
44 if (PyErr_Occurred())
45 return -1;
46 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000047 return 0;
48}
Guido van Rossume15dee51995-07-18 14:12:02 +000049
50PyObject *
Fred Drake79912472000-07-09 04:06:11 +000051PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000052{
53 PyObject *v;
54
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000055 if (o == NULL)
56 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000057 v = (PyObject *)o->ob_type;
58 Py_INCREF(v);
59 return v;
60}
61
Martin v. Löwis18e16552006-02-15 17:27:45 +000062Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000063PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000064{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000066
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000067 if (o == NULL) {
68 null_error();
69 return -1;
70 }
Guido van Rossume15dee51995-07-18 14:12:02 +000071
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000072 m = o->ob_type->tp_as_sequence;
73 if (m && m->sq_length)
74 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075
Jeremy Hylton6253f832000-07-12 12:56:19 +000076 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000077}
78
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000079#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000080Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000081PyObject_Length(PyObject *o)
82{
83 return PyObject_Size(o);
84}
85#define PyObject_Length PyObject_Size
86
Martin v. Löwis18e16552006-02-15 17:27:45 +000087Py_ssize_t
Armin Rigof5b3e362006-02-11 21:32:43 +000088_PyObject_LengthHint(PyObject *o)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000089{
Martin v. Löwis18e16552006-02-15 17:27:45 +000090 Py_ssize_t rv = PyObject_Size(o);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000091 if (rv != -1)
92 return rv;
93 if (PyErr_ExceptionMatches(PyExc_TypeError) ||
94 PyErr_ExceptionMatches(PyExc_AttributeError)) {
95 PyObject *err_type, *err_value, *err_tb, *ro;
96
97 PyErr_Fetch(&err_type, &err_value, &err_tb);
Armin Rigof5b3e362006-02-11 21:32:43 +000098 ro = PyObject_CallMethod(o, "__length_hint__", NULL);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000099 if (ro != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000100 rv = PyInt_AsLong(ro);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000101 Py_DECREF(ro);
102 Py_XDECREF(err_type);
103 Py_XDECREF(err_value);
104 Py_XDECREF(err_tb);
105 return rv;
106 }
107 PyErr_Restore(err_type, err_value, err_tb);
108 }
109 return -1;
110}
111
Guido van Rossume15dee51995-07-18 14:12:02 +0000112PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000113PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000114{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000117 if (o == NULL || key == NULL)
118 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000119
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000120 m = o->ob_type->tp_as_mapping;
121 if (m && m->mp_subscript)
122 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000123
Guido van Rossum21308241998-08-13 16:44:44 +0000124 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000125 PyNumberMethods *nb = key->ob_type->tp_as_number;
126 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
127 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000128 if (key_value == -1 && PyErr_Occurred())
129 return NULL;
130 return PySequence_GetItem(o, key_value);
131 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000132 else if (o->ob_type->tp_as_sequence->sq_item)
133 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000134 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000135
136 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000137}
138
139int
Fred Drake79912472000-07-09 04:06:11 +0000140PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000141{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000142 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000143
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000144 if (o == NULL || key == NULL || value == NULL) {
145 null_error();
146 return -1;
147 }
148 m = o->ob_type->tp_as_mapping;
149 if (m && m->mp_ass_subscript)
150 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000151
Guido van Rossum21308241998-08-13 16:44:44 +0000152 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000153 PyNumberMethods *nb = key->ob_type->tp_as_number;
154 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
155 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000156 if (key_value == -1 && PyErr_Occurred())
157 return -1;
158 return PySequence_SetItem(o, key_value, value);
159 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000160 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
161 type_error("sequence index must be integer");
162 return -1;
163 }
Guido van Rossum21308241998-08-13 16:44:44 +0000164 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000165
166 type_error("object does not support item assignment");
167 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000168}
169
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000170int
Fred Drake79912472000-07-09 04:06:11 +0000171PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000172{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000173 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000174
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000175 if (o == NULL || key == NULL) {
176 null_error();
177 return -1;
178 }
179 m = o->ob_type->tp_as_mapping;
180 if (m && m->mp_ass_subscript)
181 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000182
Guido van Rossum21308241998-08-13 16:44:44 +0000183 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000184 PyNumberMethods *nb = key->ob_type->tp_as_number;
185 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
186 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000187 if (key_value == -1 && PyErr_Occurred())
188 return -1;
189 return PySequence_DelItem(o, key_value);
190 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000191 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
192 type_error("sequence index must be integer");
193 return -1;
194 }
Guido van Rossum21308241998-08-13 16:44:44 +0000195 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000196
197 type_error("object does not support item deletion");
198 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000199}
200
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000201int
202PyObject_DelItemString(PyObject *o, char *key)
203{
204 PyObject *okey;
205 int ret;
206
207 if (o == NULL || key == NULL) {
208 null_error();
209 return -1;
210 }
211 okey = PyString_FromString(key);
212 if (okey == NULL)
213 return -1;
214 ret = PyObject_DelItem(o, okey);
215 Py_DECREF(okey);
216 return ret;
217}
218
Guido van Rossum4c08d552000-03-10 22:55:18 +0000219int PyObject_AsCharBuffer(PyObject *obj,
220 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000221 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000222{
223 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000224 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000225 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000226
227 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
228 null_error();
229 return -1;
230 }
231 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000232 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000233 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000234 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000235 PyErr_SetString(PyExc_TypeError,
236 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000237 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000238 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000239 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 PyErr_SetString(PyExc_TypeError,
241 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000242 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000243 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000244 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000245 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000246 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000247 *buffer = pp;
248 *buffer_len = len;
249 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000250}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000251
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252int
253PyObject_CheckReadBuffer(PyObject *obj)
254{
255 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
256
257 if (pb == NULL ||
258 pb->bf_getreadbuffer == NULL ||
259 pb->bf_getsegcount == NULL ||
260 (*pb->bf_getsegcount)(obj, NULL) != 1)
261 return 0;
262 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263}
264
265int PyObject_AsReadBuffer(PyObject *obj,
266 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000267 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000268{
269 PyBufferProcs *pb;
270 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000271 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000272
273 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
274 null_error();
275 return -1;
276 }
277 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000278 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000279 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000280 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000281 PyErr_SetString(PyExc_TypeError,
282 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000283 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000284 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000285 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000286 PyErr_SetString(PyExc_TypeError,
287 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000288 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000289 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000290 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000291 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000292 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000293 *buffer = pp;
294 *buffer_len = len;
295 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000296}
297
298int PyObject_AsWriteBuffer(PyObject *obj,
299 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000300 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301{
302 PyBufferProcs *pb;
303 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000305
306 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
307 null_error();
308 return -1;
309 }
310 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000311 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000312 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000313 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000314 PyErr_SetString(PyExc_TypeError,
315 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000316 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000317 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000318 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000319 PyErr_SetString(PyExc_TypeError,
320 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000321 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000322 }
323 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
324 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000325 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000326 *buffer = pp;
327 *buffer_len = len;
328 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000329}
330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000331/* Operations on numbers */
332
333int
Fred Drake79912472000-07-09 04:06:11 +0000334PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000335{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000336 return o && o->ob_type->tp_as_number &&
337 (o->ob_type->tp_as_number->nb_int ||
338 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000339}
340
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000341/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000342
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000343/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000344
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000345#define NB_SLOT(x) offsetof(PyNumberMethods, x)
346#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000347 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000348#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000349 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000350
351/*
352 Calling scheme used for binary operations:
353
354 v w Action
355 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000356 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000357 new old v.op(v,w), coerce(v,w), v.op(v,w)
358 old new w.op(v,w), coerce(v,w), v.op(v,w)
359 old old coerce(v,w), v.op(v,w)
360
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000361 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
362 v->ob_type
363
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000364 Legend:
365 -------
366 * new == new style number
367 * old == old style number
368 * Action indicates the order in which operations are tried until either
369 a valid result is produced or an error occurs.
370
371 */
372
373static PyObject *
374binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000375{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000376 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000377 binaryfunc slotv = NULL;
378 binaryfunc slotw = NULL;
379
380 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000381 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000382 if (w->ob_type != v->ob_type &&
383 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000384 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000385 if (slotw == slotv)
386 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000387 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000388 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000389 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
390 x = slotw(v, w);
391 if (x != Py_NotImplemented)
392 return x;
393 Py_DECREF(x); /* can't do it */
394 slotw = NULL;
395 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000396 x = slotv(v, w);
397 if (x != Py_NotImplemented)
398 return x;
399 Py_DECREF(x); /* can't do it */
400 }
401 if (slotw) {
402 x = slotw(v, w);
403 if (x != Py_NotImplemented)
404 return x;
405 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000406 }
407 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
408 int err = PyNumber_CoerceEx(&v, &w);
409 if (err < 0) {
410 return NULL;
411 }
412 if (err == 0) {
413 PyNumberMethods *mv = v->ob_type->tp_as_number;
414 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000415 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000416 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000417 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000418 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000419 Py_DECREF(v);
420 Py_DECREF(w);
421 return x;
422 }
423 }
424 /* CoerceEx incremented the reference counts */
425 Py_DECREF(v);
426 Py_DECREF(w);
427 }
428 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000429 Py_INCREF(Py_NotImplemented);
430 return Py_NotImplemented;
431}
Guido van Rossum77660912002-04-16 16:32:50 +0000432
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000433static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000434binop_type_error(PyObject *v, PyObject *w, const char *op_name)
435{
436 PyErr_Format(PyExc_TypeError,
437 "unsupported operand type(s) for %s: '%s' and '%s'",
438 op_name,
439 v->ob_type->tp_name,
440 w->ob_type->tp_name);
441 return NULL;
442}
443
444static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000445binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
446{
447 PyObject *result = binary_op1(v, w, op_slot);
448 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000449 Py_DECREF(result);
450 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000451 }
452 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000453}
454
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000455
456/*
457 Calling scheme used for ternary operations:
458
Guido van Rossum84675ac2001-09-29 01:05:03 +0000459 *** In some cases, w.op is called before v.op; see binary_op1. ***
460
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000461 v w z Action
462 -------------------------------------------------------------------
463 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
464 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
465 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
466 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
467 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
468 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
469 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
470 old old old coerce(v,w,z), v.op(v,w,z)
471
472 Legend:
473 -------
474 * new == new style number
475 * old == old style number
476 * Action indicates the order in which operations are tried until either
477 a valid result is produced or an error occurs.
478 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
479 only if z != Py_None; if z == Py_None, then it is treated as absent
480 variable and only coerce(v,w) is tried.
481
482 */
483
484static PyObject *
485ternary_op(PyObject *v,
486 PyObject *w,
487 PyObject *z,
488 const int op_slot,
489 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000490{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000491 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000492 PyObject *x = NULL;
493 ternaryfunc slotv = NULL;
494 ternaryfunc slotw = NULL;
495 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000496
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000497 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000498 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000499 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000500 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000501 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000502 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000503 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000504 if (slotw == slotv)
505 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000506 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000507 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000508 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
509 x = slotw(v, w, z);
510 if (x != Py_NotImplemented)
511 return x;
512 Py_DECREF(x); /* can't do it */
513 slotw = NULL;
514 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000515 x = slotv(v, w, z);
516 if (x != Py_NotImplemented)
517 return x;
518 Py_DECREF(x); /* can't do it */
519 }
520 if (slotw) {
521 x = slotw(v, w, z);
522 if (x != Py_NotImplemented)
523 return x;
524 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000525 }
526 mz = z->ob_type->tp_as_number;
527 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000528 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000529 if (slotz == slotv || slotz == slotw)
530 slotz = NULL;
531 if (slotz) {
532 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000533 if (x != Py_NotImplemented)
534 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000535 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000536 }
537 }
538
539 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
540 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
541 /* we have an old style operand, coerce */
542 PyObject *v1, *z1, *w2, *z2;
543 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000544
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000545 c = PyNumber_Coerce(&v, &w);
546 if (c != 0)
547 goto error3;
548
549 /* Special case: if the third argument is None, it is
550 treated as absent argument and not coerced. */
551 if (z == Py_None) {
552 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000553 slotz = NB_TERNOP(v->ob_type->tp_as_number,
554 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000555 if (slotz)
556 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000557 else
558 c = -1;
559 }
560 else
561 c = -1;
562 goto error2;
563 }
564 v1 = v;
565 z1 = z;
566 c = PyNumber_Coerce(&v1, &z1);
567 if (c != 0)
568 goto error2;
569 w2 = w;
570 z2 = z1;
571 c = PyNumber_Coerce(&w2, &z2);
572 if (c != 0)
573 goto error1;
574
575 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000576 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
577 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000578 if (slotv)
579 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000580 else
581 c = -1;
582 }
583 else
584 c = -1;
585
586 Py_DECREF(w2);
587 Py_DECREF(z2);
588 error1:
589 Py_DECREF(v1);
590 Py_DECREF(z1);
591 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000592 Py_DECREF(v);
593 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000594 error3:
595 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000596 return x;
597 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000598
599 if (z == Py_None)
600 PyErr_Format(
601 PyExc_TypeError,
602 "unsupported operand type(s) for ** or pow(): "
603 "'%s' and '%s'",
604 v->ob_type->tp_name,
605 w->ob_type->tp_name);
606 else
607 PyErr_Format(
608 PyExc_TypeError,
609 "unsupported operand type(s) for pow(): "
610 "'%s', '%s', '%s'",
611 v->ob_type->tp_name,
612 w->ob_type->tp_name,
613 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000614 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000615}
616
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000617#define BINARY_FUNC(func, op, op_name) \
618 PyObject * \
619 func(PyObject *v, PyObject *w) { \
620 return binary_op(v, w, NB_SLOT(op), op_name); \
621 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000622
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000623BINARY_FUNC(PyNumber_Or, nb_or, "|")
624BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
625BINARY_FUNC(PyNumber_And, nb_and, "&")
626BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
627BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
628BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000629BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
630BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000631
632PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000633PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000634{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000635 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
636 if (result == Py_NotImplemented) {
637 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000638 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000639 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000640 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000641 }
Armin Rigofd163f92005-12-29 15:59:19 +0000642 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000643 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000644 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000645}
646
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000647static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000648sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000649{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000650 Py_ssize_t count;
651 PyNumberMethods *nb = n->ob_type->tp_as_number;
652 if (nb != NULL && HASINDEX(n) && nb->nb_index != NULL) {
653 count = nb->nb_index(n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000654 if (count == -1 && PyErr_Occurred())
655 return NULL;
656 }
657 else {
658 return type_error(
Raymond Hettinger10c66062004-05-12 21:35:06 +0000659 "can't multiply sequence by non-int");
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000660 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000661 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000662}
663
664PyObject *
665PyNumber_Multiply(PyObject *v, PyObject *w)
666{
667 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
668 if (result == Py_NotImplemented) {
669 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
670 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000671 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000672 if (mv && mv->sq_repeat) {
673 return sequence_repeat(mv->sq_repeat, v, w);
674 }
675 else if (mw && mw->sq_repeat) {
676 return sequence_repeat(mw->sq_repeat, w, v);
677 }
678 result = binop_type_error(v, w, "*");
679 }
680 return result;
681}
682
Guido van Rossume15dee51995-07-18 14:12:02 +0000683PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000684PyNumber_FloorDivide(PyObject *v, PyObject *w)
685{
686 /* XXX tp_flags test */
687 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
688}
689
690PyObject *
691PyNumber_TrueDivide(PyObject *v, PyObject *w)
692{
693 /* XXX tp_flags test */
694 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
695}
696
697PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000698PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000699{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000700 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000701}
702
703PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000704PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000705{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000706 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000707}
708
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000709/* Binary in-place operators */
710
711/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000712 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000713
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000714 - If the left hand object has the appropriate struct members, and
715 they are filled, call the appropriate function and return the
716 result. No coercion is done on the arguments; the left-hand object
717 is the one the operation is performed on, and it's up to the
718 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000719
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000720 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000721 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000722
723 */
724
Guido van Rossum77660912002-04-16 16:32:50 +0000725#define HASINPLACE(t) \
726 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000727
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000728static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000729binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000730{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000731 PyNumberMethods *mv = v->ob_type->tp_as_number;
732 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000733 binaryfunc slot = NB_BINOP(mv, iop_slot);
734 if (slot) {
735 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000736 if (x != Py_NotImplemented) {
737 return x;
738 }
739 Py_DECREF(x);
740 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000741 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000742 return binary_op1(v, w, op_slot);
743}
744
745static PyObject *
746binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
747 const char *op_name)
748{
749 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
750 if (result == Py_NotImplemented) {
751 Py_DECREF(result);
752 return binop_type_error(v, w, op_name);
753 }
754 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000755}
756
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000757#define INPLACE_BINOP(func, iop, op, op_name) \
758 PyObject * \
759 func(PyObject *v, PyObject *w) { \
760 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000761 }
762
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000763INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
764INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
765INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
766INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
767INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
768INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
769INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000770
771PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000772PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
773{
774 /* XXX tp_flags test */
775 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
776 NB_SLOT(nb_floor_divide), "//=");
777}
778
779PyObject *
780PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
781{
782 /* XXX tp_flags test */
783 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
784 NB_SLOT(nb_true_divide), "/=");
785}
786
787PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000788PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
789{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000790 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
791 NB_SLOT(nb_add));
792 if (result == Py_NotImplemented) {
793 PySequenceMethods *m = v->ob_type->tp_as_sequence;
794 Py_DECREF(result);
795 if (m != NULL) {
796 binaryfunc f = NULL;
797 if (HASINPLACE(v))
798 f = m->sq_inplace_concat;
799 if (f == NULL)
800 f = m->sq_concat;
801 if (f != NULL)
802 return (*f)(v, w);
803 }
804 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000805 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000806 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000807}
808
809PyObject *
810PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
811{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000812 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
813 NB_SLOT(nb_multiply));
814 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000815 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000816 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
817 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
818 Py_DECREF(result);
819 if (mv != NULL) {
820 if (HASINPLACE(v))
821 f = mv->sq_inplace_repeat;
822 if (f == NULL)
823 f = mv->sq_repeat;
824 if (f != NULL)
825 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000826 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000827 else if (mw != NULL) {
828 /* Note that the right hand operand should not be
829 * mutated in this case so sq_inplace_repeat is not
830 * used. */
831 if (mw->sq_repeat)
832 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000833 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000834 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000835 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000836 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000837}
838
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000839PyObject *
840PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
841{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000842 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
843 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000844}
845
846PyObject *
847PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
848{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000849 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
850 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
851 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000852 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000853 else {
854 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
855 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000856}
857
858
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000859/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000860
861PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000862PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000863{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000864 PyNumberMethods *m;
865
866 if (o == NULL)
867 return null_error();
868 m = o->ob_type->tp_as_number;
869 if (m && m->nb_negative)
870 return (*m->nb_negative)(o);
871
872 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000873}
874
875PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000876PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000877{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000878 PyNumberMethods *m;
879
880 if (o == NULL)
881 return null_error();
882 m = o->ob_type->tp_as_number;
883 if (m && m->nb_positive)
884 return (*m->nb_positive)(o);
885
886 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000887}
888
889PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000890PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000891{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000892 PyNumberMethods *m;
893
894 if (o == NULL)
895 return null_error();
896 m = o->ob_type->tp_as_number;
897 if (m && m->nb_invert)
898 return (*m->nb_invert)(o);
899
900 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000901}
902
903PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000904PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000905{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000906 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000907
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 if (o == NULL)
909 return null_error();
910 m = o->ob_type->tp_as_number;
911 if (m && m->nb_absolute)
912 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000913
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000914 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000915}
916
Guido van Rossum9e896b32000-04-05 20:11:21 +0000917/* Add a check for embedded NULL-bytes in the argument. */
918static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000919int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000920{
921 char *end;
922 PyObject *x;
923
924 x = PyInt_FromString((char*)s, &end, 10);
925 if (x == NULL)
926 return NULL;
927 if (end != s + len) {
928 PyErr_SetString(PyExc_ValueError,
929 "null byte in argument for int()");
930 Py_DECREF(x);
931 return NULL;
932 }
933 return x;
934}
935
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000936/* Return a Py_ssize_t integer from the object item */
937Py_ssize_t
938PyNumber_Index(PyObject *item)
939{
940 Py_ssize_t value = -1;
941 PyNumberMethods *nb = item->ob_type->tp_as_number;
942 if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) {
943 value = nb->nb_index(item);
944 }
945 else {
Armin Rigo314861c2006-03-30 14:04:02 +0000946 PyErr_Format(PyExc_TypeError,
947 "'%.200s' object cannot be interpreted "
948 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000949 }
950 return value;
951}
952
Guido van Rossume15dee51995-07-18 14:12:02 +0000953PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000954PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000955{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000956 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000957 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000958 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000959
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000960 if (o == NULL)
961 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000962 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000963 Py_INCREF(o);
964 return o;
965 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000966 m = o->ob_type->tp_as_number;
967 if (m && m->nb_int) { /* This should include subclasses of int */
968 PyObject *res = m->nb_int(o);
969 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
970 PyErr_Format(PyExc_TypeError,
971 "__int__ returned non-int (type %.200s)",
972 res->ob_type->tp_name);
973 Py_DECREF(res);
974 return NULL;
975 }
976 return res;
977 }
978 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000979 PyIntObject *io = (PyIntObject*)o;
980 return PyInt_FromLong(io->ob_ival);
981 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000982 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000983 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000984 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000985#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000986 if (PyUnicode_Check(o))
987 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
988 PyUnicode_GET_SIZE(o),
989 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000990#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000991 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000992 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000993
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000994 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000995}
996
Guido van Rossum9e896b32000-04-05 20:11:21 +0000997/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000998static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000999long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001000{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001001 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001002 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001003
Guido van Rossum4c08d552000-03-10 22:55:18 +00001004 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001005 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001006 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001007 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001008 PyErr_SetString(PyExc_ValueError,
1009 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001010 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001011 return NULL;
1012 }
1013 return x;
1014}
1015
Guido van Rossume15dee51995-07-18 14:12:02 +00001016PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001017PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001018{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001019 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001020 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001021 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001022
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001023 if (o == NULL)
1024 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001025 m = o->ob_type->tp_as_number;
1026 if (m && m->nb_long) { /* This should include subclasses of long */
1027 PyObject *res = m->nb_long(o);
1028 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1029 PyErr_Format(PyExc_TypeError,
1030 "__long__ returned non-long (type %.200s)",
1031 res->ob_type->tp_name);
1032 Py_DECREF(res);
1033 return NULL;
1034 }
1035 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001036 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001037 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001038 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001040 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001041 * doesn't do. In particular long('9.5') must raise an
1042 * exception, not truncate the float.
1043 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001044 return long_from_string(PyString_AS_STRING(o),
1045 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001046#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001047 if (PyUnicode_Check(o))
1048 /* The above check is done in PyLong_FromUnicode(). */
1049 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1050 PyUnicode_GET_SIZE(o),
1051 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001052#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001053 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1054 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001055
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001056 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001057}
1058
1059PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001060PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001062 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064 if (o == NULL)
1065 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001066 m = o->ob_type->tp_as_number;
1067 if (m && m->nb_float) { /* This should include subclasses of float */
1068 PyObject *res = m->nb_float(o);
1069 if (res && !PyFloat_Check(res)) {
1070 PyErr_Format(PyExc_TypeError,
1071 "__float__ returned non-float (type %.200s)",
1072 res->ob_type->tp_name);
1073 Py_DECREF(res);
1074 return NULL;
1075 }
1076 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001077 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001078 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001079 PyFloatObject *po = (PyFloatObject *)o;
1080 return PyFloat_FromDouble(po->ob_fval);
1081 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001082 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001083}
1084
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001085/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001086
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001087int
Fred Drake79912472000-07-09 04:06:11 +00001088PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001089{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001090 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001091 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001092 return s != NULL && s->ob_type->tp_as_sequence &&
1093 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001094}
1095
Martin v. Löwis18e16552006-02-15 17:27:45 +00001096Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001097PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001098{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001100
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001101 if (s == NULL) {
1102 null_error();
1103 return -1;
1104 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001105
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 m = s->ob_type->tp_as_sequence;
1107 if (m && m->sq_length)
1108 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001109
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001110 type_error("len() of unsized object");
1111 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001112}
1113
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001114#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001115Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001116PySequence_Length(PyObject *s)
1117{
1118 return PySequence_Size(s);
1119}
1120#define PySequence_Length PySequence_Size
1121
Guido van Rossume15dee51995-07-18 14:12:02 +00001122PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001123PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001124{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001125 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001126
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001127 if (s == NULL || o == NULL)
1128 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001129
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 m = s->ob_type->tp_as_sequence;
1131 if (m && m->sq_concat)
1132 return m->sq_concat(s, o);
1133
Armin Rigofd163f92005-12-29 15:59:19 +00001134 /* Instances of user classes defining an __add__() method only
1135 have an nb_add slot, not an sq_concat slot. So we fall back
1136 to nb_add if both arguments appear to be sequences. */
1137 if (PySequence_Check(s) && PySequence_Check(o)) {
1138 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1139 if (result != Py_NotImplemented)
1140 return result;
1141 Py_DECREF(result);
1142 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001143 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001144}
1145
1146PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001147PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001148{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001149 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001150
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001151 if (o == NULL)
1152 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001153
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154 m = o->ob_type->tp_as_sequence;
1155 if (m && m->sq_repeat)
1156 return m->sq_repeat(o, count);
1157
Armin Rigofd163f92005-12-29 15:59:19 +00001158 /* Instances of user classes defining a __mul__() method only
1159 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1160 to nb_multiply if o appears to be a sequence. */
1161 if (PySequence_Check(o)) {
1162 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001163 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001164 if (n == NULL)
1165 return NULL;
1166 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1167 Py_DECREF(n);
1168 if (result != Py_NotImplemented)
1169 return result;
1170 Py_DECREF(result);
1171 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001172 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001173}
1174
1175PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001176PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1177{
1178 PySequenceMethods *m;
1179
1180 if (s == NULL || o == NULL)
1181 return null_error();
1182
1183 m = s->ob_type->tp_as_sequence;
1184 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1185 return m->sq_inplace_concat(s, o);
1186 if (m && m->sq_concat)
1187 return m->sq_concat(s, o);
1188
Armin Rigofd163f92005-12-29 15:59:19 +00001189 if (PySequence_Check(s) && PySequence_Check(o)) {
1190 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1191 NB_SLOT(nb_add));
1192 if (result != Py_NotImplemented)
1193 return result;
1194 Py_DECREF(result);
1195 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001196 return type_error("object can't be concatenated");
1197}
1198
1199PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001200PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001201{
1202 PySequenceMethods *m;
1203
1204 if (o == NULL)
1205 return null_error();
1206
1207 m = o->ob_type->tp_as_sequence;
1208 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1209 return m->sq_inplace_repeat(o, count);
1210 if (m && m->sq_repeat)
1211 return m->sq_repeat(o, count);
1212
Armin Rigofd163f92005-12-29 15:59:19 +00001213 if (PySequence_Check(o)) {
1214 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001215 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001216 if (n == NULL)
1217 return NULL;
1218 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1219 NB_SLOT(nb_multiply));
1220 Py_DECREF(n);
1221 if (result != Py_NotImplemented)
1222 return result;
1223 Py_DECREF(result);
1224 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001225 return type_error("object can't be repeated");
1226}
1227
1228PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001229PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001230{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001231 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001232
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001233 if (s == NULL)
1234 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001235
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001236 m = s->ob_type->tp_as_sequence;
1237 if (m && m->sq_item) {
1238 if (i < 0) {
1239 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001240 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241 if (l < 0)
1242 return NULL;
1243 i += l;
1244 }
1245 }
1246 return m->sq_item(s, i);
1247 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001248
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001249 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001250}
1251
1252PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001253PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001254{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001256 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001257
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001258 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001259
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001260 m = s->ob_type->tp_as_sequence;
1261 if (m && m->sq_slice) {
1262 if (i1 < 0 || i2 < 0) {
1263 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001264 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265 if (l < 0)
1266 return NULL;
1267 if (i1 < 0)
1268 i1 += l;
1269 if (i2 < 0)
1270 i2 += l;
1271 }
1272 }
1273 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001274 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1275 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001276 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001277 if (!slice)
1278 return NULL;
1279 res = mp->mp_subscript(s, slice);
1280 Py_DECREF(slice);
1281 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001282 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001284 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001285}
1286
1287int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001288PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001289{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001291
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001292 if (s == NULL) {
1293 null_error();
1294 return -1;
1295 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297 m = s->ob_type->tp_as_sequence;
1298 if (m && m->sq_ass_item) {
1299 if (i < 0) {
1300 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001301 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001302 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001303 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 i += l;
1305 }
1306 }
1307 return m->sq_ass_item(s, i, o);
1308 }
1309
Raymond Hettinger98779e02003-10-27 09:22:16 +00001310 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001312}
1313
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001314int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001315PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001316{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001317 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001318
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 if (s == NULL) {
1320 null_error();
1321 return -1;
1322 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001323
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324 m = s->ob_type->tp_as_sequence;
1325 if (m && m->sq_ass_item) {
1326 if (i < 0) {
1327 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001328 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001329 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001330 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 i += l;
1332 }
1333 }
1334 return m->sq_ass_item(s, i, (PyObject *)NULL);
1335 }
1336
1337 type_error("object doesn't support item deletion");
1338 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001339}
1340
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001341int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001342PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001343{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001344 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001345 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001346
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001347 if (s == NULL) {
1348 null_error();
1349 return -1;
1350 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001351
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001352 m = s->ob_type->tp_as_sequence;
1353 if (m && m->sq_ass_slice) {
1354 if (i1 < 0 || i2 < 0) {
1355 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001356 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001357 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001358 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359 if (i1 < 0)
1360 i1 += l;
1361 if (i2 < 0)
1362 i2 += l;
1363 }
1364 }
1365 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001366 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1367 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001368 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001369 if (!slice)
1370 return -1;
1371 res = mp->mp_ass_subscript(s, slice, o);
1372 Py_DECREF(slice);
1373 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001374 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001375
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001376 type_error("object doesn't support slice assignment");
1377 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001378}
1379
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001381PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001382{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001383 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001384
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001385 if (s == NULL) {
1386 null_error();
1387 return -1;
1388 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001389
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 m = s->ob_type->tp_as_sequence;
1391 if (m && m->sq_ass_slice) {
1392 if (i1 < 0 || i2 < 0) {
1393 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001394 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001395 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001396 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 if (i1 < 0)
1398 i1 += l;
1399 if (i2 < 0)
1400 i2 += l;
1401 }
1402 }
1403 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1404 }
1405 type_error("object doesn't support slice deletion");
1406 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001407}
1408
Guido van Rossume15dee51995-07-18 14:12:02 +00001409PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001410PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001411{
Tim Peters6912d4d2001-05-05 03:56:37 +00001412 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001413 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001414 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001415 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001416
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001417 if (v == NULL)
1418 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001419
Tim Peters6912d4d2001-05-05 03:56:37 +00001420 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001421 if (PyTuple_CheckExact(v)) {
1422 /* Note that we can't know whether it's safe to return
1423 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001424 to exact tuples here. In contrast, lists always make
1425 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001426 Py_INCREF(v);
1427 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001428 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001429 if (PyList_Check(v))
1430 return PyList_AsTuple(v);
1431
Tim Peters6912d4d2001-05-05 03:56:37 +00001432 /* Get iterator. */
1433 it = PyObject_GetIter(v);
1434 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001435 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001436
Tim Peters6912d4d2001-05-05 03:56:37 +00001437 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001438 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001439 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001440 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1441 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1442 Py_DECREF(it);
1443 return NULL;
1444 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001445 PyErr_Clear();
1446 n = 10; /* arbitrary */
1447 }
1448 result = PyTuple_New(n);
1449 if (result == NULL)
1450 goto Fail;
1451
1452 /* Fill the tuple. */
1453 for (j = 0; ; ++j) {
1454 PyObject *item = PyIter_Next(it);
1455 if (item == NULL) {
1456 if (PyErr_Occurred())
1457 goto Fail;
1458 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001459 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001460 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001461 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001462 /* The over-allocation strategy can grow a bit faster
1463 than for lists because unlike lists the
1464 over-allocation isn't permanent -- we reclaim
1465 the excess before the end of this routine.
1466 So, grow by ten and then add 25%.
1467 */
1468 n += 10;
1469 n += n >> 2;
1470 if (n < oldn) {
1471 /* Check for overflow */
1472 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001473 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001474 goto Fail;
1475 }
Tim Peters4324aa32001-05-28 22:30:08 +00001476 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001477 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001478 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001479 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001480 }
1481 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001482 }
1483
Tim Peters6912d4d2001-05-05 03:56:37 +00001484 /* Cut tuple back if guess was too large. */
1485 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001486 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001487 goto Fail;
1488
1489 Py_DECREF(it);
1490 return result;
1491
1492Fail:
1493 Py_XDECREF(result);
1494 Py_DECREF(it);
1495 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001496}
1497
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001498PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001499PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001500{
Tim Petersf553f892001-05-01 20:45:31 +00001501 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001502 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001503
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001504 if (v == NULL)
1505 return null_error();
1506
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001507 result = PyList_New(0);
1508 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001509 return NULL;
1510
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001511 rv = _PyList_Extend((PyListObject *)result, v);
1512 if (rv == NULL) {
1513 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001514 return NULL;
1515 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001516 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001517 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001518}
1519
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001520PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001521PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001522{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001523 PyObject *it;
1524
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001525 if (v == NULL)
1526 return null_error();
1527
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001528 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001529 Py_INCREF(v);
1530 return v;
1531 }
1532
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001533 it = PyObject_GetIter(v);
1534 if (it == NULL) {
1535 if (PyErr_ExceptionMatches(PyExc_TypeError))
1536 return type_error(m);
1537 return NULL;
1538 }
1539
Raymond Hettinger193814c2004-12-18 19:00:59 +00001540 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001541 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001542
1543 return v;
1544}
1545
Tim Peters16a77ad2001-09-08 04:00:12 +00001546/* Iterate over seq. Result depends on the operation:
1547 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1548 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1549 set ValueError and return -1 if none found; also return -1 on error.
1550 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1551*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001552Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001553_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001554{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001555 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001556 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1557 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001558
Tim Peters16a77ad2001-09-08 04:00:12 +00001559 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001560 null_error();
1561 return -1;
1562 }
Tim Peters75f8e352001-05-05 11:33:43 +00001563
Tim Peters16a77ad2001-09-08 04:00:12 +00001564 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001565 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001566 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001567 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001568 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001569
Tim Peters16a77ad2001-09-08 04:00:12 +00001570 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001571 for (;;) {
1572 int cmp;
1573 PyObject *item = PyIter_Next(it);
1574 if (item == NULL) {
1575 if (PyErr_Occurred())
1576 goto Fail;
1577 break;
1578 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001579
1580 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001581 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001582 if (cmp < 0)
1583 goto Fail;
1584 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001585 switch (operation) {
1586 case PY_ITERSEARCH_COUNT:
1587 ++n;
1588 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001589 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001590 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001591 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001592 goto Fail;
1593 }
1594 break;
1595
1596 case PY_ITERSEARCH_INDEX:
1597 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001598 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001599 PyErr_SetString(PyExc_OverflowError,
1600 "index exceeds C int size");
1601 goto Fail;
1602 }
1603 goto Done;
1604
1605 case PY_ITERSEARCH_CONTAINS:
1606 n = 1;
1607 goto Done;
1608
1609 default:
1610 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001611 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001612 }
1613
1614 if (operation == PY_ITERSEARCH_INDEX) {
1615 ++n;
1616 if (n <= 0)
1617 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001618 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001619 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001620
1621 if (operation != PY_ITERSEARCH_INDEX)
1622 goto Done;
1623
1624 PyErr_SetString(PyExc_ValueError,
1625 "sequence.index(x): x not in sequence");
1626 /* fall into failure code */
1627Fail:
1628 n = -1;
1629 /* fall through */
1630Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001631 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001632 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001633
Guido van Rossume15dee51995-07-18 14:12:02 +00001634}
1635
Tim Peters16a77ad2001-09-08 04:00:12 +00001636/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001637Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001638PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001639{
Tim Peters16a77ad2001-09-08 04:00:12 +00001640 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001641}
1642
Tim Peterscb8d3682001-05-05 21:05:01 +00001643/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001644 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001645 */
1646int
1647PySequence_Contains(PyObject *seq, PyObject *ob)
1648{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001649 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001650 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1651 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1652 if (sqm != NULL && sqm->sq_contains != NULL)
1653 return (*sqm->sq_contains)(seq, ob);
1654 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001655 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1656 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001657}
1658
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001659/* Backwards compatibility */
1660#undef PySequence_In
1661int
Fred Drake79912472000-07-09 04:06:11 +00001662PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001663{
1664 return PySequence_Contains(w, v);
1665}
1666
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001667Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001668PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001669{
Tim Peters16a77ad2001-09-08 04:00:12 +00001670 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001671}
1672
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001673/* Operations on mappings */
1674
1675int
Fred Drake79912472000-07-09 04:06:11 +00001676PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001677{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001678 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001679 return PyObject_HasAttrString(o, "__getitem__");
1680
1681 return o && o->ob_type->tp_as_mapping &&
1682 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001683 !(o->ob_type->tp_as_sequence &&
1684 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001685}
1686
Martin v. Löwis18e16552006-02-15 17:27:45 +00001687Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001688PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001689{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001690 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001691
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001692 if (o == NULL) {
1693 null_error();
1694 return -1;
1695 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001696
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001697 m = o->ob_type->tp_as_mapping;
1698 if (m && m->mp_length)
1699 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001700
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001701 type_error("len() of unsized object");
1702 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001703}
1704
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001705#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001706Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001707PyMapping_Length(PyObject *o)
1708{
1709 return PyMapping_Size(o);
1710}
1711#define PyMapping_Length PyMapping_Size
1712
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001713PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001714PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001715{
1716 PyObject *okey, *r;
1717
1718 if (key == NULL)
1719 return null_error();
1720
1721 okey = PyString_FromString(key);
1722 if (okey == NULL)
1723 return NULL;
1724 r = PyObject_GetItem(o, okey);
1725 Py_DECREF(okey);
1726 return r;
1727}
1728
1729int
Fred Drake79912472000-07-09 04:06:11 +00001730PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001731{
1732 PyObject *okey;
1733 int r;
1734
1735 if (key == NULL) {
1736 null_error();
1737 return -1;
1738 }
1739
1740 okey = PyString_FromString(key);
1741 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001742 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001743 r = PyObject_SetItem(o, okey, value);
1744 Py_DECREF(okey);
1745 return r;
1746}
1747
1748int
Fred Drake79912472000-07-09 04:06:11 +00001749PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001750{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001751 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001752
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001753 v = PyMapping_GetItemString(o, key);
1754 if (v) {
1755 Py_DECREF(v);
1756 return 1;
1757 }
1758 PyErr_Clear();
1759 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001760}
1761
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001762int
Fred Drake79912472000-07-09 04:06:11 +00001763PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001764{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001765 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001766
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001767 v = PyObject_GetItem(o, key);
1768 if (v) {
1769 Py_DECREF(v);
1770 return 1;
1771 }
1772 PyErr_Clear();
1773 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001774}
1775
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001776/* Operations on callable objects */
1777
1778/* XXX PyCallable_Check() is in object.c */
1779
Guido van Rossume15dee51995-07-18 14:12:02 +00001780PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001781PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001782{
Guido van Rossum5560b742001-09-14 16:47:50 +00001783 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001784}
Guido van Rossume15dee51995-07-18 14:12:02 +00001785
1786PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001787PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1788{
1789 ternaryfunc call;
1790
1791 if ((call = func->ob_type->tp_call) != NULL) {
1792 PyObject *result = (*call)(func, arg, kw);
1793 if (result == NULL && !PyErr_Occurred())
1794 PyErr_SetString(
1795 PyExc_SystemError,
1796 "NULL result without error in PyObject_Call");
1797 return result;
1798 }
Fred Drake573395a2001-11-01 20:26:12 +00001799 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1800 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001801 return NULL;
1802}
1803
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001804static PyObject*
1805call_function_tail(PyObject *callable, PyObject *args)
1806{
1807 PyObject *retval;
1808
1809 if (args == NULL)
1810 return NULL;
1811
1812 if (!PyTuple_Check(args)) {
1813 PyObject *a;
1814
1815 a = PyTuple_New(1);
1816 if (a == NULL) {
1817 Py_DECREF(args);
1818 return NULL;
1819 }
1820 PyTuple_SET_ITEM(a, 0, args);
1821 args = a;
1822 }
1823 retval = PyObject_Call(callable, args, NULL);
1824
1825 Py_DECREF(args);
1826
1827 return retval;
1828}
1829
Tim Peters6d6c1a32001-08-02 04:15:00 +00001830PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001832{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001833 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001834 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001835
Fred Drakeb92cf062001-10-27 06:16:31 +00001836 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001837 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001838
Fred Drakeb92cf062001-10-27 06:16:31 +00001839 if (format && *format) {
1840 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001841 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001842 va_end(va);
1843 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 else
1845 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001846
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001847 return call_function_tail(callable, args);
1848}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001849
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001850PyObject *
1851_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1852{
1853 va_list va;
1854 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001855
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001856 if (callable == NULL)
1857 return null_error();
1858
1859 if (format && *format) {
1860 va_start(va, format);
1861 args = _Py_VaBuildValue_SizeT(format, va);
1862 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001863 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001864 else
1865 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001866
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001867 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001868}
1869
1870PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001871PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001872{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001873 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001874 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001875 PyObject *func = NULL;
1876 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001877
Fred Drakeb92cf062001-10-27 06:16:31 +00001878 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001879 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001880
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001881 func = PyObject_GetAttrString(o, name);
1882 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001883 PyErr_SetString(PyExc_AttributeError, name);
1884 return 0;
1885 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001886
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001887 if (!PyCallable_Check(func)) {
1888 type_error("call of non-callable attribute");
1889 goto exit;
1890 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001891
Fred Drakeb92cf062001-10-27 06:16:31 +00001892 if (format && *format) {
1893 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001894 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001895 va_end(va);
1896 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001897 else
1898 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001899
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001900 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001901
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001902 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001903 /* args gets consumed in call_function_tail */
1904 Py_XDECREF(func);
1905
1906 return retval;
1907}
1908
1909PyObject *
1910_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1911{
1912 va_list va;
1913 PyObject *args;
1914 PyObject *func = NULL;
1915 PyObject *retval = NULL;
1916
1917 if (o == NULL || name == NULL)
1918 return null_error();
1919
1920 func = PyObject_GetAttrString(o, name);
1921 if (func == NULL) {
1922 PyErr_SetString(PyExc_AttributeError, name);
1923 return 0;
1924 }
1925
1926 if (!PyCallable_Check(func)) {
1927 type_error("call of non-callable attribute");
1928 goto exit;
1929 }
1930
1931 if (format && *format) {
1932 va_start(va, format);
1933 args = _Py_VaBuildValue_SizeT(format, va);
1934 va_end(va);
1935 }
1936 else
1937 args = PyTuple_New(0);
1938
1939 retval = call_function_tail(func, args);
1940
1941 exit:
1942 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001943 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001944
1945 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001946}
Guido van Rossum823649d2001-03-21 18:40:58 +00001947
1948
Fred Drakeb421b8c2001-10-26 16:21:32 +00001949static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001950objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001951{
1952 int i, n = 0;
1953 va_list countva;
1954 PyObject *result, *tmp;
1955
1956#ifdef VA_LIST_IS_ARRAY
1957 memcpy(countva, va, sizeof(va_list));
1958#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001959#ifdef __va_copy
1960 __va_copy(countva, va);
1961#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001962 countva = va;
1963#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001964#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001965
1966 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1967 ++n;
1968 result = PyTuple_New(n);
1969 if (result != NULL && n > 0) {
1970 for (i = 0; i < n; ++i) {
1971 tmp = (PyObject *)va_arg(va, PyObject *);
1972 PyTuple_SET_ITEM(result, i, tmp);
1973 Py_INCREF(tmp);
1974 }
1975 }
1976 return result;
1977}
1978
1979PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001980PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001981{
1982 PyObject *args, *tmp;
1983 va_list vargs;
1984
1985 if (callable == NULL || name == NULL)
1986 return null_error();
1987
1988 callable = PyObject_GetAttr(callable, name);
1989 if (callable == NULL)
1990 return NULL;
1991
1992 /* count the args */
1993 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001994 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001995 va_end(vargs);
1996 if (args == NULL) {
1997 Py_DECREF(callable);
1998 return NULL;
1999 }
2000 tmp = PyObject_Call(callable, args, NULL);
2001 Py_DECREF(args);
2002 Py_DECREF(callable);
2003
2004 return tmp;
2005}
2006
2007PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002008PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002009{
2010 PyObject *args, *tmp;
2011 va_list vargs;
2012
2013 if (callable == NULL)
2014 return null_error();
2015
2016 /* count the args */
2017 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002018 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002019 va_end(vargs);
2020 if (args == NULL)
2021 return NULL;
2022 tmp = PyObject_Call(callable, args, NULL);
2023 Py_DECREF(args);
2024
2025 return tmp;
2026}
2027
2028
Guido van Rossum823649d2001-03-21 18:40:58 +00002029/* isinstance(), issubclass() */
2030
Barry Warsawf16951c2002-04-23 22:45:44 +00002031/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2032 * state that will almost never happen.
2033 *
2034 * 0. creating the __bases__ static string could get a MemoryError
2035 * 1. getattr(cls, '__bases__') could raise an AttributeError
2036 * 2. getattr(cls, '__bases__') could raise some other exception
2037 * 3. getattr(cls, '__bases__') could return a tuple
2038 * 4. getattr(cls, '__bases__') could return something other than a tuple
2039 *
2040 * Only state #3 is a non-error state and only it returns a non-NULL object
2041 * (it returns the retrieved tuple).
2042 *
2043 * Any raised AttributeErrors are masked by clearing the exception and
2044 * returning NULL. If an object other than a tuple comes out of __bases__,
2045 * then again, the return value is NULL. So yes, these two situations
2046 * produce exactly the same results: NULL is returned and no error is set.
2047 *
2048 * If some exception other than AttributeError is raised, then NULL is also
2049 * returned, but the exception is not cleared. That's because we want the
2050 * exception to be propagated along.
2051 *
2052 * Callers are expected to test for PyErr_Occurred() when the return value
2053 * is NULL to decide whether a valid exception should be propagated or not.
2054 * When there's no exception to propagate, it's customary for the caller to
2055 * set a TypeError.
2056 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002057static PyObject *
2058abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002059{
2060 static PyObject *__bases__ = NULL;
2061 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002062
2063 if (__bases__ == NULL) {
2064 __bases__ = PyString_FromString("__bases__");
2065 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002066 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002067 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002068 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002069 if (bases == NULL) {
2070 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2071 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002072 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002073 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002074 if (!PyTuple_Check(bases)) {
2075 Py_DECREF(bases);
2076 return NULL;
2077 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002078 return bases;
2079}
2080
2081
2082static int
2083abstract_issubclass(PyObject *derived, PyObject *cls)
2084{
2085 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002086 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002087 int r = 0;
2088
2089
Guido van Rossum823649d2001-03-21 18:40:58 +00002090 if (derived == cls)
2091 return 1;
2092
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002093 if (PyTuple_Check(cls)) {
2094 /* Not a general sequence -- that opens up the road to
2095 recursion and stack overflow. */
2096 n = PyTuple_GET_SIZE(cls);
2097 for (i = 0; i < n; i++) {
2098 if (derived == PyTuple_GET_ITEM(cls, i))
2099 return 1;
2100 }
2101 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002102 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002103 if (bases == NULL) {
2104 if (PyErr_Occurred())
2105 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002106 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002107 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002108 n = PyTuple_GET_SIZE(bases);
2109 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002110 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002111 if (r != 0)
2112 break;
2113 }
2114
2115 Py_DECREF(bases);
2116
2117 return r;
2118}
2119
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002120static int
2121check_class(PyObject *cls, const char *error)
2122{
2123 PyObject *bases = abstract_get_bases(cls);
2124 if (bases == NULL) {
2125 /* Do not mask errors. */
2126 if (!PyErr_Occurred())
2127 PyErr_SetString(PyExc_TypeError, error);
2128 return 0;
2129 }
2130 Py_DECREF(bases);
2131 return -1;
2132}
2133
Brett Cannon4f653312004-03-20 22:52:14 +00002134static int
2135recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002136{
2137 PyObject *icls;
2138 static PyObject *__class__ = NULL;
2139 int retval = 0;
2140
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002141 if (__class__ == NULL) {
2142 __class__ = PyString_FromString("__class__");
2143 if (__class__ == NULL)
2144 return -1;
2145 }
2146
Neil Schemenauer6b471292001-10-18 03:18:43 +00002147 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2148 PyObject *inclass =
2149 (PyObject*)((PyInstanceObject*)inst)->in_class;
2150 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002151 }
2152 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002153 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002154 if (retval == 0) {
2155 PyObject *c = PyObject_GetAttr(inst, __class__);
2156 if (c == NULL) {
2157 PyErr_Clear();
2158 }
2159 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002160 if (c != (PyObject *)(inst->ob_type) &&
2161 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002162 retval = PyType_IsSubtype(
2163 (PyTypeObject *)c,
2164 (PyTypeObject *)cls);
2165 Py_DECREF(c);
2166 }
2167 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002168 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002169 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002170 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002171
Brett Cannon4f653312004-03-20 22:52:14 +00002172 if (!recursion_depth) {
2173 PyErr_SetString(PyExc_RuntimeError,
2174 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002175 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002176 }
2177
Guido van Rossum03290ec2001-10-07 20:54:12 +00002178 n = PyTuple_GET_SIZE(cls);
2179 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002180 retval = recursive_isinstance(
2181 inst,
2182 PyTuple_GET_ITEM(cls, i),
2183 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002184 if (retval != 0)
2185 break;
2186 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002187 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002188 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002189 if (!check_class(cls,
2190 "isinstance() arg 2 must be a class, type,"
2191 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002192 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002193 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002194 if (icls == NULL) {
2195 PyErr_Clear();
2196 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002197 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002198 else {
2199 retval = abstract_issubclass(icls, cls);
2200 Py_DECREF(icls);
2201 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002202 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002203
Guido van Rossum823649d2001-03-21 18:40:58 +00002204 return retval;
2205}
2206
2207int
Brett Cannon4f653312004-03-20 22:52:14 +00002208PyObject_IsInstance(PyObject *inst, PyObject *cls)
2209{
2210 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2211}
2212
2213static int
2214recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002215{
2216 int retval;
2217
2218 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002219 if (!check_class(derived,
2220 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002221 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002222
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002223 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002224 Py_ssize_t i;
2225 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002226
2227 if (!recursion_depth) {
2228 PyErr_SetString(PyExc_RuntimeError,
2229 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002230 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002231 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002232 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002233 retval = recursive_issubclass(
2234 derived,
2235 PyTuple_GET_ITEM(cls, i),
2236 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002237 if (retval != 0) {
2238 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002239 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002240 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002241 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002242 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002243 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002244 else {
2245 if (!check_class(cls,
2246 "issubclass() arg 2 must be a class"
2247 " or tuple of classes"))
2248 return -1;
2249 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002250
2251 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002252 }
2253 else {
2254 /* shortcut */
2255 if (!(retval = (derived == cls)))
2256 retval = PyClass_IsSubclass(derived, cls);
2257 }
2258
2259 return retval;
2260}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002261
Brett Cannon4f653312004-03-20 22:52:14 +00002262int
2263PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2264{
2265 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2266}
2267
2268
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002269PyObject *
2270PyObject_GetIter(PyObject *o)
2271{
2272 PyTypeObject *t = o->ob_type;
2273 getiterfunc f = NULL;
2274 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2275 f = t->tp_iter;
2276 if (f == NULL) {
2277 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002278 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002279 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002280 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002281 return NULL;
2282 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002283 else {
2284 PyObject *res = (*f)(o);
2285 if (res != NULL && !PyIter_Check(res)) {
2286 PyErr_Format(PyExc_TypeError,
2287 "iter() returned non-iterator "
2288 "of type '%.100s'",
2289 res->ob_type->tp_name);
2290 Py_DECREF(res);
2291 res = NULL;
2292 }
2293 return res;
2294 }
2295}
2296
Tim Petersf4848da2001-05-05 00:14:56 +00002297/* Return next item.
2298 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2299 * If the iteration terminates normally, return NULL and clear the
2300 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2301 * will be false.
2302 * Else return the next object. PyErr_Occurred() will be false.
2303 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002304PyObject *
2305PyIter_Next(PyObject *iter)
2306{
Tim Petersf4848da2001-05-05 00:14:56 +00002307 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002308 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002309 result = (*iter->ob_type->tp_iternext)(iter);
2310 if (result == NULL &&
2311 PyErr_Occurred() &&
2312 PyErr_ExceptionMatches(PyExc_StopIteration))
2313 PyErr_Clear();
2314 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002315}