blob: c7556546fdd885ae9596e5cbcfb62f0c8af94b39 [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_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000629
630PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000631PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000632{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000633 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
634 if (result == Py_NotImplemented) {
635 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000636 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000637 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000638 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000639 }
Armin Rigofd163f92005-12-29 15:59:19 +0000640 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000641 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000642 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000643}
644
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000645static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000646sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000647{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000648 Py_ssize_t count;
649 PyNumberMethods *nb = n->ob_type->tp_as_number;
650 if (nb != NULL && HASINDEX(n) && nb->nb_index != NULL) {
651 count = nb->nb_index(n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000652 if (count == -1 && PyErr_Occurred())
653 return NULL;
654 }
655 else {
656 return type_error(
Raymond Hettinger10c66062004-05-12 21:35:06 +0000657 "can't multiply sequence by non-int");
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000658 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000659 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000660}
661
662PyObject *
663PyNumber_Multiply(PyObject *v, PyObject *w)
664{
665 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
666 if (result == Py_NotImplemented) {
667 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
668 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000669 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000670 if (mv && mv->sq_repeat) {
671 return sequence_repeat(mv->sq_repeat, v, w);
672 }
673 else if (mw && mw->sq_repeat) {
674 return sequence_repeat(mw->sq_repeat, w, v);
675 }
676 result = binop_type_error(v, w, "*");
677 }
678 return result;
679}
680
Guido van Rossume15dee51995-07-18 14:12:02 +0000681PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000682PyNumber_FloorDivide(PyObject *v, PyObject *w)
683{
684 /* XXX tp_flags test */
685 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
686}
687
688PyObject *
689PyNumber_TrueDivide(PyObject *v, PyObject *w)
690{
691 /* XXX tp_flags test */
692 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
693}
694
695PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000696PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000697{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000698 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000699}
700
701PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000702PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000703{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000704 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000705}
706
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000707/* Binary in-place operators */
708
709/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000710 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000711
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000712 - If the left hand object has the appropriate struct members, and
713 they are filled, call the appropriate function and return the
714 result. No coercion is done on the arguments; the left-hand object
715 is the one the operation is performed on, and it's up to the
716 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000717
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000718 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000719 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000720
721 */
722
Guido van Rossum77660912002-04-16 16:32:50 +0000723#define HASINPLACE(t) \
724 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000725
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000727binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000728{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000729 PyNumberMethods *mv = v->ob_type->tp_as_number;
730 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000731 binaryfunc slot = NB_BINOP(mv, iop_slot);
732 if (slot) {
733 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000734 if (x != Py_NotImplemented) {
735 return x;
736 }
737 Py_DECREF(x);
738 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000739 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000740 return binary_op1(v, w, op_slot);
741}
742
743static PyObject *
744binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
745 const char *op_name)
746{
747 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
748 if (result == Py_NotImplemented) {
749 Py_DECREF(result);
750 return binop_type_error(v, w, op_name);
751 }
752 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000753}
754
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000755#define INPLACE_BINOP(func, iop, op, op_name) \
756 PyObject * \
757 func(PyObject *v, PyObject *w) { \
758 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759 }
760
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000761INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
762INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
763INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
764INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
765INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
766INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000767
768PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000769PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
770{
771 /* XXX tp_flags test */
772 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
773 NB_SLOT(nb_floor_divide), "//=");
774}
775
776PyObject *
777PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
778{
779 /* XXX tp_flags test */
780 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
781 NB_SLOT(nb_true_divide), "/=");
782}
783
784PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000785PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
786{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000787 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
788 NB_SLOT(nb_add));
789 if (result == Py_NotImplemented) {
790 PySequenceMethods *m = v->ob_type->tp_as_sequence;
791 Py_DECREF(result);
792 if (m != NULL) {
793 binaryfunc f = NULL;
794 if (HASINPLACE(v))
795 f = m->sq_inplace_concat;
796 if (f == NULL)
797 f = m->sq_concat;
798 if (f != NULL)
799 return (*f)(v, w);
800 }
801 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000802 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000803 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000804}
805
806PyObject *
807PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
808{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000809 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
810 NB_SLOT(nb_multiply));
811 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000812 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000813 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
814 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
815 Py_DECREF(result);
816 if (mv != NULL) {
817 if (HASINPLACE(v))
818 f = mv->sq_inplace_repeat;
819 if (f == NULL)
820 f = mv->sq_repeat;
821 if (f != NULL)
822 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000823 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000824 else if (mw != NULL) {
825 /* Note that the right hand operand should not be
826 * mutated in this case so sq_inplace_repeat is not
827 * used. */
828 if (mw->sq_repeat)
829 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000830 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000831 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000832 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000833 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000834}
835
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000836PyObject *
837PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
838{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000839 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
840 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000841}
842
843PyObject *
844PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
845{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000846 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
847 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
848 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000849 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000850 else {
851 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
852 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000853}
854
855
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000856/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000857
858PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000859PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000860{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000861 PyNumberMethods *m;
862
863 if (o == NULL)
864 return null_error();
865 m = o->ob_type->tp_as_number;
866 if (m && m->nb_negative)
867 return (*m->nb_negative)(o);
868
869 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000870}
871
872PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000873PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000874{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000875 PyNumberMethods *m;
876
877 if (o == NULL)
878 return null_error();
879 m = o->ob_type->tp_as_number;
880 if (m && m->nb_positive)
881 return (*m->nb_positive)(o);
882
883 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000884}
885
886PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000887PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000888{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000889 PyNumberMethods *m;
890
891 if (o == NULL)
892 return null_error();
893 m = o->ob_type->tp_as_number;
894 if (m && m->nb_invert)
895 return (*m->nb_invert)(o);
896
897 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000898}
899
900PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000901PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000902{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000903 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000904
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000905 if (o == NULL)
906 return null_error();
907 m = o->ob_type->tp_as_number;
908 if (m && m->nb_absolute)
909 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000910
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000912}
913
Guido van Rossum9e896b32000-04-05 20:11:21 +0000914/* Add a check for embedded NULL-bytes in the argument. */
915static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000916int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000917{
918 char *end;
919 PyObject *x;
920
921 x = PyInt_FromString((char*)s, &end, 10);
922 if (x == NULL)
923 return NULL;
924 if (end != s + len) {
925 PyErr_SetString(PyExc_ValueError,
926 "null byte in argument for int()");
927 Py_DECREF(x);
928 return NULL;
929 }
930 return x;
931}
932
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000933/* Return a Py_ssize_t integer from the object item */
934Py_ssize_t
935PyNumber_Index(PyObject *item)
936{
937 Py_ssize_t value = -1;
938 PyNumberMethods *nb = item->ob_type->tp_as_number;
939 if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) {
940 value = nb->nb_index(item);
941 }
942 else {
943 PyErr_SetString(PyExc_IndexError,
944 "object cannot be interpreted as an index");
945 }
946 return value;
947}
948
Guido van Rossume15dee51995-07-18 14:12:02 +0000949PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000950PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000951{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000952 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000953 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000954 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000955
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000956 if (o == NULL)
957 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000958 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000959 Py_INCREF(o);
960 return o;
961 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000962 m = o->ob_type->tp_as_number;
963 if (m && m->nb_int) { /* This should include subclasses of int */
964 PyObject *res = m->nb_int(o);
965 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
966 PyErr_Format(PyExc_TypeError,
967 "__int__ returned non-int (type %.200s)",
968 res->ob_type->tp_name);
969 Py_DECREF(res);
970 return NULL;
971 }
972 return res;
973 }
974 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000975 PyIntObject *io = (PyIntObject*)o;
976 return PyInt_FromLong(io->ob_ival);
977 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000978 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000979 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000980 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000981#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000982 if (PyUnicode_Check(o))
983 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
984 PyUnicode_GET_SIZE(o),
985 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000986#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000987 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000988 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000989
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000990 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000991}
992
Guido van Rossum9e896b32000-04-05 20:11:21 +0000993/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000994static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000995long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000996{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000997 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000998 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000999
Guido van Rossum4c08d552000-03-10 22:55:18 +00001000 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001001 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001002 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001003 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001004 PyErr_SetString(PyExc_ValueError,
1005 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001006 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001007 return NULL;
1008 }
1009 return x;
1010}
1011
Guido van Rossume15dee51995-07-18 14:12:02 +00001012PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001013PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001014{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001015 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001016 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001017 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001018
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001019 if (o == NULL)
1020 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001021 m = o->ob_type->tp_as_number;
1022 if (m && m->nb_long) { /* This should include subclasses of long */
1023 PyObject *res = m->nb_long(o);
1024 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1025 PyErr_Format(PyExc_TypeError,
1026 "__long__ returned non-long (type %.200s)",
1027 res->ob_type->tp_name);
1028 Py_DECREF(res);
1029 return NULL;
1030 }
1031 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001032 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001033 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001034 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001035 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001036 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001037 * doesn't do. In particular long('9.5') must raise an
1038 * exception, not truncate the float.
1039 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001040 return long_from_string(PyString_AS_STRING(o),
1041 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001042#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001043 if (PyUnicode_Check(o))
1044 /* The above check is done in PyLong_FromUnicode(). */
1045 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1046 PyUnicode_GET_SIZE(o),
1047 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001048#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001049 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1050 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001051
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001052 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001053}
1054
1055PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001056PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001057{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001058 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001059
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001060 if (o == NULL)
1061 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001062 m = o->ob_type->tp_as_number;
1063 if (m && m->nb_float) { /* This should include subclasses of float */
1064 PyObject *res = m->nb_float(o);
1065 if (res && !PyFloat_Check(res)) {
1066 PyErr_Format(PyExc_TypeError,
1067 "__float__ returned non-float (type %.200s)",
1068 res->ob_type->tp_name);
1069 Py_DECREF(res);
1070 return NULL;
1071 }
1072 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001073 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001074 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001075 PyFloatObject *po = (PyFloatObject *)o;
1076 return PyFloat_FromDouble(po->ob_fval);
1077 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001078 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001079}
1080
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001081/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001082
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001083int
Fred Drake79912472000-07-09 04:06:11 +00001084PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001085{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001086 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001087 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001088 return s != NULL && s->ob_type->tp_as_sequence &&
1089 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001090}
1091
Martin v. Löwis18e16552006-02-15 17:27:45 +00001092Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001093PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001094{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001095 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097 if (s == NULL) {
1098 null_error();
1099 return -1;
1100 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001101
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001102 m = s->ob_type->tp_as_sequence;
1103 if (m && m->sq_length)
1104 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001105
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 type_error("len() of unsized object");
1107 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001108}
1109
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001110#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001111Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001112PySequence_Length(PyObject *s)
1113{
1114 return PySequence_Size(s);
1115}
1116#define PySequence_Length PySequence_Size
1117
Guido van Rossume15dee51995-07-18 14:12:02 +00001118PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001119PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001120{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001121 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001122
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001123 if (s == NULL || o == NULL)
1124 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001125
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001126 m = s->ob_type->tp_as_sequence;
1127 if (m && m->sq_concat)
1128 return m->sq_concat(s, o);
1129
Armin Rigofd163f92005-12-29 15:59:19 +00001130 /* Instances of user classes defining an __add__() method only
1131 have an nb_add slot, not an sq_concat slot. So we fall back
1132 to nb_add if both arguments appear to be sequences. */
1133 if (PySequence_Check(s) && PySequence_Check(o)) {
1134 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1135 if (result != Py_NotImplemented)
1136 return result;
1137 Py_DECREF(result);
1138 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001139 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001140}
1141
1142PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001143PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001144{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001145 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001146
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001147 if (o == NULL)
1148 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001149
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150 m = o->ob_type->tp_as_sequence;
1151 if (m && m->sq_repeat)
1152 return m->sq_repeat(o, count);
1153
Armin Rigofd163f92005-12-29 15:59:19 +00001154 /* Instances of user classes defining a __mul__() method only
1155 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1156 to nb_multiply if o appears to be a sequence. */
1157 if (PySequence_Check(o)) {
1158 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001159 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001160 if (n == NULL)
1161 return NULL;
1162 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1163 Py_DECREF(n);
1164 if (result != Py_NotImplemented)
1165 return result;
1166 Py_DECREF(result);
1167 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001168 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001169}
1170
1171PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001172PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1173{
1174 PySequenceMethods *m;
1175
1176 if (s == NULL || o == NULL)
1177 return null_error();
1178
1179 m = s->ob_type->tp_as_sequence;
1180 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1181 return m->sq_inplace_concat(s, o);
1182 if (m && m->sq_concat)
1183 return m->sq_concat(s, o);
1184
Armin Rigofd163f92005-12-29 15:59:19 +00001185 if (PySequence_Check(s) && PySequence_Check(o)) {
1186 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1187 NB_SLOT(nb_add));
1188 if (result != Py_NotImplemented)
1189 return result;
1190 Py_DECREF(result);
1191 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001192 return type_error("object can't be concatenated");
1193}
1194
1195PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001196PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001197{
1198 PySequenceMethods *m;
1199
1200 if (o == NULL)
1201 return null_error();
1202
1203 m = o->ob_type->tp_as_sequence;
1204 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1205 return m->sq_inplace_repeat(o, count);
1206 if (m && m->sq_repeat)
1207 return m->sq_repeat(o, count);
1208
Armin Rigofd163f92005-12-29 15:59:19 +00001209 if (PySequence_Check(o)) {
1210 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001211 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001212 if (n == NULL)
1213 return NULL;
1214 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1215 NB_SLOT(nb_multiply));
1216 Py_DECREF(n);
1217 if (result != Py_NotImplemented)
1218 return result;
1219 Py_DECREF(result);
1220 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001221 return type_error("object can't be repeated");
1222}
1223
1224PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001225PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001226{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001228
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001229 if (s == NULL)
1230 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 m = s->ob_type->tp_as_sequence;
1233 if (m && m->sq_item) {
1234 if (i < 0) {
1235 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001236 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 if (l < 0)
1238 return NULL;
1239 i += l;
1240 }
1241 }
1242 return m->sq_item(s, i);
1243 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001244
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001245 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001246}
1247
Thomas Wouters1d75a792000-08-17 22:37:32 +00001248static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001249sliceobj_from_intint(Py_ssize_t i, Py_ssize_t j)
Thomas Wouters1d75a792000-08-17 22:37:32 +00001250{
1251 PyObject *start, *end, *slice;
1252 start = PyInt_FromLong((long)i);
1253 if (!start)
1254 return NULL;
1255 end = PyInt_FromLong((long)j);
1256 if (!end) {
1257 Py_DECREF(start);
1258 return NULL;
1259 }
1260 slice = PySlice_New(start, end, NULL);
1261 Py_DECREF(start);
1262 Py_DECREF(end);
1263 return slice;
1264}
1265
Guido van Rossume15dee51995-07-18 14:12:02 +00001266PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001267PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001268{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001269 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001270 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001271
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001272 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001273
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001274 m = s->ob_type->tp_as_sequence;
1275 if (m && m->sq_slice) {
1276 if (i1 < 0 || i2 < 0) {
1277 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001278 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279 if (l < 0)
1280 return NULL;
1281 if (i1 < 0)
1282 i1 += l;
1283 if (i2 < 0)
1284 i2 += l;
1285 }
1286 }
1287 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001288 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1289 PyObject *res;
1290 PyObject *slice = sliceobj_from_intint(i1, i2);
1291 if (!slice)
1292 return NULL;
1293 res = mp->mp_subscript(s, slice);
1294 Py_DECREF(slice);
1295 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001296 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001297
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001298 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001299}
1300
1301int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001302PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001303{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001305
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001306 if (s == NULL) {
1307 null_error();
1308 return -1;
1309 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001310
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 m = s->ob_type->tp_as_sequence;
1312 if (m && m->sq_ass_item) {
1313 if (i < 0) {
1314 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001315 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001316 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001317 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 i += l;
1319 }
1320 }
1321 return m->sq_ass_item(s, i, o);
1322 }
1323
Raymond Hettinger98779e02003-10-27 09:22:16 +00001324 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001325 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001326}
1327
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001328int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001329PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001330{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001332
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 if (s == NULL) {
1334 null_error();
1335 return -1;
1336 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001337
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001338 m = s->ob_type->tp_as_sequence;
1339 if (m && m->sq_ass_item) {
1340 if (i < 0) {
1341 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001342 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001344 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001345 i += l;
1346 }
1347 }
1348 return m->sq_ass_item(s, i, (PyObject *)NULL);
1349 }
1350
1351 type_error("object doesn't support item deletion");
1352 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001353}
1354
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001355int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001356PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001357{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001358 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001359 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001360
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001361 if (s == NULL) {
1362 null_error();
1363 return -1;
1364 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001365
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001366 m = s->ob_type->tp_as_sequence;
1367 if (m && m->sq_ass_slice) {
1368 if (i1 < 0 || i2 < 0) {
1369 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001370 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001371 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001372 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001373 if (i1 < 0)
1374 i1 += l;
1375 if (i2 < 0)
1376 i2 += l;
1377 }
1378 }
1379 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001380 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1381 int res;
1382 PyObject *slice = sliceobj_from_intint(i1, i2);
1383 if (!slice)
1384 return -1;
1385 res = mp->mp_ass_subscript(s, slice, o);
1386 Py_DECREF(slice);
1387 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001388 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001389
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 type_error("object doesn't support slice assignment");
1391 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001392}
1393
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001394int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001395PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001396{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001398
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 if (s == NULL) {
1400 null_error();
1401 return -1;
1402 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001403
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001404 m = s->ob_type->tp_as_sequence;
1405 if (m && m->sq_ass_slice) {
1406 if (i1 < 0 || i2 < 0) {
1407 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001408 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001409 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001410 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411 if (i1 < 0)
1412 i1 += l;
1413 if (i2 < 0)
1414 i2 += l;
1415 }
1416 }
1417 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1418 }
1419 type_error("object doesn't support slice deletion");
1420 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001421}
1422
Guido van Rossume15dee51995-07-18 14:12:02 +00001423PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001424PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001425{
Tim Peters6912d4d2001-05-05 03:56:37 +00001426 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001427 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001428 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001429 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001430
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001431 if (v == NULL)
1432 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001433
Tim Peters6912d4d2001-05-05 03:56:37 +00001434 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001435 if (PyTuple_CheckExact(v)) {
1436 /* Note that we can't know whether it's safe to return
1437 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001438 to exact tuples here. In contrast, lists always make
1439 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 Py_INCREF(v);
1441 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001442 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001443 if (PyList_Check(v))
1444 return PyList_AsTuple(v);
1445
Tim Peters6912d4d2001-05-05 03:56:37 +00001446 /* Get iterator. */
1447 it = PyObject_GetIter(v);
1448 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001449 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001450
Tim Peters6912d4d2001-05-05 03:56:37 +00001451 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001452 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001453 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001454 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1455 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1456 Py_DECREF(it);
1457 return NULL;
1458 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001459 PyErr_Clear();
1460 n = 10; /* arbitrary */
1461 }
1462 result = PyTuple_New(n);
1463 if (result == NULL)
1464 goto Fail;
1465
1466 /* Fill the tuple. */
1467 for (j = 0; ; ++j) {
1468 PyObject *item = PyIter_Next(it);
1469 if (item == NULL) {
1470 if (PyErr_Occurred())
1471 goto Fail;
1472 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001473 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001474 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001475 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001476 /* The over-allocation strategy can grow a bit faster
1477 than for lists because unlike lists the
1478 over-allocation isn't permanent -- we reclaim
1479 the excess before the end of this routine.
1480 So, grow by ten and then add 25%.
1481 */
1482 n += 10;
1483 n += n >> 2;
1484 if (n < oldn) {
1485 /* Check for overflow */
1486 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001487 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001488 goto Fail;
1489 }
Tim Peters4324aa32001-05-28 22:30:08 +00001490 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001491 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001492 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001493 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001494 }
1495 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001496 }
1497
Tim Peters6912d4d2001-05-05 03:56:37 +00001498 /* Cut tuple back if guess was too large. */
1499 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001500 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001501 goto Fail;
1502
1503 Py_DECREF(it);
1504 return result;
1505
1506Fail:
1507 Py_XDECREF(result);
1508 Py_DECREF(it);
1509 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001510}
1511
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001512PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001513PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001514{
Tim Petersf553f892001-05-01 20:45:31 +00001515 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001516 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001517
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001518 if (v == NULL)
1519 return null_error();
1520
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001521 result = PyList_New(0);
1522 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001523 return NULL;
1524
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001525 rv = _PyList_Extend((PyListObject *)result, v);
1526 if (rv == NULL) {
1527 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001528 return NULL;
1529 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001530 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001531 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001532}
1533
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001534PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001535PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001536{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001537 PyObject *it;
1538
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001539 if (v == NULL)
1540 return null_error();
1541
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001542 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001543 Py_INCREF(v);
1544 return v;
1545 }
1546
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001547 it = PyObject_GetIter(v);
1548 if (it == NULL) {
1549 if (PyErr_ExceptionMatches(PyExc_TypeError))
1550 return type_error(m);
1551 return NULL;
1552 }
1553
Raymond Hettinger193814c2004-12-18 19:00:59 +00001554 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001555 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001556
1557 return v;
1558}
1559
Tim Peters16a77ad2001-09-08 04:00:12 +00001560/* Iterate over seq. Result depends on the operation:
1561 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1562 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1563 set ValueError and return -1 if none found; also return -1 on error.
1564 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1565*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001566Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001567_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001568{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001569 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001570 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1571 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001572
Tim Peters16a77ad2001-09-08 04:00:12 +00001573 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001574 null_error();
1575 return -1;
1576 }
Tim Peters75f8e352001-05-05 11:33:43 +00001577
Tim Peters16a77ad2001-09-08 04:00:12 +00001578 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001579 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001580 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001581 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001582 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001583
Tim Peters16a77ad2001-09-08 04:00:12 +00001584 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001585 for (;;) {
1586 int cmp;
1587 PyObject *item = PyIter_Next(it);
1588 if (item == NULL) {
1589 if (PyErr_Occurred())
1590 goto Fail;
1591 break;
1592 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001593
1594 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001595 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001596 if (cmp < 0)
1597 goto Fail;
1598 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001599 switch (operation) {
1600 case PY_ITERSEARCH_COUNT:
1601 ++n;
1602 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001603 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001604 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001605 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001606 goto Fail;
1607 }
1608 break;
1609
1610 case PY_ITERSEARCH_INDEX:
1611 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001612 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001613 PyErr_SetString(PyExc_OverflowError,
1614 "index exceeds C int size");
1615 goto Fail;
1616 }
1617 goto Done;
1618
1619 case PY_ITERSEARCH_CONTAINS:
1620 n = 1;
1621 goto Done;
1622
1623 default:
1624 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001625 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001626 }
1627
1628 if (operation == PY_ITERSEARCH_INDEX) {
1629 ++n;
1630 if (n <= 0)
1631 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001632 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001633 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001634
1635 if (operation != PY_ITERSEARCH_INDEX)
1636 goto Done;
1637
1638 PyErr_SetString(PyExc_ValueError,
1639 "sequence.index(x): x not in sequence");
1640 /* fall into failure code */
1641Fail:
1642 n = -1;
1643 /* fall through */
1644Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001645 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001646 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001647
Guido van Rossume15dee51995-07-18 14:12:02 +00001648}
1649
Tim Peters16a77ad2001-09-08 04:00:12 +00001650/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001651Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001652PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001653{
Tim Peters16a77ad2001-09-08 04:00:12 +00001654 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001655}
1656
Tim Peterscb8d3682001-05-05 21:05:01 +00001657/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001658 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001659 */
1660int
1661PySequence_Contains(PyObject *seq, PyObject *ob)
1662{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001663 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001664 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1665 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1666 if (sqm != NULL && sqm->sq_contains != NULL)
1667 return (*sqm->sq_contains)(seq, ob);
1668 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001669 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1670 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001671}
1672
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001673/* Backwards compatibility */
1674#undef PySequence_In
1675int
Fred Drake79912472000-07-09 04:06:11 +00001676PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001677{
1678 return PySequence_Contains(w, v);
1679}
1680
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001681Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001682PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001683{
Tim Peters16a77ad2001-09-08 04:00:12 +00001684 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001685}
1686
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001687/* Operations on mappings */
1688
1689int
Fred Drake79912472000-07-09 04:06:11 +00001690PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001691{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001692 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001693 return PyObject_HasAttrString(o, "__getitem__");
1694
1695 return o && o->ob_type->tp_as_mapping &&
1696 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001697 !(o->ob_type->tp_as_sequence &&
1698 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001699}
1700
Martin v. Löwis18e16552006-02-15 17:27:45 +00001701Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001702PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001703{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001704 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001705
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001706 if (o == NULL) {
1707 null_error();
1708 return -1;
1709 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001710
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001711 m = o->ob_type->tp_as_mapping;
1712 if (m && m->mp_length)
1713 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001714
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001715 type_error("len() of unsized object");
1716 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001717}
1718
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001719#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001720Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001721PyMapping_Length(PyObject *o)
1722{
1723 return PyMapping_Size(o);
1724}
1725#define PyMapping_Length PyMapping_Size
1726
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001727PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001728PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001729{
1730 PyObject *okey, *r;
1731
1732 if (key == NULL)
1733 return null_error();
1734
1735 okey = PyString_FromString(key);
1736 if (okey == NULL)
1737 return NULL;
1738 r = PyObject_GetItem(o, okey);
1739 Py_DECREF(okey);
1740 return r;
1741}
1742
1743int
Fred Drake79912472000-07-09 04:06:11 +00001744PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001745{
1746 PyObject *okey;
1747 int r;
1748
1749 if (key == NULL) {
1750 null_error();
1751 return -1;
1752 }
1753
1754 okey = PyString_FromString(key);
1755 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001756 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001757 r = PyObject_SetItem(o, okey, value);
1758 Py_DECREF(okey);
1759 return r;
1760}
1761
1762int
Fred Drake79912472000-07-09 04:06:11 +00001763PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001764{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001765 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001766
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001767 v = PyMapping_GetItemString(o, key);
1768 if (v) {
1769 Py_DECREF(v);
1770 return 1;
1771 }
1772 PyErr_Clear();
1773 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001774}
1775
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001776int
Fred Drake79912472000-07-09 04:06:11 +00001777PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001778{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001779 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001780
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001781 v = PyObject_GetItem(o, key);
1782 if (v) {
1783 Py_DECREF(v);
1784 return 1;
1785 }
1786 PyErr_Clear();
1787 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001788}
1789
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001790/* Operations on callable objects */
1791
1792/* XXX PyCallable_Check() is in object.c */
1793
Guido van Rossume15dee51995-07-18 14:12:02 +00001794PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001795PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001796{
Guido van Rossum5560b742001-09-14 16:47:50 +00001797 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001798}
Guido van Rossume15dee51995-07-18 14:12:02 +00001799
1800PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001801PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1802{
1803 ternaryfunc call;
1804
1805 if ((call = func->ob_type->tp_call) != NULL) {
1806 PyObject *result = (*call)(func, arg, kw);
1807 if (result == NULL && !PyErr_Occurred())
1808 PyErr_SetString(
1809 PyExc_SystemError,
1810 "NULL result without error in PyObject_Call");
1811 return result;
1812 }
Fred Drake573395a2001-11-01 20:26:12 +00001813 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1814 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001815 return NULL;
1816}
1817
1818PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001819PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001820{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001821 va_list va;
1822 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001823
Fred Drakeb92cf062001-10-27 06:16:31 +00001824 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001825 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001826
Fred Drakeb92cf062001-10-27 06:16:31 +00001827 if (format && *format) {
1828 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001829 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001830 va_end(va);
1831 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001832 else
1833 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001834
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001835 if (args == NULL)
1836 return NULL;
1837
1838 if (!PyTuple_Check(args)) {
1839 PyObject *a;
1840
1841 a = PyTuple_New(1);
1842 if (a == NULL)
1843 return NULL;
1844 if (PyTuple_SetItem(a, 0, args) < 0)
1845 return NULL;
1846 args = a;
1847 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001848 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001849
1850 Py_DECREF(args);
1851
1852 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001853}
1854
1855PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001856PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001857{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001858 va_list va;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001859 PyObject *args = NULL;
1860 PyObject *func = NULL;
1861 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001862
Fred Drakeb92cf062001-10-27 06:16:31 +00001863 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001864 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001865
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001866 func = PyObject_GetAttrString(o, name);
1867 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001868 PyErr_SetString(PyExc_AttributeError, name);
1869 return 0;
1870 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001871
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001872 if (!PyCallable_Check(func)) {
1873 type_error("call of non-callable attribute");
1874 goto exit;
1875 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001876
Fred Drakeb92cf062001-10-27 06:16:31 +00001877 if (format && *format) {
1878 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001879 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001880 va_end(va);
1881 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001882 else
1883 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001884
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001885 if (!args)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001886 goto exit;
Guido van Rossume15dee51995-07-18 14:12:02 +00001887
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001888 if (!PyTuple_Check(args)) {
1889 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001890
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001891 a = PyTuple_New(1);
1892 if (a == NULL)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001893 goto exit;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001894 if (PyTuple_SetItem(a, 0, args) < 0)
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001895 goto exit;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001896 args = a;
1897 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001898
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001899 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001900
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001901 exit:
1902 Py_XDECREF(args);
1903 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001904
1905 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001906}
Guido van Rossum823649d2001-03-21 18:40:58 +00001907
1908
Fred Drakeb421b8c2001-10-26 16:21:32 +00001909static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001910objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001911{
1912 int i, n = 0;
1913 va_list countva;
1914 PyObject *result, *tmp;
1915
1916#ifdef VA_LIST_IS_ARRAY
1917 memcpy(countva, va, sizeof(va_list));
1918#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001919#ifdef __va_copy
1920 __va_copy(countva, va);
1921#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001922 countva = va;
1923#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001924#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001925
1926 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1927 ++n;
1928 result = PyTuple_New(n);
1929 if (result != NULL && n > 0) {
1930 for (i = 0; i < n; ++i) {
1931 tmp = (PyObject *)va_arg(va, PyObject *);
1932 PyTuple_SET_ITEM(result, i, tmp);
1933 Py_INCREF(tmp);
1934 }
1935 }
1936 return result;
1937}
1938
1939PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001940PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001941{
1942 PyObject *args, *tmp;
1943 va_list vargs;
1944
1945 if (callable == NULL || name == NULL)
1946 return null_error();
1947
1948 callable = PyObject_GetAttr(callable, name);
1949 if (callable == NULL)
1950 return NULL;
1951
1952 /* count the args */
1953 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001954 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001955 va_end(vargs);
1956 if (args == NULL) {
1957 Py_DECREF(callable);
1958 return NULL;
1959 }
1960 tmp = PyObject_Call(callable, args, NULL);
1961 Py_DECREF(args);
1962 Py_DECREF(callable);
1963
1964 return tmp;
1965}
1966
1967PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001968PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001969{
1970 PyObject *args, *tmp;
1971 va_list vargs;
1972
1973 if (callable == NULL)
1974 return null_error();
1975
1976 /* count the args */
1977 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001978 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001979 va_end(vargs);
1980 if (args == NULL)
1981 return NULL;
1982 tmp = PyObject_Call(callable, args, NULL);
1983 Py_DECREF(args);
1984
1985 return tmp;
1986}
1987
1988
Guido van Rossum823649d2001-03-21 18:40:58 +00001989/* isinstance(), issubclass() */
1990
Barry Warsawf16951c2002-04-23 22:45:44 +00001991/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1992 * state that will almost never happen.
1993 *
1994 * 0. creating the __bases__ static string could get a MemoryError
1995 * 1. getattr(cls, '__bases__') could raise an AttributeError
1996 * 2. getattr(cls, '__bases__') could raise some other exception
1997 * 3. getattr(cls, '__bases__') could return a tuple
1998 * 4. getattr(cls, '__bases__') could return something other than a tuple
1999 *
2000 * Only state #3 is a non-error state and only it returns a non-NULL object
2001 * (it returns the retrieved tuple).
2002 *
2003 * Any raised AttributeErrors are masked by clearing the exception and
2004 * returning NULL. If an object other than a tuple comes out of __bases__,
2005 * then again, the return value is NULL. So yes, these two situations
2006 * produce exactly the same results: NULL is returned and no error is set.
2007 *
2008 * If some exception other than AttributeError is raised, then NULL is also
2009 * returned, but the exception is not cleared. That's because we want the
2010 * exception to be propagated along.
2011 *
2012 * Callers are expected to test for PyErr_Occurred() when the return value
2013 * is NULL to decide whether a valid exception should be propagated or not.
2014 * When there's no exception to propagate, it's customary for the caller to
2015 * set a TypeError.
2016 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002017static PyObject *
2018abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002019{
2020 static PyObject *__bases__ = NULL;
2021 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002022
2023 if (__bases__ == NULL) {
2024 __bases__ = PyString_FromString("__bases__");
2025 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002026 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002027 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002028 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002029 if (bases == NULL) {
2030 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2031 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002032 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002033 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002034 if (!PyTuple_Check(bases)) {
2035 Py_DECREF(bases);
2036 return NULL;
2037 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002038 return bases;
2039}
2040
2041
2042static int
2043abstract_issubclass(PyObject *derived, PyObject *cls)
2044{
2045 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002046 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002047 int r = 0;
2048
2049
Guido van Rossum823649d2001-03-21 18:40:58 +00002050 if (derived == cls)
2051 return 1;
2052
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002053 if (PyTuple_Check(cls)) {
2054 /* Not a general sequence -- that opens up the road to
2055 recursion and stack overflow. */
2056 n = PyTuple_GET_SIZE(cls);
2057 for (i = 0; i < n; i++) {
2058 if (derived == PyTuple_GET_ITEM(cls, i))
2059 return 1;
2060 }
2061 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002062 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002063 if (bases == NULL) {
2064 if (PyErr_Occurred())
2065 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002066 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002067 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002068 n = PyTuple_GET_SIZE(bases);
2069 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002070 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002071 if (r != 0)
2072 break;
2073 }
2074
2075 Py_DECREF(bases);
2076
2077 return r;
2078}
2079
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002080static int
2081check_class(PyObject *cls, const char *error)
2082{
2083 PyObject *bases = abstract_get_bases(cls);
2084 if (bases == NULL) {
2085 /* Do not mask errors. */
2086 if (!PyErr_Occurred())
2087 PyErr_SetString(PyExc_TypeError, error);
2088 return 0;
2089 }
2090 Py_DECREF(bases);
2091 return -1;
2092}
2093
Brett Cannon4f653312004-03-20 22:52:14 +00002094static int
2095recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002096{
2097 PyObject *icls;
2098 static PyObject *__class__ = NULL;
2099 int retval = 0;
2100
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002101 if (__class__ == NULL) {
2102 __class__ = PyString_FromString("__class__");
2103 if (__class__ == NULL)
2104 return -1;
2105 }
2106
Guido van Rossum45aecf42006-03-15 04:58:47 +00002107 if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002108 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002109 if (retval == 0) {
2110 PyObject *c = PyObject_GetAttr(inst, __class__);
2111 if (c == NULL) {
2112 PyErr_Clear();
2113 }
2114 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002115 if (c != (PyObject *)(inst->ob_type) &&
2116 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002117 retval = PyType_IsSubtype(
2118 (PyTypeObject *)c,
2119 (PyTypeObject *)cls);
2120 Py_DECREF(c);
2121 }
2122 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002123 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002124 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002125 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002126
Brett Cannon4f653312004-03-20 22:52:14 +00002127 if (!recursion_depth) {
2128 PyErr_SetString(PyExc_RuntimeError,
2129 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002130 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002131 }
2132
Guido van Rossum03290ec2001-10-07 20:54:12 +00002133 n = PyTuple_GET_SIZE(cls);
2134 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002135 retval = recursive_isinstance(
2136 inst,
2137 PyTuple_GET_ITEM(cls, i),
2138 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002139 if (retval != 0)
2140 break;
2141 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002142 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002143 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002144 if (!check_class(cls,
2145 "isinstance() arg 2 must be a class, type,"
2146 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002147 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002148 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002149 if (icls == NULL) {
2150 PyErr_Clear();
2151 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002152 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002153 else {
2154 retval = abstract_issubclass(icls, cls);
2155 Py_DECREF(icls);
2156 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002157 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002158
Guido van Rossum823649d2001-03-21 18:40:58 +00002159 return retval;
2160}
2161
2162int
Brett Cannon4f653312004-03-20 22:52:14 +00002163PyObject_IsInstance(PyObject *inst, PyObject *cls)
2164{
2165 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2166}
2167
2168static int
2169recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002170{
2171 int retval;
2172
Guido van Rossum45aecf42006-03-15 04:58:47 +00002173 {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002174 if (!check_class(derived,
2175 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002176 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002177
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002178 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002179 Py_ssize_t i;
2180 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002181
2182 if (!recursion_depth) {
2183 PyErr_SetString(PyExc_RuntimeError,
2184 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002185 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002186 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002187 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002188 retval = recursive_issubclass(
2189 derived,
2190 PyTuple_GET_ITEM(cls, i),
2191 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002192 if (retval != 0) {
2193 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002194 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002195 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002196 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002197 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002198 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002199 else {
2200 if (!check_class(cls,
2201 "issubclass() arg 2 must be a class"
2202 " or tuple of classes"))
2203 return -1;
2204 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002205
2206 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002207 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002208
2209 return retval;
2210}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002211
Brett Cannon4f653312004-03-20 22:52:14 +00002212int
2213PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2214{
2215 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2216}
2217
2218
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002219PyObject *
2220PyObject_GetIter(PyObject *o)
2221{
2222 PyTypeObject *t = o->ob_type;
2223 getiterfunc f = NULL;
2224 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2225 f = t->tp_iter;
2226 if (f == NULL) {
2227 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002228 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002229 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002230 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002231 return NULL;
2232 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002233 else {
2234 PyObject *res = (*f)(o);
2235 if (res != NULL && !PyIter_Check(res)) {
2236 PyErr_Format(PyExc_TypeError,
2237 "iter() returned non-iterator "
2238 "of type '%.100s'",
2239 res->ob_type->tp_name);
2240 Py_DECREF(res);
2241 res = NULL;
2242 }
2243 return res;
2244 }
2245}
2246
Tim Petersf4848da2001-05-05 00:14:56 +00002247/* Return next item.
2248 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2249 * If the iteration terminates normally, return NULL and clear the
2250 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2251 * will be false.
2252 * Else return the next object. PyErr_Occurred() will be false.
2253 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002254PyObject *
2255PyIter_Next(PyObject *iter)
2256{
Tim Petersf4848da2001-05-05 00:14:56 +00002257 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002258 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002259 result = (*iter->ob_type->tp_iternext)(iter);
2260 if (result == NULL &&
2261 PyErr_Occurred() &&
2262 PyErr_ExceptionMatches(PyExc_StopIteration))
2263 PyErr_Clear();
2264 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002265}