blob: 7115c523c2daa417eaf5c787db5bbc2295145d0f [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();
Neal Norwitz271a8682006-08-15 06:29:03 +0000948 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000949 Py_INCREF(item);
950 return item;
951 }
952 if (PyIndex_Check(item)) {
953 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000954 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +0000955 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000956 PyErr_Format(PyExc_TypeError,
957 "__index__ returned non-(int,long) " \
958 "(type %.200s)",
959 result->ob_type->tp_name);
960 Py_DECREF(result);
961 return NULL;
962 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000963 }
964 else {
Armin Rigo314861c2006-03-30 14:04:02 +0000965 PyErr_Format(PyExc_TypeError,
966 "'%.200s' object cannot be interpreted "
967 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000968 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000969 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000970}
971
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000972/* Return an error on Overflow only if err is not NULL*/
973
974Py_ssize_t
975PyNumber_AsSsize_t(PyObject *item, PyObject *err)
976{
977 Py_ssize_t result;
978 PyObject *runerr;
979 PyObject *value = PyNumber_Index(item);
980 if (value == NULL)
981 return -1;
982
983 /* We're done if PyInt_AsSsize_t() returns without error. */
984 result = PyInt_AsSsize_t(value);
985 if (result != -1 || !(runerr = PyErr_Occurred()))
986 goto finish;
987
988 /* Error handling code -- only manage OverflowError differently */
989 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
990 goto finish;
991
992 PyErr_Clear();
993 /* If no error-handling desired then the default clipping
994 is sufficient.
995 */
996 if (!err) {
997 assert(PyLong_Check(value));
998 /* Whether or not it is less than or equal to
999 zero is determined by the sign of ob_size
1000 */
1001 if (_PyLong_Sign(value) < 0)
1002 result = PY_SSIZE_T_MIN;
1003 else
1004 result = PY_SSIZE_T_MAX;
1005 }
1006 else {
1007 /* Otherwise replace the error with caller's error object. */
1008 PyErr_Format(err,
1009 "cannot fit '%.200s' into an index-sized integer",
1010 item->ob_type->tp_name);
1011 }
1012
1013 finish:
1014 Py_DECREF(value);
1015 return result;
1016}
1017
1018
Guido van Rossume15dee51995-07-18 14:12:02 +00001019PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001020PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001021{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001023 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001024 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001025
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001026 if (o == NULL)
1027 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001028 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001029 Py_INCREF(o);
1030 return o;
1031 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001032 m = o->ob_type->tp_as_number;
1033 if (m && m->nb_int) { /* This should include subclasses of int */
1034 PyObject *res = m->nb_int(o);
1035 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1036 PyErr_Format(PyExc_TypeError,
1037 "__int__ returned non-int (type %.200s)",
1038 res->ob_type->tp_name);
1039 Py_DECREF(res);
1040 return NULL;
1041 }
1042 return res;
1043 }
1044 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001045 PyIntObject *io = (PyIntObject*)o;
1046 return PyInt_FromLong(io->ob_ival);
1047 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001048 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001049 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +00001050 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001051#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001052 if (PyUnicode_Check(o))
1053 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1054 PyUnicode_GET_SIZE(o),
1055 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001056#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001057 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001058 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001059
Georg Brandlccff7852006-06-18 22:17:29 +00001060 return type_error("int() argument must be a string or a "
1061 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001062}
1063
Guido van Rossum9e896b32000-04-05 20:11:21 +00001064/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001065static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001066long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001067{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001068 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001069 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001070
Guido van Rossum4c08d552000-03-10 22:55:18 +00001071 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001072 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001073 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001074 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001075 PyErr_SetString(PyExc_ValueError,
1076 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001077 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001078 return NULL;
1079 }
1080 return x;
1081}
1082
Guido van Rossume15dee51995-07-18 14:12:02 +00001083PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001084PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001085{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001086 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001087 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001088 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001089
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001090 if (o == NULL)
1091 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001092 m = o->ob_type->tp_as_number;
1093 if (m && m->nb_long) { /* This should include subclasses of long */
1094 PyObject *res = m->nb_long(o);
1095 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1096 PyErr_Format(PyExc_TypeError,
1097 "__long__ returned non-long (type %.200s)",
1098 res->ob_type->tp_name);
1099 Py_DECREF(res);
1100 return NULL;
1101 }
1102 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001103 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001104 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001105 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001107 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001108 * doesn't do. In particular long('9.5') must raise an
1109 * exception, not truncate the float.
1110 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001111 return long_from_string(PyString_AS_STRING(o),
1112 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001113#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001114 if (PyUnicode_Check(o))
1115 /* The above check is done in PyLong_FromUnicode(). */
1116 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1117 PyUnicode_GET_SIZE(o),
1118 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001119#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001120 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1121 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001122
Georg Brandlccff7852006-06-18 22:17:29 +00001123 return type_error("long() argument must be a string or a "
1124 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001125}
1126
1127PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001128PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001129{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001131
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 if (o == NULL)
1133 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001134 m = o->ob_type->tp_as_number;
1135 if (m && m->nb_float) { /* This should include subclasses of float */
1136 PyObject *res = m->nb_float(o);
1137 if (res && !PyFloat_Check(res)) {
1138 PyErr_Format(PyExc_TypeError,
1139 "__float__ returned non-float (type %.200s)",
1140 res->ob_type->tp_name);
1141 Py_DECREF(res);
1142 return NULL;
1143 }
1144 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001145 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001146 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001147 PyFloatObject *po = (PyFloatObject *)o;
1148 return PyFloat_FromDouble(po->ob_fval);
1149 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001150 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001151}
1152
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001153/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001154
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001155int
Fred Drake79912472000-07-09 04:06:11 +00001156PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001157{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001158 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001159 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001160 return s != NULL && s->ob_type->tp_as_sequence &&
1161 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001162}
1163
Martin v. Löwis18e16552006-02-15 17:27:45 +00001164Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001165PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001166{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001167 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001168
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001169 if (s == NULL) {
1170 null_error();
1171 return -1;
1172 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001173
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174 m = s->ob_type->tp_as_sequence;
1175 if (m && m->sq_length)
1176 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001177
Georg Brandlb0061c82006-08-08 11:56:21 +00001178 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001179 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001180}
1181
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001182#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001183Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001184PySequence_Length(PyObject *s)
1185{
1186 return PySequence_Size(s);
1187}
1188#define PySequence_Length PySequence_Size
1189
Guido van Rossume15dee51995-07-18 14:12:02 +00001190PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001191PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001192{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001194
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001195 if (s == NULL || o == NULL)
1196 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001197
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198 m = s->ob_type->tp_as_sequence;
1199 if (m && m->sq_concat)
1200 return m->sq_concat(s, o);
1201
Armin Rigofd163f92005-12-29 15:59:19 +00001202 /* Instances of user classes defining an __add__() method only
1203 have an nb_add slot, not an sq_concat slot. So we fall back
1204 to nb_add if both arguments appear to be sequences. */
1205 if (PySequence_Check(s) && PySequence_Check(o)) {
1206 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1207 if (result != Py_NotImplemented)
1208 return result;
1209 Py_DECREF(result);
1210 }
Georg Brandlccff7852006-06-18 22:17:29 +00001211 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001212}
1213
1214PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001215PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001216{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001218
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001219 if (o == NULL)
1220 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001221
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222 m = o->ob_type->tp_as_sequence;
1223 if (m && m->sq_repeat)
1224 return m->sq_repeat(o, count);
1225
Armin Rigofd163f92005-12-29 15:59:19 +00001226 /* Instances of user classes defining a __mul__() method only
1227 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1228 to nb_multiply if o appears to be a sequence. */
1229 if (PySequence_Check(o)) {
1230 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001231 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001232 if (n == NULL)
1233 return NULL;
1234 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1235 Py_DECREF(n);
1236 if (result != Py_NotImplemented)
1237 return result;
1238 Py_DECREF(result);
1239 }
Georg Brandlccff7852006-06-18 22:17:29 +00001240 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001241}
1242
1243PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001244PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1245{
1246 PySequenceMethods *m;
1247
1248 if (s == NULL || o == NULL)
1249 return null_error();
1250
1251 m = s->ob_type->tp_as_sequence;
1252 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1253 return m->sq_inplace_concat(s, o);
1254 if (m && m->sq_concat)
1255 return m->sq_concat(s, o);
1256
Armin Rigofd163f92005-12-29 15:59:19 +00001257 if (PySequence_Check(s) && PySequence_Check(o)) {
1258 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1259 NB_SLOT(nb_add));
1260 if (result != Py_NotImplemented)
1261 return result;
1262 Py_DECREF(result);
1263 }
Georg Brandlccff7852006-06-18 22:17:29 +00001264 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001265}
1266
1267PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001268PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001269{
1270 PySequenceMethods *m;
1271
1272 if (o == NULL)
1273 return null_error();
1274
1275 m = o->ob_type->tp_as_sequence;
1276 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1277 return m->sq_inplace_repeat(o, count);
1278 if (m && m->sq_repeat)
1279 return m->sq_repeat(o, count);
1280
Armin Rigofd163f92005-12-29 15:59:19 +00001281 if (PySequence_Check(o)) {
1282 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001283 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001284 if (n == NULL)
1285 return NULL;
1286 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1287 NB_SLOT(nb_multiply));
1288 Py_DECREF(n);
1289 if (result != Py_NotImplemented)
1290 return result;
1291 Py_DECREF(result);
1292 }
Georg Brandlccff7852006-06-18 22:17:29 +00001293 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001294}
1295
1296PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001297PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001298{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001299 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001300
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301 if (s == NULL)
1302 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001303
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 m = s->ob_type->tp_as_sequence;
1305 if (m && m->sq_item) {
1306 if (i < 0) {
1307 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001308 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001309 if (l < 0)
1310 return NULL;
1311 i += l;
1312 }
1313 }
1314 return m->sq_item(s, i);
1315 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001316
Georg Brandlccff7852006-06-18 22:17:29 +00001317 return type_error("'%.200s' object is unindexable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001318}
1319
1320PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001321PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001322{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001324 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001325
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 m = s->ob_type->tp_as_sequence;
1329 if (m && m->sq_slice) {
1330 if (i1 < 0 || i2 < 0) {
1331 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001332 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 if (l < 0)
1334 return NULL;
1335 if (i1 < 0)
1336 i1 += l;
1337 if (i2 < 0)
1338 i2 += l;
1339 }
1340 }
1341 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001342 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1343 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001344 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001345 if (!slice)
1346 return NULL;
1347 res = mp->mp_subscript(s, slice);
1348 Py_DECREF(slice);
1349 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001350 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001351
Georg Brandlccff7852006-06-18 22:17:29 +00001352 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001353}
1354
1355int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001356PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001357{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001358 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001359
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 if (s == NULL) {
1361 null_error();
1362 return -1;
1363 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001364
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001365 m = s->ob_type->tp_as_sequence;
1366 if (m && m->sq_ass_item) {
1367 if (i < 0) {
1368 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001369 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001370 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001371 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 i += l;
1373 }
1374 }
1375 return m->sq_ass_item(s, i, o);
1376 }
1377
Georg Brandlccff7852006-06-18 22:17:29 +00001378 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001379 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001380}
1381
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001382int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001383PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001384{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001385 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001386
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001387 if (s == NULL) {
1388 null_error();
1389 return -1;
1390 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001391
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 m = s->ob_type->tp_as_sequence;
1393 if (m && m->sq_ass_item) {
1394 if (i < 0) {
1395 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001396 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001398 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 i += l;
1400 }
1401 }
1402 return m->sq_ass_item(s, i, (PyObject *)NULL);
1403 }
1404
Georg Brandlccff7852006-06-18 22:17:29 +00001405 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001406 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001407}
1408
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001409int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001410PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001411{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001412 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001413 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001414
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001415 if (s == NULL) {
1416 null_error();
1417 return -1;
1418 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001419
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001420 m = s->ob_type->tp_as_sequence;
1421 if (m && m->sq_ass_slice) {
1422 if (i1 < 0 || i2 < 0) {
1423 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001424 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001426 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 if (i1 < 0)
1428 i1 += l;
1429 if (i2 < 0)
1430 i2 += l;
1431 }
1432 }
1433 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001434 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1435 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001436 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001437 if (!slice)
1438 return -1;
1439 res = mp->mp_ass_subscript(s, slice, o);
1440 Py_DECREF(slice);
1441 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001443
Georg Brandlccff7852006-06-18 22:17:29 +00001444 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001446}
1447
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001448int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001449PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001450{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001451 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001452
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453 if (s == NULL) {
1454 null_error();
1455 return -1;
1456 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001457
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001458 m = s->ob_type->tp_as_sequence;
1459 if (m && m->sq_ass_slice) {
1460 if (i1 < 0 || i2 < 0) {
1461 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001462 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001463 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001464 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001465 if (i1 < 0)
1466 i1 += l;
1467 if (i2 < 0)
1468 i2 += l;
1469 }
1470 }
1471 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1472 }
Georg Brandlccff7852006-06-18 22:17:29 +00001473 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001475}
1476
Guido van Rossume15dee51995-07-18 14:12:02 +00001477PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001478PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001479{
Tim Peters6912d4d2001-05-05 03:56:37 +00001480 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001481 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001482 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001483 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001484
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001485 if (v == NULL)
1486 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001487
Tim Peters6912d4d2001-05-05 03:56:37 +00001488 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001489 if (PyTuple_CheckExact(v)) {
1490 /* Note that we can't know whether it's safe to return
1491 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001492 to exact tuples here. In contrast, lists always make
1493 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001494 Py_INCREF(v);
1495 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001496 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001497 if (PyList_Check(v))
1498 return PyList_AsTuple(v);
1499
Tim Peters6912d4d2001-05-05 03:56:37 +00001500 /* Get iterator. */
1501 it = PyObject_GetIter(v);
1502 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001503 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001504
Tim Peters6912d4d2001-05-05 03:56:37 +00001505 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001506 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001507 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001508 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1509 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1510 Py_DECREF(it);
1511 return NULL;
1512 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001513 PyErr_Clear();
1514 n = 10; /* arbitrary */
1515 }
1516 result = PyTuple_New(n);
1517 if (result == NULL)
1518 goto Fail;
1519
1520 /* Fill the tuple. */
1521 for (j = 0; ; ++j) {
1522 PyObject *item = PyIter_Next(it);
1523 if (item == NULL) {
1524 if (PyErr_Occurred())
1525 goto Fail;
1526 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001527 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001528 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001529 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001530 /* The over-allocation strategy can grow a bit faster
1531 than for lists because unlike lists the
1532 over-allocation isn't permanent -- we reclaim
1533 the excess before the end of this routine.
1534 So, grow by ten and then add 25%.
1535 */
1536 n += 10;
1537 n += n >> 2;
1538 if (n < oldn) {
1539 /* Check for overflow */
1540 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001541 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001542 goto Fail;
1543 }
Tim Peters4324aa32001-05-28 22:30:08 +00001544 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001545 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001546 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001547 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001548 }
1549 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001550 }
1551
Tim Peters6912d4d2001-05-05 03:56:37 +00001552 /* Cut tuple back if guess was too large. */
1553 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001554 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001555 goto Fail;
1556
1557 Py_DECREF(it);
1558 return result;
1559
1560Fail:
1561 Py_XDECREF(result);
1562 Py_DECREF(it);
1563 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001564}
1565
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001566PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001567PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001568{
Tim Petersf553f892001-05-01 20:45:31 +00001569 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001570 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001571
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001572 if (v == NULL)
1573 return null_error();
1574
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001575 result = PyList_New(0);
1576 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001577 return NULL;
1578
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001579 rv = _PyList_Extend((PyListObject *)result, v);
1580 if (rv == NULL) {
1581 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001582 return NULL;
1583 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001584 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001585 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001586}
1587
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001588PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001589PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001590{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001591 PyObject *it;
1592
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001593 if (v == NULL)
1594 return null_error();
1595
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001596 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001597 Py_INCREF(v);
1598 return v;
1599 }
1600
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001601 it = PyObject_GetIter(v);
1602 if (it == NULL) {
1603 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00001604 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001605 return NULL;
1606 }
1607
Raymond Hettinger193814c2004-12-18 19:00:59 +00001608 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001609 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001610
1611 return v;
1612}
1613
Tim Peters16a77ad2001-09-08 04:00:12 +00001614/* Iterate over seq. Result depends on the operation:
1615 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1616 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1617 set ValueError and return -1 if none found; also return -1 on error.
1618 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1619*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001620Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001621_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001622{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001623 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001624 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1625 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001626
Tim Peters16a77ad2001-09-08 04:00:12 +00001627 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001628 null_error();
1629 return -1;
1630 }
Tim Peters75f8e352001-05-05 11:33:43 +00001631
Tim Peters16a77ad2001-09-08 04:00:12 +00001632 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001633 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00001634 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001635 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001636 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001637
Tim Peters16a77ad2001-09-08 04:00:12 +00001638 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001639 for (;;) {
1640 int cmp;
1641 PyObject *item = PyIter_Next(it);
1642 if (item == NULL) {
1643 if (PyErr_Occurred())
1644 goto Fail;
1645 break;
1646 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001647
1648 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001649 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001650 if (cmp < 0)
1651 goto Fail;
1652 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001653 switch (operation) {
1654 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00001655 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001656 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00001657 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001658 goto Fail;
1659 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001660 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001661 break;
1662
1663 case PY_ITERSEARCH_INDEX:
1664 if (wrapped) {
1665 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00001666 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001667 goto Fail;
1668 }
1669 goto Done;
1670
1671 case PY_ITERSEARCH_CONTAINS:
1672 n = 1;
1673 goto Done;
1674
1675 default:
1676 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001677 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001678 }
1679
1680 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00001681 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00001682 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001683 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00001684 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001685 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001686
1687 if (operation != PY_ITERSEARCH_INDEX)
1688 goto Done;
1689
1690 PyErr_SetString(PyExc_ValueError,
1691 "sequence.index(x): x not in sequence");
1692 /* fall into failure code */
1693Fail:
1694 n = -1;
1695 /* fall through */
1696Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001697 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001698 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001699
Guido van Rossume15dee51995-07-18 14:12:02 +00001700}
1701
Tim Peters16a77ad2001-09-08 04:00:12 +00001702/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001703Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001704PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001705{
Tim Peters16a77ad2001-09-08 04:00:12 +00001706 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001707}
1708
Tim Peterscb8d3682001-05-05 21:05:01 +00001709/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001710 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001711 */
1712int
1713PySequence_Contains(PyObject *seq, PyObject *ob)
1714{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001715 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001716 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1717 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1718 if (sqm != NULL && sqm->sq_contains != NULL)
1719 return (*sqm->sq_contains)(seq, ob);
1720 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001721 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1722 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001723}
1724
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001725/* Backwards compatibility */
1726#undef PySequence_In
1727int
Fred Drake79912472000-07-09 04:06:11 +00001728PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001729{
1730 return PySequence_Contains(w, v);
1731}
1732
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001733Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001734PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001735{
Tim Peters16a77ad2001-09-08 04:00:12 +00001736 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001737}
1738
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001739/* Operations on mappings */
1740
1741int
Fred Drake79912472000-07-09 04:06:11 +00001742PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001743{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001744 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001745 return PyObject_HasAttrString(o, "__getitem__");
1746
1747 return o && o->ob_type->tp_as_mapping &&
1748 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001749 !(o->ob_type->tp_as_sequence &&
1750 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001751}
1752
Martin v. Löwis18e16552006-02-15 17:27:45 +00001753Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001754PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001755{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001756 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001757
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001758 if (o == NULL) {
1759 null_error();
1760 return -1;
1761 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001762
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001763 m = o->ob_type->tp_as_mapping;
1764 if (m && m->mp_length)
1765 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001766
Georg Brandlb0061c82006-08-08 11:56:21 +00001767 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001768 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001769}
1770
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001771#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001772Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001773PyMapping_Length(PyObject *o)
1774{
1775 return PyMapping_Size(o);
1776}
1777#define PyMapping_Length PyMapping_Size
1778
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001779PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001780PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001781{
1782 PyObject *okey, *r;
1783
1784 if (key == NULL)
1785 return null_error();
1786
1787 okey = PyString_FromString(key);
1788 if (okey == NULL)
1789 return NULL;
1790 r = PyObject_GetItem(o, okey);
1791 Py_DECREF(okey);
1792 return r;
1793}
1794
1795int
Fred Drake79912472000-07-09 04:06:11 +00001796PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001797{
1798 PyObject *okey;
1799 int r;
1800
1801 if (key == NULL) {
1802 null_error();
1803 return -1;
1804 }
1805
1806 okey = PyString_FromString(key);
1807 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001808 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001809 r = PyObject_SetItem(o, okey, value);
1810 Py_DECREF(okey);
1811 return r;
1812}
1813
1814int
Fred Drake79912472000-07-09 04:06:11 +00001815PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001816{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001817 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001818
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001819 v = PyMapping_GetItemString(o, key);
1820 if (v) {
1821 Py_DECREF(v);
1822 return 1;
1823 }
1824 PyErr_Clear();
1825 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001826}
1827
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001828int
Fred Drake79912472000-07-09 04:06:11 +00001829PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001830{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001832
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001833 v = PyObject_GetItem(o, key);
1834 if (v) {
1835 Py_DECREF(v);
1836 return 1;
1837 }
1838 PyErr_Clear();
1839 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001840}
1841
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001842/* Operations on callable objects */
1843
1844/* XXX PyCallable_Check() is in object.c */
1845
Guido van Rossume15dee51995-07-18 14:12:02 +00001846PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001847PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001848{
Guido van Rossum5560b742001-09-14 16:47:50 +00001849 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001850}
Guido van Rossume15dee51995-07-18 14:12:02 +00001851
1852PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001853PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1854{
1855 ternaryfunc call;
1856
1857 if ((call = func->ob_type->tp_call) != NULL) {
Armin Rigo53c1692f2006-06-21 21:58:50 +00001858 PyObject *result = (*call)(func, arg, kw);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001859 if (result == NULL && !PyErr_Occurred())
1860 PyErr_SetString(
1861 PyExc_SystemError,
1862 "NULL result without error in PyObject_Call");
1863 return result;
1864 }
Georg Brandlccff7852006-06-18 22:17:29 +00001865 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00001866 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001867 return NULL;
1868}
1869
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001870static PyObject*
1871call_function_tail(PyObject *callable, PyObject *args)
1872{
1873 PyObject *retval;
1874
1875 if (args == NULL)
1876 return NULL;
1877
1878 if (!PyTuple_Check(args)) {
1879 PyObject *a;
1880
1881 a = PyTuple_New(1);
1882 if (a == NULL) {
1883 Py_DECREF(args);
1884 return NULL;
1885 }
1886 PyTuple_SET_ITEM(a, 0, args);
1887 args = a;
1888 }
1889 retval = PyObject_Call(callable, args, NULL);
1890
1891 Py_DECREF(args);
1892
1893 return retval;
1894}
1895
Tim Peters6d6c1a32001-08-02 04:15:00 +00001896PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001897PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001898{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001899 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001900 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001901
Fred Drakeb92cf062001-10-27 06:16:31 +00001902 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001903 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001904
Fred Drakeb92cf062001-10-27 06:16:31 +00001905 if (format && *format) {
1906 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001907 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001908 va_end(va);
1909 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001910 else
1911 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001912
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001913 return call_function_tail(callable, args);
1914}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001915
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001916PyObject *
1917_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1918{
1919 va_list va;
1920 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001921
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001922 if (callable == NULL)
1923 return null_error();
1924
1925 if (format && *format) {
1926 va_start(va, format);
1927 args = _Py_VaBuildValue_SizeT(format, va);
1928 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001929 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001930 else
1931 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001932
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001933 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001934}
1935
1936PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001937PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001938{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001939 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001940 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001941 PyObject *func = NULL;
1942 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001943
Fred Drakeb92cf062001-10-27 06:16:31 +00001944 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001945 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001946
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001947 func = PyObject_GetAttrString(o, name);
1948 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001949 PyErr_SetString(PyExc_AttributeError, name);
1950 return 0;
1951 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001952
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001953 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00001954 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001955 goto exit;
1956 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001957
Fred Drakeb92cf062001-10-27 06:16:31 +00001958 if (format && *format) {
1959 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001960 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001961 va_end(va);
1962 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001963 else
1964 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001965
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001966 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001967
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001968 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001969 /* args gets consumed in call_function_tail */
1970 Py_XDECREF(func);
1971
1972 return retval;
1973}
1974
1975PyObject *
1976_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1977{
1978 va_list va;
1979 PyObject *args;
1980 PyObject *func = NULL;
1981 PyObject *retval = NULL;
1982
1983 if (o == NULL || name == NULL)
1984 return null_error();
1985
1986 func = PyObject_GetAttrString(o, name);
1987 if (func == NULL) {
1988 PyErr_SetString(PyExc_AttributeError, name);
1989 return 0;
1990 }
1991
1992 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00001993 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001994 goto exit;
1995 }
1996
1997 if (format && *format) {
1998 va_start(va, format);
1999 args = _Py_VaBuildValue_SizeT(format, va);
2000 va_end(va);
2001 }
2002 else
2003 args = PyTuple_New(0);
2004
2005 retval = call_function_tail(func, args);
2006
2007 exit:
2008 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002009 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002010
2011 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002012}
Guido van Rossum823649d2001-03-21 18:40:58 +00002013
2014
Fred Drakeb421b8c2001-10-26 16:21:32 +00002015static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002016objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002017{
2018 int i, n = 0;
2019 va_list countva;
2020 PyObject *result, *tmp;
2021
2022#ifdef VA_LIST_IS_ARRAY
2023 memcpy(countva, va, sizeof(va_list));
2024#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002025#ifdef __va_copy
2026 __va_copy(countva, va);
2027#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002028 countva = va;
2029#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002030#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002031
2032 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2033 ++n;
2034 result = PyTuple_New(n);
2035 if (result != NULL && n > 0) {
2036 for (i = 0; i < n; ++i) {
2037 tmp = (PyObject *)va_arg(va, PyObject *);
2038 PyTuple_SET_ITEM(result, i, tmp);
2039 Py_INCREF(tmp);
2040 }
2041 }
2042 return result;
2043}
2044
2045PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002046PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002047{
2048 PyObject *args, *tmp;
2049 va_list vargs;
2050
2051 if (callable == NULL || name == NULL)
2052 return null_error();
2053
2054 callable = PyObject_GetAttr(callable, name);
2055 if (callable == NULL)
2056 return NULL;
2057
2058 /* count the args */
2059 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002060 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002061 va_end(vargs);
2062 if (args == NULL) {
2063 Py_DECREF(callable);
2064 return NULL;
2065 }
2066 tmp = PyObject_Call(callable, args, NULL);
2067 Py_DECREF(args);
2068 Py_DECREF(callable);
2069
2070 return tmp;
2071}
2072
2073PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002074PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002075{
2076 PyObject *args, *tmp;
2077 va_list vargs;
2078
2079 if (callable == NULL)
2080 return null_error();
2081
2082 /* count the args */
2083 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002084 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002085 va_end(vargs);
2086 if (args == NULL)
2087 return NULL;
2088 tmp = PyObject_Call(callable, args, NULL);
2089 Py_DECREF(args);
2090
2091 return tmp;
2092}
2093
2094
Guido van Rossum823649d2001-03-21 18:40:58 +00002095/* isinstance(), issubclass() */
2096
Barry Warsawf16951c2002-04-23 22:45:44 +00002097/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2098 * state that will almost never happen.
2099 *
2100 * 0. creating the __bases__ static string could get a MemoryError
2101 * 1. getattr(cls, '__bases__') could raise an AttributeError
2102 * 2. getattr(cls, '__bases__') could raise some other exception
2103 * 3. getattr(cls, '__bases__') could return a tuple
2104 * 4. getattr(cls, '__bases__') could return something other than a tuple
2105 *
2106 * Only state #3 is a non-error state and only it returns a non-NULL object
2107 * (it returns the retrieved tuple).
2108 *
2109 * Any raised AttributeErrors are masked by clearing the exception and
2110 * returning NULL. If an object other than a tuple comes out of __bases__,
2111 * then again, the return value is NULL. So yes, these two situations
2112 * produce exactly the same results: NULL is returned and no error is set.
2113 *
2114 * If some exception other than AttributeError is raised, then NULL is also
2115 * returned, but the exception is not cleared. That's because we want the
2116 * exception to be propagated along.
2117 *
2118 * Callers are expected to test for PyErr_Occurred() when the return value
2119 * is NULL to decide whether a valid exception should be propagated or not.
2120 * When there's no exception to propagate, it's customary for the caller to
2121 * set a TypeError.
2122 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002123static PyObject *
2124abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002125{
2126 static PyObject *__bases__ = NULL;
2127 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002128
2129 if (__bases__ == NULL) {
2130 __bases__ = PyString_FromString("__bases__");
2131 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002132 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002133 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002134 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002135 if (bases == NULL) {
2136 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2137 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002138 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002139 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002140 if (!PyTuple_Check(bases)) {
2141 Py_DECREF(bases);
2142 return NULL;
2143 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002144 return bases;
2145}
2146
2147
2148static int
2149abstract_issubclass(PyObject *derived, PyObject *cls)
2150{
2151 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002152 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002153 int r = 0;
2154
2155
Guido van Rossum823649d2001-03-21 18:40:58 +00002156 if (derived == cls)
2157 return 1;
2158
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002159 if (PyTuple_Check(cls)) {
2160 /* Not a general sequence -- that opens up the road to
2161 recursion and stack overflow. */
2162 n = PyTuple_GET_SIZE(cls);
2163 for (i = 0; i < n; i++) {
2164 if (derived == PyTuple_GET_ITEM(cls, i))
2165 return 1;
2166 }
2167 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002168 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002169 if (bases == NULL) {
2170 if (PyErr_Occurred())
2171 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002172 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002173 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002174 n = PyTuple_GET_SIZE(bases);
2175 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002176 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002177 if (r != 0)
2178 break;
2179 }
2180
2181 Py_DECREF(bases);
2182
2183 return r;
2184}
2185
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002186static int
2187check_class(PyObject *cls, const char *error)
2188{
2189 PyObject *bases = abstract_get_bases(cls);
2190 if (bases == NULL) {
2191 /* Do not mask errors. */
2192 if (!PyErr_Occurred())
2193 PyErr_SetString(PyExc_TypeError, error);
2194 return 0;
2195 }
2196 Py_DECREF(bases);
2197 return -1;
2198}
2199
Brett Cannon4f653312004-03-20 22:52:14 +00002200static int
2201recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002202{
2203 PyObject *icls;
2204 static PyObject *__class__ = NULL;
2205 int retval = 0;
2206
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002207 if (__class__ == NULL) {
2208 __class__ = PyString_FromString("__class__");
2209 if (__class__ == NULL)
2210 return -1;
2211 }
2212
Neil Schemenauer6b471292001-10-18 03:18:43 +00002213 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2214 PyObject *inclass =
2215 (PyObject*)((PyInstanceObject*)inst)->in_class;
2216 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002217 }
2218 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002219 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002220 if (retval == 0) {
2221 PyObject *c = PyObject_GetAttr(inst, __class__);
2222 if (c == NULL) {
2223 PyErr_Clear();
2224 }
2225 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002226 if (c != (PyObject *)(inst->ob_type) &&
2227 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002228 retval = PyType_IsSubtype(
2229 (PyTypeObject *)c,
2230 (PyTypeObject *)cls);
2231 Py_DECREF(c);
2232 }
2233 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002234 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002235 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002236 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002237
Brett Cannon4f653312004-03-20 22:52:14 +00002238 if (!recursion_depth) {
2239 PyErr_SetString(PyExc_RuntimeError,
2240 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002241 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002242 }
2243
Guido van Rossum03290ec2001-10-07 20:54:12 +00002244 n = PyTuple_GET_SIZE(cls);
2245 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002246 retval = recursive_isinstance(
2247 inst,
2248 PyTuple_GET_ITEM(cls, i),
2249 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002250 if (retval != 0)
2251 break;
2252 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002253 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002254 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002255 if (!check_class(cls,
2256 "isinstance() arg 2 must be a class, type,"
2257 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002258 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002259 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002260 if (icls == NULL) {
2261 PyErr_Clear();
2262 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002263 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002264 else {
2265 retval = abstract_issubclass(icls, cls);
2266 Py_DECREF(icls);
2267 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002268 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002269
Guido van Rossum823649d2001-03-21 18:40:58 +00002270 return retval;
2271}
2272
2273int
Brett Cannon4f653312004-03-20 22:52:14 +00002274PyObject_IsInstance(PyObject *inst, PyObject *cls)
2275{
2276 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2277}
2278
2279static int
2280recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002281{
2282 int retval;
2283
2284 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002285 if (!check_class(derived,
2286 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002287 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002288
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002289 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002290 Py_ssize_t i;
2291 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002292
2293 if (!recursion_depth) {
2294 PyErr_SetString(PyExc_RuntimeError,
2295 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002296 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002297 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002298 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002299 retval = recursive_issubclass(
2300 derived,
2301 PyTuple_GET_ITEM(cls, i),
2302 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002303 if (retval != 0) {
2304 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002305 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002306 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002307 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002308 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002309 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002310 else {
2311 if (!check_class(cls,
2312 "issubclass() arg 2 must be a class"
2313 " or tuple of classes"))
2314 return -1;
2315 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002316
2317 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002318 }
2319 else {
2320 /* shortcut */
2321 if (!(retval = (derived == cls)))
2322 retval = PyClass_IsSubclass(derived, cls);
2323 }
2324
2325 return retval;
2326}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002327
Brett Cannon4f653312004-03-20 22:52:14 +00002328int
2329PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2330{
2331 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2332}
2333
2334
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002335PyObject *
2336PyObject_GetIter(PyObject *o)
2337{
2338 PyTypeObject *t = o->ob_type;
2339 getiterfunc f = NULL;
2340 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2341 f = t->tp_iter;
2342 if (f == NULL) {
2343 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002344 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00002345 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002346 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002347 else {
2348 PyObject *res = (*f)(o);
2349 if (res != NULL && !PyIter_Check(res)) {
2350 PyErr_Format(PyExc_TypeError,
2351 "iter() returned non-iterator "
2352 "of type '%.100s'",
2353 res->ob_type->tp_name);
2354 Py_DECREF(res);
2355 res = NULL;
2356 }
2357 return res;
2358 }
2359}
2360
Tim Petersf4848da2001-05-05 00:14:56 +00002361/* Return next item.
2362 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2363 * If the iteration terminates normally, return NULL and clear the
2364 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2365 * will be false.
2366 * Else return the next object. PyErr_Occurred() will be false.
2367 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002368PyObject *
2369PyIter_Next(PyObject *iter)
2370{
Tim Petersf4848da2001-05-05 00:14:56 +00002371 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002372 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002373 result = (*iter->ob_type->tp_iternext)(iter);
2374 if (result == NULL &&
2375 PyErr_Occurred() &&
2376 PyErr_ExceptionMatches(PyExc_StopIteration))
2377 PyErr_Clear();
2378 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002379}