blob: 6b76ba62201b01d25abd99f889f79b54d1114f7e [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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000013
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000014/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000015
16static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000017type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000018{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000019 PyErr_SetString(PyExc_TypeError, msg);
20 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000021}
22
Guido van Rossum052b7e11996-11-11 15:08:19 +000023static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000024null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000025{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000026 if (!PyErr_Occurred())
27 PyErr_SetString(PyExc_SystemError,
28 "null argument to internal routine");
29 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000030}
31
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000032/* Operations on any object */
33
34int
Fred Drake79912472000-07-09 04:06:11 +000035PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000036{
37 int r;
38
39 if (o1 == NULL || o2 == NULL) {
40 null_error();
41 return -1;
42 }
43 r = PyObject_Compare(o1, o2);
44 if (PyErr_Occurred())
45 return -1;
46 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000047 return 0;
48}
Guido van Rossume15dee51995-07-18 14:12:02 +000049
50PyObject *
Fred Drake79912472000-07-09 04:06:11 +000051PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000052{
53 PyObject *v;
54
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000055 if (o == NULL)
56 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000057 v = (PyObject *)o->ob_type;
58 Py_INCREF(v);
59 return v;
60}
61
Martin v. Löwis18e16552006-02-15 17:27:45 +000062Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000063PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000064{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000066
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000067 if (o == NULL) {
68 null_error();
69 return -1;
70 }
Guido van Rossume15dee51995-07-18 14:12:02 +000071
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000072 m = o->ob_type->tp_as_sequence;
73 if (m && m->sq_length)
74 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075
Jeremy Hylton6253f832000-07-12 12:56:19 +000076 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000077}
78
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000079#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000080Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000081PyObject_Length(PyObject *o)
82{
83 return PyObject_Size(o);
84}
85#define PyObject_Length PyObject_Size
86
Martin v. Löwis18e16552006-02-15 17:27:45 +000087Py_ssize_t
Armin Rigof5b3e362006-02-11 21:32:43 +000088_PyObject_LengthHint(PyObject *o)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000089{
Martin v. Löwis18e16552006-02-15 17:27:45 +000090 Py_ssize_t rv = PyObject_Size(o);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000091 if (rv != -1)
92 return rv;
93 if (PyErr_ExceptionMatches(PyExc_TypeError) ||
94 PyErr_ExceptionMatches(PyExc_AttributeError)) {
95 PyObject *err_type, *err_value, *err_tb, *ro;
96
97 PyErr_Fetch(&err_type, &err_value, &err_tb);
Armin Rigof5b3e362006-02-11 21:32:43 +000098 ro = PyObject_CallMethod(o, "__length_hint__", NULL);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000099 if (ro != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000100 rv = PyInt_AsLong(ro);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000101 Py_DECREF(ro);
102 Py_XDECREF(err_type);
103 Py_XDECREF(err_value);
104 Py_XDECREF(err_tb);
105 return rv;
106 }
107 PyErr_Restore(err_type, err_value, err_tb);
108 }
109 return -1;
110}
111
Guido van Rossume15dee51995-07-18 14:12:02 +0000112PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000113PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000114{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000117 if (o == NULL || key == NULL)
118 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000119
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000120 m = o->ob_type->tp_as_mapping;
121 if (m && m->mp_subscript)
122 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000123
Guido van Rossum21308241998-08-13 16:44:44 +0000124 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000125 PyNumberMethods *nb = key->ob_type->tp_as_number;
126 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
127 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000128 if (key_value == -1 && PyErr_Occurred())
129 return NULL;
130 return PySequence_GetItem(o, key_value);
131 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000132 else if (o->ob_type->tp_as_sequence->sq_item)
133 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000134 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000135
136 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000137}
138
139int
Fred Drake79912472000-07-09 04:06:11 +0000140PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000141{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000142 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000143
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000144 if (o == NULL || key == NULL || value == NULL) {
145 null_error();
146 return -1;
147 }
148 m = o->ob_type->tp_as_mapping;
149 if (m && m->mp_ass_subscript)
150 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000151
Guido van Rossum21308241998-08-13 16:44:44 +0000152 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000153 PyNumberMethods *nb = key->ob_type->tp_as_number;
154 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
155 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000156 if (key_value == -1 && PyErr_Occurred())
157 return -1;
158 return PySequence_SetItem(o, key_value, value);
159 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000160 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
161 type_error("sequence index must be integer");
162 return -1;
163 }
Guido van Rossum21308241998-08-13 16:44:44 +0000164 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000165
166 type_error("object does not support item assignment");
167 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000168}
169
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000170int
Fred Drake79912472000-07-09 04:06:11 +0000171PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000172{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000173 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000174
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000175 if (o == NULL || key == NULL) {
176 null_error();
177 return -1;
178 }
179 m = o->ob_type->tp_as_mapping;
180 if (m && m->mp_ass_subscript)
181 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000182
Guido van Rossum21308241998-08-13 16:44:44 +0000183 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000184 PyNumberMethods *nb = key->ob_type->tp_as_number;
185 if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) {
186 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000187 if (key_value == -1 && PyErr_Occurred())
188 return -1;
189 return PySequence_DelItem(o, key_value);
190 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000191 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
192 type_error("sequence index must be integer");
193 return -1;
194 }
Guido van Rossum21308241998-08-13 16:44:44 +0000195 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000196
197 type_error("object does not support item deletion");
198 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000199}
200
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000201int
202PyObject_DelItemString(PyObject *o, char *key)
203{
204 PyObject *okey;
205 int ret;
206
207 if (o == NULL || key == NULL) {
208 null_error();
209 return -1;
210 }
211 okey = PyString_FromString(key);
212 if (okey == NULL)
213 return -1;
214 ret = PyObject_DelItem(o, okey);
215 Py_DECREF(okey);
216 return ret;
217}
218
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000219int
220PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000221 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000222 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000223{
224 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000225 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000226 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000227
228 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
229 null_error();
230 return -1;
231 }
232 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000233 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000234 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000235 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000236 PyErr_SetString(PyExc_TypeError,
237 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000238 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000240 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000241 PyErr_SetString(PyExc_TypeError,
242 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000243 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000244 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000245 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000247 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000248 *buffer = pp;
249 *buffer_len = len;
250 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000251}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000252
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000253int
254PyObject_CheckReadBuffer(PyObject *obj)
255{
256 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
257
258 if (pb == NULL ||
259 pb->bf_getreadbuffer == NULL ||
260 pb->bf_getsegcount == NULL ||
261 (*pb->bf_getsegcount)(obj, NULL) != 1)
262 return 0;
263 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000264}
265
266int PyObject_AsReadBuffer(PyObject *obj,
267 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000268 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000269{
270 PyBufferProcs *pb;
271 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000272 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000273
274 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
275 null_error();
276 return -1;
277 }
278 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000279 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000280 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000281 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000282 PyErr_SetString(PyExc_TypeError,
283 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000284 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000285 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000286 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000287 PyErr_SetString(PyExc_TypeError,
288 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000289 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000291 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000293 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000294 *buffer = pp;
295 *buffer_len = len;
296 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000297}
298
299int PyObject_AsWriteBuffer(PyObject *obj,
300 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000301 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000302{
303 PyBufferProcs *pb;
304 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000305 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000306
307 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
308 null_error();
309 return -1;
310 }
311 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000314 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000315 PyErr_SetString(PyExc_TypeError,
316 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000317 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000318 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000319 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000320 PyErr_SetString(PyExc_TypeError,
321 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000322 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000323 }
324 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
325 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000326 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000327 *buffer = pp;
328 *buffer_len = len;
329 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000330}
331
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000332/* Operations on numbers */
333
334int
Fred Drake79912472000-07-09 04:06:11 +0000335PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000336{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000337 return o && o->ob_type->tp_as_number &&
338 (o->ob_type->tp_as_number->nb_int ||
339 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000340}
341
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000342/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000343
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000344/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000345
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000346#define NB_SLOT(x) offsetof(PyNumberMethods, x)
347#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000348 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000349#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000350 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000351
352/*
353 Calling scheme used for binary operations:
354
355 v w Action
356 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000357 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000358 new old v.op(v,w), coerce(v,w), v.op(v,w)
359 old new w.op(v,w), coerce(v,w), v.op(v,w)
360 old old coerce(v,w), v.op(v,w)
361
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000362 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
363 v->ob_type
364
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000365 Legend:
366 -------
367 * new == new style number
368 * old == old style number
369 * Action indicates the order in which operations are tried until either
370 a valid result is produced or an error occurs.
371
372 */
373
374static PyObject *
375binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000376{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000377 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000378 binaryfunc slotv = NULL;
379 binaryfunc slotw = NULL;
380
381 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000382 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000383 if (w->ob_type != v->ob_type &&
384 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000385 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000386 if (slotw == slotv)
387 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000388 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000389 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000390 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
391 x = slotw(v, w);
392 if (x != Py_NotImplemented)
393 return x;
394 Py_DECREF(x); /* can't do it */
395 slotw = NULL;
396 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000397 x = slotv(v, w);
398 if (x != Py_NotImplemented)
399 return x;
400 Py_DECREF(x); /* can't do it */
401 }
402 if (slotw) {
403 x = slotw(v, w);
404 if (x != Py_NotImplemented)
405 return x;
406 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000407 }
408 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
409 int err = PyNumber_CoerceEx(&v, &w);
410 if (err < 0) {
411 return NULL;
412 }
413 if (err == 0) {
414 PyNumberMethods *mv = v->ob_type->tp_as_number;
415 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000416 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000417 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000418 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000419 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000420 Py_DECREF(v);
421 Py_DECREF(w);
422 return x;
423 }
424 }
425 /* CoerceEx incremented the reference counts */
426 Py_DECREF(v);
427 Py_DECREF(w);
428 }
429 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000430 Py_INCREF(Py_NotImplemented);
431 return Py_NotImplemented;
432}
Guido van Rossum77660912002-04-16 16:32:50 +0000433
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000434static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000435binop_type_error(PyObject *v, PyObject *w, const char *op_name)
436{
437 PyErr_Format(PyExc_TypeError,
438 "unsupported operand type(s) for %s: '%s' and '%s'",
439 op_name,
440 v->ob_type->tp_name,
441 w->ob_type->tp_name);
442 return NULL;
443}
444
445static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000446binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
447{
448 PyObject *result = binary_op1(v, w, op_slot);
449 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000450 Py_DECREF(result);
451 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000452 }
453 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000454}
455
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000456
457/*
458 Calling scheme used for ternary operations:
459
Guido van Rossum84675ac2001-09-29 01:05:03 +0000460 *** In some cases, w.op is called before v.op; see binary_op1. ***
461
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000462 v w z Action
463 -------------------------------------------------------------------
464 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
465 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
466 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
467 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
468 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
469 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
470 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
471 old old old coerce(v,w,z), v.op(v,w,z)
472
473 Legend:
474 -------
475 * new == new style number
476 * old == old style number
477 * Action indicates the order in which operations are tried until either
478 a valid result is produced or an error occurs.
479 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
480 only if z != Py_None; if z == Py_None, then it is treated as absent
481 variable and only coerce(v,w) is tried.
482
483 */
484
485static PyObject *
486ternary_op(PyObject *v,
487 PyObject *w,
488 PyObject *z,
489 const int op_slot,
490 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000491{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000492 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000493 PyObject *x = NULL;
494 ternaryfunc slotv = NULL;
495 ternaryfunc slotw = NULL;
496 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000497
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000498 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000499 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000500 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000501 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000502 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000503 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000504 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000505 if (slotw == slotv)
506 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000507 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000508 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000509 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
510 x = slotw(v, w, z);
511 if (x != Py_NotImplemented)
512 return x;
513 Py_DECREF(x); /* can't do it */
514 slotw = NULL;
515 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000516 x = slotv(v, w, z);
517 if (x != Py_NotImplemented)
518 return x;
519 Py_DECREF(x); /* can't do it */
520 }
521 if (slotw) {
522 x = slotw(v, w, z);
523 if (x != Py_NotImplemented)
524 return x;
525 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000526 }
527 mz = z->ob_type->tp_as_number;
528 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000529 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000530 if (slotz == slotv || slotz == slotw)
531 slotz = NULL;
532 if (slotz) {
533 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000534 if (x != Py_NotImplemented)
535 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000536 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000537 }
538 }
539
540 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
541 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
542 /* we have an old style operand, coerce */
543 PyObject *v1, *z1, *w2, *z2;
544 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000545
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000546 c = PyNumber_Coerce(&v, &w);
547 if (c != 0)
548 goto error3;
549
550 /* Special case: if the third argument is None, it is
551 treated as absent argument and not coerced. */
552 if (z == Py_None) {
553 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000554 slotz = NB_TERNOP(v->ob_type->tp_as_number,
555 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000556 if (slotz)
557 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000558 else
559 c = -1;
560 }
561 else
562 c = -1;
563 goto error2;
564 }
565 v1 = v;
566 z1 = z;
567 c = PyNumber_Coerce(&v1, &z1);
568 if (c != 0)
569 goto error2;
570 w2 = w;
571 z2 = z1;
572 c = PyNumber_Coerce(&w2, &z2);
573 if (c != 0)
574 goto error1;
575
576 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000577 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
578 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000579 if (slotv)
580 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000581 else
582 c = -1;
583 }
584 else
585 c = -1;
586
587 Py_DECREF(w2);
588 Py_DECREF(z2);
589 error1:
590 Py_DECREF(v1);
591 Py_DECREF(z1);
592 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000593 Py_DECREF(v);
594 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000595 error3:
596 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000597 return x;
598 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000599
600 if (z == Py_None)
601 PyErr_Format(
602 PyExc_TypeError,
603 "unsupported operand type(s) for ** or pow(): "
604 "'%s' and '%s'",
605 v->ob_type->tp_name,
606 w->ob_type->tp_name);
607 else
608 PyErr_Format(
609 PyExc_TypeError,
610 "unsupported operand type(s) for pow(): "
611 "'%s', '%s', '%s'",
612 v->ob_type->tp_name,
613 w->ob_type->tp_name,
614 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000615 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000616}
617
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000618#define BINARY_FUNC(func, op, op_name) \
619 PyObject * \
620 func(PyObject *v, PyObject *w) { \
621 return binary_op(v, w, NB_SLOT(op), op_name); \
622 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000623
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000624BINARY_FUNC(PyNumber_Or, nb_or, "|")
625BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
626BINARY_FUNC(PyNumber_And, nb_and, "&")
627BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
628BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
629BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000630BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000631
632PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000633PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000634{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000635 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
636 if (result == Py_NotImplemented) {
637 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000638 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000639 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000640 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000641 }
Armin Rigofd163f92005-12-29 15:59:19 +0000642 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000643 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000644 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000645}
646
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000647static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000648sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000649{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000650 Py_ssize_t count;
651 PyNumberMethods *nb = n->ob_type->tp_as_number;
652 if (nb != NULL && HASINDEX(n) && nb->nb_index != NULL) {
653 count = nb->nb_index(n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000654 if (count == -1 && PyErr_Occurred())
655 return NULL;
656 }
657 else {
658 return type_error(
Raymond Hettinger10c66062004-05-12 21:35:06 +0000659 "can't multiply sequence by non-int");
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000660 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000661 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000662}
663
664PyObject *
665PyNumber_Multiply(PyObject *v, PyObject *w)
666{
667 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
668 if (result == Py_NotImplemented) {
669 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
670 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000671 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000672 if (mv && mv->sq_repeat) {
673 return sequence_repeat(mv->sq_repeat, v, w);
674 }
675 else if (mw && mw->sq_repeat) {
676 return sequence_repeat(mw->sq_repeat, w, v);
677 }
678 result = binop_type_error(v, w, "*");
679 }
680 return result;
681}
682
Guido van Rossume15dee51995-07-18 14:12:02 +0000683PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000684PyNumber_FloorDivide(PyObject *v, PyObject *w)
685{
686 /* XXX tp_flags test */
687 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
688}
689
690PyObject *
691PyNumber_TrueDivide(PyObject *v, PyObject *w)
692{
693 /* XXX tp_flags test */
694 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
695}
696
697PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000698PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000699{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000700 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000701}
702
703PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000704PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000705{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000706 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000707}
708
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000709/* Binary in-place operators */
710
711/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000712 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000713
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000714 - If the left hand object has the appropriate struct members, and
715 they are filled, call the appropriate function and return the
716 result. No coercion is done on the arguments; the left-hand object
717 is the one the operation is performed on, and it's up to the
718 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000719
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000720 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000721 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000722
723 */
724
Guido van Rossum77660912002-04-16 16:32:50 +0000725#define HASINPLACE(t) \
726 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000727
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000728static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000729binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000730{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000731 PyNumberMethods *mv = v->ob_type->tp_as_number;
732 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000733 binaryfunc slot = NB_BINOP(mv, iop_slot);
734 if (slot) {
735 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000736 if (x != Py_NotImplemented) {
737 return x;
738 }
739 Py_DECREF(x);
740 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000741 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000742 return binary_op1(v, w, op_slot);
743}
744
745static PyObject *
746binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
747 const char *op_name)
748{
749 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
750 if (result == Py_NotImplemented) {
751 Py_DECREF(result);
752 return binop_type_error(v, w, op_name);
753 }
754 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000755}
756
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000757#define INPLACE_BINOP(func, iop, op, op_name) \
758 PyObject * \
759 func(PyObject *v, PyObject *w) { \
760 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000761 }
762
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000763INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
764INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
765INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
766INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
767INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
768INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000769
770PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000771PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
772{
773 /* XXX tp_flags test */
774 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
775 NB_SLOT(nb_floor_divide), "//=");
776}
777
778PyObject *
779PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
780{
781 /* XXX tp_flags test */
782 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
783 NB_SLOT(nb_true_divide), "/=");
784}
785
786PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000787PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
788{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000789 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
790 NB_SLOT(nb_add));
791 if (result == Py_NotImplemented) {
792 PySequenceMethods *m = v->ob_type->tp_as_sequence;
793 Py_DECREF(result);
794 if (m != NULL) {
795 binaryfunc f = NULL;
796 if (HASINPLACE(v))
797 f = m->sq_inplace_concat;
798 if (f == NULL)
799 f = m->sq_concat;
800 if (f != NULL)
801 return (*f)(v, w);
802 }
803 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000804 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000805 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000806}
807
808PyObject *
809PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
810{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000811 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
812 NB_SLOT(nb_multiply));
813 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000814 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000815 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
816 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
817 Py_DECREF(result);
818 if (mv != NULL) {
819 if (HASINPLACE(v))
820 f = mv->sq_inplace_repeat;
821 if (f == NULL)
822 f = mv->sq_repeat;
823 if (f != NULL)
824 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000825 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000826 else if (mw != NULL) {
827 /* Note that the right hand operand should not be
828 * mutated in this case so sq_inplace_repeat is not
829 * used. */
830 if (mw->sq_repeat)
831 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000832 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000833 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000834 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000835 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000836}
837
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000838PyObject *
839PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
840{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000841 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
842 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000843}
844
845PyObject *
846PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
847{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000848 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
849 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
850 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000851 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000852 else {
853 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
854 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000855}
856
857
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000859
860PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000861PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000862{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863 PyNumberMethods *m;
864
865 if (o == NULL)
866 return null_error();
867 m = o->ob_type->tp_as_number;
868 if (m && m->nb_negative)
869 return (*m->nb_negative)(o);
870
871 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000872}
873
874PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000875PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000876{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000877 PyNumberMethods *m;
878
879 if (o == NULL)
880 return null_error();
881 m = o->ob_type->tp_as_number;
882 if (m && m->nb_positive)
883 return (*m->nb_positive)(o);
884
885 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000886}
887
888PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000889PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000890{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000891 PyNumberMethods *m;
892
893 if (o == NULL)
894 return null_error();
895 m = o->ob_type->tp_as_number;
896 if (m && m->nb_invert)
897 return (*m->nb_invert)(o);
898
899 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000900}
901
902PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000903PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000904{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000905 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000906
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000907 if (o == NULL)
908 return null_error();
909 m = o->ob_type->tp_as_number;
910 if (m && m->nb_absolute)
911 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000912
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000913 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000914}
915
Guido van Rossum9e896b32000-04-05 20:11:21 +0000916/* Add a check for embedded NULL-bytes in the argument. */
917static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000918int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000919{
920 char *end;
921 PyObject *x;
922
923 x = PyInt_FromString((char*)s, &end, 10);
924 if (x == NULL)
925 return NULL;
926 if (end != s + len) {
927 PyErr_SetString(PyExc_ValueError,
928 "null byte in argument for int()");
929 Py_DECREF(x);
930 return NULL;
931 }
932 return x;
933}
934
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000935/* Return a Py_ssize_t integer from the object item */
936Py_ssize_t
937PyNumber_Index(PyObject *item)
938{
939 Py_ssize_t value = -1;
940 PyNumberMethods *nb = item->ob_type->tp_as_number;
941 if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) {
942 value = nb->nb_index(item);
943 }
944 else {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000945 PyErr_Format(PyExc_TypeError,
946 "'%.200s' object cannot be interpreted "
947 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000948 }
949 return value;
950}
951
Guido van Rossume15dee51995-07-18 14:12:02 +0000952PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000953PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000954{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000955 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000956 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000957 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000958
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000959 if (o == NULL)
960 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000961 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000962 Py_INCREF(o);
963 return o;
964 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000965 m = o->ob_type->tp_as_number;
966 if (m && m->nb_int) { /* This should include subclasses of int */
967 PyObject *res = m->nb_int(o);
968 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
969 PyErr_Format(PyExc_TypeError,
970 "__int__ returned non-int (type %.200s)",
971 res->ob_type->tp_name);
972 Py_DECREF(res);
973 return NULL;
974 }
975 return res;
976 }
977 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000978 PyIntObject *io = (PyIntObject*)o;
979 return PyInt_FromLong(io->ob_ival);
980 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000981 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000982 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000983 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000984#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000985 if (PyUnicode_Check(o))
986 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
987 PyUnicode_GET_SIZE(o),
988 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000989#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000990 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000991 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000992
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000993 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000994}
995
Guido van Rossum9e896b32000-04-05 20:11:21 +0000996/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000997static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000998long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000999{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001000 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001001 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001002
Guido van Rossum4c08d552000-03-10 22:55:18 +00001003 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001004 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001005 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001006 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001007 PyErr_SetString(PyExc_ValueError,
1008 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001009 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001010 return NULL;
1011 }
1012 return x;
1013}
1014
Guido van Rossume15dee51995-07-18 14:12:02 +00001015PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001016PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001017{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001018 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001019 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001020 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001021
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022 if (o == NULL)
1023 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001024 m = o->ob_type->tp_as_number;
1025 if (m && m->nb_long) { /* This should include subclasses of long */
1026 PyObject *res = m->nb_long(o);
1027 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1028 PyErr_Format(PyExc_TypeError,
1029 "__long__ returned non-long (type %.200s)",
1030 res->ob_type->tp_name);
1031 Py_DECREF(res);
1032 return NULL;
1033 }
1034 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001035 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001036 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001037 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001038 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001039 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001040 * doesn't do. In particular long('9.5') must raise an
1041 * exception, not truncate the float.
1042 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001043 return long_from_string(PyString_AS_STRING(o),
1044 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001045#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001046 if (PyUnicode_Check(o))
1047 /* The above check is done in PyLong_FromUnicode(). */
1048 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1049 PyUnicode_GET_SIZE(o),
1050 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001051#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001052 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1053 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001054
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001055 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001056}
1057
1058PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001059PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001060{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001061 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001062
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001063 if (o == NULL)
1064 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001065 m = o->ob_type->tp_as_number;
1066 if (m && m->nb_float) { /* This should include subclasses of float */
1067 PyObject *res = m->nb_float(o);
1068 if (res && !PyFloat_Check(res)) {
1069 PyErr_Format(PyExc_TypeError,
1070 "__float__ returned non-float (type %.200s)",
1071 res->ob_type->tp_name);
1072 Py_DECREF(res);
1073 return NULL;
1074 }
1075 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001076 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001077 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001078 PyFloatObject *po = (PyFloatObject *)o;
1079 return PyFloat_FromDouble(po->ob_fval);
1080 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001081 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001082}
1083
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001084/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001085
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001086int
Fred Drake79912472000-07-09 04:06:11 +00001087PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001088{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001089 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001090 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001091 return s != NULL && s->ob_type->tp_as_sequence &&
1092 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001093}
1094
Martin v. Löwis18e16552006-02-15 17:27:45 +00001095Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001096PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001097{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001098 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001099
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001100 if (s == NULL) {
1101 null_error();
1102 return -1;
1103 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001104
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001105 m = s->ob_type->tp_as_sequence;
1106 if (m && m->sq_length)
1107 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001108
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 type_error("len() of unsized object");
1110 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001111}
1112
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001113#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001114Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001115PySequence_Length(PyObject *s)
1116{
1117 return PySequence_Size(s);
1118}
1119#define PySequence_Length PySequence_Size
1120
Guido van Rossume15dee51995-07-18 14:12:02 +00001121PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001122PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001123{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001124 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001125
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001126 if (s == NULL || o == NULL)
1127 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001128
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001129 m = s->ob_type->tp_as_sequence;
1130 if (m && m->sq_concat)
1131 return m->sq_concat(s, o);
1132
Armin Rigofd163f92005-12-29 15:59:19 +00001133 /* Instances of user classes defining an __add__() method only
1134 have an nb_add slot, not an sq_concat slot. So we fall back
1135 to nb_add if both arguments appear to be sequences. */
1136 if (PySequence_Check(s) && PySequence_Check(o)) {
1137 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1138 if (result != Py_NotImplemented)
1139 return result;
1140 Py_DECREF(result);
1141 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001142 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001143}
1144
1145PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001146PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001147{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001148 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001149
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150 if (o == NULL)
1151 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001152
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001153 m = o->ob_type->tp_as_sequence;
1154 if (m && m->sq_repeat)
1155 return m->sq_repeat(o, count);
1156
Armin Rigofd163f92005-12-29 15:59:19 +00001157 /* Instances of user classes defining a __mul__() method only
1158 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1159 to nb_multiply if o appears to be a sequence. */
1160 if (PySequence_Check(o)) {
1161 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001162 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001163 if (n == NULL)
1164 return NULL;
1165 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1166 Py_DECREF(n);
1167 if (result != Py_NotImplemented)
1168 return result;
1169 Py_DECREF(result);
1170 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001171 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001172}
1173
1174PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001175PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1176{
1177 PySequenceMethods *m;
1178
1179 if (s == NULL || o == NULL)
1180 return null_error();
1181
1182 m = s->ob_type->tp_as_sequence;
1183 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1184 return m->sq_inplace_concat(s, o);
1185 if (m && m->sq_concat)
1186 return m->sq_concat(s, o);
1187
Armin Rigofd163f92005-12-29 15:59:19 +00001188 if (PySequence_Check(s) && PySequence_Check(o)) {
1189 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1190 NB_SLOT(nb_add));
1191 if (result != Py_NotImplemented)
1192 return result;
1193 Py_DECREF(result);
1194 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001195 return type_error("object can't be concatenated");
1196}
1197
1198PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001199PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001200{
1201 PySequenceMethods *m;
1202
1203 if (o == NULL)
1204 return null_error();
1205
1206 m = o->ob_type->tp_as_sequence;
1207 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1208 return m->sq_inplace_repeat(o, count);
1209 if (m && m->sq_repeat)
1210 return m->sq_repeat(o, count);
1211
Armin Rigofd163f92005-12-29 15:59:19 +00001212 if (PySequence_Check(o)) {
1213 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001214 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001215 if (n == NULL)
1216 return NULL;
1217 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1218 NB_SLOT(nb_multiply));
1219 Py_DECREF(n);
1220 if (result != Py_NotImplemented)
1221 return result;
1222 Py_DECREF(result);
1223 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001224 return type_error("object can't be repeated");
1225}
1226
1227PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001228PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001229{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 if (s == NULL)
1233 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001234
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001235 m = s->ob_type->tp_as_sequence;
1236 if (m && m->sq_item) {
1237 if (i < 0) {
1238 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001239 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 if (l < 0)
1241 return NULL;
1242 i += l;
1243 }
1244 }
1245 return m->sq_item(s, i);
1246 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001247
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001249}
1250
1251PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001252PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001253{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001255 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001256
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001258
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259 m = s->ob_type->tp_as_sequence;
1260 if (m && m->sq_slice) {
1261 if (i1 < 0 || i2 < 0) {
1262 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001263 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001264 if (l < 0)
1265 return NULL;
1266 if (i1 < 0)
1267 i1 += l;
1268 if (i2 < 0)
1269 i2 += l;
1270 }
1271 }
1272 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001273 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1274 PyObject *res;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001275 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001276 if (!slice)
1277 return NULL;
1278 res = mp->mp_subscript(s, slice);
1279 Py_DECREF(slice);
1280 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001281 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001282
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001284}
1285
1286int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001287PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001288{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001289 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001290
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291 if (s == NULL) {
1292 null_error();
1293 return -1;
1294 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001295
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001296 m = s->ob_type->tp_as_sequence;
1297 if (m && m->sq_ass_item) {
1298 if (i < 0) {
1299 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001300 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001302 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 i += l;
1304 }
1305 }
1306 return m->sq_ass_item(s, i, o);
1307 }
1308
Raymond Hettinger98779e02003-10-27 09:22:16 +00001309 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001310 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001311}
1312
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001313int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001314PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001315{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001316 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001317
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 if (s == NULL) {
1319 null_error();
1320 return -1;
1321 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001322
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323 m = s->ob_type->tp_as_sequence;
1324 if (m && m->sq_ass_item) {
1325 if (i < 0) {
1326 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001327 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001329 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001330 i += l;
1331 }
1332 }
1333 return m->sq_ass_item(s, i, (PyObject *)NULL);
1334 }
1335
1336 type_error("object doesn't support item deletion");
1337 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001338}
1339
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001340int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001341PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001342{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001344 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001345
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001346 if (s == NULL) {
1347 null_error();
1348 return -1;
1349 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001350
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001351 m = s->ob_type->tp_as_sequence;
1352 if (m && m->sq_ass_slice) {
1353 if (i1 < 0 || i2 < 0) {
1354 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001355 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001356 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001357 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001358 if (i1 < 0)
1359 i1 += l;
1360 if (i2 < 0)
1361 i2 += l;
1362 }
1363 }
1364 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001365 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1366 int res;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001367 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001368 if (!slice)
1369 return -1;
1370 res = mp->mp_ass_subscript(s, slice, o);
1371 Py_DECREF(slice);
1372 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001373 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001374
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375 type_error("object doesn't support slice assignment");
1376 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001377}
1378
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001379int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001380PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001381{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001382 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001383
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 if (s == NULL) {
1385 null_error();
1386 return -1;
1387 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001388
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001389 m = s->ob_type->tp_as_sequence;
1390 if (m && m->sq_ass_slice) {
1391 if (i1 < 0 || i2 < 0) {
1392 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001393 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001394 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001395 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 if (i1 < 0)
1397 i1 += l;
1398 if (i2 < 0)
1399 i2 += l;
1400 }
1401 }
1402 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1403 }
1404 type_error("object doesn't support slice deletion");
1405 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001406}
1407
Guido van Rossume15dee51995-07-18 14:12:02 +00001408PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001409PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001410{
Tim Peters6912d4d2001-05-05 03:56:37 +00001411 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001412 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001413 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001414 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001415
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001416 if (v == NULL)
1417 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001418
Tim Peters6912d4d2001-05-05 03:56:37 +00001419 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001420 if (PyTuple_CheckExact(v)) {
1421 /* Note that we can't know whether it's safe to return
1422 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001423 to exact tuples here. In contrast, lists always make
1424 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 Py_INCREF(v);
1426 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001427 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001428 if (PyList_Check(v))
1429 return PyList_AsTuple(v);
1430
Tim Peters6912d4d2001-05-05 03:56:37 +00001431 /* Get iterator. */
1432 it = PyObject_GetIter(v);
1433 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001434 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001435
Tim Peters6912d4d2001-05-05 03:56:37 +00001436 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001437 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001438 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001439 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1440 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1441 Py_DECREF(it);
1442 return NULL;
1443 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001444 PyErr_Clear();
1445 n = 10; /* arbitrary */
1446 }
1447 result = PyTuple_New(n);
1448 if (result == NULL)
1449 goto Fail;
1450
1451 /* Fill the tuple. */
1452 for (j = 0; ; ++j) {
1453 PyObject *item = PyIter_Next(it);
1454 if (item == NULL) {
1455 if (PyErr_Occurred())
1456 goto Fail;
1457 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001458 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001459 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001460 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001461 /* The over-allocation strategy can grow a bit faster
1462 than for lists because unlike lists the
1463 over-allocation isn't permanent -- we reclaim
1464 the excess before the end of this routine.
1465 So, grow by ten and then add 25%.
1466 */
1467 n += 10;
1468 n += n >> 2;
1469 if (n < oldn) {
1470 /* Check for overflow */
1471 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001472 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001473 goto Fail;
1474 }
Tim Peters4324aa32001-05-28 22:30:08 +00001475 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001476 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001477 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001478 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001479 }
1480 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001481 }
1482
Tim Peters6912d4d2001-05-05 03:56:37 +00001483 /* Cut tuple back if guess was too large. */
1484 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001485 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001486 goto Fail;
1487
1488 Py_DECREF(it);
1489 return result;
1490
1491Fail:
1492 Py_XDECREF(result);
1493 Py_DECREF(it);
1494 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001495}
1496
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001497PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001498PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001499{
Tim Petersf553f892001-05-01 20:45:31 +00001500 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001501 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001502
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001503 if (v == NULL)
1504 return null_error();
1505
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001506 result = PyList_New(0);
1507 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001508 return NULL;
1509
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001510 rv = _PyList_Extend((PyListObject *)result, v);
1511 if (rv == NULL) {
1512 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001513 return NULL;
1514 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001515 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001516 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001517}
1518
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001519PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001520PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001521{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001522 PyObject *it;
1523
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001524 if (v == NULL)
1525 return null_error();
1526
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001527 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001528 Py_INCREF(v);
1529 return v;
1530 }
1531
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001532 it = PyObject_GetIter(v);
1533 if (it == NULL) {
1534 if (PyErr_ExceptionMatches(PyExc_TypeError))
1535 return type_error(m);
1536 return NULL;
1537 }
1538
Raymond Hettinger193814c2004-12-18 19:00:59 +00001539 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001540 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001541
1542 return v;
1543}
1544
Tim Peters16a77ad2001-09-08 04:00:12 +00001545/* Iterate over seq. Result depends on the operation:
1546 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1547 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1548 set ValueError and return -1 if none found; also return -1 on error.
1549 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1550*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001551Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001552_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001553{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001554 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001555 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1556 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001557
Tim Peters16a77ad2001-09-08 04:00:12 +00001558 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001559 null_error();
1560 return -1;
1561 }
Tim Peters75f8e352001-05-05 11:33:43 +00001562
Tim Peters16a77ad2001-09-08 04:00:12 +00001563 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001564 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001565 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001566 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001567 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001568
Tim Peters16a77ad2001-09-08 04:00:12 +00001569 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001570 for (;;) {
1571 int cmp;
1572 PyObject *item = PyIter_Next(it);
1573 if (item == NULL) {
1574 if (PyErr_Occurred())
1575 goto Fail;
1576 break;
1577 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001578
1579 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001580 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001581 if (cmp < 0)
1582 goto Fail;
1583 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001584 switch (operation) {
1585 case PY_ITERSEARCH_COUNT:
1586 ++n;
1587 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001588 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001589 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001590 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001591 goto Fail;
1592 }
1593 break;
1594
1595 case PY_ITERSEARCH_INDEX:
1596 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001597 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001598 PyErr_SetString(PyExc_OverflowError,
1599 "index exceeds C int size");
1600 goto Fail;
1601 }
1602 goto Done;
1603
1604 case PY_ITERSEARCH_CONTAINS:
1605 n = 1;
1606 goto Done;
1607
1608 default:
1609 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001610 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001611 }
1612
1613 if (operation == PY_ITERSEARCH_INDEX) {
1614 ++n;
1615 if (n <= 0)
1616 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001617 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001618 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001619
1620 if (operation != PY_ITERSEARCH_INDEX)
1621 goto Done;
1622
1623 PyErr_SetString(PyExc_ValueError,
1624 "sequence.index(x): x not in sequence");
1625 /* fall into failure code */
1626Fail:
1627 n = -1;
1628 /* fall through */
1629Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001630 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001631 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001632
Guido van Rossume15dee51995-07-18 14:12:02 +00001633}
1634
Tim Peters16a77ad2001-09-08 04:00:12 +00001635/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001636Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001637PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001638{
Tim Peters16a77ad2001-09-08 04:00:12 +00001639 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001640}
1641
Tim Peterscb8d3682001-05-05 21:05:01 +00001642/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001643 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001644 */
1645int
1646PySequence_Contains(PyObject *seq, PyObject *ob)
1647{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001648 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001649 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1650 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1651 if (sqm != NULL && sqm->sq_contains != NULL)
1652 return (*sqm->sq_contains)(seq, ob);
1653 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001654 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1655 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001656}
1657
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001658/* Backwards compatibility */
1659#undef PySequence_In
1660int
Fred Drake79912472000-07-09 04:06:11 +00001661PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001662{
1663 return PySequence_Contains(w, v);
1664}
1665
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001666Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001667PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001668{
Tim Peters16a77ad2001-09-08 04:00:12 +00001669 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001670}
1671
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001672/* Operations on mappings */
1673
1674int
Fred Drake79912472000-07-09 04:06:11 +00001675PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001676{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001677 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001678 return PyObject_HasAttrString(o, "__getitem__");
1679
1680 return o && o->ob_type->tp_as_mapping &&
1681 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001682 !(o->ob_type->tp_as_sequence &&
1683 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001684}
1685
Martin v. Löwis18e16552006-02-15 17:27:45 +00001686Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001687PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001688{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001689 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001690
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001691 if (o == NULL) {
1692 null_error();
1693 return -1;
1694 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001695
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001696 m = o->ob_type->tp_as_mapping;
1697 if (m && m->mp_length)
1698 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001699
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001700 type_error("len() of unsized object");
1701 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001702}
1703
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001704#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001705Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001706PyMapping_Length(PyObject *o)
1707{
1708 return PyMapping_Size(o);
1709}
1710#define PyMapping_Length PyMapping_Size
1711
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001712PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001713PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714{
1715 PyObject *okey, *r;
1716
1717 if (key == NULL)
1718 return null_error();
1719
1720 okey = PyString_FromString(key);
1721 if (okey == NULL)
1722 return NULL;
1723 r = PyObject_GetItem(o, okey);
1724 Py_DECREF(okey);
1725 return r;
1726}
1727
1728int
Fred Drake79912472000-07-09 04:06:11 +00001729PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001730{
1731 PyObject *okey;
1732 int r;
1733
1734 if (key == NULL) {
1735 null_error();
1736 return -1;
1737 }
1738
1739 okey = PyString_FromString(key);
1740 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001741 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001742 r = PyObject_SetItem(o, okey, value);
1743 Py_DECREF(okey);
1744 return r;
1745}
1746
1747int
Fred Drake79912472000-07-09 04:06:11 +00001748PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001749{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001750 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001751
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001752 v = PyMapping_GetItemString(o, key);
1753 if (v) {
1754 Py_DECREF(v);
1755 return 1;
1756 }
1757 PyErr_Clear();
1758 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001759}
1760
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001761int
Fred Drake79912472000-07-09 04:06:11 +00001762PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001763{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001764 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001765
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001766 v = PyObject_GetItem(o, key);
1767 if (v) {
1768 Py_DECREF(v);
1769 return 1;
1770 }
1771 PyErr_Clear();
1772 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001773}
1774
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001775/* Operations on callable objects */
1776
1777/* XXX PyCallable_Check() is in object.c */
1778
Guido van Rossume15dee51995-07-18 14:12:02 +00001779PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001780PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001781{
Guido van Rossum5560b742001-09-14 16:47:50 +00001782 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001783}
Guido van Rossume15dee51995-07-18 14:12:02 +00001784
1785PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001786PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1787{
1788 ternaryfunc call;
1789
1790 if ((call = func->ob_type->tp_call) != NULL) {
1791 PyObject *result = (*call)(func, arg, kw);
1792 if (result == NULL && !PyErr_Occurred())
1793 PyErr_SetString(
1794 PyExc_SystemError,
1795 "NULL result without error in PyObject_Call");
1796 return result;
1797 }
Fred Drake573395a2001-11-01 20:26:12 +00001798 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1799 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001800 return NULL;
1801}
1802
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001803static PyObject*
1804call_function_tail(PyObject *callable, PyObject *args)
1805{
1806 PyObject *retval;
1807
1808 if (args == NULL)
1809 return NULL;
1810
1811 if (!PyTuple_Check(args)) {
1812 PyObject *a;
1813
1814 a = PyTuple_New(1);
1815 if (a == NULL) {
1816 Py_DECREF(args);
1817 return NULL;
1818 }
1819 PyTuple_SET_ITEM(a, 0, args);
1820 args = a;
1821 }
1822 retval = PyObject_Call(callable, args, NULL);
1823
1824 Py_DECREF(args);
1825
1826 return retval;
1827}
1828
Tim Peters6d6c1a32001-08-02 04:15:00 +00001829PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001830PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001831{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001832 va_list va;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001833 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001834
Fred Drakeb92cf062001-10-27 06:16:31 +00001835 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001836 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001837
Fred Drakeb92cf062001-10-27 06:16:31 +00001838 if (format && *format) {
1839 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001840 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001841 va_end(va);
1842 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001843 else
1844 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001845
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001846 return call_function_tail(callable, args);
1847}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001848
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001849PyObject *
1850_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1851{
1852 va_list va;
1853 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001854
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001855 if (callable == NULL)
1856 return null_error();
1857
1858 if (format && *format) {
1859 va_start(va, format);
1860 args = _Py_VaBuildValue_SizeT(format, va);
1861 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001862 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001863 else
1864 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001865
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001866 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001867}
1868
1869PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001870PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001871{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001872 va_list va;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001873 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001874 PyObject *func = NULL;
1875 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001876
Fred Drakeb92cf062001-10-27 06:16:31 +00001877 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001878 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001879
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001880 func = PyObject_GetAttrString(o, name);
1881 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001882 PyErr_SetString(PyExc_AttributeError, name);
1883 return 0;
1884 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001885
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001886 if (!PyCallable_Check(func)) {
1887 type_error("call of non-callable attribute");
1888 goto exit;
1889 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001890
Fred Drakeb92cf062001-10-27 06:16:31 +00001891 if (format && *format) {
1892 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001893 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001894 va_end(va);
1895 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001896 else
1897 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001898
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001899 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001900
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001901 exit:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001902 /* args gets consumed in call_function_tail */
1903 Py_XDECREF(func);
1904
1905 return retval;
1906}
1907
1908PyObject *
1909_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1910{
1911 va_list va;
1912 PyObject *args;
1913 PyObject *func = NULL;
1914 PyObject *retval = NULL;
1915
1916 if (o == NULL || name == NULL)
1917 return null_error();
1918
1919 func = PyObject_GetAttrString(o, name);
1920 if (func == NULL) {
1921 PyErr_SetString(PyExc_AttributeError, name);
1922 return 0;
1923 }
1924
1925 if (!PyCallable_Check(func)) {
1926 type_error("call of non-callable attribute");
1927 goto exit;
1928 }
1929
1930 if (format && *format) {
1931 va_start(va, format);
1932 args = _Py_VaBuildValue_SizeT(format, va);
1933 va_end(va);
1934 }
1935 else
1936 args = PyTuple_New(0);
1937
1938 retval = call_function_tail(func, args);
1939
1940 exit:
1941 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001942 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001943
1944 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001945}
Guido van Rossum823649d2001-03-21 18:40:58 +00001946
1947
Fred Drakeb421b8c2001-10-26 16:21:32 +00001948static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001949objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001950{
1951 int i, n = 0;
1952 va_list countva;
1953 PyObject *result, *tmp;
1954
1955#ifdef VA_LIST_IS_ARRAY
1956 memcpy(countva, va, sizeof(va_list));
1957#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001958#ifdef __va_copy
1959 __va_copy(countva, va);
1960#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001961 countva = va;
1962#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001963#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001964
1965 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1966 ++n;
1967 result = PyTuple_New(n);
1968 if (result != NULL && n > 0) {
1969 for (i = 0; i < n; ++i) {
1970 tmp = (PyObject *)va_arg(va, PyObject *);
1971 PyTuple_SET_ITEM(result, i, tmp);
1972 Py_INCREF(tmp);
1973 }
1974 }
1975 return result;
1976}
1977
1978PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001979PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001980{
1981 PyObject *args, *tmp;
1982 va_list vargs;
1983
1984 if (callable == NULL || name == NULL)
1985 return null_error();
1986
1987 callable = PyObject_GetAttr(callable, name);
1988 if (callable == NULL)
1989 return NULL;
1990
1991 /* count the args */
1992 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001993 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001994 va_end(vargs);
1995 if (args == NULL) {
1996 Py_DECREF(callable);
1997 return NULL;
1998 }
1999 tmp = PyObject_Call(callable, args, NULL);
2000 Py_DECREF(args);
2001 Py_DECREF(callable);
2002
2003 return tmp;
2004}
2005
2006PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002007PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002008{
2009 PyObject *args, *tmp;
2010 va_list vargs;
2011
2012 if (callable == NULL)
2013 return null_error();
2014
2015 /* count the args */
2016 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002017 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002018 va_end(vargs);
2019 if (args == NULL)
2020 return NULL;
2021 tmp = PyObject_Call(callable, args, NULL);
2022 Py_DECREF(args);
2023
2024 return tmp;
2025}
2026
2027
Guido van Rossum823649d2001-03-21 18:40:58 +00002028/* isinstance(), issubclass() */
2029
Barry Warsawf16951c2002-04-23 22:45:44 +00002030/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2031 * state that will almost never happen.
2032 *
2033 * 0. creating the __bases__ static string could get a MemoryError
2034 * 1. getattr(cls, '__bases__') could raise an AttributeError
2035 * 2. getattr(cls, '__bases__') could raise some other exception
2036 * 3. getattr(cls, '__bases__') could return a tuple
2037 * 4. getattr(cls, '__bases__') could return something other than a tuple
2038 *
2039 * Only state #3 is a non-error state and only it returns a non-NULL object
2040 * (it returns the retrieved tuple).
2041 *
2042 * Any raised AttributeErrors are masked by clearing the exception and
2043 * returning NULL. If an object other than a tuple comes out of __bases__,
2044 * then again, the return value is NULL. So yes, these two situations
2045 * produce exactly the same results: NULL is returned and no error is set.
2046 *
2047 * If some exception other than AttributeError is raised, then NULL is also
2048 * returned, but the exception is not cleared. That's because we want the
2049 * exception to be propagated along.
2050 *
2051 * Callers are expected to test for PyErr_Occurred() when the return value
2052 * is NULL to decide whether a valid exception should be propagated or not.
2053 * When there's no exception to propagate, it's customary for the caller to
2054 * set a TypeError.
2055 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002056static PyObject *
2057abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002058{
2059 static PyObject *__bases__ = NULL;
2060 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002061
2062 if (__bases__ == NULL) {
2063 __bases__ = PyString_FromString("__bases__");
2064 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002065 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002066 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002067 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002068 if (bases == NULL) {
2069 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2070 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002071 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002072 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002073 if (!PyTuple_Check(bases)) {
2074 Py_DECREF(bases);
2075 return NULL;
2076 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002077 return bases;
2078}
2079
2080
2081static int
2082abstract_issubclass(PyObject *derived, PyObject *cls)
2083{
2084 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002085 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002086 int r = 0;
2087
2088
Guido van Rossum823649d2001-03-21 18:40:58 +00002089 if (derived == cls)
2090 return 1;
2091
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002092 if (PyTuple_Check(cls)) {
2093 /* Not a general sequence -- that opens up the road to
2094 recursion and stack overflow. */
2095 n = PyTuple_GET_SIZE(cls);
2096 for (i = 0; i < n; i++) {
2097 if (derived == PyTuple_GET_ITEM(cls, i))
2098 return 1;
2099 }
2100 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002101 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002102 if (bases == NULL) {
2103 if (PyErr_Occurred())
2104 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002105 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002106 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002107 n = PyTuple_GET_SIZE(bases);
2108 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002109 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002110 if (r != 0)
2111 break;
2112 }
2113
2114 Py_DECREF(bases);
2115
2116 return r;
2117}
2118
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002119static int
2120check_class(PyObject *cls, const char *error)
2121{
2122 PyObject *bases = abstract_get_bases(cls);
2123 if (bases == NULL) {
2124 /* Do not mask errors. */
2125 if (!PyErr_Occurred())
2126 PyErr_SetString(PyExc_TypeError, error);
2127 return 0;
2128 }
2129 Py_DECREF(bases);
2130 return -1;
2131}
2132
Brett Cannon4f653312004-03-20 22:52:14 +00002133static int
2134recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002135{
2136 PyObject *icls;
2137 static PyObject *__class__ = NULL;
2138 int retval = 0;
2139
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002140 if (__class__ == NULL) {
2141 __class__ = PyString_FromString("__class__");
2142 if (__class__ == NULL)
2143 return -1;
2144 }
2145
Guido van Rossum45aecf42006-03-15 04:58:47 +00002146 if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002147 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002148 if (retval == 0) {
2149 PyObject *c = PyObject_GetAttr(inst, __class__);
2150 if (c == NULL) {
2151 PyErr_Clear();
2152 }
2153 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002154 if (c != (PyObject *)(inst->ob_type) &&
2155 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002156 retval = PyType_IsSubtype(
2157 (PyTypeObject *)c,
2158 (PyTypeObject *)cls);
2159 Py_DECREF(c);
2160 }
2161 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002162 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002163 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002164 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002165
Brett Cannon4f653312004-03-20 22:52:14 +00002166 if (!recursion_depth) {
2167 PyErr_SetString(PyExc_RuntimeError,
2168 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002169 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002170 }
2171
Guido van Rossum03290ec2001-10-07 20:54:12 +00002172 n = PyTuple_GET_SIZE(cls);
2173 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002174 retval = recursive_isinstance(
2175 inst,
2176 PyTuple_GET_ITEM(cls, i),
2177 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002178 if (retval != 0)
2179 break;
2180 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002181 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002182 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002183 if (!check_class(cls,
2184 "isinstance() arg 2 must be a class, type,"
2185 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002186 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002187 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002188 if (icls == NULL) {
2189 PyErr_Clear();
2190 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002191 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002192 else {
2193 retval = abstract_issubclass(icls, cls);
2194 Py_DECREF(icls);
2195 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002196 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002197
Guido van Rossum823649d2001-03-21 18:40:58 +00002198 return retval;
2199}
2200
2201int
Brett Cannon4f653312004-03-20 22:52:14 +00002202PyObject_IsInstance(PyObject *inst, PyObject *cls)
2203{
2204 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2205}
2206
2207static int
2208recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002209{
2210 int retval;
2211
Guido van Rossum45aecf42006-03-15 04:58:47 +00002212 {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002213 if (!check_class(derived,
2214 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002215 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002216
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002217 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002218 Py_ssize_t i;
2219 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002220
2221 if (!recursion_depth) {
2222 PyErr_SetString(PyExc_RuntimeError,
2223 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002224 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002225 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002226 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002227 retval = recursive_issubclass(
2228 derived,
2229 PyTuple_GET_ITEM(cls, i),
2230 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002231 if (retval != 0) {
2232 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002233 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002234 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002235 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002236 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002237 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002238 else {
2239 if (!check_class(cls,
2240 "issubclass() arg 2 must be a class"
2241 " or tuple of classes"))
2242 return -1;
2243 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002244
2245 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002246 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002247
2248 return retval;
2249}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002250
Brett Cannon4f653312004-03-20 22:52:14 +00002251int
2252PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2253{
2254 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2255}
2256
2257
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002258PyObject *
2259PyObject_GetIter(PyObject *o)
2260{
2261 PyTypeObject *t = o->ob_type;
2262 getiterfunc f = NULL;
2263 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2264 f = t->tp_iter;
2265 if (f == NULL) {
2266 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002267 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002268 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002269 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002270 return NULL;
2271 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002272 else {
2273 PyObject *res = (*f)(o);
2274 if (res != NULL && !PyIter_Check(res)) {
2275 PyErr_Format(PyExc_TypeError,
2276 "iter() returned non-iterator "
2277 "of type '%.100s'",
2278 res->ob_type->tp_name);
2279 Py_DECREF(res);
2280 res = NULL;
2281 }
2282 return res;
2283 }
2284}
2285
Tim Petersf4848da2001-05-05 00:14:56 +00002286/* Return next item.
2287 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2288 * If the iteration terminates normally, return NULL and clear the
2289 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2290 * will be false.
2291 * Else return the next object. PyErr_Occurred() will be false.
2292 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002293PyObject *
2294PyIter_Next(PyObject *iter)
2295{
Tim Petersf4848da2001-05-05 00:14:56 +00002296 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002297 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002298 result = (*iter->ob_type->tp_iternext)(iter);
2299 if (result == NULL &&
2300 PyErr_Occurred() &&
2301 PyErr_ExceptionMatches(PyExc_StopIteration))
2302 PyErr_Clear();
2303 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002304}