blob: c8e9ddcf4942958474a41cb476127a4cf90f994a [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
Martin v. Löwis5cb69362006-04-14 09:08:42 +000011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000013
14static PyObject *
Georg Brandlccff7852006-06-18 22:17:29 +000015type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000016{
Georg Brandlccff7852006-06-18 22:17:29 +000017 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000018 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000019}
20
Guido van Rossum052b7e11996-11-11 15:08:19 +000021static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000022null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000023{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000024 if (!PyErr_Occurred())
25 PyErr_SetString(PyExc_SystemError,
26 "null argument to internal routine");
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000030/* Operations on any object */
31
32int
Fred Drake79912472000-07-09 04:06:11 +000033PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034{
35 int r;
36
37 if (o1 == NULL || o2 == NULL) {
38 null_error();
39 return -1;
40 }
41 r = PyObject_Compare(o1, o2);
42 if (PyErr_Occurred())
43 return -1;
44 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000045 return 0;
46}
Guido van Rossume15dee51995-07-18 14:12:02 +000047
48PyObject *
Fred Drake79912472000-07-09 04:06:11 +000049PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000050{
51 PyObject *v;
52
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000053 if (o == NULL)
54 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000055 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
58}
59
Martin v. Löwis18e16552006-02-15 17:27:45 +000060Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000061PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 m = o->ob_type->tp_as_sequence;
71 if (m && m->sq_length)
72 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Jeremy Hylton6253f832000-07-12 12:56:19 +000074 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075}
76
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000077#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000078Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000079PyObject_Length(PyObject *o)
80{
81 return PyObject_Size(o);
82}
83#define PyObject_Length PyObject_Size
84
Martin v. Löwis18e16552006-02-15 17:27:45 +000085Py_ssize_t
Armin Rigof5b3e362006-02-11 21:32:43 +000086_PyObject_LengthHint(PyObject *o)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000087{
Martin v. Löwis18e16552006-02-15 17:27:45 +000088 Py_ssize_t rv = PyObject_Size(o);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000089 if (rv != -1)
90 return rv;
91 if (PyErr_ExceptionMatches(PyExc_TypeError) ||
92 PyErr_ExceptionMatches(PyExc_AttributeError)) {
93 PyObject *err_type, *err_value, *err_tb, *ro;
94
95 PyErr_Fetch(&err_type, &err_value, &err_tb);
Armin Rigof5b3e362006-02-11 21:32:43 +000096 ro = PyObject_CallMethod(o, "__length_hint__", NULL);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000097 if (ro != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +000098 rv = PyInt_AsLong(ro);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000099 Py_DECREF(ro);
100 Py_XDECREF(err_type);
101 Py_XDECREF(err_value);
102 Py_XDECREF(err_tb);
103 return rv;
104 }
105 PyErr_Restore(err_type, err_value, err_tb);
106 }
107 return -1;
108}
109
Guido van Rossume15dee51995-07-18 14:12:02 +0000110PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000111PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000112{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000113 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000114
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 if (o == NULL || key == NULL)
116 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000118 m = o->ob_type->tp_as_mapping;
119 if (m && m->mp_subscript)
120 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000121
Guido van Rossum21308241998-08-13 16:44:44 +0000122 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000123 if (PyIndex_Check(key)) {
124 Py_ssize_t key_value;
125 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000126 if (key_value == -1 && PyErr_Occurred())
127 return NULL;
128 return PySequence_GetItem(o, key_value);
129 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000130 else if (o->ob_type->tp_as_sequence->sq_item)
Georg Brandlccff7852006-06-18 22:17:29 +0000131 return type_error("sequence index must "
132 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000133 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000134
Georg Brandlccff7852006-06-18 22:17:29 +0000135 return type_error("'%.200s' object is unsubscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000136}
137
138int
Fred Drake79912472000-07-09 04:06:11 +0000139PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000140{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000141 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000142
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000143 if (o == NULL || key == NULL || value == NULL) {
144 null_error();
145 return -1;
146 }
147 m = o->ob_type->tp_as_mapping;
148 if (m && m->mp_ass_subscript)
149 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000150
Guido van Rossum21308241998-08-13 16:44:44 +0000151 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000152 if (PyIndex_Check(key)) {
153 Py_ssize_t key_value;
154 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000155 if (key_value == -1 && PyErr_Occurred())
156 return -1;
157 return PySequence_SetItem(o, key_value, value);
158 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000159 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000160 type_error("sequence index must be "
161 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000162 return -1;
163 }
Guido van Rossum21308241998-08-13 16:44:44 +0000164 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000165
Georg Brandlccff7852006-06-18 22:17:29 +0000166 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000167 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) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000184 if (PyIndex_Check(key)) {
185 Py_ssize_t key_value;
186 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
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) {
Georg Brandlccff7852006-06-18 22:17:29 +0000192 type_error("sequence index must be "
193 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000194 return -1;
195 }
Guido van Rossum21308241998-08-13 16:44:44 +0000196 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000197
Georg Brandlccff7852006-06-18 22:17:29 +0000198 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000199 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000200}
201
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000202int
203PyObject_DelItemString(PyObject *o, char *key)
204{
205 PyObject *okey;
206 int ret;
207
208 if (o == NULL || key == NULL) {
209 null_error();
210 return -1;
211 }
212 okey = PyString_FromString(key);
213 if (okey == NULL)
214 return -1;
215 ret = PyObject_DelItem(o, okey);
216 Py_DECREF(okey);
217 return ret;
218}
219
Brett Cannonea229bd2006-06-06 18:08:16 +0000220int
221PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000222 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000223 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000224{
225 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000226 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000227 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000228
229 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
230 null_error();
231 return -1;
232 }
233 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000234 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000235 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000236 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000237 PyErr_SetString(PyExc_TypeError,
238 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000239 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000241 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242 PyErr_SetString(PyExc_TypeError,
243 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000244 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000245 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000246 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000247 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000248 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000249 *buffer = pp;
250 *buffer_len = len;
251 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000253
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254int
255PyObject_CheckReadBuffer(PyObject *obj)
256{
257 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
258
259 if (pb == NULL ||
260 pb->bf_getreadbuffer == NULL ||
261 pb->bf_getsegcount == NULL ||
262 (*pb->bf_getsegcount)(obj, NULL) != 1)
263 return 0;
264 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265}
266
267int PyObject_AsReadBuffer(PyObject *obj,
268 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000269 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000270{
271 PyBufferProcs *pb;
272 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000273 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000274
275 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
276 null_error();
277 return -1;
278 }
279 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000280 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000281 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000282 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283 PyErr_SetString(PyExc_TypeError,
284 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000285 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000286 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000287 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288 PyErr_SetString(PyExc_TypeError,
289 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000290 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000291 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000292 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000293 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000294 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000295 *buffer = pp;
296 *buffer_len = len;
297 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000298}
299
300int PyObject_AsWriteBuffer(PyObject *obj,
301 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000302 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000303{
304 PyBufferProcs *pb;
305 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000306 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000307
308 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
309 null_error();
310 return -1;
311 }
312 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000313 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000314 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000315 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316 PyErr_SetString(PyExc_TypeError,
317 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000318 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000319 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000320 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321 PyErr_SetString(PyExc_TypeError,
322 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000323 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000324 }
325 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
326 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000327 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000328 *buffer = pp;
329 *buffer_len = len;
330 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000331}
332
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000333/* Operations on numbers */
334
335int
Fred Drake79912472000-07-09 04:06:11 +0000336PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000337{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000338 return o && o->ob_type->tp_as_number &&
339 (o->ob_type->tp_as_number->nb_int ||
340 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000341}
342
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000343/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000344
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000345/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000346
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000347#define NB_SLOT(x) offsetof(PyNumberMethods, x)
348#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000349 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000350#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000351 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000352
353/*
354 Calling scheme used for binary operations:
355
356 v w Action
357 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000358 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000359 new old v.op(v,w), coerce(v,w), v.op(v,w)
360 old new w.op(v,w), coerce(v,w), v.op(v,w)
361 old old coerce(v,w), v.op(v,w)
362
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000363 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
364 v->ob_type
365
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000366 Legend:
367 -------
368 * new == new style number
369 * old == old style number
370 * Action indicates the order in which operations are tried until either
371 a valid result is produced or an error occurs.
372
373 */
374
375static PyObject *
376binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000377{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000378 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000379 binaryfunc slotv = NULL;
380 binaryfunc slotw = NULL;
381
382 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000383 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000384 if (w->ob_type != v->ob_type &&
385 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000386 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000387 if (slotw == slotv)
388 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000389 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000390 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000391 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
392 x = slotw(v, w);
393 if (x != Py_NotImplemented)
394 return x;
395 Py_DECREF(x); /* can't do it */
396 slotw = NULL;
397 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000398 x = slotv(v, w);
399 if (x != Py_NotImplemented)
400 return x;
401 Py_DECREF(x); /* can't do it */
402 }
403 if (slotw) {
404 x = slotw(v, w);
405 if (x != Py_NotImplemented)
406 return x;
407 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000408 }
409 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
410 int err = PyNumber_CoerceEx(&v, &w);
411 if (err < 0) {
412 return NULL;
413 }
414 if (err == 0) {
415 PyNumberMethods *mv = v->ob_type->tp_as_number;
416 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000417 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000418 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000419 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000420 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000421 Py_DECREF(v);
422 Py_DECREF(w);
423 return x;
424 }
425 }
426 /* CoerceEx incremented the reference counts */
427 Py_DECREF(v);
428 Py_DECREF(w);
429 }
430 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000431 Py_INCREF(Py_NotImplemented);
432 return Py_NotImplemented;
433}
Guido van Rossum77660912002-04-16 16:32:50 +0000434
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000435static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000436binop_type_error(PyObject *v, PyObject *w, const char *op_name)
437{
438 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000439 "unsupported operand type(s) for %.100s: "
440 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000441 op_name,
442 v->ob_type->tp_name,
443 w->ob_type->tp_name);
444 return NULL;
445}
446
447static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000448binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
449{
450 PyObject *result = binary_op1(v, w, op_slot);
451 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000452 Py_DECREF(result);
453 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000454 }
455 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000456}
457
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000458
459/*
460 Calling scheme used for ternary operations:
461
Guido van Rossum84675ac2001-09-29 01:05:03 +0000462 *** In some cases, w.op is called before v.op; see binary_op1. ***
463
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000464 v w z Action
465 -------------------------------------------------------------------
466 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
467 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
468 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
469 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
470 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
471 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
472 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
473 old old old coerce(v,w,z), v.op(v,w,z)
474
475 Legend:
476 -------
477 * new == new style number
478 * old == old style number
479 * Action indicates the order in which operations are tried until either
480 a valid result is produced or an error occurs.
481 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
482 only if z != Py_None; if z == Py_None, then it is treated as absent
483 variable and only coerce(v,w) is tried.
484
485 */
486
487static PyObject *
488ternary_op(PyObject *v,
489 PyObject *w,
490 PyObject *z,
491 const int op_slot,
492 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000493{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000494 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000495 PyObject *x = NULL;
496 ternaryfunc slotv = NULL;
497 ternaryfunc slotw = NULL;
498 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000499
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000500 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000501 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000502 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000503 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000504 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000505 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000506 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000507 if (slotw == slotv)
508 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000509 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000510 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000511 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
512 x = slotw(v, w, z);
513 if (x != Py_NotImplemented)
514 return x;
515 Py_DECREF(x); /* can't do it */
516 slotw = NULL;
517 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000518 x = slotv(v, w, z);
519 if (x != Py_NotImplemented)
520 return x;
521 Py_DECREF(x); /* can't do it */
522 }
523 if (slotw) {
524 x = slotw(v, w, z);
525 if (x != Py_NotImplemented)
526 return x;
527 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000528 }
529 mz = z->ob_type->tp_as_number;
530 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000531 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000532 if (slotz == slotv || slotz == slotw)
533 slotz = NULL;
534 if (slotz) {
535 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000536 if (x != Py_NotImplemented)
537 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000538 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000539 }
540 }
541
542 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
543 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
544 /* we have an old style operand, coerce */
545 PyObject *v1, *z1, *w2, *z2;
546 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000547
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000548 c = PyNumber_Coerce(&v, &w);
549 if (c != 0)
550 goto error3;
551
552 /* Special case: if the third argument is None, it is
553 treated as absent argument and not coerced. */
554 if (z == Py_None) {
555 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000556 slotz = NB_TERNOP(v->ob_type->tp_as_number,
557 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000558 if (slotz)
559 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000560 else
561 c = -1;
562 }
563 else
564 c = -1;
565 goto error2;
566 }
567 v1 = v;
568 z1 = z;
569 c = PyNumber_Coerce(&v1, &z1);
570 if (c != 0)
571 goto error2;
572 w2 = w;
573 z2 = z1;
574 c = PyNumber_Coerce(&w2, &z2);
575 if (c != 0)
576 goto error1;
577
578 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000579 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
580 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000581 if (slotv)
582 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000583 else
584 c = -1;
585 }
586 else
587 c = -1;
588
589 Py_DECREF(w2);
590 Py_DECREF(z2);
591 error1:
592 Py_DECREF(v1);
593 Py_DECREF(z1);
594 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000595 Py_DECREF(v);
596 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000597 error3:
598 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000599 return x;
600 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000601
602 if (z == Py_None)
603 PyErr_Format(
604 PyExc_TypeError,
605 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000606 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000607 v->ob_type->tp_name,
608 w->ob_type->tp_name);
609 else
610 PyErr_Format(
611 PyExc_TypeError,
612 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000613 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000614 v->ob_type->tp_name,
615 w->ob_type->tp_name,
616 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000617 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000618}
619
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000620#define BINARY_FUNC(func, op, op_name) \
621 PyObject * \
622 func(PyObject *v, PyObject *w) { \
623 return binary_op(v, w, NB_SLOT(op), op_name); \
624 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000625
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000626BINARY_FUNC(PyNumber_Or, nb_or, "|")
627BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
628BINARY_FUNC(PyNumber_And, nb_and, "&")
629BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
630BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
631BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000632BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
633BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000634
635PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000636PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000637{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000638 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
639 if (result == Py_NotImplemented) {
640 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000641 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000642 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000643 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000644 }
Armin Rigofd163f92005-12-29 15:59:19 +0000645 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000646 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000647 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000648}
649
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000650static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000651sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000652{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000653 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000654 if (PyIndex_Check(n)) {
655 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000656 if (count == -1 && PyErr_Occurred())
657 return NULL;
658 }
659 else {
Georg Brandlccff7852006-06-18 22:17:29 +0000660 return type_error("can't multiply sequence by "
661 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000662 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000663 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000664}
665
666PyObject *
667PyNumber_Multiply(PyObject *v, PyObject *w)
668{
669 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
670 if (result == Py_NotImplemented) {
671 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
672 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000673 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000674 if (mv && mv->sq_repeat) {
675 return sequence_repeat(mv->sq_repeat, v, w);
676 }
677 else if (mw && mw->sq_repeat) {
678 return sequence_repeat(mw->sq_repeat, w, v);
679 }
680 result = binop_type_error(v, w, "*");
681 }
682 return result;
683}
684
Guido van Rossume15dee51995-07-18 14:12:02 +0000685PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000686PyNumber_FloorDivide(PyObject *v, PyObject *w)
687{
688 /* XXX tp_flags test */
689 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
690}
691
692PyObject *
693PyNumber_TrueDivide(PyObject *v, PyObject *w)
694{
695 /* XXX tp_flags test */
696 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
697}
698
699PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000700PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000701{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000702 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000703}
704
705PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000706PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000707{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000708 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000709}
710
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000711/* Binary in-place operators */
712
713/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000714 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000715
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000716 - If the left hand object has the appropriate struct members, and
717 they are filled, call the appropriate function and return the
718 result. No coercion is done on the arguments; the left-hand object
719 is the one the operation is performed on, and it's up to the
720 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000721
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000722 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000723 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000724
725 */
726
Guido van Rossum77660912002-04-16 16:32:50 +0000727#define HASINPLACE(t) \
728 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000730static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000731binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000732{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000733 PyNumberMethods *mv = v->ob_type->tp_as_number;
734 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000735 binaryfunc slot = NB_BINOP(mv, iop_slot);
736 if (slot) {
737 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000738 if (x != Py_NotImplemented) {
739 return x;
740 }
741 Py_DECREF(x);
742 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000743 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000744 return binary_op1(v, w, op_slot);
745}
746
747static PyObject *
748binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
749 const char *op_name)
750{
751 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
752 if (result == Py_NotImplemented) {
753 Py_DECREF(result);
754 return binop_type_error(v, w, op_name);
755 }
756 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000757}
758
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000759#define INPLACE_BINOP(func, iop, op, op_name) \
760 PyObject * \
761 func(PyObject *v, PyObject *w) { \
762 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000763 }
764
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000765INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
766INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
767INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
768INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
769INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
770INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
771INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000772
773PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000774PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
775{
776 /* XXX tp_flags test */
777 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
778 NB_SLOT(nb_floor_divide), "//=");
779}
780
781PyObject *
782PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
783{
784 /* XXX tp_flags test */
785 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
786 NB_SLOT(nb_true_divide), "/=");
787}
788
789PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000790PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
791{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000792 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
793 NB_SLOT(nb_add));
794 if (result == Py_NotImplemented) {
795 PySequenceMethods *m = v->ob_type->tp_as_sequence;
796 Py_DECREF(result);
797 if (m != NULL) {
798 binaryfunc f = NULL;
799 if (HASINPLACE(v))
800 f = m->sq_inplace_concat;
801 if (f == NULL)
802 f = m->sq_concat;
803 if (f != NULL)
804 return (*f)(v, w);
805 }
806 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000807 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000808 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000809}
810
811PyObject *
812PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
813{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000814 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
815 NB_SLOT(nb_multiply));
816 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000817 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000818 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
819 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
820 Py_DECREF(result);
821 if (mv != NULL) {
822 if (HASINPLACE(v))
823 f = mv->sq_inplace_repeat;
824 if (f == NULL)
825 f = mv->sq_repeat;
826 if (f != NULL)
827 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000828 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000829 else if (mw != NULL) {
830 /* Note that the right hand operand should not be
831 * mutated in this case so sq_inplace_repeat is not
832 * used. */
833 if (mw->sq_repeat)
834 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000835 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000836 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000837 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000838 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000839}
840
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000841PyObject *
842PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
843{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000844 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
845 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000846}
847
848PyObject *
849PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
850{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000851 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
852 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
853 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000854 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000855 else {
856 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
857 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000858}
859
860
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000861/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000862
863PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000864PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000865{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000866 PyNumberMethods *m;
867
868 if (o == NULL)
869 return null_error();
870 m = o->ob_type->tp_as_number;
871 if (m && m->nb_negative)
872 return (*m->nb_negative)(o);
873
Georg Brandlccff7852006-06-18 22:17:29 +0000874 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000875}
876
877PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000878PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000879{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000880 PyNumberMethods *m;
881
882 if (o == NULL)
883 return null_error();
884 m = o->ob_type->tp_as_number;
885 if (m && m->nb_positive)
886 return (*m->nb_positive)(o);
887
Georg Brandlccff7852006-06-18 22:17:29 +0000888 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000889}
890
891PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000892PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000893{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000894 PyNumberMethods *m;
895
896 if (o == NULL)
897 return null_error();
898 m = o->ob_type->tp_as_number;
899 if (m && m->nb_invert)
900 return (*m->nb_invert)(o);
901
Georg Brandlccff7852006-06-18 22:17:29 +0000902 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000903}
904
905PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000906PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000907{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000909
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000910 if (o == NULL)
911 return null_error();
912 m = o->ob_type->tp_as_number;
913 if (m && m->nb_absolute)
914 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000915
Georg Brandlccff7852006-06-18 22:17:29 +0000916 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000917}
918
Guido van Rossum9e896b32000-04-05 20:11:21 +0000919/* Add a check for embedded NULL-bytes in the argument. */
920static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000921int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000922{
923 char *end;
924 PyObject *x;
925
926 x = PyInt_FromString((char*)s, &end, 10);
927 if (x == NULL)
928 return NULL;
929 if (end != s + len) {
930 PyErr_SetString(PyExc_ValueError,
931 "null byte in argument for int()");
932 Py_DECREF(x);
933 return NULL;
934 }
935 return x;
936}
937
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000938/* Return a Python Int or Long from the object item
939 Raise TypeError if the result is not an int-or-long
940 or if the object cannot be interpreted as an index.
941*/
942PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000943PyNumber_Index(PyObject *item)
944{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000945 PyObject *result = NULL;
946 if (item == NULL)
947 return null_error();
948 /* XXX(nnorwitz): should these be CheckExact? Aren't subclasses ok? */
949 if (PyInt_CheckExact(item) || PyLong_CheckExact(item)) {
950 Py_INCREF(item);
951 return item;
952 }
953 if (PyIndex_Check(item)) {
954 result = item->ob_type->tp_as_number->nb_index(item);
955 /* XXX(nnorwitz): Aren't subclasses ok here too? */
956 if (result &&
957 !PyInt_CheckExact(result) && !PyLong_CheckExact(result)) {
958 PyErr_Format(PyExc_TypeError,
959 "__index__ returned non-(int,long) " \
960 "(type %.200s)",
961 result->ob_type->tp_name);
962 Py_DECREF(result);
963 return NULL;
964 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000965 }
966 else {
Armin Rigo314861c2006-03-30 14:04:02 +0000967 PyErr_Format(PyExc_TypeError,
968 "'%.200s' object cannot be interpreted "
969 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000970 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000971 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000972}
973
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000974/* Return an error on Overflow only if err is not NULL*/
975
976Py_ssize_t
977PyNumber_AsSsize_t(PyObject *item, PyObject *err)
978{
979 Py_ssize_t result;
980 PyObject *runerr;
981 PyObject *value = PyNumber_Index(item);
982 if (value == NULL)
983 return -1;
984
985 /* We're done if PyInt_AsSsize_t() returns without error. */
986 result = PyInt_AsSsize_t(value);
987 if (result != -1 || !(runerr = PyErr_Occurred()))
988 goto finish;
989
990 /* Error handling code -- only manage OverflowError differently */
991 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
992 goto finish;
993
994 PyErr_Clear();
995 /* If no error-handling desired then the default clipping
996 is sufficient.
997 */
998 if (!err) {
999 assert(PyLong_Check(value));
1000 /* Whether or not it is less than or equal to
1001 zero is determined by the sign of ob_size
1002 */
1003 if (_PyLong_Sign(value) < 0)
1004 result = PY_SSIZE_T_MIN;
1005 else
1006 result = PY_SSIZE_T_MAX;
1007 }
1008 else {
1009 /* Otherwise replace the error with caller's error object. */
1010 PyErr_Format(err,
1011 "cannot fit '%.200s' into an index-sized integer",
1012 item->ob_type->tp_name);
1013 }
1014
1015 finish:
1016 Py_DECREF(value);
1017 return result;
1018}
1019
1020
Guido van Rossume15dee51995-07-18 14:12:02 +00001021PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001022PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001023{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001024 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001025 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001026 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001027
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001028 if (o == NULL)
1029 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001030 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001031 Py_INCREF(o);
1032 return o;
1033 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001034 m = o->ob_type->tp_as_number;
1035 if (m && m->nb_int) { /* This should include subclasses of int */
1036 PyObject *res = m->nb_int(o);
1037 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1038 PyErr_Format(PyExc_TypeError,
1039 "__int__ returned non-int (type %.200s)",
1040 res->ob_type->tp_name);
1041 Py_DECREF(res);
1042 return NULL;
1043 }
1044 return res;
1045 }
1046 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001047 PyIntObject *io = (PyIntObject*)o;
1048 return PyInt_FromLong(io->ob_ival);
1049 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001050 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001051 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +00001052 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001053#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001054 if (PyUnicode_Check(o))
1055 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1056 PyUnicode_GET_SIZE(o),
1057 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001058#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001059 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001060 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001061
Georg Brandlccff7852006-06-18 22:17:29 +00001062 return type_error("int() argument must be a string or a "
1063 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001064}
1065
Guido van Rossum9e896b32000-04-05 20:11:21 +00001066/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001067static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001068long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001069{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001070 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001071 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001072
Guido van Rossum4c08d552000-03-10 22:55:18 +00001073 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001074 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001075 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001076 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001077 PyErr_SetString(PyExc_ValueError,
1078 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001079 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001080 return NULL;
1081 }
1082 return x;
1083}
1084
Guido van Rossume15dee51995-07-18 14:12:02 +00001085PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001086PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001087{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001088 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001089 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001090 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001091
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001092 if (o == NULL)
1093 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001094 m = o->ob_type->tp_as_number;
1095 if (m && m->nb_long) { /* This should include subclasses of long */
1096 PyObject *res = m->nb_long(o);
1097 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1098 PyErr_Format(PyExc_TypeError,
1099 "__long__ returned non-long (type %.200s)",
1100 res->ob_type->tp_name);
1101 Py_DECREF(res);
1102 return NULL;
1103 }
1104 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001105 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001106 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001107 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001109 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001110 * doesn't do. In particular long('9.5') must raise an
1111 * exception, not truncate the float.
1112 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001113 return long_from_string(PyString_AS_STRING(o),
1114 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001115#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001116 if (PyUnicode_Check(o))
1117 /* The above check is done in PyLong_FromUnicode(). */
1118 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1119 PyUnicode_GET_SIZE(o),
1120 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001121#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001122 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1123 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001124
Georg Brandlccff7852006-06-18 22:17:29 +00001125 return type_error("long() argument must be a string or a "
1126 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001127}
1128
1129PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001130PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001131{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001134 if (o == NULL)
1135 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001136 m = o->ob_type->tp_as_number;
1137 if (m && m->nb_float) { /* This should include subclasses of float */
1138 PyObject *res = m->nb_float(o);
1139 if (res && !PyFloat_Check(res)) {
1140 PyErr_Format(PyExc_TypeError,
1141 "__float__ returned non-float (type %.200s)",
1142 res->ob_type->tp_name);
1143 Py_DECREF(res);
1144 return NULL;
1145 }
1146 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001147 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001148 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001149 PyFloatObject *po = (PyFloatObject *)o;
1150 return PyFloat_FromDouble(po->ob_fval);
1151 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001152 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001153}
1154
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001155/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001156
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001157int
Fred Drake79912472000-07-09 04:06:11 +00001158PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001159{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001160 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001161 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001162 return s != NULL && s->ob_type->tp_as_sequence &&
1163 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001164}
1165
Martin v. Löwis18e16552006-02-15 17:27:45 +00001166Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001167PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001168{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001169 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001170
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001171 if (s == NULL) {
1172 null_error();
1173 return -1;
1174 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001175
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001176 m = s->ob_type->tp_as_sequence;
1177 if (m && m->sq_length)
1178 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001179
Georg Brandlb0061c82006-08-08 11:56:21 +00001180 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001181 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001182}
1183
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001184#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001185Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001186PySequence_Length(PyObject *s)
1187{
1188 return PySequence_Size(s);
1189}
1190#define PySequence_Length PySequence_Size
1191
Guido van Rossume15dee51995-07-18 14:12:02 +00001192PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001193PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001194{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001195 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001196
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197 if (s == NULL || o == NULL)
1198 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001199
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001200 m = s->ob_type->tp_as_sequence;
1201 if (m && m->sq_concat)
1202 return m->sq_concat(s, o);
1203
Armin Rigofd163f92005-12-29 15:59:19 +00001204 /* Instances of user classes defining an __add__() method only
1205 have an nb_add slot, not an sq_concat slot. So we fall back
1206 to nb_add if both arguments appear to be sequences. */
1207 if (PySequence_Check(s) && PySequence_Check(o)) {
1208 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1209 if (result != Py_NotImplemented)
1210 return result;
1211 Py_DECREF(result);
1212 }
Georg Brandlccff7852006-06-18 22:17:29 +00001213 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001214}
1215
1216PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001217PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001218{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001219 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001220
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001221 if (o == NULL)
1222 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001223
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001224 m = o->ob_type->tp_as_sequence;
1225 if (m && m->sq_repeat)
1226 return m->sq_repeat(o, count);
1227
Armin Rigofd163f92005-12-29 15:59:19 +00001228 /* Instances of user classes defining a __mul__() method only
1229 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1230 to nb_multiply if o appears to be a sequence. */
1231 if (PySequence_Check(o)) {
1232 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001233 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001234 if (n == NULL)
1235 return NULL;
1236 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1237 Py_DECREF(n);
1238 if (result != Py_NotImplemented)
1239 return result;
1240 Py_DECREF(result);
1241 }
Georg Brandlccff7852006-06-18 22:17:29 +00001242 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001243}
1244
1245PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001246PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1247{
1248 PySequenceMethods *m;
1249
1250 if (s == NULL || o == NULL)
1251 return null_error();
1252
1253 m = s->ob_type->tp_as_sequence;
1254 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1255 return m->sq_inplace_concat(s, o);
1256 if (m && m->sq_concat)
1257 return m->sq_concat(s, o);
1258
Armin Rigofd163f92005-12-29 15:59:19 +00001259 if (PySequence_Check(s) && PySequence_Check(o)) {
1260 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1261 NB_SLOT(nb_add));
1262 if (result != Py_NotImplemented)
1263 return result;
1264 Py_DECREF(result);
1265 }
Georg Brandlccff7852006-06-18 22:17:29 +00001266 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001267}
1268
1269PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001270PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001271{
1272 PySequenceMethods *m;
1273
1274 if (o == NULL)
1275 return null_error();
1276
1277 m = o->ob_type->tp_as_sequence;
1278 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1279 return m->sq_inplace_repeat(o, count);
1280 if (m && m->sq_repeat)
1281 return m->sq_repeat(o, count);
1282
Armin Rigofd163f92005-12-29 15:59:19 +00001283 if (PySequence_Check(o)) {
1284 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001285 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001286 if (n == NULL)
1287 return NULL;
1288 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1289 NB_SLOT(nb_multiply));
1290 Py_DECREF(n);
1291 if (result != Py_NotImplemented)
1292 return result;
1293 Py_DECREF(result);
1294 }
Georg Brandlccff7852006-06-18 22:17:29 +00001295 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001296}
1297
1298PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001299PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001300{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001302
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 if (s == NULL)
1304 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001305
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001306 m = s->ob_type->tp_as_sequence;
1307 if (m && m->sq_item) {
1308 if (i < 0) {
1309 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001310 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 if (l < 0)
1312 return NULL;
1313 i += l;
1314 }
1315 }
1316 return m->sq_item(s, i);
1317 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001318
Georg Brandlccff7852006-06-18 22:17:29 +00001319 return type_error("'%.200s' object is unindexable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001320}
1321
1322PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001323PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001324{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001325 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001326 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001329
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001330 m = s->ob_type->tp_as_sequence;
1331 if (m && m->sq_slice) {
1332 if (i1 < 0 || i2 < 0) {
1333 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001334 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335 if (l < 0)
1336 return NULL;
1337 if (i1 < 0)
1338 i1 += l;
1339 if (i2 < 0)
1340 i2 += l;
1341 }
1342 }
1343 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001344 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1345 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001346 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001347 if (!slice)
1348 return NULL;
1349 res = mp->mp_subscript(s, slice);
1350 Py_DECREF(slice);
1351 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001352 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001353
Georg Brandlccff7852006-06-18 22:17:29 +00001354 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001355}
1356
1357int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001358PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001359{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001361
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001362 if (s == NULL) {
1363 null_error();
1364 return -1;
1365 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001366
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001367 m = s->ob_type->tp_as_sequence;
1368 if (m && m->sq_ass_item) {
1369 if (i < 0) {
1370 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001371 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001373 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001374 i += l;
1375 }
1376 }
1377 return m->sq_ass_item(s, i, o);
1378 }
1379
Georg Brandlccff7852006-06-18 22:17:29 +00001380 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001382}
1383
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001384int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001385PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001386{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001387 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001388
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001389 if (s == NULL) {
1390 null_error();
1391 return -1;
1392 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001393
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001394 m = s->ob_type->tp_as_sequence;
1395 if (m && m->sq_ass_item) {
1396 if (i < 0) {
1397 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001398 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001400 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001401 i += l;
1402 }
1403 }
1404 return m->sq_ass_item(s, i, (PyObject *)NULL);
1405 }
1406
Georg Brandlccff7852006-06-18 22:17:29 +00001407 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001408 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001409}
1410
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001412PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001413{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001414 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001415 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001416
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001417 if (s == NULL) {
1418 null_error();
1419 return -1;
1420 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001421
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001422 m = s->ob_type->tp_as_sequence;
1423 if (m && m->sq_ass_slice) {
1424 if (i1 < 0 || i2 < 0) {
1425 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001426 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001428 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001429 if (i1 < 0)
1430 i1 += l;
1431 if (i2 < 0)
1432 i2 += l;
1433 }
1434 }
1435 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001436 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1437 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001438 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001439 if (!slice)
1440 return -1;
1441 res = mp->mp_ass_subscript(s, slice, o);
1442 Py_DECREF(slice);
1443 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001444 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001445
Georg Brandlccff7852006-06-18 22:17:29 +00001446 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001447 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001448}
1449
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001450int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001451PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001452{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001454
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001455 if (s == NULL) {
1456 null_error();
1457 return -1;
1458 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001459
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 m = s->ob_type->tp_as_sequence;
1461 if (m && m->sq_ass_slice) {
1462 if (i1 < 0 || i2 < 0) {
1463 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001464 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001465 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001466 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 if (i1 < 0)
1468 i1 += l;
1469 if (i2 < 0)
1470 i2 += l;
1471 }
1472 }
1473 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1474 }
Georg Brandlccff7852006-06-18 22:17:29 +00001475 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001476 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001477}
1478
Guido van Rossume15dee51995-07-18 14:12:02 +00001479PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001480PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001481{
Tim Peters6912d4d2001-05-05 03:56:37 +00001482 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001483 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001484 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001485 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001486
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001487 if (v == NULL)
1488 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001489
Tim Peters6912d4d2001-05-05 03:56:37 +00001490 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001491 if (PyTuple_CheckExact(v)) {
1492 /* Note that we can't know whether it's safe to return
1493 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001494 to exact tuples here. In contrast, lists always make
1495 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001496 Py_INCREF(v);
1497 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001498 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001499 if (PyList_Check(v))
1500 return PyList_AsTuple(v);
1501
Tim Peters6912d4d2001-05-05 03:56:37 +00001502 /* Get iterator. */
1503 it = PyObject_GetIter(v);
1504 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001505 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001506
Tim Peters6912d4d2001-05-05 03:56:37 +00001507 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001508 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001509 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001510 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1511 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1512 Py_DECREF(it);
1513 return NULL;
1514 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001515 PyErr_Clear();
1516 n = 10; /* arbitrary */
1517 }
1518 result = PyTuple_New(n);
1519 if (result == NULL)
1520 goto Fail;
1521
1522 /* Fill the tuple. */
1523 for (j = 0; ; ++j) {
1524 PyObject *item = PyIter_Next(it);
1525 if (item == NULL) {
1526 if (PyErr_Occurred())
1527 goto Fail;
1528 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001529 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001530 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001531 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001532 /* The over-allocation strategy can grow a bit faster
1533 than for lists because unlike lists the
1534 over-allocation isn't permanent -- we reclaim
1535 the excess before the end of this routine.
1536 So, grow by ten and then add 25%.
1537 */
1538 n += 10;
1539 n += n >> 2;
1540 if (n < oldn) {
1541 /* Check for overflow */
1542 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001543 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001544 goto Fail;
1545 }
Tim Peters4324aa32001-05-28 22:30:08 +00001546 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001547 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001548 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001549 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001550 }
1551 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001552 }
1553
Tim Peters6912d4d2001-05-05 03:56:37 +00001554 /* Cut tuple back if guess was too large. */
1555 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001556 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001557 goto Fail;
1558
1559 Py_DECREF(it);
1560 return result;
1561
1562Fail:
1563 Py_XDECREF(result);
1564 Py_DECREF(it);
1565 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001566}
1567
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001568PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001569PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001570{
Tim Petersf553f892001-05-01 20:45:31 +00001571 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001572 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001573
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001574 if (v == NULL)
1575 return null_error();
1576
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001577 result = PyList_New(0);
1578 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001579 return NULL;
1580
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001581 rv = _PyList_Extend((PyListObject *)result, v);
1582 if (rv == NULL) {
1583 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001584 return NULL;
1585 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001586 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001587 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001588}
1589
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001590PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001591PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001592{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001593 PyObject *it;
1594
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001595 if (v == NULL)
1596 return null_error();
1597
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001598 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001599 Py_INCREF(v);
1600 return v;
1601 }
1602
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001603 it = PyObject_GetIter(v);
1604 if (it == NULL) {
1605 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00001606 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001607 return NULL;
1608 }
1609
Raymond Hettinger193814c2004-12-18 19:00:59 +00001610 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001611 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001612
1613 return v;
1614}
1615
Tim Peters16a77ad2001-09-08 04:00:12 +00001616/* Iterate over seq. Result depends on the operation:
1617 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1618 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1619 set ValueError and return -1 if none found; also return -1 on error.
1620 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1621*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001622Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001623_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001624{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001625 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001626 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1627 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001628
Tim Peters16a77ad2001-09-08 04:00:12 +00001629 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001630 null_error();
1631 return -1;
1632 }
Tim Peters75f8e352001-05-05 11:33:43 +00001633
Tim Peters16a77ad2001-09-08 04:00:12 +00001634 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001635 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00001636 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001637 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001638 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001639
Tim Peters16a77ad2001-09-08 04:00:12 +00001640 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001641 for (;;) {
1642 int cmp;
1643 PyObject *item = PyIter_Next(it);
1644 if (item == NULL) {
1645 if (PyErr_Occurred())
1646 goto Fail;
1647 break;
1648 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001649
1650 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001651 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001652 if (cmp < 0)
1653 goto Fail;
1654 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001655 switch (operation) {
1656 case PY_ITERSEARCH_COUNT:
1657 ++n;
1658 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001659 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001660 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001661 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001662 goto Fail;
1663 }
1664 break;
1665
1666 case PY_ITERSEARCH_INDEX:
1667 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001668 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001669 PyErr_SetString(PyExc_OverflowError,
1670 "index exceeds C int size");
1671 goto Fail;
1672 }
1673 goto Done;
1674
1675 case PY_ITERSEARCH_CONTAINS:
1676 n = 1;
1677 goto Done;
1678
1679 default:
1680 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001681 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001682 }
1683
1684 if (operation == PY_ITERSEARCH_INDEX) {
1685 ++n;
1686 if (n <= 0)
1687 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001688 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001689 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001690
1691 if (operation != PY_ITERSEARCH_INDEX)
1692 goto Done;
1693
1694 PyErr_SetString(PyExc_ValueError,
1695 "sequence.index(x): x not in sequence");
1696 /* fall into failure code */
1697Fail:
1698 n = -1;
1699 /* fall through */
1700Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001701 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001702 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001703
Guido van Rossume15dee51995-07-18 14:12:02 +00001704}
1705
Tim Peters16a77ad2001-09-08 04:00:12 +00001706/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001707Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001708PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001709{
Tim Peters16a77ad2001-09-08 04:00:12 +00001710 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001711}
1712
Tim Peterscb8d3682001-05-05 21:05:01 +00001713/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001714 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001715 */
1716int
1717PySequence_Contains(PyObject *seq, PyObject *ob)
1718{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001719 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001720 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1721 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1722 if (sqm != NULL && sqm->sq_contains != NULL)
1723 return (*sqm->sq_contains)(seq, ob);
1724 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001725 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1726 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001727}
1728
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001729/* Backwards compatibility */
1730#undef PySequence_In
1731int
Fred Drake79912472000-07-09 04:06:11 +00001732PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001733{
1734 return PySequence_Contains(w, v);
1735}
1736
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001737Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001738PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001739{
Tim Peters16a77ad2001-09-08 04:00:12 +00001740 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001741}
1742
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001743/* Operations on mappings */
1744
1745int
Fred Drake79912472000-07-09 04:06:11 +00001746PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001747{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001748 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001749 return PyObject_HasAttrString(o, "__getitem__");
1750
1751 return o && o->ob_type->tp_as_mapping &&
1752 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001753 !(o->ob_type->tp_as_sequence &&
1754 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001755}
1756
Martin v. Löwis18e16552006-02-15 17:27:45 +00001757Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001758PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001759{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001761
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001762 if (o == NULL) {
1763 null_error();
1764 return -1;
1765 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001766
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001767 m = o->ob_type->tp_as_mapping;
1768 if (m && m->mp_length)
1769 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001770
Georg Brandlb0061c82006-08-08 11:56:21 +00001771 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001772 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001773}
1774
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001775#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001776Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001777PyMapping_Length(PyObject *o)
1778{
1779 return PyMapping_Size(o);
1780}
1781#define PyMapping_Length PyMapping_Size
1782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001783PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001784PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001785{
1786 PyObject *okey, *r;
1787
1788 if (key == NULL)
1789 return null_error();
1790
1791 okey = PyString_FromString(key);
1792 if (okey == NULL)
1793 return NULL;
1794 r = PyObject_GetItem(o, okey);
1795 Py_DECREF(okey);
1796 return r;
1797}
1798
1799int
Fred Drake79912472000-07-09 04:06:11 +00001800PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001801{
1802 PyObject *okey;
1803 int r;
1804
1805 if (key == NULL) {
1806 null_error();
1807 return -1;
1808 }
1809
1810 okey = PyString_FromString(key);
1811 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001812 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001813 r = PyObject_SetItem(o, okey, value);
1814 Py_DECREF(okey);
1815 return r;
1816}
1817
1818int
Fred Drake79912472000-07-09 04:06:11 +00001819PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001820{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001821 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001822
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001823 v = PyMapping_GetItemString(o, key);
1824 if (v) {
1825 Py_DECREF(v);
1826 return 1;
1827 }
1828 PyErr_Clear();
1829 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001830}
1831
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001832int
Fred Drake79912472000-07-09 04:06:11 +00001833PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001834{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001835 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001836
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001837 v = PyObject_GetItem(o, key);
1838 if (v) {
1839 Py_DECREF(v);
1840 return 1;
1841 }
1842 PyErr_Clear();
1843 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001844}
1845
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001846/* Operations on callable objects */
1847
1848/* XXX PyCallable_Check() is in object.c */
1849
Guido van Rossume15dee51995-07-18 14:12:02 +00001850PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001851PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001852{
Guido van Rossum5560b742001-09-14 16:47:50 +00001853 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001854}
Guido van Rossume15dee51995-07-18 14:12:02 +00001855
1856PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001857PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1858{
1859 ternaryfunc call;
1860
1861 if ((call = func->ob_type->tp_call) != NULL) {
Armin Rigo53c1692f2006-06-21 21:58:50 +00001862 PyObject *result = (*call)(func, arg, kw);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001863 if (result == NULL && !PyErr_Occurred())
1864 PyErr_SetString(
1865 PyExc_SystemError,
1866 "NULL result without error in PyObject_Call");
1867 return result;
1868 }
Georg Brandlccff7852006-06-18 22:17:29 +00001869 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00001870 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001871 return NULL;
1872}
1873
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001874static PyObject*
1875call_function_tail(PyObject *callable, PyObject *args)
1876{
1877 PyObject *retval;
1878
1879 if (args == NULL)
1880 return NULL;
1881
1882 if (!PyTuple_Check(args)) {
1883 PyObject *a;
1884
1885 a = PyTuple_New(1);
1886 if (a == NULL) {
1887 Py_DECREF(args);
1888 return NULL;
1889 }
1890 PyTuple_SET_ITEM(a, 0, args);
1891 args = a;
1892 }
1893 retval = PyObject_Call(callable, args, NULL);
1894
1895 Py_DECREF(args);
1896
1897 return retval;
1898}
1899
Tim Peters6d6c1a32001-08-02 04:15:00 +00001900PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001901PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001902{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001903 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001904 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001905
Fred Drakeb92cf062001-10-27 06:16:31 +00001906 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001907 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001908
Fred Drakeb92cf062001-10-27 06:16:31 +00001909 if (format && *format) {
1910 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001911 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001912 va_end(va);
1913 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001914 else
1915 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001916
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001917 return call_function_tail(callable, args);
1918}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001919
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001920PyObject *
1921_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1922{
1923 va_list va;
1924 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001925
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001926 if (callable == NULL)
1927 return null_error();
1928
1929 if (format && *format) {
1930 va_start(va, format);
1931 args = _Py_VaBuildValue_SizeT(format, va);
1932 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001933 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001934 else
1935 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001936
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001937 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001938}
1939
1940PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001941PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001942{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001943 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001944 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001945 PyObject *func = NULL;
1946 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001947
Fred Drakeb92cf062001-10-27 06:16:31 +00001948 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001949 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001950
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001951 func = PyObject_GetAttrString(o, name);
1952 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001953 PyErr_SetString(PyExc_AttributeError, name);
1954 return 0;
1955 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001956
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001957 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00001958 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001959 goto exit;
1960 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001961
Fred Drakeb92cf062001-10-27 06:16:31 +00001962 if (format && *format) {
1963 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001964 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001965 va_end(va);
1966 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001967 else
1968 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001969
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001970 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001971
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001972 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001973 /* args gets consumed in call_function_tail */
1974 Py_XDECREF(func);
1975
1976 return retval;
1977}
1978
1979PyObject *
1980_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1981{
1982 va_list va;
1983 PyObject *args;
1984 PyObject *func = NULL;
1985 PyObject *retval = NULL;
1986
1987 if (o == NULL || name == NULL)
1988 return null_error();
1989
1990 func = PyObject_GetAttrString(o, name);
1991 if (func == NULL) {
1992 PyErr_SetString(PyExc_AttributeError, name);
1993 return 0;
1994 }
1995
1996 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00001997 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001998 goto exit;
1999 }
2000
2001 if (format && *format) {
2002 va_start(va, format);
2003 args = _Py_VaBuildValue_SizeT(format, va);
2004 va_end(va);
2005 }
2006 else
2007 args = PyTuple_New(0);
2008
2009 retval = call_function_tail(func, args);
2010
2011 exit:
2012 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002013 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002014
2015 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002016}
Guido van Rossum823649d2001-03-21 18:40:58 +00002017
2018
Fred Drakeb421b8c2001-10-26 16:21:32 +00002019static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002020objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002021{
2022 int i, n = 0;
2023 va_list countva;
2024 PyObject *result, *tmp;
2025
2026#ifdef VA_LIST_IS_ARRAY
2027 memcpy(countva, va, sizeof(va_list));
2028#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002029#ifdef __va_copy
2030 __va_copy(countva, va);
2031#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002032 countva = va;
2033#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002034#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002035
2036 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2037 ++n;
2038 result = PyTuple_New(n);
2039 if (result != NULL && n > 0) {
2040 for (i = 0; i < n; ++i) {
2041 tmp = (PyObject *)va_arg(va, PyObject *);
2042 PyTuple_SET_ITEM(result, i, tmp);
2043 Py_INCREF(tmp);
2044 }
2045 }
2046 return result;
2047}
2048
2049PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002050PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002051{
2052 PyObject *args, *tmp;
2053 va_list vargs;
2054
2055 if (callable == NULL || name == NULL)
2056 return null_error();
2057
2058 callable = PyObject_GetAttr(callable, name);
2059 if (callable == NULL)
2060 return NULL;
2061
2062 /* count the args */
2063 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002064 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002065 va_end(vargs);
2066 if (args == NULL) {
2067 Py_DECREF(callable);
2068 return NULL;
2069 }
2070 tmp = PyObject_Call(callable, args, NULL);
2071 Py_DECREF(args);
2072 Py_DECREF(callable);
2073
2074 return tmp;
2075}
2076
2077PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002078PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002079{
2080 PyObject *args, *tmp;
2081 va_list vargs;
2082
2083 if (callable == NULL)
2084 return null_error();
2085
2086 /* count the args */
2087 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002088 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002089 va_end(vargs);
2090 if (args == NULL)
2091 return NULL;
2092 tmp = PyObject_Call(callable, args, NULL);
2093 Py_DECREF(args);
2094
2095 return tmp;
2096}
2097
2098
Guido van Rossum823649d2001-03-21 18:40:58 +00002099/* isinstance(), issubclass() */
2100
Barry Warsawf16951c2002-04-23 22:45:44 +00002101/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2102 * state that will almost never happen.
2103 *
2104 * 0. creating the __bases__ static string could get a MemoryError
2105 * 1. getattr(cls, '__bases__') could raise an AttributeError
2106 * 2. getattr(cls, '__bases__') could raise some other exception
2107 * 3. getattr(cls, '__bases__') could return a tuple
2108 * 4. getattr(cls, '__bases__') could return something other than a tuple
2109 *
2110 * Only state #3 is a non-error state and only it returns a non-NULL object
2111 * (it returns the retrieved tuple).
2112 *
2113 * Any raised AttributeErrors are masked by clearing the exception and
2114 * returning NULL. If an object other than a tuple comes out of __bases__,
2115 * then again, the return value is NULL. So yes, these two situations
2116 * produce exactly the same results: NULL is returned and no error is set.
2117 *
2118 * If some exception other than AttributeError is raised, then NULL is also
2119 * returned, but the exception is not cleared. That's because we want the
2120 * exception to be propagated along.
2121 *
2122 * Callers are expected to test for PyErr_Occurred() when the return value
2123 * is NULL to decide whether a valid exception should be propagated or not.
2124 * When there's no exception to propagate, it's customary for the caller to
2125 * set a TypeError.
2126 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002127static PyObject *
2128abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002129{
2130 static PyObject *__bases__ = NULL;
2131 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002132
2133 if (__bases__ == NULL) {
2134 __bases__ = PyString_FromString("__bases__");
2135 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002136 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002137 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002138 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002139 if (bases == NULL) {
2140 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2141 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002142 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002143 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002144 if (!PyTuple_Check(bases)) {
2145 Py_DECREF(bases);
2146 return NULL;
2147 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002148 return bases;
2149}
2150
2151
2152static int
2153abstract_issubclass(PyObject *derived, PyObject *cls)
2154{
2155 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002156 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002157 int r = 0;
2158
2159
Guido van Rossum823649d2001-03-21 18:40:58 +00002160 if (derived == cls)
2161 return 1;
2162
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002163 if (PyTuple_Check(cls)) {
2164 /* Not a general sequence -- that opens up the road to
2165 recursion and stack overflow. */
2166 n = PyTuple_GET_SIZE(cls);
2167 for (i = 0; i < n; i++) {
2168 if (derived == PyTuple_GET_ITEM(cls, i))
2169 return 1;
2170 }
2171 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002172 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002173 if (bases == NULL) {
2174 if (PyErr_Occurred())
2175 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002176 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002177 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002178 n = PyTuple_GET_SIZE(bases);
2179 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002180 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002181 if (r != 0)
2182 break;
2183 }
2184
2185 Py_DECREF(bases);
2186
2187 return r;
2188}
2189
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002190static int
2191check_class(PyObject *cls, const char *error)
2192{
2193 PyObject *bases = abstract_get_bases(cls);
2194 if (bases == NULL) {
2195 /* Do not mask errors. */
2196 if (!PyErr_Occurred())
2197 PyErr_SetString(PyExc_TypeError, error);
2198 return 0;
2199 }
2200 Py_DECREF(bases);
2201 return -1;
2202}
2203
Brett Cannon4f653312004-03-20 22:52:14 +00002204static int
2205recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002206{
2207 PyObject *icls;
2208 static PyObject *__class__ = NULL;
2209 int retval = 0;
2210
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002211 if (__class__ == NULL) {
2212 __class__ = PyString_FromString("__class__");
2213 if (__class__ == NULL)
2214 return -1;
2215 }
2216
Neil Schemenauer6b471292001-10-18 03:18:43 +00002217 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2218 PyObject *inclass =
2219 (PyObject*)((PyInstanceObject*)inst)->in_class;
2220 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002221 }
2222 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002223 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002224 if (retval == 0) {
2225 PyObject *c = PyObject_GetAttr(inst, __class__);
2226 if (c == NULL) {
2227 PyErr_Clear();
2228 }
2229 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002230 if (c != (PyObject *)(inst->ob_type) &&
2231 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002232 retval = PyType_IsSubtype(
2233 (PyTypeObject *)c,
2234 (PyTypeObject *)cls);
2235 Py_DECREF(c);
2236 }
2237 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002238 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002239 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002240 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002241
Brett Cannon4f653312004-03-20 22:52:14 +00002242 if (!recursion_depth) {
2243 PyErr_SetString(PyExc_RuntimeError,
2244 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002245 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002246 }
2247
Guido van Rossum03290ec2001-10-07 20:54:12 +00002248 n = PyTuple_GET_SIZE(cls);
2249 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002250 retval = recursive_isinstance(
2251 inst,
2252 PyTuple_GET_ITEM(cls, i),
2253 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002254 if (retval != 0)
2255 break;
2256 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002257 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002258 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002259 if (!check_class(cls,
2260 "isinstance() arg 2 must be a class, type,"
2261 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002262 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002263 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002264 if (icls == NULL) {
2265 PyErr_Clear();
2266 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002267 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002268 else {
2269 retval = abstract_issubclass(icls, cls);
2270 Py_DECREF(icls);
2271 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002272 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002273
Guido van Rossum823649d2001-03-21 18:40:58 +00002274 return retval;
2275}
2276
2277int
Brett Cannon4f653312004-03-20 22:52:14 +00002278PyObject_IsInstance(PyObject *inst, PyObject *cls)
2279{
2280 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2281}
2282
2283static int
2284recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002285{
2286 int retval;
2287
2288 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002289 if (!check_class(derived,
2290 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002291 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002292
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002293 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002294 Py_ssize_t i;
2295 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002296
2297 if (!recursion_depth) {
2298 PyErr_SetString(PyExc_RuntimeError,
2299 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002300 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002301 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002302 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002303 retval = recursive_issubclass(
2304 derived,
2305 PyTuple_GET_ITEM(cls, i),
2306 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002307 if (retval != 0) {
2308 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002309 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002310 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002311 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002312 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002313 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002314 else {
2315 if (!check_class(cls,
2316 "issubclass() arg 2 must be a class"
2317 " or tuple of classes"))
2318 return -1;
2319 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002320
2321 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002322 }
2323 else {
2324 /* shortcut */
2325 if (!(retval = (derived == cls)))
2326 retval = PyClass_IsSubclass(derived, cls);
2327 }
2328
2329 return retval;
2330}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002331
Brett Cannon4f653312004-03-20 22:52:14 +00002332int
2333PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2334{
2335 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2336}
2337
2338
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002339PyObject *
2340PyObject_GetIter(PyObject *o)
2341{
2342 PyTypeObject *t = o->ob_type;
2343 getiterfunc f = NULL;
2344 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2345 f = t->tp_iter;
2346 if (f == NULL) {
2347 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002348 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00002349 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002350 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002351 else {
2352 PyObject *res = (*f)(o);
2353 if (res != NULL && !PyIter_Check(res)) {
2354 PyErr_Format(PyExc_TypeError,
2355 "iter() returned non-iterator "
2356 "of type '%.100s'",
2357 res->ob_type->tp_name);
2358 Py_DECREF(res);
2359 res = NULL;
2360 }
2361 return res;
2362 }
2363}
2364
Tim Petersf4848da2001-05-05 00:14:56 +00002365/* Return next item.
2366 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2367 * If the iteration terminates normally, return NULL and clear the
2368 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2369 * will be false.
2370 * Else return the next object. PyErr_Occurred() will be false.
2371 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002372PyObject *
2373PyIter_Next(PyObject *iter)
2374{
Tim Petersf4848da2001-05-05 00:14:56 +00002375 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002376 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002377 result = (*iter->ob_type->tp_iternext)(iter);
2378 if (result == NULL &&
2379 PyErr_Occurred() &&
2380 PyErr_ExceptionMatches(PyExc_StopIteration))
2381 PyErr_Clear();
2382 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002383}