blob: 4c8ef8361ff05c4547416799b0adad1697fb1567 [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
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000085
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000086/* The length hint function returns a non-negative value from o.__len__()
87 or o.__length_hint__(). If those methods aren't found or return a negative
88 value, then the defaultvalue is returned. This function never fails.
89 Accordingly, it will mask exceptions raised in either method.
90*/
91
92Py_ssize_t
93_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
94{
95 static PyObject *hintstrobj = NULL;
96 PyObject *ro;
97 Py_ssize_t rv;
98
99 /* try o.__len__() */
100 rv = PyObject_Size(o);
101 if (rv >= 0)
102 return rv;
103 if (PyErr_Occurred())
104 PyErr_Clear();
105
106 /* cache a hashed version of the attribute string */
107 if (hintstrobj == NULL) {
108 hintstrobj = PyString_InternFromString("__length_hint__");
109 if (hintstrobj == NULL)
110 goto defaultcase;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000111 }
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000112
113 /* try o.__length_hint__() */
114 ro = PyObject_CallMethodObjArgs(o, hintstrobj, NULL);
115 if (ro == NULL)
116 goto defaultcase;
117 rv = PyInt_AsLong(ro);
118 Py_DECREF(ro);
119 if (rv >= 0)
120 return rv;
121
122defaultcase:
123 if (PyErr_Occurred())
124 PyErr_Clear();
125 return defaultvalue;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000126}
127
Guido van Rossume15dee51995-07-18 14:12:02 +0000128PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000129PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000130{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000131 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000132
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133 if (o == NULL || key == NULL)
134 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000136 m = o->ob_type->tp_as_mapping;
137 if (m && m->mp_subscript)
138 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000139
Guido van Rossum21308241998-08-13 16:44:44 +0000140 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000141 if (PyIndex_Check(key)) {
142 Py_ssize_t key_value;
143 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000144 if (key_value == -1 && PyErr_Occurred())
145 return NULL;
146 return PySequence_GetItem(o, key_value);
147 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000148 else if (o->ob_type->tp_as_sequence->sq_item)
Georg Brandlccff7852006-06-18 22:17:29 +0000149 return type_error("sequence index must "
150 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000151 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000152
Georg Brandlccff7852006-06-18 22:17:29 +0000153 return type_error("'%.200s' object is unsubscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000154}
155
156int
Fred Drake79912472000-07-09 04:06:11 +0000157PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000158{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000159 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000161 if (o == NULL || key == NULL || value == NULL) {
162 null_error();
163 return -1;
164 }
165 m = o->ob_type->tp_as_mapping;
166 if (m && m->mp_ass_subscript)
167 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000168
Guido van Rossum21308241998-08-13 16:44:44 +0000169 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000170 if (PyIndex_Check(key)) {
171 Py_ssize_t key_value;
172 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000173 if (key_value == -1 && PyErr_Occurred())
174 return -1;
175 return PySequence_SetItem(o, key_value, value);
176 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000177 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000178 type_error("sequence index must be "
179 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000180 return -1;
181 }
Guido van Rossum21308241998-08-13 16:44:44 +0000182 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000183
Georg Brandlccff7852006-06-18 22:17:29 +0000184 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000185 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000186}
187
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000188int
Fred Drake79912472000-07-09 04:06:11 +0000189PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000190{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000191 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000193 if (o == NULL || key == NULL) {
194 null_error();
195 return -1;
196 }
197 m = o->ob_type->tp_as_mapping;
198 if (m && m->mp_ass_subscript)
199 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000200
Guido van Rossum21308241998-08-13 16:44:44 +0000201 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000202 if (PyIndex_Check(key)) {
203 Py_ssize_t key_value;
204 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000205 if (key_value == -1 && PyErr_Occurred())
206 return -1;
207 return PySequence_DelItem(o, key_value);
208 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000209 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000210 type_error("sequence index must be "
211 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000212 return -1;
213 }
Guido van Rossum21308241998-08-13 16:44:44 +0000214 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000215
Georg Brandlccff7852006-06-18 22:17:29 +0000216 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000217 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000218}
219
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000220int
221PyObject_DelItemString(PyObject *o, char *key)
222{
223 PyObject *okey;
224 int ret;
225
226 if (o == NULL || key == NULL) {
227 null_error();
228 return -1;
229 }
230 okey = PyString_FromString(key);
231 if (okey == NULL)
232 return -1;
233 ret = PyObject_DelItem(o, okey);
234 Py_DECREF(okey);
235 return ret;
236}
237
Brett Cannonea229bd2006-06-06 18:08:16 +0000238int
239PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000241 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242{
243 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000244 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000245 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246
247 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
248 null_error();
249 return -1;
250 }
251 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000253 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000255 PyErr_SetString(PyExc_TypeError,
256 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000257 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000258 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000260 PyErr_SetString(PyExc_TypeError,
261 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000262 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000266 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267 *buffer = pp;
268 *buffer_len = len;
269 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000270}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000272int
273PyObject_CheckReadBuffer(PyObject *obj)
274{
275 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
276
277 if (pb == NULL ||
278 pb->bf_getreadbuffer == NULL ||
279 pb->bf_getsegcount == NULL ||
280 (*pb->bf_getsegcount)(obj, NULL) != 1)
281 return 0;
282 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283}
284
285int PyObject_AsReadBuffer(PyObject *obj,
286 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288{
289 PyBufferProcs *pb;
290 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000291 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292
293 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
294 null_error();
295 return -1;
296 }
297 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000298 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000299 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000300 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 PyErr_SetString(PyExc_TypeError,
302 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000303 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000305 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000306 PyErr_SetString(PyExc_TypeError,
307 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000308 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000309 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000310 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 *buffer = pp;
314 *buffer_len = len;
315 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316}
317
318int PyObject_AsWriteBuffer(PyObject *obj,
319 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321{
322 PyBufferProcs *pb;
323 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000325
326 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
327 null_error();
328 return -1;
329 }
330 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000331 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000332 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000333 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000334 PyErr_SetString(PyExc_TypeError,
335 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000336 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000337 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000338 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000339 PyErr_SetString(PyExc_TypeError,
340 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000341 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000342 }
343 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
344 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000345 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000346 *buffer = pp;
347 *buffer_len = len;
348 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000349}
350
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000351/* Operations on numbers */
352
353int
Fred Drake79912472000-07-09 04:06:11 +0000354PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000355{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000356 return o && o->ob_type->tp_as_number &&
357 (o->ob_type->tp_as_number->nb_int ||
358 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000359}
360
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000361/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000362
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000363/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000364
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000365#define NB_SLOT(x) offsetof(PyNumberMethods, x)
366#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000367 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000368#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000369 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000370
371/*
372 Calling scheme used for binary operations:
373
374 v w Action
375 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000376 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000377 new old v.op(v,w), coerce(v,w), v.op(v,w)
378 old new w.op(v,w), coerce(v,w), v.op(v,w)
379 old old coerce(v,w), v.op(v,w)
380
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000381 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
382 v->ob_type
383
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000384 Legend:
385 -------
386 * new == new style number
387 * old == old style number
388 * Action indicates the order in which operations are tried until either
389 a valid result is produced or an error occurs.
390
391 */
392
393static PyObject *
394binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000395{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000396 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000397 binaryfunc slotv = NULL;
398 binaryfunc slotw = NULL;
399
400 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000401 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000402 if (w->ob_type != v->ob_type &&
403 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000404 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000405 if (slotw == slotv)
406 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000407 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000408 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000409 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
410 x = slotw(v, w);
411 if (x != Py_NotImplemented)
412 return x;
413 Py_DECREF(x); /* can't do it */
414 slotw = NULL;
415 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000416 x = slotv(v, w);
417 if (x != Py_NotImplemented)
418 return x;
419 Py_DECREF(x); /* can't do it */
420 }
421 if (slotw) {
422 x = slotw(v, w);
423 if (x != Py_NotImplemented)
424 return x;
425 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000426 }
427 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
428 int err = PyNumber_CoerceEx(&v, &w);
429 if (err < 0) {
430 return NULL;
431 }
432 if (err == 0) {
433 PyNumberMethods *mv = v->ob_type->tp_as_number;
434 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000435 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000436 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000437 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000438 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000439 Py_DECREF(v);
440 Py_DECREF(w);
441 return x;
442 }
443 }
444 /* CoerceEx incremented the reference counts */
445 Py_DECREF(v);
446 Py_DECREF(w);
447 }
448 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000449 Py_INCREF(Py_NotImplemented);
450 return Py_NotImplemented;
451}
Guido van Rossum77660912002-04-16 16:32:50 +0000452
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000453static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000454binop_type_error(PyObject *v, PyObject *w, const char *op_name)
455{
456 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000457 "unsupported operand type(s) for %.100s: "
458 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000459 op_name,
460 v->ob_type->tp_name,
461 w->ob_type->tp_name);
462 return NULL;
463}
464
465static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000466binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
467{
468 PyObject *result = binary_op1(v, w, op_slot);
469 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000470 Py_DECREF(result);
471 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000472 }
473 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000474}
475
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000476
477/*
478 Calling scheme used for ternary operations:
479
Guido van Rossum84675ac2001-09-29 01:05:03 +0000480 *** In some cases, w.op is called before v.op; see binary_op1. ***
481
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000482 v w z Action
483 -------------------------------------------------------------------
484 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
485 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
486 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
487 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
488 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
489 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
490 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
491 old old old coerce(v,w,z), v.op(v,w,z)
492
493 Legend:
494 -------
495 * new == new style number
496 * old == old style number
497 * Action indicates the order in which operations are tried until either
498 a valid result is produced or an error occurs.
499 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
500 only if z != Py_None; if z == Py_None, then it is treated as absent
501 variable and only coerce(v,w) is tried.
502
503 */
504
505static PyObject *
506ternary_op(PyObject *v,
507 PyObject *w,
508 PyObject *z,
509 const int op_slot,
510 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000511{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000512 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000513 PyObject *x = NULL;
514 ternaryfunc slotv = NULL;
515 ternaryfunc slotw = NULL;
516 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000517
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000518 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000519 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000520 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000521 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000522 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000523 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000524 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000525 if (slotw == slotv)
526 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000527 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000528 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000529 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
530 x = slotw(v, w, z);
531 if (x != Py_NotImplemented)
532 return x;
533 Py_DECREF(x); /* can't do it */
534 slotw = NULL;
535 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000536 x = slotv(v, w, z);
537 if (x != Py_NotImplemented)
538 return x;
539 Py_DECREF(x); /* can't do it */
540 }
541 if (slotw) {
542 x = slotw(v, w, z);
543 if (x != Py_NotImplemented)
544 return x;
545 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000546 }
547 mz = z->ob_type->tp_as_number;
548 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000549 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000550 if (slotz == slotv || slotz == slotw)
551 slotz = NULL;
552 if (slotz) {
553 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000554 if (x != Py_NotImplemented)
555 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000556 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000557 }
558 }
559
560 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
561 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
562 /* we have an old style operand, coerce */
563 PyObject *v1, *z1, *w2, *z2;
564 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000565
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000566 c = PyNumber_Coerce(&v, &w);
567 if (c != 0)
568 goto error3;
569
570 /* Special case: if the third argument is None, it is
571 treated as absent argument and not coerced. */
572 if (z == Py_None) {
573 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000574 slotz = NB_TERNOP(v->ob_type->tp_as_number,
575 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000576 if (slotz)
577 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000578 else
579 c = -1;
580 }
581 else
582 c = -1;
583 goto error2;
584 }
585 v1 = v;
586 z1 = z;
587 c = PyNumber_Coerce(&v1, &z1);
588 if (c != 0)
589 goto error2;
590 w2 = w;
591 z2 = z1;
592 c = PyNumber_Coerce(&w2, &z2);
593 if (c != 0)
594 goto error1;
595
596 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000597 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
598 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000599 if (slotv)
600 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000601 else
602 c = -1;
603 }
604 else
605 c = -1;
606
607 Py_DECREF(w2);
608 Py_DECREF(z2);
609 error1:
610 Py_DECREF(v1);
611 Py_DECREF(z1);
612 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000613 Py_DECREF(v);
614 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000615 error3:
616 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000617 return x;
618 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000619
620 if (z == Py_None)
621 PyErr_Format(
622 PyExc_TypeError,
623 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000624 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000625 v->ob_type->tp_name,
626 w->ob_type->tp_name);
627 else
628 PyErr_Format(
629 PyExc_TypeError,
630 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000631 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000632 v->ob_type->tp_name,
633 w->ob_type->tp_name,
634 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000635 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000636}
637
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000638#define BINARY_FUNC(func, op, op_name) \
639 PyObject * \
640 func(PyObject *v, PyObject *w) { \
641 return binary_op(v, w, NB_SLOT(op), op_name); \
642 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000643
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000644BINARY_FUNC(PyNumber_Or, nb_or, "|")
645BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
646BINARY_FUNC(PyNumber_And, nb_and, "&")
647BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
648BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
649BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000650BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
651BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000652
653PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000654PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000655{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000656 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
657 if (result == Py_NotImplemented) {
658 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000659 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000660 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000661 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000662 }
Armin Rigofd163f92005-12-29 15:59:19 +0000663 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000664 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000665 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000666}
667
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000668static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000669sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000670{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000671 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000672 if (PyIndex_Check(n)) {
673 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000674 if (count == -1 && PyErr_Occurred())
675 return NULL;
676 }
677 else {
Georg Brandlccff7852006-06-18 22:17:29 +0000678 return type_error("can't multiply sequence by "
679 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000680 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000681 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000682}
683
684PyObject *
685PyNumber_Multiply(PyObject *v, PyObject *w)
686{
687 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
688 if (result == Py_NotImplemented) {
689 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
690 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000691 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000692 if (mv && mv->sq_repeat) {
693 return sequence_repeat(mv->sq_repeat, v, w);
694 }
695 else if (mw && mw->sq_repeat) {
696 return sequence_repeat(mw->sq_repeat, w, v);
697 }
698 result = binop_type_error(v, w, "*");
699 }
700 return result;
701}
702
Guido van Rossume15dee51995-07-18 14:12:02 +0000703PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000704PyNumber_FloorDivide(PyObject *v, PyObject *w)
705{
706 /* XXX tp_flags test */
707 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
708}
709
710PyObject *
711PyNumber_TrueDivide(PyObject *v, PyObject *w)
712{
713 /* XXX tp_flags test */
714 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
715}
716
717PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000718PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000719{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000720 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000721}
722
723PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000724PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000725{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000727}
728
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729/* Binary in-place operators */
730
731/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000732 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000733
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000734 - If the left hand object has the appropriate struct members, and
735 they are filled, call the appropriate function and return the
736 result. No coercion is done on the arguments; the left-hand object
737 is the one the operation is performed on, and it's up to the
738 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000739
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000740 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000741 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000742
743 */
744
Guido van Rossum77660912002-04-16 16:32:50 +0000745#define HASINPLACE(t) \
746 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000747
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000748static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000749binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000750{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000751 PyNumberMethods *mv = v->ob_type->tp_as_number;
752 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000753 binaryfunc slot = NB_BINOP(mv, iop_slot);
754 if (slot) {
755 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000756 if (x != Py_NotImplemented) {
757 return x;
758 }
759 Py_DECREF(x);
760 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000761 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000762 return binary_op1(v, w, op_slot);
763}
764
765static PyObject *
766binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
767 const char *op_name)
768{
769 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
770 if (result == Py_NotImplemented) {
771 Py_DECREF(result);
772 return binop_type_error(v, w, op_name);
773 }
774 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000775}
776
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000777#define INPLACE_BINOP(func, iop, op, op_name) \
778 PyObject * \
779 func(PyObject *v, PyObject *w) { \
780 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000781 }
782
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000783INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
784INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
785INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
786INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
787INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
788INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
789INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000790
791PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000792PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
793{
794 /* XXX tp_flags test */
795 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
796 NB_SLOT(nb_floor_divide), "//=");
797}
798
799PyObject *
800PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
801{
802 /* XXX tp_flags test */
803 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
804 NB_SLOT(nb_true_divide), "/=");
805}
806
807PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000808PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
809{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000810 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
811 NB_SLOT(nb_add));
812 if (result == Py_NotImplemented) {
813 PySequenceMethods *m = v->ob_type->tp_as_sequence;
814 Py_DECREF(result);
815 if (m != NULL) {
816 binaryfunc f = NULL;
817 if (HASINPLACE(v))
818 f = m->sq_inplace_concat;
819 if (f == NULL)
820 f = m->sq_concat;
821 if (f != NULL)
822 return (*f)(v, w);
823 }
824 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000825 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000826 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000827}
828
829PyObject *
830PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
831{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000832 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
833 NB_SLOT(nb_multiply));
834 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000835 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000836 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
837 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
838 Py_DECREF(result);
839 if (mv != NULL) {
840 if (HASINPLACE(v))
841 f = mv->sq_inplace_repeat;
842 if (f == NULL)
843 f = mv->sq_repeat;
844 if (f != NULL)
845 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000846 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000847 else if (mw != NULL) {
848 /* Note that the right hand operand should not be
849 * mutated in this case so sq_inplace_repeat is not
850 * used. */
851 if (mw->sq_repeat)
852 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000853 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000854 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000855 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000856 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000857}
858
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000859PyObject *
860PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
861{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000862 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
863 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000864}
865
866PyObject *
867PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
868{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000869 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
870 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
871 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000872 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000873 else {
874 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
875 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000876}
877
878
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000879/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000880
881PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000882PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000883{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000884 PyNumberMethods *m;
885
886 if (o == NULL)
887 return null_error();
888 m = o->ob_type->tp_as_number;
889 if (m && m->nb_negative)
890 return (*m->nb_negative)(o);
891
Georg Brandlccff7852006-06-18 22:17:29 +0000892 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000893}
894
895PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000896PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000897{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000898 PyNumberMethods *m;
899
900 if (o == NULL)
901 return null_error();
902 m = o->ob_type->tp_as_number;
903 if (m && m->nb_positive)
904 return (*m->nb_positive)(o);
905
Georg Brandlccff7852006-06-18 22:17:29 +0000906 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000907}
908
909PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000910PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000911{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000912 PyNumberMethods *m;
913
914 if (o == NULL)
915 return null_error();
916 m = o->ob_type->tp_as_number;
917 if (m && m->nb_invert)
918 return (*m->nb_invert)(o);
919
Georg Brandlccff7852006-06-18 22:17:29 +0000920 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000921}
922
923PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000924PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000925{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000926 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000927
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 if (o == NULL)
929 return null_error();
930 m = o->ob_type->tp_as_number;
931 if (m && m->nb_absolute)
932 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000933
Georg Brandlccff7852006-06-18 22:17:29 +0000934 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000935}
936
Guido van Rossum9e896b32000-04-05 20:11:21 +0000937/* Add a check for embedded NULL-bytes in the argument. */
938static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000939int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000940{
941 char *end;
942 PyObject *x;
943
944 x = PyInt_FromString((char*)s, &end, 10);
945 if (x == NULL)
946 return NULL;
947 if (end != s + len) {
948 PyErr_SetString(PyExc_ValueError,
949 "null byte in argument for int()");
950 Py_DECREF(x);
951 return NULL;
952 }
953 return x;
954}
955
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000956/* Return a Python Int or Long from the object item
957 Raise TypeError if the result is not an int-or-long
958 or if the object cannot be interpreted as an index.
959*/
960PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000961PyNumber_Index(PyObject *item)
962{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000963 PyObject *result = NULL;
964 if (item == NULL)
965 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +0000966 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000967 Py_INCREF(item);
968 return item;
969 }
970 if (PyIndex_Check(item)) {
971 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000972 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +0000973 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000974 PyErr_Format(PyExc_TypeError,
975 "__index__ returned non-(int,long) " \
976 "(type %.200s)",
977 result->ob_type->tp_name);
978 Py_DECREF(result);
979 return NULL;
980 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000981 }
982 else {
Armin Rigo314861c2006-03-30 14:04:02 +0000983 PyErr_Format(PyExc_TypeError,
984 "'%.200s' object cannot be interpreted "
985 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000986 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000987 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000988}
989
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000990/* Return an error on Overflow only if err is not NULL*/
991
992Py_ssize_t
993PyNumber_AsSsize_t(PyObject *item, PyObject *err)
994{
995 Py_ssize_t result;
996 PyObject *runerr;
997 PyObject *value = PyNumber_Index(item);
998 if (value == NULL)
999 return -1;
1000
1001 /* We're done if PyInt_AsSsize_t() returns without error. */
1002 result = PyInt_AsSsize_t(value);
1003 if (result != -1 || !(runerr = PyErr_Occurred()))
1004 goto finish;
1005
1006 /* Error handling code -- only manage OverflowError differently */
1007 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1008 goto finish;
1009
1010 PyErr_Clear();
1011 /* If no error-handling desired then the default clipping
1012 is sufficient.
1013 */
1014 if (!err) {
1015 assert(PyLong_Check(value));
1016 /* Whether or not it is less than or equal to
1017 zero is determined by the sign of ob_size
1018 */
1019 if (_PyLong_Sign(value) < 0)
1020 result = PY_SSIZE_T_MIN;
1021 else
1022 result = PY_SSIZE_T_MAX;
1023 }
1024 else {
1025 /* Otherwise replace the error with caller's error object. */
1026 PyErr_Format(err,
1027 "cannot fit '%.200s' into an index-sized integer",
1028 item->ob_type->tp_name);
1029 }
1030
1031 finish:
1032 Py_DECREF(value);
1033 return result;
1034}
1035
1036
Guido van Rossume15dee51995-07-18 14:12:02 +00001037PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001038PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001039{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001040 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001041 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001042 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001043
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001044 if (o == NULL)
1045 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001046 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001047 Py_INCREF(o);
1048 return o;
1049 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001050 m = o->ob_type->tp_as_number;
1051 if (m && m->nb_int) { /* This should include subclasses of int */
1052 PyObject *res = m->nb_int(o);
1053 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1054 PyErr_Format(PyExc_TypeError,
1055 "__int__ returned non-int (type %.200s)",
1056 res->ob_type->tp_name);
1057 Py_DECREF(res);
1058 return NULL;
1059 }
1060 return res;
1061 }
1062 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001063 PyIntObject *io = (PyIntObject*)o;
1064 return PyInt_FromLong(io->ob_ival);
1065 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001066 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001067 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +00001068 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001069#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001070 if (PyUnicode_Check(o))
1071 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1072 PyUnicode_GET_SIZE(o),
1073 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001074#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001075 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001076 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001077
Georg Brandlccff7852006-06-18 22:17:29 +00001078 return type_error("int() argument must be a string or a "
1079 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001080}
1081
Guido van Rossum9e896b32000-04-05 20:11:21 +00001082/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001083static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001084long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001085{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001086 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001087 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001088
Guido van Rossum4c08d552000-03-10 22:55:18 +00001089 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001090 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001091 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001092 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001093 PyErr_SetString(PyExc_ValueError,
1094 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001095 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001096 return NULL;
1097 }
1098 return x;
1099}
1100
Guido van Rossume15dee51995-07-18 14:12:02 +00001101PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001102PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001103{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001105 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001106 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001107
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 if (o == NULL)
1109 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001110 m = o->ob_type->tp_as_number;
1111 if (m && m->nb_long) { /* This should include subclasses of long */
1112 PyObject *res = m->nb_long(o);
1113 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1114 PyErr_Format(PyExc_TypeError,
1115 "__long__ returned non-long (type %.200s)",
1116 res->ob_type->tp_name);
1117 Py_DECREF(res);
1118 return NULL;
1119 }
1120 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001121 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001122 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001123 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001124 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001125 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001126 * doesn't do. In particular long('9.5') must raise an
1127 * exception, not truncate the float.
1128 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001129 return long_from_string(PyString_AS_STRING(o),
1130 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001131#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001132 if (PyUnicode_Check(o))
1133 /* The above check is done in PyLong_FromUnicode(). */
1134 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1135 PyUnicode_GET_SIZE(o),
1136 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001137#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001138 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1139 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001140
Georg Brandlccff7852006-06-18 22:17:29 +00001141 return type_error("long() argument must be a string or a "
1142 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001143}
1144
1145PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001146PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001147{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001148 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001149
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150 if (o == NULL)
1151 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001152 m = o->ob_type->tp_as_number;
1153 if (m && m->nb_float) { /* This should include subclasses of float */
1154 PyObject *res = m->nb_float(o);
1155 if (res && !PyFloat_Check(res)) {
1156 PyErr_Format(PyExc_TypeError,
1157 "__float__ returned non-float (type %.200s)",
1158 res->ob_type->tp_name);
1159 Py_DECREF(res);
1160 return NULL;
1161 }
1162 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001163 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001164 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001165 PyFloatObject *po = (PyFloatObject *)o;
1166 return PyFloat_FromDouble(po->ob_fval);
1167 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001168 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001169}
1170
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001171/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001172
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001173int
Fred Drake79912472000-07-09 04:06:11 +00001174PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001175{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001176 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001177 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001178 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001179 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001180 return s != NULL && s->ob_type->tp_as_sequence &&
1181 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001182}
1183
Martin v. Löwis18e16552006-02-15 17:27:45 +00001184Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001185PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001186{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001187 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001188
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 if (s == NULL) {
1190 null_error();
1191 return -1;
1192 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001193
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001194 m = s->ob_type->tp_as_sequence;
1195 if (m && m->sq_length)
1196 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001197
Georg Brandlb0061c82006-08-08 11:56:21 +00001198 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001199 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001200}
1201
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001202#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001203Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001204PySequence_Length(PyObject *s)
1205{
1206 return PySequence_Size(s);
1207}
1208#define PySequence_Length PySequence_Size
1209
Guido van Rossume15dee51995-07-18 14:12:02 +00001210PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001211PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001212{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001213 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001214
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001215 if (s == NULL || o == NULL)
1216 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001217
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001218 m = s->ob_type->tp_as_sequence;
1219 if (m && m->sq_concat)
1220 return m->sq_concat(s, o);
1221
Armin Rigofd163f92005-12-29 15:59:19 +00001222 /* Instances of user classes defining an __add__() method only
1223 have an nb_add slot, not an sq_concat slot. So we fall back
1224 to nb_add if both arguments appear to be sequences. */
1225 if (PySequence_Check(s) && PySequence_Check(o)) {
1226 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1227 if (result != Py_NotImplemented)
1228 return result;
1229 Py_DECREF(result);
1230 }
Georg Brandlccff7852006-06-18 22:17:29 +00001231 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001232}
1233
1234PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001235PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001236{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001238
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001239 if (o == NULL)
1240 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001241
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242 m = o->ob_type->tp_as_sequence;
1243 if (m && m->sq_repeat)
1244 return m->sq_repeat(o, count);
1245
Armin Rigofd163f92005-12-29 15:59:19 +00001246 /* Instances of user classes defining a __mul__() method only
1247 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1248 to nb_multiply if o appears to be a sequence. */
1249 if (PySequence_Check(o)) {
1250 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001251 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001252 if (n == NULL)
1253 return NULL;
1254 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1255 Py_DECREF(n);
1256 if (result != Py_NotImplemented)
1257 return result;
1258 Py_DECREF(result);
1259 }
Georg Brandlccff7852006-06-18 22:17:29 +00001260 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001261}
1262
1263PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001264PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1265{
1266 PySequenceMethods *m;
1267
1268 if (s == NULL || o == NULL)
1269 return null_error();
1270
1271 m = s->ob_type->tp_as_sequence;
1272 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1273 return m->sq_inplace_concat(s, o);
1274 if (m && m->sq_concat)
1275 return m->sq_concat(s, o);
1276
Armin Rigofd163f92005-12-29 15:59:19 +00001277 if (PySequence_Check(s) && PySequence_Check(o)) {
1278 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1279 NB_SLOT(nb_add));
1280 if (result != Py_NotImplemented)
1281 return result;
1282 Py_DECREF(result);
1283 }
Georg Brandlccff7852006-06-18 22:17:29 +00001284 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001285}
1286
1287PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001288PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001289{
1290 PySequenceMethods *m;
1291
1292 if (o == NULL)
1293 return null_error();
1294
1295 m = o->ob_type->tp_as_sequence;
1296 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1297 return m->sq_inplace_repeat(o, count);
1298 if (m && m->sq_repeat)
1299 return m->sq_repeat(o, count);
1300
Armin Rigofd163f92005-12-29 15:59:19 +00001301 if (PySequence_Check(o)) {
1302 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001303 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001304 if (n == NULL)
1305 return NULL;
1306 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1307 NB_SLOT(nb_multiply));
1308 Py_DECREF(n);
1309 if (result != Py_NotImplemented)
1310 return result;
1311 Py_DECREF(result);
1312 }
Georg Brandlccff7852006-06-18 22:17:29 +00001313 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001314}
1315
1316PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001317PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001318{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001320
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321 if (s == NULL)
1322 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001323
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324 m = s->ob_type->tp_as_sequence;
1325 if (m && m->sq_item) {
1326 if (i < 0) {
1327 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001328 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001329 if (l < 0)
1330 return NULL;
1331 i += l;
1332 }
1333 }
1334 return m->sq_item(s, i);
1335 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001336
Georg Brandlccff7852006-06-18 22:17:29 +00001337 return type_error("'%.200s' object is unindexable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001338}
1339
1340PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001341PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001342{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001344 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001345
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001346 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001348 m = s->ob_type->tp_as_sequence;
1349 if (m && m->sq_slice) {
1350 if (i1 < 0 || i2 < 0) {
1351 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001352 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001353 if (l < 0)
1354 return NULL;
1355 if (i1 < 0)
1356 i1 += l;
1357 if (i2 < 0)
1358 i2 += l;
1359 }
1360 }
1361 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001362 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1363 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001364 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001365 if (!slice)
1366 return NULL;
1367 res = mp->mp_subscript(s, slice);
1368 Py_DECREF(slice);
1369 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001370 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001371
Georg Brandlccff7852006-06-18 22:17:29 +00001372 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001373}
1374
1375int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001376PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001377{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001378 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001379
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380 if (s == NULL) {
1381 null_error();
1382 return -1;
1383 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001384
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001385 m = s->ob_type->tp_as_sequence;
1386 if (m && m->sq_ass_item) {
1387 if (i < 0) {
1388 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001389 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001391 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 i += l;
1393 }
1394 }
1395 return m->sq_ass_item(s, i, o);
1396 }
1397
Georg Brandlccff7852006-06-18 22:17:29 +00001398 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001400}
1401
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001402int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001403PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001404{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001405 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001406
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001407 if (s == NULL) {
1408 null_error();
1409 return -1;
1410 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001411
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001412 m = s->ob_type->tp_as_sequence;
1413 if (m && m->sq_ass_item) {
1414 if (i < 0) {
1415 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001416 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001417 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001418 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001419 i += l;
1420 }
1421 }
1422 return m->sq_ass_item(s, i, (PyObject *)NULL);
1423 }
1424
Georg Brandlccff7852006-06-18 22:17:29 +00001425 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001426 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001427}
1428
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001429int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001430PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001431{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001432 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001433 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001434
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001435 if (s == NULL) {
1436 null_error();
1437 return -1;
1438 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001439
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 m = s->ob_type->tp_as_sequence;
1441 if (m && m->sq_ass_slice) {
1442 if (i1 < 0 || i2 < 0) {
1443 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001444 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001446 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001447 if (i1 < 0)
1448 i1 += l;
1449 if (i2 < 0)
1450 i2 += l;
1451 }
1452 }
1453 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001454 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1455 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001456 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001457 if (!slice)
1458 return -1;
1459 res = mp->mp_ass_subscript(s, slice, o);
1460 Py_DECREF(slice);
1461 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001462 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001463
Georg Brandlccff7852006-06-18 22:17:29 +00001464 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001465 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001466}
1467
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001468int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001469PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001470{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001471 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001472
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001473 if (s == NULL) {
1474 null_error();
1475 return -1;
1476 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001477
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001478 m = s->ob_type->tp_as_sequence;
1479 if (m && m->sq_ass_slice) {
1480 if (i1 < 0 || i2 < 0) {
1481 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001482 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001483 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001484 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001485 if (i1 < 0)
1486 i1 += l;
1487 if (i2 < 0)
1488 i2 += l;
1489 }
1490 }
1491 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1492 }
Georg Brandlccff7852006-06-18 22:17:29 +00001493 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001494 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001495}
1496
Guido van Rossume15dee51995-07-18 14:12:02 +00001497PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001498PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001499{
Tim Peters6912d4d2001-05-05 03:56:37 +00001500 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001501 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001502 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001503 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001504
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001505 if (v == NULL)
1506 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001507
Tim Peters6912d4d2001-05-05 03:56:37 +00001508 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001509 if (PyTuple_CheckExact(v)) {
1510 /* Note that we can't know whether it's safe to return
1511 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001512 to exact tuples here. In contrast, lists always make
1513 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001514 Py_INCREF(v);
1515 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001516 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001517 if (PyList_Check(v))
1518 return PyList_AsTuple(v);
1519
Tim Peters6912d4d2001-05-05 03:56:37 +00001520 /* Get iterator. */
1521 it = PyObject_GetIter(v);
1522 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001523 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001524
Tim Peters6912d4d2001-05-05 03:56:37 +00001525 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00001526 n = _PyObject_LengthHint(v, 10);
Tim Peters6912d4d2001-05-05 03:56:37 +00001527 result = PyTuple_New(n);
1528 if (result == NULL)
1529 goto Fail;
1530
1531 /* Fill the tuple. */
1532 for (j = 0; ; ++j) {
1533 PyObject *item = PyIter_Next(it);
1534 if (item == NULL) {
1535 if (PyErr_Occurred())
1536 goto Fail;
1537 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001538 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001539 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001540 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001541 /* The over-allocation strategy can grow a bit faster
1542 than for lists because unlike lists the
1543 over-allocation isn't permanent -- we reclaim
1544 the excess before the end of this routine.
1545 So, grow by ten and then add 25%.
1546 */
1547 n += 10;
1548 n += n >> 2;
1549 if (n < oldn) {
1550 /* Check for overflow */
1551 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001552 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001553 goto Fail;
1554 }
Tim Peters4324aa32001-05-28 22:30:08 +00001555 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001556 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001557 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001558 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001559 }
1560 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001561 }
1562
Tim Peters6912d4d2001-05-05 03:56:37 +00001563 /* Cut tuple back if guess was too large. */
1564 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001565 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001566 goto Fail;
1567
1568 Py_DECREF(it);
1569 return result;
1570
1571Fail:
1572 Py_XDECREF(result);
1573 Py_DECREF(it);
1574 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001575}
1576
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001577PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001578PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001579{
Tim Petersf553f892001-05-01 20:45:31 +00001580 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001581 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001582
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001583 if (v == NULL)
1584 return null_error();
1585
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001586 result = PyList_New(0);
1587 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001588 return NULL;
1589
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001590 rv = _PyList_Extend((PyListObject *)result, v);
1591 if (rv == NULL) {
1592 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001593 return NULL;
1594 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001595 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001596 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001597}
1598
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001599PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001600PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001601{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001602 PyObject *it;
1603
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001604 if (v == NULL)
1605 return null_error();
1606
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001607 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001608 Py_INCREF(v);
1609 return v;
1610 }
1611
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001612 it = PyObject_GetIter(v);
1613 if (it == NULL) {
1614 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00001615 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001616 return NULL;
1617 }
1618
Raymond Hettinger193814c2004-12-18 19:00:59 +00001619 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001620 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001621
1622 return v;
1623}
1624
Tim Peters16a77ad2001-09-08 04:00:12 +00001625/* Iterate over seq. Result depends on the operation:
1626 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1627 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1628 set ValueError and return -1 if none found; also return -1 on error.
1629 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1630*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001631Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001632_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001633{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001634 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001635 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1636 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001637
Tim Peters16a77ad2001-09-08 04:00:12 +00001638 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001639 null_error();
1640 return -1;
1641 }
Tim Peters75f8e352001-05-05 11:33:43 +00001642
Tim Peters16a77ad2001-09-08 04:00:12 +00001643 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001644 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00001645 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001646 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001647 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001648
Tim Peters16a77ad2001-09-08 04:00:12 +00001649 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001650 for (;;) {
1651 int cmp;
1652 PyObject *item = PyIter_Next(it);
1653 if (item == NULL) {
1654 if (PyErr_Occurred())
1655 goto Fail;
1656 break;
1657 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001658
1659 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001660 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001661 if (cmp < 0)
1662 goto Fail;
1663 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001664 switch (operation) {
1665 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00001666 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001667 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00001668 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001669 goto Fail;
1670 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001671 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001672 break;
1673
1674 case PY_ITERSEARCH_INDEX:
1675 if (wrapped) {
1676 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00001677 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001678 goto Fail;
1679 }
1680 goto Done;
1681
1682 case PY_ITERSEARCH_CONTAINS:
1683 n = 1;
1684 goto Done;
1685
1686 default:
1687 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001688 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001689 }
1690
1691 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00001692 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00001693 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001694 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00001695 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001696 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001697
1698 if (operation != PY_ITERSEARCH_INDEX)
1699 goto Done;
1700
1701 PyErr_SetString(PyExc_ValueError,
1702 "sequence.index(x): x not in sequence");
1703 /* fall into failure code */
1704Fail:
1705 n = -1;
1706 /* fall through */
1707Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001708 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001709 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001710
Guido van Rossume15dee51995-07-18 14:12:02 +00001711}
1712
Tim Peters16a77ad2001-09-08 04:00:12 +00001713/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001714Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001715PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001716{
Tim Peters16a77ad2001-09-08 04:00:12 +00001717 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001718}
1719
Tim Peterscb8d3682001-05-05 21:05:01 +00001720/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001721 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001722 */
1723int
1724PySequence_Contains(PyObject *seq, PyObject *ob)
1725{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001726 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001727 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1728 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1729 if (sqm != NULL && sqm->sq_contains != NULL)
1730 return (*sqm->sq_contains)(seq, ob);
1731 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001732 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1733 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001734}
1735
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001736/* Backwards compatibility */
1737#undef PySequence_In
1738int
Fred Drake79912472000-07-09 04:06:11 +00001739PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001740{
1741 return PySequence_Contains(w, v);
1742}
1743
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001744Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001745PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001746{
Tim Peters16a77ad2001-09-08 04:00:12 +00001747 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001748}
1749
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001750/* Operations on mappings */
1751
1752int
Fred Drake79912472000-07-09 04:06:11 +00001753PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001754{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001755 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001756 return PyObject_HasAttrString(o, "__getitem__");
1757
1758 return o && o->ob_type->tp_as_mapping &&
1759 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001760 !(o->ob_type->tp_as_sequence &&
1761 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001762}
1763
Martin v. Löwis18e16552006-02-15 17:27:45 +00001764Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001765PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001766{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001767 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001769 if (o == NULL) {
1770 null_error();
1771 return -1;
1772 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001773
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001774 m = o->ob_type->tp_as_mapping;
1775 if (m && m->mp_length)
1776 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001777
Georg Brandlb0061c82006-08-08 11:56:21 +00001778 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001779 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001780}
1781
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001782#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001783Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001784PyMapping_Length(PyObject *o)
1785{
1786 return PyMapping_Size(o);
1787}
1788#define PyMapping_Length PyMapping_Size
1789
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001790PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001791PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001792{
1793 PyObject *okey, *r;
1794
1795 if (key == NULL)
1796 return null_error();
1797
1798 okey = PyString_FromString(key);
1799 if (okey == NULL)
1800 return NULL;
1801 r = PyObject_GetItem(o, okey);
1802 Py_DECREF(okey);
1803 return r;
1804}
1805
1806int
Fred Drake79912472000-07-09 04:06:11 +00001807PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001808{
1809 PyObject *okey;
1810 int r;
1811
1812 if (key == NULL) {
1813 null_error();
1814 return -1;
1815 }
1816
1817 okey = PyString_FromString(key);
1818 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001819 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001820 r = PyObject_SetItem(o, okey, value);
1821 Py_DECREF(okey);
1822 return r;
1823}
1824
1825int
Fred Drake79912472000-07-09 04:06:11 +00001826PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001827{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001828 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001829
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001830 v = PyMapping_GetItemString(o, key);
1831 if (v) {
1832 Py_DECREF(v);
1833 return 1;
1834 }
1835 PyErr_Clear();
1836 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001837}
1838
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001839int
Fred Drake79912472000-07-09 04:06:11 +00001840PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001841{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001842 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001843
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 v = PyObject_GetItem(o, key);
1845 if (v) {
1846 Py_DECREF(v);
1847 return 1;
1848 }
1849 PyErr_Clear();
1850 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001851}
1852
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001853/* Operations on callable objects */
1854
1855/* XXX PyCallable_Check() is in object.c */
1856
Guido van Rossume15dee51995-07-18 14:12:02 +00001857PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001858PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001859{
Guido van Rossum5560b742001-09-14 16:47:50 +00001860 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001861}
Guido van Rossume15dee51995-07-18 14:12:02 +00001862
1863PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001864PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1865{
1866 ternaryfunc call;
1867
1868 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00001869 PyObject *result;
1870 if (Py_EnterRecursiveCall(" while calling a Python object"))
1871 return NULL;
1872 result = (*call)(func, arg, kw);
1873 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001874 if (result == NULL && !PyErr_Occurred())
1875 PyErr_SetString(
1876 PyExc_SystemError,
1877 "NULL result without error in PyObject_Call");
1878 return result;
1879 }
Georg Brandlccff7852006-06-18 22:17:29 +00001880 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00001881 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001882 return NULL;
1883}
1884
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001885static PyObject*
1886call_function_tail(PyObject *callable, PyObject *args)
1887{
1888 PyObject *retval;
1889
1890 if (args == NULL)
1891 return NULL;
1892
1893 if (!PyTuple_Check(args)) {
1894 PyObject *a;
1895
1896 a = PyTuple_New(1);
1897 if (a == NULL) {
1898 Py_DECREF(args);
1899 return NULL;
1900 }
1901 PyTuple_SET_ITEM(a, 0, args);
1902 args = a;
1903 }
1904 retval = PyObject_Call(callable, args, NULL);
1905
1906 Py_DECREF(args);
1907
1908 return retval;
1909}
1910
Tim Peters6d6c1a32001-08-02 04:15:00 +00001911PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001912PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001913{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001914 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001915 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001916
Fred Drakeb92cf062001-10-27 06:16:31 +00001917 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001918 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001919
Fred Drakeb92cf062001-10-27 06:16:31 +00001920 if (format && *format) {
1921 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001922 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001923 va_end(va);
1924 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001925 else
1926 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001927
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001928 return call_function_tail(callable, args);
1929}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001930
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001931PyObject *
1932_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1933{
1934 va_list va;
1935 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001936
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001937 if (callable == NULL)
1938 return null_error();
1939
1940 if (format && *format) {
1941 va_start(va, format);
1942 args = _Py_VaBuildValue_SizeT(format, va);
1943 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001944 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001945 else
1946 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001947
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001948 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001949}
1950
1951PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001952PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001953{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001954 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001955 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001956 PyObject *func = NULL;
1957 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001958
Fred Drakeb92cf062001-10-27 06:16:31 +00001959 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001960 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001961
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001962 func = PyObject_GetAttrString(o, name);
1963 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001964 PyErr_SetString(PyExc_AttributeError, name);
1965 return 0;
1966 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001967
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001968 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00001969 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001970 goto exit;
1971 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001972
Fred Drakeb92cf062001-10-27 06:16:31 +00001973 if (format && *format) {
1974 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001975 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001976 va_end(va);
1977 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001978 else
1979 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001980
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001981 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001982
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001983 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001984 /* args gets consumed in call_function_tail */
1985 Py_XDECREF(func);
1986
1987 return retval;
1988}
1989
1990PyObject *
1991_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1992{
1993 va_list va;
1994 PyObject *args;
1995 PyObject *func = NULL;
1996 PyObject *retval = NULL;
1997
1998 if (o == NULL || name == NULL)
1999 return null_error();
2000
2001 func = PyObject_GetAttrString(o, name);
2002 if (func == NULL) {
2003 PyErr_SetString(PyExc_AttributeError, name);
2004 return 0;
2005 }
2006
2007 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002008 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002009 goto exit;
2010 }
2011
2012 if (format && *format) {
2013 va_start(va, format);
2014 args = _Py_VaBuildValue_SizeT(format, va);
2015 va_end(va);
2016 }
2017 else
2018 args = PyTuple_New(0);
2019
2020 retval = call_function_tail(func, args);
2021
2022 exit:
2023 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002024 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002025
2026 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002027}
Guido van Rossum823649d2001-03-21 18:40:58 +00002028
2029
Fred Drakeb421b8c2001-10-26 16:21:32 +00002030static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002031objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002032{
2033 int i, n = 0;
2034 va_list countva;
2035 PyObject *result, *tmp;
2036
2037#ifdef VA_LIST_IS_ARRAY
2038 memcpy(countva, va, sizeof(va_list));
2039#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002040#ifdef __va_copy
2041 __va_copy(countva, va);
2042#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002043 countva = va;
2044#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002045#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002046
2047 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2048 ++n;
2049 result = PyTuple_New(n);
2050 if (result != NULL && n > 0) {
2051 for (i = 0; i < n; ++i) {
2052 tmp = (PyObject *)va_arg(va, PyObject *);
2053 PyTuple_SET_ITEM(result, i, tmp);
2054 Py_INCREF(tmp);
2055 }
2056 }
2057 return result;
2058}
2059
2060PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002061PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002062{
2063 PyObject *args, *tmp;
2064 va_list vargs;
2065
2066 if (callable == NULL || name == NULL)
2067 return null_error();
2068
2069 callable = PyObject_GetAttr(callable, name);
2070 if (callable == NULL)
2071 return NULL;
2072
2073 /* count the args */
2074 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002075 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002076 va_end(vargs);
2077 if (args == NULL) {
2078 Py_DECREF(callable);
2079 return NULL;
2080 }
2081 tmp = PyObject_Call(callable, args, NULL);
2082 Py_DECREF(args);
2083 Py_DECREF(callable);
2084
2085 return tmp;
2086}
2087
2088PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002089PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002090{
2091 PyObject *args, *tmp;
2092 va_list vargs;
2093
2094 if (callable == NULL)
2095 return null_error();
2096
2097 /* count the args */
2098 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002099 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002100 va_end(vargs);
2101 if (args == NULL)
2102 return NULL;
2103 tmp = PyObject_Call(callable, args, NULL);
2104 Py_DECREF(args);
2105
2106 return tmp;
2107}
2108
2109
Guido van Rossum823649d2001-03-21 18:40:58 +00002110/* isinstance(), issubclass() */
2111
Barry Warsawf16951c2002-04-23 22:45:44 +00002112/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2113 * state that will almost never happen.
2114 *
2115 * 0. creating the __bases__ static string could get a MemoryError
2116 * 1. getattr(cls, '__bases__') could raise an AttributeError
2117 * 2. getattr(cls, '__bases__') could raise some other exception
2118 * 3. getattr(cls, '__bases__') could return a tuple
2119 * 4. getattr(cls, '__bases__') could return something other than a tuple
2120 *
2121 * Only state #3 is a non-error state and only it returns a non-NULL object
2122 * (it returns the retrieved tuple).
2123 *
2124 * Any raised AttributeErrors are masked by clearing the exception and
2125 * returning NULL. If an object other than a tuple comes out of __bases__,
2126 * then again, the return value is NULL. So yes, these two situations
2127 * produce exactly the same results: NULL is returned and no error is set.
2128 *
2129 * If some exception other than AttributeError is raised, then NULL is also
2130 * returned, but the exception is not cleared. That's because we want the
2131 * exception to be propagated along.
2132 *
2133 * Callers are expected to test for PyErr_Occurred() when the return value
2134 * is NULL to decide whether a valid exception should be propagated or not.
2135 * When there's no exception to propagate, it's customary for the caller to
2136 * set a TypeError.
2137 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002138static PyObject *
2139abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002140{
2141 static PyObject *__bases__ = NULL;
2142 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002143
2144 if (__bases__ == NULL) {
2145 __bases__ = PyString_FromString("__bases__");
2146 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002147 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002148 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002149 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002150 if (bases == NULL) {
2151 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2152 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002153 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002154 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002155 if (!PyTuple_Check(bases)) {
2156 Py_DECREF(bases);
2157 return NULL;
2158 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002159 return bases;
2160}
2161
2162
2163static int
2164abstract_issubclass(PyObject *derived, PyObject *cls)
2165{
2166 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002167 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002168 int r = 0;
2169
2170
Guido van Rossum823649d2001-03-21 18:40:58 +00002171 if (derived == cls)
2172 return 1;
2173
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002174 if (PyTuple_Check(cls)) {
2175 /* Not a general sequence -- that opens up the road to
2176 recursion and stack overflow. */
2177 n = PyTuple_GET_SIZE(cls);
2178 for (i = 0; i < n; i++) {
2179 if (derived == PyTuple_GET_ITEM(cls, i))
2180 return 1;
2181 }
2182 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002183 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002184 if (bases == NULL) {
2185 if (PyErr_Occurred())
2186 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002187 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002188 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002189 n = PyTuple_GET_SIZE(bases);
2190 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002191 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002192 if (r != 0)
2193 break;
2194 }
2195
2196 Py_DECREF(bases);
2197
2198 return r;
2199}
2200
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002201static int
2202check_class(PyObject *cls, const char *error)
2203{
2204 PyObject *bases = abstract_get_bases(cls);
2205 if (bases == NULL) {
2206 /* Do not mask errors. */
2207 if (!PyErr_Occurred())
2208 PyErr_SetString(PyExc_TypeError, error);
2209 return 0;
2210 }
2211 Py_DECREF(bases);
2212 return -1;
2213}
2214
Brett Cannon4f653312004-03-20 22:52:14 +00002215static int
2216recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002217{
2218 PyObject *icls;
2219 static PyObject *__class__ = NULL;
2220 int retval = 0;
2221
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002222 if (__class__ == NULL) {
2223 __class__ = PyString_FromString("__class__");
2224 if (__class__ == NULL)
2225 return -1;
2226 }
2227
Neil Schemenauer6b471292001-10-18 03:18:43 +00002228 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2229 PyObject *inclass =
2230 (PyObject*)((PyInstanceObject*)inst)->in_class;
2231 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002232 }
2233 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002234 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002235 if (retval == 0) {
2236 PyObject *c = PyObject_GetAttr(inst, __class__);
2237 if (c == NULL) {
2238 PyErr_Clear();
2239 }
2240 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002241 if (c != (PyObject *)(inst->ob_type) &&
2242 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002243 retval = PyType_IsSubtype(
2244 (PyTypeObject *)c,
2245 (PyTypeObject *)cls);
2246 Py_DECREF(c);
2247 }
2248 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002249 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002250 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002251 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002252
Brett Cannon4f653312004-03-20 22:52:14 +00002253 if (!recursion_depth) {
2254 PyErr_SetString(PyExc_RuntimeError,
2255 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002256 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002257 }
2258
Guido van Rossum03290ec2001-10-07 20:54:12 +00002259 n = PyTuple_GET_SIZE(cls);
2260 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002261 retval = recursive_isinstance(
2262 inst,
2263 PyTuple_GET_ITEM(cls, i),
2264 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002265 if (retval != 0)
2266 break;
2267 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002268 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002269 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002270 if (!check_class(cls,
2271 "isinstance() arg 2 must be a class, type,"
2272 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002273 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002274 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002275 if (icls == NULL) {
2276 PyErr_Clear();
2277 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002278 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002279 else {
2280 retval = abstract_issubclass(icls, cls);
2281 Py_DECREF(icls);
2282 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002283 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002284
Guido van Rossum823649d2001-03-21 18:40:58 +00002285 return retval;
2286}
2287
2288int
Brett Cannon4f653312004-03-20 22:52:14 +00002289PyObject_IsInstance(PyObject *inst, PyObject *cls)
2290{
Guido van Rossumb5591132007-09-10 22:36:02 +00002291 PyObject *t, *v, *tb;
2292 PyObject *checker;
2293 PyErr_Fetch(&t, &v, &tb);
2294 checker = PyObject_GetAttrString(cls, "__instancecheck__");
2295 PyErr_Restore(t, v, tb);
2296 if (checker != NULL) {
2297 PyObject *res;
2298 int ok = -1;
2299 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2300 Py_DECREF(checker);
2301 return ok;
2302 }
2303 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2304 Py_LeaveRecursiveCall();
2305 Py_DECREF(checker);
2306 if (res != NULL) {
2307 ok = PyObject_IsTrue(res);
2308 Py_DECREF(res);
2309 }
2310 return ok;
2311 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002312 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002313}
2314
2315static int
2316recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002317{
2318 int retval;
2319
2320 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002321 if (!check_class(derived,
2322 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002323 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002324
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002325 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002326 Py_ssize_t i;
2327 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002328
2329 if (!recursion_depth) {
2330 PyErr_SetString(PyExc_RuntimeError,
2331 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002332 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002333 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002334 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002335 retval = recursive_issubclass(
2336 derived,
2337 PyTuple_GET_ITEM(cls, i),
2338 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002339 if (retval != 0) {
2340 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002341 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002342 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002343 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002344 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002345 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002346 else {
2347 if (!check_class(cls,
2348 "issubclass() arg 2 must be a class"
2349 " or tuple of classes"))
2350 return -1;
2351 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002352
2353 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002354 }
2355 else {
2356 /* shortcut */
2357 if (!(retval = (derived == cls)))
2358 retval = PyClass_IsSubclass(derived, cls);
2359 }
2360
2361 return retval;
2362}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002363
Brett Cannon4f653312004-03-20 22:52:14 +00002364int
2365PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2366{
Guido van Rossumb5591132007-09-10 22:36:02 +00002367 PyObject *t, *v, *tb;
2368 PyObject *checker;
2369 PyErr_Fetch(&t, &v, &tb);
2370 checker = PyObject_GetAttrString(cls, "__subclasscheck__");
2371 PyErr_Restore(t, v, tb);
2372 if (checker != NULL) {
2373 PyObject *res;
2374 int ok = -1;
2375 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2376 return ok;
2377 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
2378 Py_LeaveRecursiveCall();
2379 Py_DECREF(checker);
2380 if (res != NULL) {
2381 ok = PyObject_IsTrue(res);
2382 Py_DECREF(res);
2383 }
2384 return ok;
2385 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002386 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002387}
2388
2389
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002390PyObject *
2391PyObject_GetIter(PyObject *o)
2392{
2393 PyTypeObject *t = o->ob_type;
2394 getiterfunc f = NULL;
2395 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2396 f = t->tp_iter;
2397 if (f == NULL) {
2398 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002399 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00002400 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002401 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002402 else {
2403 PyObject *res = (*f)(o);
2404 if (res != NULL && !PyIter_Check(res)) {
2405 PyErr_Format(PyExc_TypeError,
2406 "iter() returned non-iterator "
2407 "of type '%.100s'",
2408 res->ob_type->tp_name);
2409 Py_DECREF(res);
2410 res = NULL;
2411 }
2412 return res;
2413 }
2414}
2415
Tim Petersf4848da2001-05-05 00:14:56 +00002416/* Return next item.
2417 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2418 * If the iteration terminates normally, return NULL and clear the
2419 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2420 * will be false.
2421 * Else return the next object. PyErr_Occurred() will be false.
2422 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002423PyObject *
2424PyIter_Next(PyObject *iter)
2425{
Tim Petersf4848da2001-05-05 00:14:56 +00002426 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002427 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002428 result = (*iter->ob_type->tp_iternext)(iter);
2429 if (result == NULL &&
2430 PyErr_Occurred() &&
2431 PyErr_ExceptionMatches(PyExc_StopIteration))
2432 PyErr_Clear();
2433 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002434}