blob: 399656ffe0058de83f8638cd97fc5e414bc2679e [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
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000013/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000014
15static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000016type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000017{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000018 PyErr_SetString(PyExc_TypeError, msg);
19 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000020}
21
Guido van Rossum052b7e11996-11-11 15:08:19 +000022static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000023null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000024{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000025 if (!PyErr_Occurred())
26 PyErr_SetString(PyExc_SystemError,
27 "null argument to internal routine");
28 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000029}
30
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000031/* Operations on any object */
32
33int
Fred Drake79912472000-07-09 04:06:11 +000034PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000035{
36 int r;
37
38 if (o1 == NULL || o2 == NULL) {
39 null_error();
40 return -1;
41 }
42 r = PyObject_Compare(o1, o2);
43 if (PyErr_Occurred())
44 return -1;
45 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000046 return 0;
47}
Guido van Rossume15dee51995-07-18 14:12:02 +000048
49PyObject *
Fred Drake79912472000-07-09 04:06:11 +000050PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000051{
52 PyObject *v;
53
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000054 if (o == NULL)
55 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000056 v = (PyObject *)o->ob_type;
57 Py_INCREF(v);
58 return v;
59}
60
Martin v. Löwis18e16552006-02-15 17:27:45 +000061Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000062PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000063{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000064 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000065
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000066 if (o == NULL) {
67 null_error();
68 return -1;
69 }
Guido van Rossume15dee51995-07-18 14:12:02 +000070
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000071 m = o->ob_type->tp_as_sequence;
72 if (m && m->sq_length)
73 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000074
Jeremy Hylton6253f832000-07-12 12:56:19 +000075 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000076}
77
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000078#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000079Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000080PyObject_Length(PyObject *o)
81{
82 return PyObject_Size(o);
83}
84#define PyObject_Length PyObject_Size
85
Martin v. Löwis18e16552006-02-15 17:27:45 +000086Py_ssize_t
Armin Rigof5b3e362006-02-11 21:32:43 +000087_PyObject_LengthHint(PyObject *o)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000088{
Martin v. Löwis18e16552006-02-15 17:27:45 +000089 Py_ssize_t rv = PyObject_Size(o);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000090 if (rv != -1)
91 return rv;
92 if (PyErr_ExceptionMatches(PyExc_TypeError) ||
93 PyErr_ExceptionMatches(PyExc_AttributeError)) {
94 PyObject *err_type, *err_value, *err_tb, *ro;
95
96 PyErr_Fetch(&err_type, &err_value, &err_tb);
Armin Rigof5b3e362006-02-11 21:32:43 +000097 ro = PyObject_CallMethod(o, "__length_hint__", NULL);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000098 if (ro != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +000099 rv = PyInt_AsLong(ro);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000100 Py_DECREF(ro);
101 Py_XDECREF(err_type);
102 Py_XDECREF(err_value);
103 Py_XDECREF(err_tb);
104 return rv;
105 }
106 PyErr_Restore(err_type, err_value, err_tb);
107 }
108 return -1;
109}
110
Guido van Rossume15dee51995-07-18 14:12:02 +0000111PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000112PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000113{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000114 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000115
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000116 if (o == NULL || key == NULL)
117 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000118
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000119 m = o->ob_type->tp_as_mapping;
120 if (m && m->mp_subscript)
121 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000122
Guido van Rossum21308241998-08-13 16:44:44 +0000123 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000124 PyNumberMethods *nb = key->ob_type->tp_as_number;
125 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
126 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000127 if (key_value == -1 && PyErr_Occurred())
128 return NULL;
129 return PySequence_GetItem(o, key_value);
130 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000131 else if (o->ob_type->tp_as_sequence->sq_item)
132 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000133 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000134
135 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000136}
137
138int
Fred Drake79912472000-07-09 04:06:11 +0000139PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000140{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000141 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000142
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000143 if (o == NULL || key == NULL || value == NULL) {
144 null_error();
145 return -1;
146 }
147 m = o->ob_type->tp_as_mapping;
148 if (m && m->mp_ass_subscript)
149 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000150
Guido van Rossum21308241998-08-13 16:44:44 +0000151 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000152 PyNumberMethods *nb = key->ob_type->tp_as_number;
153 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
154 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000155 if (key_value == -1 && PyErr_Occurred())
156 return -1;
157 return PySequence_SetItem(o, key_value, value);
158 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000159 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
160 type_error("sequence index must be integer");
161 return -1;
162 }
Guido van Rossum21308241998-08-13 16:44:44 +0000163 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000164
165 type_error("object does not support item assignment");
166 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000167}
168
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000169int
Fred Drake79912472000-07-09 04:06:11 +0000170PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000171{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000172 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000173
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000174 if (o == NULL || key == NULL) {
175 null_error();
176 return -1;
177 }
178 m = o->ob_type->tp_as_mapping;
179 if (m && m->mp_ass_subscript)
180 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000181
Guido van Rossum21308241998-08-13 16:44:44 +0000182 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000183 PyNumberMethods *nb = key->ob_type->tp_as_number;
184 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
185 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000186 if (key_value == -1 && PyErr_Occurred())
187 return -1;
188 return PySequence_DelItem(o, key_value);
189 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000190 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
191 type_error("sequence index must be integer");
192 return -1;
193 }
Guido van Rossum21308241998-08-13 16:44:44 +0000194 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000195
196 type_error("object does not support item deletion");
197 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000198}
199
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000200int
201PyObject_DelItemString(PyObject *o, char *key)
202{
203 PyObject *okey;
204 int ret;
205
206 if (o == NULL || key == NULL) {
207 null_error();
208 return -1;
209 }
210 okey = PyString_FromString(key);
211 if (okey == NULL)
212 return -1;
213 ret = PyObject_DelItem(o, okey);
214 Py_DECREF(okey);
215 return ret;
216}
217
Guido van Rossum4c08d552000-03-10 22:55:18 +0000218int PyObject_AsCharBuffer(PyObject *obj,
219 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000220 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000221{
222 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000223 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000224 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000225
226 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
227 null_error();
228 return -1;
229 }
230 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000231 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000232 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000233 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000234 PyErr_SetString(PyExc_TypeError,
235 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000236 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000237 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000238 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239 PyErr_SetString(PyExc_TypeError,
240 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000241 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000243 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000244 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000245 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246 *buffer = pp;
247 *buffer_len = len;
248 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000249}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000250
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000251int
252PyObject_CheckReadBuffer(PyObject *obj)
253{
254 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
255
256 if (pb == NULL ||
257 pb->bf_getreadbuffer == NULL ||
258 pb->bf_getsegcount == NULL ||
259 (*pb->bf_getsegcount)(obj, NULL) != 1)
260 return 0;
261 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000262}
263
264int PyObject_AsReadBuffer(PyObject *obj,
265 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000266 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267{
268 PyBufferProcs *pb;
269 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000270 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271
272 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
273 null_error();
274 return -1;
275 }
276 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000277 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000278 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000279 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000280 PyErr_SetString(PyExc_TypeError,
281 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000282 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000284 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000285 PyErr_SetString(PyExc_TypeError,
286 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000287 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000289 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000291 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292 *buffer = pp;
293 *buffer_len = len;
294 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000295}
296
297int PyObject_AsWriteBuffer(PyObject *obj,
298 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000299 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000300{
301 PyBufferProcs *pb;
302 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000303 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304
305 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
306 null_error();
307 return -1;
308 }
309 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000310 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 PyErr_SetString(PyExc_TypeError,
314 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000315 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000317 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000318 PyErr_SetString(PyExc_TypeError,
319 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000320 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321 }
322 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
323 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000324 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000325 *buffer = pp;
326 *buffer_len = len;
327 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000328}
329
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000330/* Operations on numbers */
331
332int
Fred Drake79912472000-07-09 04:06:11 +0000333PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000334{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000335 return o && o->ob_type->tp_as_number &&
336 (o->ob_type->tp_as_number->nb_int ||
337 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000338}
339
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000340/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000341
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000342/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000343
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000344#define NB_SLOT(x) offsetof(PyNumberMethods, x)
345#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000346 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000347#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000348 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000349
350/*
351 Calling scheme used for binary operations:
352
353 v w Action
354 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000355 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000356 new old v.op(v,w), coerce(v,w), v.op(v,w)
357 old new w.op(v,w), coerce(v,w), v.op(v,w)
358 old old coerce(v,w), v.op(v,w)
359
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000360 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
361 v->ob_type
362
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000363 Legend:
364 -------
365 * new == new style number
366 * old == old style number
367 * Action indicates the order in which operations are tried until either
368 a valid result is produced or an error occurs.
369
370 */
371
372static PyObject *
373binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000374{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000375 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000376 binaryfunc slotv = NULL;
377 binaryfunc slotw = NULL;
378
379 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000380 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000381 if (w->ob_type != v->ob_type &&
382 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000383 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000384 if (slotw == slotv)
385 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000386 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000387 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000388 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
389 x = slotw(v, w);
390 if (x != Py_NotImplemented)
391 return x;
392 Py_DECREF(x); /* can't do it */
393 slotw = NULL;
394 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000395 x = slotv(v, w);
396 if (x != Py_NotImplemented)
397 return x;
398 Py_DECREF(x); /* can't do it */
399 }
400 if (slotw) {
401 x = slotw(v, w);
402 if (x != Py_NotImplemented)
403 return x;
404 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000405 }
406 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
407 int err = PyNumber_CoerceEx(&v, &w);
408 if (err < 0) {
409 return NULL;
410 }
411 if (err == 0) {
412 PyNumberMethods *mv = v->ob_type->tp_as_number;
413 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000414 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000415 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000416 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000417 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000418 Py_DECREF(v);
419 Py_DECREF(w);
420 return x;
421 }
422 }
423 /* CoerceEx incremented the reference counts */
424 Py_DECREF(v);
425 Py_DECREF(w);
426 }
427 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000428 Py_INCREF(Py_NotImplemented);
429 return Py_NotImplemented;
430}
Guido van Rossum77660912002-04-16 16:32:50 +0000431
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000432static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000433binop_type_error(PyObject *v, PyObject *w, const char *op_name)
434{
435 PyErr_Format(PyExc_TypeError,
436 "unsupported operand type(s) for %s: '%s' and '%s'",
437 op_name,
438 v->ob_type->tp_name,
439 w->ob_type->tp_name);
440 return NULL;
441}
442
443static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000444binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
445{
446 PyObject *result = binary_op1(v, w, op_slot);
447 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000448 Py_DECREF(result);
449 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000450 }
451 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000452}
453
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000454
455/*
456 Calling scheme used for ternary operations:
457
Guido van Rossum84675ac2001-09-29 01:05:03 +0000458 *** In some cases, w.op is called before v.op; see binary_op1. ***
459
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000460 v w z Action
461 -------------------------------------------------------------------
462 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
463 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
464 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
465 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
466 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
467 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
468 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
469 old old old coerce(v,w,z), v.op(v,w,z)
470
471 Legend:
472 -------
473 * new == new style number
474 * old == old style number
475 * Action indicates the order in which operations are tried until either
476 a valid result is produced or an error occurs.
477 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
478 only if z != Py_None; if z == Py_None, then it is treated as absent
479 variable and only coerce(v,w) is tried.
480
481 */
482
483static PyObject *
484ternary_op(PyObject *v,
485 PyObject *w,
486 PyObject *z,
487 const int op_slot,
488 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000489{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000490 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000491 PyObject *x = NULL;
492 ternaryfunc slotv = NULL;
493 ternaryfunc slotw = NULL;
494 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000495
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000496 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000497 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000498 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000499 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000500 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000501 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000502 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000503 if (slotw == slotv)
504 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000505 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000506 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000507 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
508 x = slotw(v, w, z);
509 if (x != Py_NotImplemented)
510 return x;
511 Py_DECREF(x); /* can't do it */
512 slotw = NULL;
513 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000514 x = slotv(v, w, z);
515 if (x != Py_NotImplemented)
516 return x;
517 Py_DECREF(x); /* can't do it */
518 }
519 if (slotw) {
520 x = slotw(v, w, z);
521 if (x != Py_NotImplemented)
522 return x;
523 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000524 }
525 mz = z->ob_type->tp_as_number;
526 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000527 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000528 if (slotz == slotv || slotz == slotw)
529 slotz = NULL;
530 if (slotz) {
531 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000532 if (x != Py_NotImplemented)
533 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000534 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000535 }
536 }
537
538 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
539 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
540 /* we have an old style operand, coerce */
541 PyObject *v1, *z1, *w2, *z2;
542 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000543
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000544 c = PyNumber_Coerce(&v, &w);
545 if (c != 0)
546 goto error3;
547
548 /* Special case: if the third argument is None, it is
549 treated as absent argument and not coerced. */
550 if (z == Py_None) {
551 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000552 slotz = NB_TERNOP(v->ob_type->tp_as_number,
553 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000554 if (slotz)
555 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000556 else
557 c = -1;
558 }
559 else
560 c = -1;
561 goto error2;
562 }
563 v1 = v;
564 z1 = z;
565 c = PyNumber_Coerce(&v1, &z1);
566 if (c != 0)
567 goto error2;
568 w2 = w;
569 z2 = z1;
570 c = PyNumber_Coerce(&w2, &z2);
571 if (c != 0)
572 goto error1;
573
574 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000575 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
576 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000577 if (slotv)
578 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000579 else
580 c = -1;
581 }
582 else
583 c = -1;
584
585 Py_DECREF(w2);
586 Py_DECREF(z2);
587 error1:
588 Py_DECREF(v1);
589 Py_DECREF(z1);
590 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000591 Py_DECREF(v);
592 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000593 error3:
594 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000595 return x;
596 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000597
598 if (z == Py_None)
599 PyErr_Format(
600 PyExc_TypeError,
601 "unsupported operand type(s) for ** or pow(): "
602 "'%s' and '%s'",
603 v->ob_type->tp_name,
604 w->ob_type->tp_name);
605 else
606 PyErr_Format(
607 PyExc_TypeError,
608 "unsupported operand type(s) for pow(): "
609 "'%s', '%s', '%s'",
610 v->ob_type->tp_name,
611 w->ob_type->tp_name,
612 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000613 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000614}
615
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000616#define BINARY_FUNC(func, op, op_name) \
617 PyObject * \
618 func(PyObject *v, PyObject *w) { \
619 return binary_op(v, w, NB_SLOT(op), op_name); \
620 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000621
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000622BINARY_FUNC(PyNumber_Or, nb_or, "|")
623BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
624BINARY_FUNC(PyNumber_And, nb_and, "&")
625BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
626BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
627BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000628BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
629BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000630
631PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000632PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000633{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000634 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
635 if (result == Py_NotImplemented) {
636 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000637 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000638 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000639 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000640 }
Armin Rigofd163f92005-12-29 15:59:19 +0000641 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000642 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000643 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000644}
645
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000646static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000647sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000648{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000649 Py_ssize_t count;
650 PyNumberMethods *nb = n->ob_type->tp_as_number;
651 if (nb != NULL && HASINDEX(n) && nb->nb_index != NULL) {
652 count = nb->nb_index(n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000653 if (count == -1 && PyErr_Occurred())
654 return NULL;
655 }
656 else {
657 return type_error(
Raymond Hettinger10c66062004-05-12 21:35:06 +0000658 "can't multiply sequence by non-int");
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000659 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000660 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000661}
662
663PyObject *
664PyNumber_Multiply(PyObject *v, PyObject *w)
665{
666 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
667 if (result == Py_NotImplemented) {
668 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
669 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000670 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000671 if (mv && mv->sq_repeat) {
672 return sequence_repeat(mv->sq_repeat, v, w);
673 }
674 else if (mw && mw->sq_repeat) {
675 return sequence_repeat(mw->sq_repeat, w, v);
676 }
677 result = binop_type_error(v, w, "*");
678 }
679 return result;
680}
681
Guido van Rossume15dee51995-07-18 14:12:02 +0000682PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000683PyNumber_FloorDivide(PyObject *v, PyObject *w)
684{
685 /* XXX tp_flags test */
686 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
687}
688
689PyObject *
690PyNumber_TrueDivide(PyObject *v, PyObject *w)
691{
692 /* XXX tp_flags test */
693 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
694}
695
696PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000697PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000698{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000699 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000700}
701
702PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000703PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000704{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000705 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000706}
707
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000708/* Binary in-place operators */
709
710/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000711 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000712
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000713 - If the left hand object has the appropriate struct members, and
714 they are filled, call the appropriate function and return the
715 result. No coercion is done on the arguments; the left-hand object
716 is the one the operation is performed on, and it's up to the
717 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000718
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000719 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000720 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000721
722 */
723
Guido van Rossum77660912002-04-16 16:32:50 +0000724#define HASINPLACE(t) \
725 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000726
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000727static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000728binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000730 PyNumberMethods *mv = v->ob_type->tp_as_number;
731 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000732 binaryfunc slot = NB_BINOP(mv, iop_slot);
733 if (slot) {
734 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000735 if (x != Py_NotImplemented) {
736 return x;
737 }
738 Py_DECREF(x);
739 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000740 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000741 return binary_op1(v, w, op_slot);
742}
743
744static PyObject *
745binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
746 const char *op_name)
747{
748 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
749 if (result == Py_NotImplemented) {
750 Py_DECREF(result);
751 return binop_type_error(v, w, op_name);
752 }
753 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000754}
755
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000756#define INPLACE_BINOP(func, iop, op, op_name) \
757 PyObject * \
758 func(PyObject *v, PyObject *w) { \
759 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000760 }
761
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000762INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
763INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
764INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
765INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
766INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
767INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
768INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000769
770PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000771PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
772{
773 /* XXX tp_flags test */
774 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
775 NB_SLOT(nb_floor_divide), "//=");
776}
777
778PyObject *
779PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
780{
781 /* XXX tp_flags test */
782 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
783 NB_SLOT(nb_true_divide), "/=");
784}
785
786PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000787PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
788{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000789 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
790 NB_SLOT(nb_add));
791 if (result == Py_NotImplemented) {
792 PySequenceMethods *m = v->ob_type->tp_as_sequence;
793 Py_DECREF(result);
794 if (m != NULL) {
795 binaryfunc f = NULL;
796 if (HASINPLACE(v))
797 f = m->sq_inplace_concat;
798 if (f == NULL)
799 f = m->sq_concat;
800 if (f != NULL)
801 return (*f)(v, w);
802 }
803 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000804 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000805 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000806}
807
808PyObject *
809PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
810{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000811 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
812 NB_SLOT(nb_multiply));
813 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000814 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000815 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
816 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
817 Py_DECREF(result);
818 if (mv != NULL) {
819 if (HASINPLACE(v))
820 f = mv->sq_inplace_repeat;
821 if (f == NULL)
822 f = mv->sq_repeat;
823 if (f != NULL)
824 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000825 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000826 else if (mw != NULL) {
827 /* Note that the right hand operand should not be
828 * mutated in this case so sq_inplace_repeat is not
829 * used. */
830 if (mw->sq_repeat)
831 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000832 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000833 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000834 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000835 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000836}
837
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000838PyObject *
839PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
840{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000841 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
842 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000843}
844
845PyObject *
846PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
847{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000848 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
849 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
850 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000851 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000852 else {
853 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
854 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000855}
856
857
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000859
860PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000861PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000862{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863 PyNumberMethods *m;
864
865 if (o == NULL)
866 return null_error();
867 m = o->ob_type->tp_as_number;
868 if (m && m->nb_negative)
869 return (*m->nb_negative)(o);
870
871 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000872}
873
874PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000875PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000876{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000877 PyNumberMethods *m;
878
879 if (o == NULL)
880 return null_error();
881 m = o->ob_type->tp_as_number;
882 if (m && m->nb_positive)
883 return (*m->nb_positive)(o);
884
885 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000886}
887
888PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000889PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000890{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000891 PyNumberMethods *m;
892
893 if (o == NULL)
894 return null_error();
895 m = o->ob_type->tp_as_number;
896 if (m && m->nb_invert)
897 return (*m->nb_invert)(o);
898
899 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000900}
901
902PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000903PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000904{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000905 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000906
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000907 if (o == NULL)
908 return null_error();
909 m = o->ob_type->tp_as_number;
910 if (m && m->nb_absolute)
911 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000912
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000913 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000914}
915
Guido van Rossum9e896b32000-04-05 20:11:21 +0000916/* Add a check for embedded NULL-bytes in the argument. */
917static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000918int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000919{
920 char *end;
921 PyObject *x;
922
923 x = PyInt_FromString((char*)s, &end, 10);
924 if (x == NULL)
925 return NULL;
926 if (end != s + len) {
927 PyErr_SetString(PyExc_ValueError,
928 "null byte in argument for int()");
929 Py_DECREF(x);
930 return NULL;
931 }
932 return x;
933}
934
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000935/* Return a Py_ssize_t integer from the object item */
936Py_ssize_t
937PyNumber_Index(PyObject *item)
938{
939 Py_ssize_t value = -1;
940 PyNumberMethods *nb = item->ob_type->tp_as_number;
941 if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) {
942 value = nb->nb_index(item);
943 }
944 else {
945 PyErr_SetString(PyExc_IndexError,
946 "object cannot be interpreted as an index");
947 }
948 return value;
949}
950
Guido van Rossume15dee51995-07-18 14:12:02 +0000951PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000952PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000953{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000954 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000955 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000956 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000957
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000958 if (o == NULL)
959 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000960 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000961 Py_INCREF(o);
962 return o;
963 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000964 m = o->ob_type->tp_as_number;
965 if (m && m->nb_int) { /* This should include subclasses of int */
966 PyObject *res = m->nb_int(o);
967 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
968 PyErr_Format(PyExc_TypeError,
969 "__int__ returned non-int (type %.200s)",
970 res->ob_type->tp_name);
971 Py_DECREF(res);
972 return NULL;
973 }
974 return res;
975 }
976 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000977 PyIntObject *io = (PyIntObject*)o;
978 return PyInt_FromLong(io->ob_ival);
979 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000980 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000981 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000982 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000983#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000984 if (PyUnicode_Check(o))
985 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
986 PyUnicode_GET_SIZE(o),
987 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000988#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000989 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000990 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000991
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000992 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000993}
994
Guido van Rossum9e896b32000-04-05 20:11:21 +0000995/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000996static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000997long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000998{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000999 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001000 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001001
Guido van Rossum4c08d552000-03-10 22:55:18 +00001002 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001003 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001004 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001005 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001006 PyErr_SetString(PyExc_ValueError,
1007 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001008 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001009 return NULL;
1010 }
1011 return x;
1012}
1013
Guido van Rossume15dee51995-07-18 14:12:02 +00001014PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001015PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001016{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001017 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001018 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001019 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001020
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001021 if (o == NULL)
1022 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001023 m = o->ob_type->tp_as_number;
1024 if (m && m->nb_long) { /* This should include subclasses of long */
1025 PyObject *res = m->nb_long(o);
1026 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1027 PyErr_Format(PyExc_TypeError,
1028 "__long__ returned non-long (type %.200s)",
1029 res->ob_type->tp_name);
1030 Py_DECREF(res);
1031 return NULL;
1032 }
1033 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001034 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001035 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001036 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001037 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001038 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001039 * doesn't do. In particular long('9.5') must raise an
1040 * exception, not truncate the float.
1041 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001042 return long_from_string(PyString_AS_STRING(o),
1043 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001044#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001045 if (PyUnicode_Check(o))
1046 /* The above check is done in PyLong_FromUnicode(). */
1047 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1048 PyUnicode_GET_SIZE(o),
1049 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001050#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001051 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1052 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001053
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001054 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001055}
1056
1057PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001058PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001059{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001060 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001061
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001062 if (o == NULL)
1063 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001064 m = o->ob_type->tp_as_number;
1065 if (m && m->nb_float) { /* This should include subclasses of float */
1066 PyObject *res = m->nb_float(o);
1067 if (res && !PyFloat_Check(res)) {
1068 PyErr_Format(PyExc_TypeError,
1069 "__float__ returned non-float (type %.200s)",
1070 res->ob_type->tp_name);
1071 Py_DECREF(res);
1072 return NULL;
1073 }
1074 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001075 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001076 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001077 PyFloatObject *po = (PyFloatObject *)o;
1078 return PyFloat_FromDouble(po->ob_fval);
1079 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001080 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001081}
1082
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001083/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001084
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001085int
Fred Drake79912472000-07-09 04:06:11 +00001086PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001087{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001088 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001089 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001090 return s != NULL && s->ob_type->tp_as_sequence &&
1091 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001092}
1093
Martin v. Löwis18e16552006-02-15 17:27:45 +00001094Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001095PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001096{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001098
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099 if (s == NULL) {
1100 null_error();
1101 return -1;
1102 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001103
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104 m = s->ob_type->tp_as_sequence;
1105 if (m && m->sq_length)
1106 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001107
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 type_error("len() of unsized object");
1109 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001110}
1111
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001112#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001113Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001114PySequence_Length(PyObject *s)
1115{
1116 return PySequence_Size(s);
1117}
1118#define PySequence_Length PySequence_Size
1119
Guido van Rossume15dee51995-07-18 14:12:02 +00001120PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001121PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001122{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001123 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001124
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001125 if (s == NULL || o == NULL)
1126 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001127
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001128 m = s->ob_type->tp_as_sequence;
1129 if (m && m->sq_concat)
1130 return m->sq_concat(s, o);
1131
Armin Rigofd163f92005-12-29 15:59:19 +00001132 /* Instances of user classes defining an __add__() method only
1133 have an nb_add slot, not an sq_concat slot. So we fall back
1134 to nb_add if both arguments appear to be sequences. */
1135 if (PySequence_Check(s) && PySequence_Check(o)) {
1136 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1137 if (result != Py_NotImplemented)
1138 return result;
1139 Py_DECREF(result);
1140 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001141 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001142}
1143
1144PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001145PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001146{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001147 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001148
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001149 if (o == NULL)
1150 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001151
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152 m = o->ob_type->tp_as_sequence;
1153 if (m && m->sq_repeat)
1154 return m->sq_repeat(o, count);
1155
Armin Rigofd163f92005-12-29 15:59:19 +00001156 /* Instances of user classes defining a __mul__() method only
1157 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1158 to nb_multiply if o appears to be a sequence. */
1159 if (PySequence_Check(o)) {
1160 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001161 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001162 if (n == NULL)
1163 return NULL;
1164 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1165 Py_DECREF(n);
1166 if (result != Py_NotImplemented)
1167 return result;
1168 Py_DECREF(result);
1169 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001171}
1172
1173PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001174PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1175{
1176 PySequenceMethods *m;
1177
1178 if (s == NULL || o == NULL)
1179 return null_error();
1180
1181 m = s->ob_type->tp_as_sequence;
1182 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1183 return m->sq_inplace_concat(s, o);
1184 if (m && m->sq_concat)
1185 return m->sq_concat(s, o);
1186
Armin Rigofd163f92005-12-29 15:59:19 +00001187 if (PySequence_Check(s) && PySequence_Check(o)) {
1188 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1189 NB_SLOT(nb_add));
1190 if (result != Py_NotImplemented)
1191 return result;
1192 Py_DECREF(result);
1193 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001194 return type_error("object can't be concatenated");
1195}
1196
1197PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001198PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001199{
1200 PySequenceMethods *m;
1201
1202 if (o == NULL)
1203 return null_error();
1204
1205 m = o->ob_type->tp_as_sequence;
1206 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1207 return m->sq_inplace_repeat(o, count);
1208 if (m && m->sq_repeat)
1209 return m->sq_repeat(o, count);
1210
Armin Rigofd163f92005-12-29 15:59:19 +00001211 if (PySequence_Check(o)) {
1212 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001213 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001214 if (n == NULL)
1215 return NULL;
1216 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1217 NB_SLOT(nb_multiply));
1218 Py_DECREF(n);
1219 if (result != Py_NotImplemented)
1220 return result;
1221 Py_DECREF(result);
1222 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001223 return type_error("object can't be repeated");
1224}
1225
1226PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001227PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001228{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001229 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001230
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001231 if (s == NULL)
1232 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001233
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001234 m = s->ob_type->tp_as_sequence;
1235 if (m && m->sq_item) {
1236 if (i < 0) {
1237 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001238 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001239 if (l < 0)
1240 return NULL;
1241 i += l;
1242 }
1243 }
1244 return m->sq_item(s, i);
1245 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001246
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001248}
1249
Thomas Wouters1d75a792000-08-17 22:37:32 +00001250static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001251sliceobj_from_intint(Py_ssize_t i, Py_ssize_t j)
Thomas Wouters1d75a792000-08-17 22:37:32 +00001252{
1253 PyObject *start, *end, *slice;
1254 start = PyInt_FromLong((long)i);
1255 if (!start)
1256 return NULL;
1257 end = PyInt_FromLong((long)j);
1258 if (!end) {
1259 Py_DECREF(start);
1260 return NULL;
1261 }
1262 slice = PySlice_New(start, end, NULL);
1263 Py_DECREF(start);
1264 Py_DECREF(end);
1265 return slice;
1266}
1267
Guido van Rossume15dee51995-07-18 14:12:02 +00001268PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001269PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001270{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001271 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001272 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001273
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001274 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001275
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001276 m = s->ob_type->tp_as_sequence;
1277 if (m && m->sq_slice) {
1278 if (i1 < 0 || i2 < 0) {
1279 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001280 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001281 if (l < 0)
1282 return NULL;
1283 if (i1 < 0)
1284 i1 += l;
1285 if (i2 < 0)
1286 i2 += l;
1287 }
1288 }
1289 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001290 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1291 PyObject *res;
1292 PyObject *slice = sliceobj_from_intint(i1, i2);
1293 if (!slice)
1294 return NULL;
1295 res = mp->mp_subscript(s, slice);
1296 Py_DECREF(slice);
1297 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001298 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001299
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001300 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001301}
1302
1303int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001304PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001305{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001306 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001307
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001308 if (s == NULL) {
1309 null_error();
1310 return -1;
1311 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001312
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001313 m = s->ob_type->tp_as_sequence;
1314 if (m && m->sq_ass_item) {
1315 if (i < 0) {
1316 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001317 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001319 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001320 i += l;
1321 }
1322 }
1323 return m->sq_ass_item(s, i, o);
1324 }
1325
Raymond Hettinger98779e02003-10-27 09:22:16 +00001326 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001327 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001328}
1329
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001330int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001331PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001332{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001334
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335 if (s == NULL) {
1336 null_error();
1337 return -1;
1338 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001339
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001340 m = s->ob_type->tp_as_sequence;
1341 if (m && m->sq_ass_item) {
1342 if (i < 0) {
1343 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001344 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001345 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001346 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001347 i += l;
1348 }
1349 }
1350 return m->sq_ass_item(s, i, (PyObject *)NULL);
1351 }
1352
1353 type_error("object doesn't support item deletion");
1354 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001355}
1356
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001357int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001358PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001359{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001361 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001362
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001363 if (s == NULL) {
1364 null_error();
1365 return -1;
1366 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001367
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001368 m = s->ob_type->tp_as_sequence;
1369 if (m && m->sq_ass_slice) {
1370 if (i1 < 0 || i2 < 0) {
1371 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001372 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001373 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001374 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375 if (i1 < 0)
1376 i1 += l;
1377 if (i2 < 0)
1378 i2 += l;
1379 }
1380 }
1381 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001382 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1383 int res;
1384 PyObject *slice = sliceobj_from_intint(i1, i2);
1385 if (!slice)
1386 return -1;
1387 res = mp->mp_ass_subscript(s, slice, o);
1388 Py_DECREF(slice);
1389 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001391
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 type_error("object doesn't support slice assignment");
1393 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001394}
1395
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001397PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001398{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001400
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001401 if (s == NULL) {
1402 null_error();
1403 return -1;
1404 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001405
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001406 m = s->ob_type->tp_as_sequence;
1407 if (m && m->sq_ass_slice) {
1408 if (i1 < 0 || i2 < 0) {
1409 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001410 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001412 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 if (i1 < 0)
1414 i1 += l;
1415 if (i2 < 0)
1416 i2 += l;
1417 }
1418 }
1419 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1420 }
1421 type_error("object doesn't support slice deletion");
1422 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001423}
1424
Guido van Rossume15dee51995-07-18 14:12:02 +00001425PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001426PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001427{
Tim Peters6912d4d2001-05-05 03:56:37 +00001428 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001429 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001430 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001431 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001432
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 if (v == NULL)
1434 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001435
Tim Peters6912d4d2001-05-05 03:56:37 +00001436 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001437 if (PyTuple_CheckExact(v)) {
1438 /* Note that we can't know whether it's safe to return
1439 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001440 to exact tuples here. In contrast, lists always make
1441 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442 Py_INCREF(v);
1443 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001444 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 if (PyList_Check(v))
1446 return PyList_AsTuple(v);
1447
Tim Peters6912d4d2001-05-05 03:56:37 +00001448 /* Get iterator. */
1449 it = PyObject_GetIter(v);
1450 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001451 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001452
Tim Peters6912d4d2001-05-05 03:56:37 +00001453 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001454 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001455 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001456 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1457 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1458 Py_DECREF(it);
1459 return NULL;
1460 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001461 PyErr_Clear();
1462 n = 10; /* arbitrary */
1463 }
1464 result = PyTuple_New(n);
1465 if (result == NULL)
1466 goto Fail;
1467
1468 /* Fill the tuple. */
1469 for (j = 0; ; ++j) {
1470 PyObject *item = PyIter_Next(it);
1471 if (item == NULL) {
1472 if (PyErr_Occurred())
1473 goto Fail;
1474 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001475 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001476 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001477 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001478 /* The over-allocation strategy can grow a bit faster
1479 than for lists because unlike lists the
1480 over-allocation isn't permanent -- we reclaim
1481 the excess before the end of this routine.
1482 So, grow by ten and then add 25%.
1483 */
1484 n += 10;
1485 n += n >> 2;
1486 if (n < oldn) {
1487 /* Check for overflow */
1488 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001489 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001490 goto Fail;
1491 }
Tim Peters4324aa32001-05-28 22:30:08 +00001492 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001493 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001494 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001495 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001496 }
1497 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001498 }
1499
Tim Peters6912d4d2001-05-05 03:56:37 +00001500 /* Cut tuple back if guess was too large. */
1501 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001502 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001503 goto Fail;
1504
1505 Py_DECREF(it);
1506 return result;
1507
1508Fail:
1509 Py_XDECREF(result);
1510 Py_DECREF(it);
1511 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001512}
1513
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001514PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001515PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001516{
Tim Petersf553f892001-05-01 20:45:31 +00001517 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001518 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001519
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001520 if (v == NULL)
1521 return null_error();
1522
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001523 result = PyList_New(0);
1524 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001525 return NULL;
1526
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001527 rv = _PyList_Extend((PyListObject *)result, v);
1528 if (rv == NULL) {
1529 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001530 return NULL;
1531 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001532 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001533 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001534}
1535
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001536PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001537PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001538{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001539 PyObject *it;
1540
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001541 if (v == NULL)
1542 return null_error();
1543
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001544 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001545 Py_INCREF(v);
1546 return v;
1547 }
1548
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001549 it = PyObject_GetIter(v);
1550 if (it == NULL) {
1551 if (PyErr_ExceptionMatches(PyExc_TypeError))
1552 return type_error(m);
1553 return NULL;
1554 }
1555
Raymond Hettinger193814c2004-12-18 19:00:59 +00001556 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001557 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001558
1559 return v;
1560}
1561
Tim Peters16a77ad2001-09-08 04:00:12 +00001562/* Iterate over seq. Result depends on the operation:
1563 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1564 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1565 set ValueError and return -1 if none found; also return -1 on error.
1566 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1567*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001568Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001569_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001570{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001571 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001572 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1573 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001574
Tim Peters16a77ad2001-09-08 04:00:12 +00001575 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001576 null_error();
1577 return -1;
1578 }
Tim Peters75f8e352001-05-05 11:33:43 +00001579
Tim Peters16a77ad2001-09-08 04:00:12 +00001580 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001581 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001582 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001583 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001584 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001585
Tim Peters16a77ad2001-09-08 04:00:12 +00001586 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001587 for (;;) {
1588 int cmp;
1589 PyObject *item = PyIter_Next(it);
1590 if (item == NULL) {
1591 if (PyErr_Occurred())
1592 goto Fail;
1593 break;
1594 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001595
1596 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001597 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001598 if (cmp < 0)
1599 goto Fail;
1600 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001601 switch (operation) {
1602 case PY_ITERSEARCH_COUNT:
1603 ++n;
1604 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001605 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001606 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001607 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001608 goto Fail;
1609 }
1610 break;
1611
1612 case PY_ITERSEARCH_INDEX:
1613 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001614 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001615 PyErr_SetString(PyExc_OverflowError,
1616 "index exceeds C int size");
1617 goto Fail;
1618 }
1619 goto Done;
1620
1621 case PY_ITERSEARCH_CONTAINS:
1622 n = 1;
1623 goto Done;
1624
1625 default:
1626 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001627 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001628 }
1629
1630 if (operation == PY_ITERSEARCH_INDEX) {
1631 ++n;
1632 if (n <= 0)
1633 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001634 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001635 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001636
1637 if (operation != PY_ITERSEARCH_INDEX)
1638 goto Done;
1639
1640 PyErr_SetString(PyExc_ValueError,
1641 "sequence.index(x): x not in sequence");
1642 /* fall into failure code */
1643Fail:
1644 n = -1;
1645 /* fall through */
1646Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001647 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001648 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001649
Guido van Rossume15dee51995-07-18 14:12:02 +00001650}
1651
Tim Peters16a77ad2001-09-08 04:00:12 +00001652/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001653Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001654PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001655{
Tim Peters16a77ad2001-09-08 04:00:12 +00001656 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001657}
1658
Tim Peterscb8d3682001-05-05 21:05:01 +00001659/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001660 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001661 */
1662int
1663PySequence_Contains(PyObject *seq, PyObject *ob)
1664{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001665 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001666 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1667 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1668 if (sqm != NULL && sqm->sq_contains != NULL)
1669 return (*sqm->sq_contains)(seq, ob);
1670 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001671 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1672 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001673}
1674
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001675/* Backwards compatibility */
1676#undef PySequence_In
1677int
Fred Drake79912472000-07-09 04:06:11 +00001678PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001679{
1680 return PySequence_Contains(w, v);
1681}
1682
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001683Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001684PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001685{
Tim Peters16a77ad2001-09-08 04:00:12 +00001686 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001687}
1688
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001689/* Operations on mappings */
1690
1691int
Fred Drake79912472000-07-09 04:06:11 +00001692PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001693{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001694 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001695 return PyObject_HasAttrString(o, "__getitem__");
1696
1697 return o && o->ob_type->tp_as_mapping &&
1698 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001699 !(o->ob_type->tp_as_sequence &&
1700 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001701}
1702
Martin v. Löwis18e16552006-02-15 17:27:45 +00001703Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001704PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001705{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001706 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001707
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001708 if (o == NULL) {
1709 null_error();
1710 return -1;
1711 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001712
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001713 m = o->ob_type->tp_as_mapping;
1714 if (m && m->mp_length)
1715 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001716
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001717 type_error("len() of unsized object");
1718 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001719}
1720
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001721#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001722Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001723PyMapping_Length(PyObject *o)
1724{
1725 return PyMapping_Size(o);
1726}
1727#define PyMapping_Length PyMapping_Size
1728
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001729PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001730PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001731{
1732 PyObject *okey, *r;
1733
1734 if (key == NULL)
1735 return null_error();
1736
1737 okey = PyString_FromString(key);
1738 if (okey == NULL)
1739 return NULL;
1740 r = PyObject_GetItem(o, okey);
1741 Py_DECREF(okey);
1742 return r;
1743}
1744
1745int
Fred Drake79912472000-07-09 04:06:11 +00001746PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001747{
1748 PyObject *okey;
1749 int r;
1750
1751 if (key == NULL) {
1752 null_error();
1753 return -1;
1754 }
1755
1756 okey = PyString_FromString(key);
1757 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001758 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001759 r = PyObject_SetItem(o, okey, value);
1760 Py_DECREF(okey);
1761 return r;
1762}
1763
1764int
Fred Drake79912472000-07-09 04:06:11 +00001765PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001766{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001767 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001769 v = PyMapping_GetItemString(o, key);
1770 if (v) {
1771 Py_DECREF(v);
1772 return 1;
1773 }
1774 PyErr_Clear();
1775 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001776}
1777
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001778int
Fred Drake79912472000-07-09 04:06:11 +00001779PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001780{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001781 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001783 v = PyObject_GetItem(o, key);
1784 if (v) {
1785 Py_DECREF(v);
1786 return 1;
1787 }
1788 PyErr_Clear();
1789 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001790}
1791
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001792/* Operations on callable objects */
1793
1794/* XXX PyCallable_Check() is in object.c */
1795
Guido van Rossume15dee51995-07-18 14:12:02 +00001796PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001797PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001798{
Guido van Rossum5560b742001-09-14 16:47:50 +00001799 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001800}
Guido van Rossume15dee51995-07-18 14:12:02 +00001801
1802PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001803PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1804{
1805 ternaryfunc call;
1806
1807 if ((call = func->ob_type->tp_call) != NULL) {
1808 PyObject *result = (*call)(func, arg, kw);
1809 if (result == NULL && !PyErr_Occurred())
1810 PyErr_SetString(
1811 PyExc_SystemError,
1812 "NULL result without error in PyObject_Call");
1813 return result;
1814 }
Fred Drake573395a2001-11-01 20:26:12 +00001815 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1816 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001817 return NULL;
1818}
1819
1820PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001821PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001822{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001823 va_list va;
1824 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001825
Fred Drakeb92cf062001-10-27 06:16:31 +00001826 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001827 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001828
Fred Drakeb92cf062001-10-27 06:16:31 +00001829 if (format && *format) {
1830 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001832 va_end(va);
1833 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001834 else
1835 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001836
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001837 if (args == NULL)
1838 return NULL;
1839
1840 if (!PyTuple_Check(args)) {
1841 PyObject *a;
1842
1843 a = PyTuple_New(1);
1844 if (a == NULL)
1845 return NULL;
1846 if (PyTuple_SetItem(a, 0, args) < 0)
1847 return NULL;
1848 args = a;
1849 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001850 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001851
1852 Py_DECREF(args);
1853
1854 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001855}
1856
1857PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001858PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001859{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001860 va_list va;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001861 PyObject *args = NULL;
1862 PyObject *func = NULL;
1863 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001864
Fred Drakeb92cf062001-10-27 06:16:31 +00001865 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001866 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001867
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001868 func = PyObject_GetAttrString(o, name);
1869 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001870 PyErr_SetString(PyExc_AttributeError, name);
1871 return 0;
1872 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001873
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001874 if (!PyCallable_Check(func)) {
1875 type_error("call of non-callable attribute");
1876 goto exit;
1877 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001878
Fred Drakeb92cf062001-10-27 06:16:31 +00001879 if (format && *format) {
1880 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001881 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001882 va_end(va);
1883 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001884 else
1885 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001886
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001887 if (!args)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001888 goto exit;
Guido van Rossume15dee51995-07-18 14:12:02 +00001889
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001890 if (!PyTuple_Check(args)) {
1891 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001892
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001893 a = PyTuple_New(1);
1894 if (a == NULL)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001895 goto exit;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001896 if (PyTuple_SetItem(a, 0, args) < 0)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001897 goto exit;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001898 args = a;
1899 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001900
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001901 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001902
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001903 exit:
1904 Py_XDECREF(args);
1905 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001906
1907 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001908}
Guido van Rossum823649d2001-03-21 18:40:58 +00001909
1910
Fred Drakeb421b8c2001-10-26 16:21:32 +00001911static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001912objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001913{
1914 int i, n = 0;
1915 va_list countva;
1916 PyObject *result, *tmp;
1917
1918#ifdef VA_LIST_IS_ARRAY
1919 memcpy(countva, va, sizeof(va_list));
1920#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001921#ifdef __va_copy
1922 __va_copy(countva, va);
1923#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001924 countva = va;
1925#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001926#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001927
1928 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1929 ++n;
1930 result = PyTuple_New(n);
1931 if (result != NULL && n > 0) {
1932 for (i = 0; i < n; ++i) {
1933 tmp = (PyObject *)va_arg(va, PyObject *);
1934 PyTuple_SET_ITEM(result, i, tmp);
1935 Py_INCREF(tmp);
1936 }
1937 }
1938 return result;
1939}
1940
1941PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001942PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001943{
1944 PyObject *args, *tmp;
1945 va_list vargs;
1946
1947 if (callable == NULL || name == NULL)
1948 return null_error();
1949
1950 callable = PyObject_GetAttr(callable, name);
1951 if (callable == NULL)
1952 return NULL;
1953
1954 /* count the args */
1955 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001956 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001957 va_end(vargs);
1958 if (args == NULL) {
1959 Py_DECREF(callable);
1960 return NULL;
1961 }
1962 tmp = PyObject_Call(callable, args, NULL);
1963 Py_DECREF(args);
1964 Py_DECREF(callable);
1965
1966 return tmp;
1967}
1968
1969PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001970PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001971{
1972 PyObject *args, *tmp;
1973 va_list vargs;
1974
1975 if (callable == NULL)
1976 return null_error();
1977
1978 /* count the args */
1979 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001980 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001981 va_end(vargs);
1982 if (args == NULL)
1983 return NULL;
1984 tmp = PyObject_Call(callable, args, NULL);
1985 Py_DECREF(args);
1986
1987 return tmp;
1988}
1989
1990
Guido van Rossum823649d2001-03-21 18:40:58 +00001991/* isinstance(), issubclass() */
1992
Barry Warsawf16951c2002-04-23 22:45:44 +00001993/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1994 * state that will almost never happen.
1995 *
1996 * 0. creating the __bases__ static string could get a MemoryError
1997 * 1. getattr(cls, '__bases__') could raise an AttributeError
1998 * 2. getattr(cls, '__bases__') could raise some other exception
1999 * 3. getattr(cls, '__bases__') could return a tuple
2000 * 4. getattr(cls, '__bases__') could return something other than a tuple
2001 *
2002 * Only state #3 is a non-error state and only it returns a non-NULL object
2003 * (it returns the retrieved tuple).
2004 *
2005 * Any raised AttributeErrors are masked by clearing the exception and
2006 * returning NULL. If an object other than a tuple comes out of __bases__,
2007 * then again, the return value is NULL. So yes, these two situations
2008 * produce exactly the same results: NULL is returned and no error is set.
2009 *
2010 * If some exception other than AttributeError is raised, then NULL is also
2011 * returned, but the exception is not cleared. That's because we want the
2012 * exception to be propagated along.
2013 *
2014 * Callers are expected to test for PyErr_Occurred() when the return value
2015 * is NULL to decide whether a valid exception should be propagated or not.
2016 * When there's no exception to propagate, it's customary for the caller to
2017 * set a TypeError.
2018 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002019static PyObject *
2020abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002021{
2022 static PyObject *__bases__ = NULL;
2023 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002024
2025 if (__bases__ == NULL) {
2026 __bases__ = PyString_FromString("__bases__");
2027 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002028 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002029 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002030 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002031 if (bases == NULL) {
2032 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2033 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002034 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002035 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002036 if (!PyTuple_Check(bases)) {
2037 Py_DECREF(bases);
2038 return NULL;
2039 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002040 return bases;
2041}
2042
2043
2044static int
2045abstract_issubclass(PyObject *derived, PyObject *cls)
2046{
2047 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002048 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002049 int r = 0;
2050
2051
Guido van Rossum823649d2001-03-21 18:40:58 +00002052 if (derived == cls)
2053 return 1;
2054
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002055 if (PyTuple_Check(cls)) {
2056 /* Not a general sequence -- that opens up the road to
2057 recursion and stack overflow. */
2058 n = PyTuple_GET_SIZE(cls);
2059 for (i = 0; i < n; i++) {
2060 if (derived == PyTuple_GET_ITEM(cls, i))
2061 return 1;
2062 }
2063 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002064 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002065 if (bases == NULL) {
2066 if (PyErr_Occurred())
2067 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002068 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002069 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002070 n = PyTuple_GET_SIZE(bases);
2071 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002072 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002073 if (r != 0)
2074 break;
2075 }
2076
2077 Py_DECREF(bases);
2078
2079 return r;
2080}
2081
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002082static int
2083check_class(PyObject *cls, const char *error)
2084{
2085 PyObject *bases = abstract_get_bases(cls);
2086 if (bases == NULL) {
2087 /* Do not mask errors. */
2088 if (!PyErr_Occurred())
2089 PyErr_SetString(PyExc_TypeError, error);
2090 return 0;
2091 }
2092 Py_DECREF(bases);
2093 return -1;
2094}
2095
Brett Cannon4f653312004-03-20 22:52:14 +00002096static int
2097recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002098{
2099 PyObject *icls;
2100 static PyObject *__class__ = NULL;
2101 int retval = 0;
2102
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002103 if (__class__ == NULL) {
2104 __class__ = PyString_FromString("__class__");
2105 if (__class__ == NULL)
2106 return -1;
2107 }
2108
Neil Schemenauer6b471292001-10-18 03:18:43 +00002109 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2110 PyObject *inclass =
2111 (PyObject*)((PyInstanceObject*)inst)->in_class;
2112 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002113 }
2114 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002115 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002116 if (retval == 0) {
2117 PyObject *c = PyObject_GetAttr(inst, __class__);
2118 if (c == NULL) {
2119 PyErr_Clear();
2120 }
2121 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002122 if (c != (PyObject *)(inst->ob_type) &&
2123 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002124 retval = PyType_IsSubtype(
2125 (PyTypeObject *)c,
2126 (PyTypeObject *)cls);
2127 Py_DECREF(c);
2128 }
2129 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002130 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002131 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002132 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002133
Brett Cannon4f653312004-03-20 22:52:14 +00002134 if (!recursion_depth) {
2135 PyErr_SetString(PyExc_RuntimeError,
2136 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002137 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002138 }
2139
Guido van Rossum03290ec2001-10-07 20:54:12 +00002140 n = PyTuple_GET_SIZE(cls);
2141 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002142 retval = recursive_isinstance(
2143 inst,
2144 PyTuple_GET_ITEM(cls, i),
2145 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002146 if (retval != 0)
2147 break;
2148 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002149 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002150 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002151 if (!check_class(cls,
2152 "isinstance() arg 2 must be a class, type,"
2153 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002154 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002155 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002156 if (icls == NULL) {
2157 PyErr_Clear();
2158 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002159 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002160 else {
2161 retval = abstract_issubclass(icls, cls);
2162 Py_DECREF(icls);
2163 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002164 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002165
Guido van Rossum823649d2001-03-21 18:40:58 +00002166 return retval;
2167}
2168
2169int
Brett Cannon4f653312004-03-20 22:52:14 +00002170PyObject_IsInstance(PyObject *inst, PyObject *cls)
2171{
2172 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2173}
2174
2175static int
2176recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002177{
2178 int retval;
2179
2180 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002181 if (!check_class(derived,
2182 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002183 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002184
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002185 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002186 Py_ssize_t i;
2187 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002188
2189 if (!recursion_depth) {
2190 PyErr_SetString(PyExc_RuntimeError,
2191 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002192 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002193 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002194 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002195 retval = recursive_issubclass(
2196 derived,
2197 PyTuple_GET_ITEM(cls, i),
2198 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002199 if (retval != 0) {
2200 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002201 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002202 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002203 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002204 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002205 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002206 else {
2207 if (!check_class(cls,
2208 "issubclass() arg 2 must be a class"
2209 " or tuple of classes"))
2210 return -1;
2211 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002212
2213 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002214 }
2215 else {
2216 /* shortcut */
2217 if (!(retval = (derived == cls)))
2218 retval = PyClass_IsSubclass(derived, cls);
2219 }
2220
2221 return retval;
2222}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002223
Brett Cannon4f653312004-03-20 22:52:14 +00002224int
2225PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2226{
2227 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2228}
2229
2230
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002231PyObject *
2232PyObject_GetIter(PyObject *o)
2233{
2234 PyTypeObject *t = o->ob_type;
2235 getiterfunc f = NULL;
2236 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2237 f = t->tp_iter;
2238 if (f == NULL) {
2239 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002240 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002241 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002242 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002243 return NULL;
2244 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002245 else {
2246 PyObject *res = (*f)(o);
2247 if (res != NULL && !PyIter_Check(res)) {
2248 PyErr_Format(PyExc_TypeError,
2249 "iter() returned non-iterator "
2250 "of type '%.100s'",
2251 res->ob_type->tp_name);
2252 Py_DECREF(res);
2253 res = NULL;
2254 }
2255 return res;
2256 }
2257}
2258
Tim Petersf4848da2001-05-05 00:14:56 +00002259/* Return next item.
2260 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2261 * If the iteration terminates normally, return NULL and clear the
2262 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2263 * will be false.
2264 * Else return the next object. PyErr_Occurred() will be false.
2265 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002266PyObject *
2267PyIter_Next(PyObject *iter)
2268{
Tim Petersf4848da2001-05-05 00:14:56 +00002269 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002270 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002271 result = (*iter->ob_type->tp_iternext)(iter);
2272 if (result == NULL &&
2273 PyErr_Occurred() &&
2274 PyErr_ExceptionMatches(PyExc_StopIteration))
2275 PyErr_Clear();
2276 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002277}