blob: 99b22db71bad23e559684b6a928c08b55dc97acf [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
Raymond Hettingerb5163702009-02-02 21:50:13 +000088 value, then the defaultvalue is returned. If one of the calls fails,
89 this function returns -1.
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000090*/
91
92Py_ssize_t
93_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
94{
95 static PyObject *hintstrobj = NULL;
Benjamin Petersonaf1692a2009-05-09 16:36:39 +000096 PyObject *ro, *hintmeth;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000097 Py_ssize_t rv;
98
99 /* try o.__len__() */
100 rv = PyObject_Size(o);
101 if (rv >= 0)
102 return rv;
Raymond Hettingerb5163702009-02-02 21:50:13 +0000103 if (PyErr_Occurred()) {
104 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
105 !PyErr_ExceptionMatches(PyExc_AttributeError))
106 return -1;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000107 PyErr_Clear();
Raymond Hettingerb5163702009-02-02 21:50:13 +0000108 }
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000109
Benjamin Peterson3f3d36b2009-05-09 16:51:51 +0000110 if (PyInstance_Check(o))
111 return defaultvalue;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000112 /* try o.__length_hint__() */
Benjamin Petersonaf1692a2009-05-09 16:36:39 +0000113 hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
114 if (hintmeth == NULL)
115 return defaultvalue;
116 ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
117 Py_DECREF(hintmeth);
Raymond Hettingerb5163702009-02-02 21:50:13 +0000118 if (ro == NULL) {
Benjamin Petersonaf1692a2009-05-09 16:36:39 +0000119 if (!PyErr_ExceptionMatches(PyExc_TypeError))
120 return -1;
Raymond Hettingerb5163702009-02-02 21:50:13 +0000121 return defaultvalue;
122 }
Mark Dickinsonb91d2f52009-02-08 13:58:10 +0000123 rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000124 Py_DECREF(ro);
Raymond Hettingerb5163702009-02-02 21:50:13 +0000125 return rv;
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 Brandlf5fd5232009-04-18 08:26:21 +0000153 return type_error("'%.200s' object is not subscriptable", 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 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000230 okey = PyString_FromString(key);
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000231 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
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000351/* Buffer C-API for Python 3.0 */
352
353int
354PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
355{
356 if (!PyObject_CheckBuffer(obj)) {
357 PyErr_Format(PyExc_TypeError,
358 "'%100s' does not have the buffer interface",
359 Py_TYPE(obj)->tp_name);
360 return -1;
361 }
362 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
363}
364
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000365static int
366_IsFortranContiguous(Py_buffer *view)
367{
368 Py_ssize_t sd, dim;
369 int i;
370
371 if (view->ndim == 0) return 1;
372 if (view->strides == NULL) return (view->ndim == 1);
373
374 sd = view->itemsize;
375 if (view->ndim == 1) return (view->shape[0] == 1 ||
376 sd == view->strides[0]);
377 for (i=0; i<view->ndim; i++) {
378 dim = view->shape[i];
379 if (dim == 0) return 1;
380 if (view->strides[i] != sd) return 0;
381 sd *= dim;
382 }
383 return 1;
384}
385
386static int
387_IsCContiguous(Py_buffer *view)
388{
389 Py_ssize_t sd, dim;
390 int i;
391
392 if (view->ndim == 0) return 1;
393 if (view->strides == NULL) return 1;
394
395 sd = view->itemsize;
396 if (view->ndim == 1) return (view->shape[0] == 1 ||
397 sd == view->strides[0]);
398 for (i=view->ndim-1; i>=0; i--) {
399 dim = view->shape[i];
400 if (dim == 0) return 1;
401 if (view->strides[i] != sd) return 0;
402 sd *= dim;
403 }
404 return 1;
405}
406
407int
408PyBuffer_IsContiguous(Py_buffer *view, char fort)
409{
410
411 if (view->suboffsets != NULL) return 0;
412
413 if (fort == 'C')
414 return _IsCContiguous(view);
415 else if (fort == 'F')
416 return _IsFortranContiguous(view);
417 else if (fort == 'A')
418 return (_IsCContiguous(view) || _IsFortranContiguous(view));
419 return 0;
420}
421
422
423void*
424PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
425{
426 char* pointer;
427 int i;
428 pointer = (char *)view->buf;
429 for (i = 0; i < view->ndim; i++) {
430 pointer += view->strides[i]*indices[i];
431 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
432 pointer = *((char**)pointer) + view->suboffsets[i];
433 }
434 }
435 return (void*)pointer;
436}
437
438
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000439void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000440_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape)
441{
442 int k;
443
444 for (k=0; k<nd; k++) {
445 if (index[k] < shape[k]-1) {
446 index[k]++;
447 break;
448 }
449 else {
450 index[k] = 0;
451 }
452 }
453}
454
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000455void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000456_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape)
457{
458 int k;
459
460 for (k=nd-1; k>=0; k--) {
461 if (index[k] < shape[k]-1) {
462 index[k]++;
463 break;
464 }
465 else {
466 index[k] = 0;
467 }
468 }
469}
470
471 /* view is not checked for consistency in either of these. It is
472 assumed that the size of the buffer is view->len in
473 view->len / view->itemsize elements.
474 */
475
476int
477PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
478{
479 int k;
480 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
481 Py_ssize_t *indices, elements;
482 char *dest, *ptr;
483
484 if (len > view->len) {
485 len = view->len;
486 }
487
488 if (PyBuffer_IsContiguous(view, fort)) {
489 /* simplest copy is all that is needed */
490 memcpy(buf, view->buf, len);
491 return 0;
492 }
493
494 /* Otherwise a more elaborate scheme is needed */
495
496 /* XXX(nnorwitz): need to check for overflow! */
497 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
498 if (indices == NULL) {
499 PyErr_NoMemory();
500 return -1;
501 }
502 for (k=0; k<view->ndim;k++) {
503 indices[k] = 0;
504 }
505
506 if (fort == 'F') {
507 addone = _add_one_to_index_F;
508 }
509 else {
510 addone = _add_one_to_index_C;
511 }
512 dest = buf;
513 /* XXX : This is not going to be the fastest code in the world
514 several optimizations are possible.
515 */
516 elements = len / view->itemsize;
517 while (elements--) {
518 addone(view->ndim, indices, view->shape);
519 ptr = PyBuffer_GetPointer(view, indices);
520 memcpy(dest, ptr, view->itemsize);
521 dest += view->itemsize;
522 }
523 PyMem_Free(indices);
524 return 0;
525}
526
527int
528PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
529{
530 int k;
531 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
532 Py_ssize_t *indices, elements;
533 char *src, *ptr;
534
535 if (len > view->len) {
536 len = view->len;
537 }
538
539 if (PyBuffer_IsContiguous(view, fort)) {
540 /* simplest copy is all that is needed */
541 memcpy(view->buf, buf, len);
542 return 0;
543 }
544
545 /* Otherwise a more elaborate scheme is needed */
546
547 /* XXX(nnorwitz): need to check for overflow! */
548 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
549 if (indices == NULL) {
550 PyErr_NoMemory();
551 return -1;
552 }
553 for (k=0; k<view->ndim;k++) {
554 indices[k] = 0;
555 }
556
557 if (fort == 'F') {
558 addone = _add_one_to_index_F;
559 }
560 else {
561 addone = _add_one_to_index_C;
562 }
563 src = buf;
564 /* XXX : This is not going to be the fastest code in the world
565 several optimizations are possible.
566 */
567 elements = len / view->itemsize;
568 while (elements--) {
569 addone(view->ndim, indices, view->shape);
570 ptr = PyBuffer_GetPointer(view, indices);
571 memcpy(ptr, src, view->itemsize);
572 src += view->itemsize;
573 }
574
575 PyMem_Free(indices);
576 return 0;
577}
578
579int PyObject_CopyData(PyObject *dest, PyObject *src)
580{
581 Py_buffer view_dest, view_src;
582 int k;
583 Py_ssize_t *indices, elements;
584 char *dptr, *sptr;
585
586 if (!PyObject_CheckBuffer(dest) ||
587 !PyObject_CheckBuffer(src)) {
588 PyErr_SetString(PyExc_TypeError,
589 "both destination and source must have the "\
590 "buffer interface");
591 return -1;
592 }
593
594 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
595 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000596 PyBuffer_Release(&view_dest);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000597 return -1;
598 }
599
600 if (view_dest.len < view_src.len) {
601 PyErr_SetString(PyExc_BufferError,
602 "destination is too small to receive data from source");
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000603 PyBuffer_Release(&view_dest);
604 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000605 return -1;
606 }
607
608 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
609 PyBuffer_IsContiguous(&view_src, 'C')) ||
610 (PyBuffer_IsContiguous(&view_dest, 'F') &&
611 PyBuffer_IsContiguous(&view_src, 'F'))) {
612 /* simplest copy is all that is needed */
613 memcpy(view_dest.buf, view_src.buf, view_src.len);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000614 PyBuffer_Release(&view_dest);
615 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000616 return 0;
617 }
618
619 /* Otherwise a more elaborate copy scheme is needed */
620
621 /* XXX(nnorwitz): need to check for overflow! */
622 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
623 if (indices == NULL) {
624 PyErr_NoMemory();
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000625 PyBuffer_Release(&view_dest);
626 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000627 return -1;
628 }
629 for (k=0; k<view_src.ndim;k++) {
630 indices[k] = 0;
631 }
632 elements = 1;
633 for (k=0; k<view_src.ndim; k++) {
634 /* XXX(nnorwitz): can this overflow? */
635 elements *= view_src.shape[k];
636 }
637 while (elements--) {
638 _add_one_to_index_C(view_src.ndim, indices, view_src.shape);
639 dptr = PyBuffer_GetPointer(&view_dest, indices);
640 sptr = PyBuffer_GetPointer(&view_src, indices);
641 memcpy(dptr, sptr, view_src.itemsize);
642 }
643 PyMem_Free(indices);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000644 PyBuffer_Release(&view_dest);
645 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000646 return 0;
647}
648
649void
650PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
651 Py_ssize_t *strides, int itemsize,
652 char fort)
653{
654 int k;
655 Py_ssize_t sd;
656
657 sd = itemsize;
658 if (fort == 'F') {
659 for (k=0; k<nd; k++) {
660 strides[k] = sd;
661 sd *= shape[k];
662 }
663 }
664 else {
665 for (k=nd-1; k>=0; k--) {
666 strides[k] = sd;
667 sd *= shape[k];
668 }
669 }
670 return;
671}
672
673int
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000674PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000675 int readonly, int flags)
676{
677 if (view == NULL) return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000678 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
679 (readonly == 1)) {
680 PyErr_SetString(PyExc_BufferError,
681 "Object is not writable.");
682 return -1;
683 }
684
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000685 view->obj = obj;
Martin v. Löwis241b8342008-08-14 15:54:27 +0000686 if (obj)
687 Py_INCREF(obj);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000688 view->buf = buf;
689 view->len = len;
690 view->readonly = readonly;
691 view->itemsize = 1;
692 view->format = NULL;
693 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
694 view->format = "B";
695 view->ndim = 1;
696 view->shape = NULL;
697 if ((flags & PyBUF_ND) == PyBUF_ND)
698 view->shape = &(view->len);
699 view->strides = NULL;
700 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
701 view->strides = &(view->itemsize);
702 view->suboffsets = NULL;
703 view->internal = NULL;
704 return 0;
705}
706
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000707void
708PyBuffer_Release(Py_buffer *view)
709{
710 PyObject *obj = view->obj;
Martin v. Löwis64034f92008-08-14 20:12:06 +0000711 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
712 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
713 Py_XDECREF(obj);
Martin v. Löwis241b8342008-08-14 15:54:27 +0000714 view->obj = NULL;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000715}
716
Eric Smitha9f7d622008-02-17 19:46:49 +0000717PyObject *
718PyObject_Format(PyObject* obj, PyObject *format_spec)
719{
720 static PyObject * str__format__ = NULL;
721 PyObject *empty = NULL;
722 PyObject *result = NULL;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000723#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000724 int spec_is_unicode;
725 int result_is_unicode;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000726#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000727
728 /* Initialize cached value */
729 if (str__format__ == NULL) {
730 /* Initialize static variable needed by _PyType_Lookup */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000731 str__format__ = PyString_InternFromString("__format__");
Eric Smitha9f7d622008-02-17 19:46:49 +0000732 if (str__format__ == NULL)
733 goto done;
734 }
735
736 /* If no format_spec is provided, use an empty string */
737 if (format_spec == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000738 empty = PyString_FromStringAndSize(NULL, 0);
Eric Smitha9f7d622008-02-17 19:46:49 +0000739 format_spec = empty;
740 }
741
742 /* Check the format_spec type, and make sure it's str or unicode */
Hirokazu Yamamoto1e234e82009-01-25 17:46:48 +0000743#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000744 if (PyUnicode_Check(format_spec))
745 spec_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000746 else if (PyString_Check(format_spec))
Eric Smitha9f7d622008-02-17 19:46:49 +0000747 spec_is_unicode = 0;
748 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000749#else
750 if (!PyString_Check(format_spec)) {
751#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000752 PyErr_Format(PyExc_TypeError,
753 "format expects arg 2 to be string "
754 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
755 goto done;
756 }
757
758 /* Make sure the type is initialized. float gets initialized late */
759 if (Py_TYPE(obj)->tp_dict == NULL)
760 if (PyType_Ready(Py_TYPE(obj)) < 0)
761 goto done;
762
763 /* Check for a __format__ method and call it. */
764 if (PyInstance_Check(obj)) {
765 /* We're an instance of a classic class */
766 PyObject *bound_method = PyObject_GetAttr(obj,
767 str__format__);
768 if (bound_method != NULL) {
769 result = PyObject_CallFunctionObjArgs(bound_method,
770 format_spec,
771 NULL);
772 Py_DECREF(bound_method);
773 } else {
774 PyObject *self_as_str;
775 PyObject *format_method;
776
777 PyErr_Clear();
778 /* Per the PEP, convert to str (or unicode,
779 depending on the type of the format
780 specifier). For new-style classes, this
781 logic is done by object.__format__(). */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000782#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000783 if (spec_is_unicode)
784 self_as_str = PyObject_Unicode(obj);
785 else
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000786#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000787 self_as_str = PyObject_Str(obj);
788 if (self_as_str == NULL)
789 goto done;
790
791 /* Then call str.__format__ on that result */
792 format_method = PyObject_GetAttr(self_as_str,
793 str__format__);
794 if (format_method == NULL) {
795 Py_DECREF(self_as_str);
796 goto done;
797 }
798 result = PyObject_CallFunctionObjArgs(format_method,
799 format_spec,
800 NULL);
801 Py_DECREF(self_as_str);
802 Py_DECREF(format_method);
803 if (result == NULL)
804 goto done;
805 }
806 } else {
807 /* Not an instance of a classic class, use the code
808 from py3k */
809
810 /* Find the (unbound!) __format__ method (a borrowed
811 reference) */
812 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
813 str__format__);
814 if (method == NULL) {
815 PyErr_Format(PyExc_TypeError,
816 "Type %.100s doesn't define __format__",
817 Py_TYPE(obj)->tp_name);
818 goto done;
819 }
820 /* And call it, binding it to the value */
821 result = PyObject_CallFunctionObjArgs(method, obj,
822 format_spec, NULL);
823 }
824
825 if (result == NULL)
826 goto done;
827
828 /* Check the result type, and make sure it's str or unicode */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000829#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000830 if (PyUnicode_Check(result))
831 result_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000832 else if (PyString_Check(result))
Eric Smitha9f7d622008-02-17 19:46:49 +0000833 result_is_unicode = 0;
834 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000835#else
836 if (!PyString_Check(result)) {
837#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000838 PyErr_Format(PyExc_TypeError,
839 "%.100s.__format__ must return string or "
840 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
841 Py_TYPE(result)->tp_name);
842 Py_DECREF(result);
843 result = NULL;
844 goto done;
845 }
846
847 /* Convert to unicode, if needed. Required if spec is unicode
848 and result is str */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000849#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000850 if (spec_is_unicode && !result_is_unicode) {
851 PyObject *tmp = PyObject_Unicode(result);
852 /* This logic works whether or not tmp is NULL */
853 Py_DECREF(result);
854 result = tmp;
855 }
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000856#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000857
858done:
859 Py_XDECREF(empty);
860 return result;
861}
862
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863/* Operations on numbers */
864
865int
Fred Drake79912472000-07-09 04:06:11 +0000866PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000867{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000868 return o && o->ob_type->tp_as_number &&
869 (o->ob_type->tp_as_number->nb_int ||
870 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000871}
872
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000873/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000874
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000875/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000876
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000877#define NB_SLOT(x) offsetof(PyNumberMethods, x)
878#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000879 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000880#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000881 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000882
883/*
884 Calling scheme used for binary operations:
885
886 v w Action
887 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000888 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000889 new old v.op(v,w), coerce(v,w), v.op(v,w)
890 old new w.op(v,w), coerce(v,w), v.op(v,w)
891 old old coerce(v,w), v.op(v,w)
892
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000893 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
894 v->ob_type
895
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000896 Legend:
897 -------
898 * new == new style number
899 * old == old style number
900 * Action indicates the order in which operations are tried until either
901 a valid result is produced or an error occurs.
902
903 */
904
905static PyObject *
906binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000907{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000908 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000909 binaryfunc slotv = NULL;
910 binaryfunc slotw = NULL;
911
912 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000913 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000914 if (w->ob_type != v->ob_type &&
915 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000916 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000917 if (slotw == slotv)
918 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000919 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000920 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000921 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
922 x = slotw(v, w);
923 if (x != Py_NotImplemented)
924 return x;
925 Py_DECREF(x); /* can't do it */
926 slotw = NULL;
927 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000928 x = slotv(v, w);
929 if (x != Py_NotImplemented)
930 return x;
931 Py_DECREF(x); /* can't do it */
932 }
933 if (slotw) {
934 x = slotw(v, w);
935 if (x != Py_NotImplemented)
936 return x;
937 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000938 }
939 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
940 int err = PyNumber_CoerceEx(&v, &w);
941 if (err < 0) {
942 return NULL;
943 }
944 if (err == 0) {
945 PyNumberMethods *mv = v->ob_type->tp_as_number;
946 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000947 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000948 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000949 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000950 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000951 Py_DECREF(v);
952 Py_DECREF(w);
953 return x;
954 }
955 }
956 /* CoerceEx incremented the reference counts */
957 Py_DECREF(v);
958 Py_DECREF(w);
959 }
960 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000961 Py_INCREF(Py_NotImplemented);
962 return Py_NotImplemented;
963}
Guido van Rossum77660912002-04-16 16:32:50 +0000964
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000965static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000966binop_type_error(PyObject *v, PyObject *w, const char *op_name)
967{
968 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000969 "unsupported operand type(s) for %.100s: "
970 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000971 op_name,
972 v->ob_type->tp_name,
973 w->ob_type->tp_name);
974 return NULL;
975}
976
977static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000978binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
979{
980 PyObject *result = binary_op1(v, w, op_slot);
981 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000982 Py_DECREF(result);
983 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000984 }
985 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000986}
987
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000988
989/*
990 Calling scheme used for ternary operations:
991
Guido van Rossum84675ac2001-09-29 01:05:03 +0000992 *** In some cases, w.op is called before v.op; see binary_op1. ***
993
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000994 v w z Action
995 -------------------------------------------------------------------
996 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
997 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
998 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
999 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1000 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1001 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1002 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1003 old old old coerce(v,w,z), v.op(v,w,z)
1004
1005 Legend:
1006 -------
1007 * new == new style number
1008 * old == old style number
1009 * Action indicates the order in which operations are tried until either
1010 a valid result is produced or an error occurs.
1011 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
1012 only if z != Py_None; if z == Py_None, then it is treated as absent
1013 variable and only coerce(v,w) is tried.
1014
1015 */
1016
1017static PyObject *
1018ternary_op(PyObject *v,
1019 PyObject *w,
1020 PyObject *z,
1021 const int op_slot,
1022 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001023{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001024 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001025 PyObject *x = NULL;
1026 ternaryfunc slotv = NULL;
1027 ternaryfunc slotw = NULL;
1028 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001029
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001030 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001031 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001032 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001033 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001034 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001035 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001036 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001037 if (slotw == slotv)
1038 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001039 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001040 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001041 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1042 x = slotw(v, w, z);
1043 if (x != Py_NotImplemented)
1044 return x;
1045 Py_DECREF(x); /* can't do it */
1046 slotw = NULL;
1047 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001048 x = slotv(v, w, z);
1049 if (x != Py_NotImplemented)
1050 return x;
1051 Py_DECREF(x); /* can't do it */
1052 }
1053 if (slotw) {
1054 x = slotw(v, w, z);
1055 if (x != Py_NotImplemented)
1056 return x;
1057 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001058 }
1059 mz = z->ob_type->tp_as_number;
1060 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001061 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001062 if (slotz == slotv || slotz == slotw)
1063 slotz = NULL;
1064 if (slotz) {
1065 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001066 if (x != Py_NotImplemented)
1067 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001068 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001069 }
1070 }
1071
1072 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1073 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1074 /* we have an old style operand, coerce */
1075 PyObject *v1, *z1, *w2, *z2;
1076 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001077
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001078 c = PyNumber_Coerce(&v, &w);
1079 if (c != 0)
1080 goto error3;
1081
1082 /* Special case: if the third argument is None, it is
1083 treated as absent argument and not coerced. */
1084 if (z == Py_None) {
1085 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001086 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1087 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001088 if (slotz)
1089 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001090 else
1091 c = -1;
1092 }
1093 else
1094 c = -1;
1095 goto error2;
1096 }
1097 v1 = v;
1098 z1 = z;
1099 c = PyNumber_Coerce(&v1, &z1);
1100 if (c != 0)
1101 goto error2;
1102 w2 = w;
1103 z2 = z1;
1104 c = PyNumber_Coerce(&w2, &z2);
1105 if (c != 0)
1106 goto error1;
1107
1108 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001109 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1110 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001111 if (slotv)
1112 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001113 else
1114 c = -1;
1115 }
1116 else
1117 c = -1;
1118
1119 Py_DECREF(w2);
1120 Py_DECREF(z2);
1121 error1:
1122 Py_DECREF(v1);
1123 Py_DECREF(z1);
1124 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001125 Py_DECREF(v);
1126 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001127 error3:
1128 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001129 return x;
1130 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001131
1132 if (z == Py_None)
1133 PyErr_Format(
1134 PyExc_TypeError,
1135 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001136 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001137 v->ob_type->tp_name,
1138 w->ob_type->tp_name);
1139 else
1140 PyErr_Format(
1141 PyExc_TypeError,
1142 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001143 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001144 v->ob_type->tp_name,
1145 w->ob_type->tp_name,
1146 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001147 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001148}
1149
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001150#define BINARY_FUNC(func, op, op_name) \
1151 PyObject * \
1152 func(PyObject *v, PyObject *w) { \
1153 return binary_op(v, w, NB_SLOT(op), op_name); \
1154 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001155
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001156BINARY_FUNC(PyNumber_Or, nb_or, "|")
1157BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1158BINARY_FUNC(PyNumber_And, nb_and, "&")
1159BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1160BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1161BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001162BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1163BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001164
1165PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001166PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001167{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001168 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1169 if (result == Py_NotImplemented) {
1170 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001171 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001172 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001173 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001174 }
Armin Rigofd163f92005-12-29 15:59:19 +00001175 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001176 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001177 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001178}
1179
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001180static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001181sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001182{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001183 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001184 if (PyIndex_Check(n)) {
1185 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001186 if (count == -1 && PyErr_Occurred())
1187 return NULL;
1188 }
1189 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001190 return type_error("can't multiply sequence by "
1191 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001192 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001193 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001194}
1195
1196PyObject *
1197PyNumber_Multiply(PyObject *v, PyObject *w)
1198{
1199 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1200 if (result == Py_NotImplemented) {
1201 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1202 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001203 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001204 if (mv && mv->sq_repeat) {
1205 return sequence_repeat(mv->sq_repeat, v, w);
1206 }
1207 else if (mw && mw->sq_repeat) {
1208 return sequence_repeat(mw->sq_repeat, w, v);
1209 }
1210 result = binop_type_error(v, w, "*");
1211 }
1212 return result;
1213}
1214
Guido van Rossume15dee51995-07-18 14:12:02 +00001215PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001216PyNumber_FloorDivide(PyObject *v, PyObject *w)
1217{
1218 /* XXX tp_flags test */
1219 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1220}
1221
1222PyObject *
1223PyNumber_TrueDivide(PyObject *v, PyObject *w)
1224{
1225 /* XXX tp_flags test */
1226 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1227}
1228
1229PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001230PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001231{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001232 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001233}
1234
1235PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001236PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001237{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001238 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001239}
1240
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001241/* Binary in-place operators */
1242
1243/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001244 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001245
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001246 - If the left hand object has the appropriate struct members, and
1247 they are filled, call the appropriate function and return the
1248 result. No coercion is done on the arguments; the left-hand object
1249 is the one the operation is performed on, and it's up to the
1250 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001251
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001252 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001253 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001254
1255 */
1256
Guido van Rossum77660912002-04-16 16:32:50 +00001257#define HASINPLACE(t) \
1258 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001259
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001260static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001261binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001262{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001263 PyNumberMethods *mv = v->ob_type->tp_as_number;
1264 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001265 binaryfunc slot = NB_BINOP(mv, iop_slot);
1266 if (slot) {
1267 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001268 if (x != Py_NotImplemented) {
1269 return x;
1270 }
1271 Py_DECREF(x);
1272 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001273 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001274 return binary_op1(v, w, op_slot);
1275}
1276
1277static PyObject *
1278binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1279 const char *op_name)
1280{
1281 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1282 if (result == Py_NotImplemented) {
1283 Py_DECREF(result);
1284 return binop_type_error(v, w, op_name);
1285 }
1286 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001287}
1288
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001289#define INPLACE_BINOP(func, iop, op, op_name) \
1290 PyObject * \
1291 func(PyObject *v, PyObject *w) { \
1292 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001293 }
1294
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001295INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1296INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1297INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1298INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1299INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1300INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1301INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001302
1303PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001304PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1305{
1306 /* XXX tp_flags test */
1307 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1308 NB_SLOT(nb_floor_divide), "//=");
1309}
1310
1311PyObject *
1312PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1313{
1314 /* XXX tp_flags test */
1315 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1316 NB_SLOT(nb_true_divide), "/=");
1317}
1318
1319PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001320PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1321{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001322 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1323 NB_SLOT(nb_add));
1324 if (result == Py_NotImplemented) {
1325 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1326 Py_DECREF(result);
1327 if (m != NULL) {
1328 binaryfunc f = NULL;
1329 if (HASINPLACE(v))
1330 f = m->sq_inplace_concat;
1331 if (f == NULL)
1332 f = m->sq_concat;
1333 if (f != NULL)
1334 return (*f)(v, w);
1335 }
1336 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001337 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001338 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001339}
1340
1341PyObject *
1342PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1343{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001344 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1345 NB_SLOT(nb_multiply));
1346 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001347 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001348 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1349 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1350 Py_DECREF(result);
1351 if (mv != NULL) {
1352 if (HASINPLACE(v))
1353 f = mv->sq_inplace_repeat;
1354 if (f == NULL)
1355 f = mv->sq_repeat;
1356 if (f != NULL)
1357 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001358 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001359 else if (mw != NULL) {
1360 /* Note that the right hand operand should not be
1361 * mutated in this case so sq_inplace_repeat is not
1362 * used. */
1363 if (mw->sq_repeat)
1364 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001365 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001366 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001367 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001368 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001369}
1370
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001371PyObject *
1372PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1373{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001374 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1375 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001376}
1377
1378PyObject *
1379PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1380{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001381 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1382 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1383 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001384 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001385 else {
1386 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1387 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001388}
1389
1390
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001392
1393PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001394PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001395{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 PyNumberMethods *m;
1397
1398 if (o == NULL)
1399 return null_error();
1400 m = o->ob_type->tp_as_number;
1401 if (m && m->nb_negative)
1402 return (*m->nb_negative)(o);
1403
Georg Brandlccff7852006-06-18 22:17:29 +00001404 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001405}
1406
1407PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001408PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001409{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001410 PyNumberMethods *m;
1411
1412 if (o == NULL)
1413 return null_error();
1414 m = o->ob_type->tp_as_number;
1415 if (m && m->nb_positive)
1416 return (*m->nb_positive)(o);
1417
Georg Brandlccff7852006-06-18 22:17:29 +00001418 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001419}
1420
1421PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001422PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001423{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 PyNumberMethods *m;
1425
1426 if (o == NULL)
1427 return null_error();
1428 m = o->ob_type->tp_as_number;
1429 if (m && m->nb_invert)
1430 return (*m->nb_invert)(o);
1431
Georg Brandlccff7852006-06-18 22:17:29 +00001432 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001433}
1434
1435PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001436PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001437{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001438 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001439
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 if (o == NULL)
1441 return null_error();
1442 m = o->ob_type->tp_as_number;
1443 if (m && m->nb_absolute)
1444 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001445
Georg Brandlccff7852006-06-18 22:17:29 +00001446 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001447}
1448
Guido van Rossum9e896b32000-04-05 20:11:21 +00001449/* Add a check for embedded NULL-bytes in the argument. */
1450static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001451int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001452{
1453 char *end;
1454 PyObject *x;
1455
1456 x = PyInt_FromString((char*)s, &end, 10);
1457 if (x == NULL)
1458 return NULL;
1459 if (end != s + len) {
1460 PyErr_SetString(PyExc_ValueError,
1461 "null byte in argument for int()");
1462 Py_DECREF(x);
1463 return NULL;
1464 }
1465 return x;
1466}
1467
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001468/* Return a Python Int or Long from the object item
1469 Raise TypeError if the result is not an int-or-long
1470 or if the object cannot be interpreted as an index.
1471*/
1472PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001473PyNumber_Index(PyObject *item)
1474{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001475 PyObject *result = NULL;
1476 if (item == NULL)
1477 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001478 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001479 Py_INCREF(item);
1480 return item;
1481 }
1482 if (PyIndex_Check(item)) {
1483 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001484 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001485 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001486 PyErr_Format(PyExc_TypeError,
1487 "__index__ returned non-(int,long) " \
1488 "(type %.200s)",
1489 result->ob_type->tp_name);
1490 Py_DECREF(result);
1491 return NULL;
1492 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001493 }
1494 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001495 PyErr_Format(PyExc_TypeError,
1496 "'%.200s' object cannot be interpreted "
1497 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001498 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001499 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001500}
1501
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001502/* Return an error on Overflow only if err is not NULL*/
1503
1504Py_ssize_t
1505PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1506{
1507 Py_ssize_t result;
1508 PyObject *runerr;
1509 PyObject *value = PyNumber_Index(item);
1510 if (value == NULL)
1511 return -1;
1512
1513 /* We're done if PyInt_AsSsize_t() returns without error. */
1514 result = PyInt_AsSsize_t(value);
1515 if (result != -1 || !(runerr = PyErr_Occurred()))
1516 goto finish;
1517
1518 /* Error handling code -- only manage OverflowError differently */
1519 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1520 goto finish;
1521
1522 PyErr_Clear();
1523 /* If no error-handling desired then the default clipping
1524 is sufficient.
1525 */
1526 if (!err) {
1527 assert(PyLong_Check(value));
1528 /* Whether or not it is less than or equal to
1529 zero is determined by the sign of ob_size
1530 */
1531 if (_PyLong_Sign(value) < 0)
1532 result = PY_SSIZE_T_MIN;
1533 else
1534 result = PY_SSIZE_T_MAX;
1535 }
1536 else {
1537 /* Otherwise replace the error with caller's error object. */
1538 PyErr_Format(err,
1539 "cannot fit '%.200s' into an index-sized integer",
1540 item->ob_type->tp_name);
1541 }
1542
1543 finish:
1544 Py_DECREF(value);
1545 return result;
1546}
1547
1548
Guido van Rossume15dee51995-07-18 14:12:02 +00001549PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001550_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1551{
1552 const char *type_name;
1553 static PyObject *int_name = NULL;
1554 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001555 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001556 if (int_name == NULL)
1557 return NULL;
1558 }
1559
1560 if (integral && (!PyInt_Check(integral) &&
1561 !PyLong_Check(integral))) {
1562 /* Don't go through tp_as_number->nb_int to avoid
1563 hitting the classic class fallback to __trunc__. */
1564 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1565 if (int_func == NULL) {
1566 PyErr_Clear(); /* Raise a different error. */
1567 goto non_integral_error;
1568 }
1569 Py_DECREF(integral);
1570 integral = PyEval_CallObject(int_func, NULL);
1571 Py_DECREF(int_func);
1572 if (integral && (!PyInt_Check(integral) &&
1573 !PyLong_Check(integral))) {
1574 goto non_integral_error;
1575 }
1576 }
1577 return integral;
1578
1579non_integral_error:
1580 if (PyInstance_Check(integral)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001581 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001582 ->in_class->cl_name);
1583 }
1584 else {
1585 type_name = integral->ob_type->tp_name;
1586 }
1587 PyErr_Format(PyExc_TypeError, error_format, type_name);
1588 Py_DECREF(integral);
1589 return NULL;
1590}
1591
1592
1593PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001594PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001595{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001596 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001597 static PyObject *trunc_name = NULL;
1598 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001599 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001600 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001601
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001602 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001603 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001604 if (trunc_name == NULL)
1605 return NULL;
1606 }
1607
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001608 if (o == NULL)
1609 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001610 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001611 Py_INCREF(o);
1612 return o;
1613 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001614 m = o->ob_type->tp_as_number;
1615 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001616 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001617 PyObject *res = m->nb_int(o);
1618 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1619 PyErr_Format(PyExc_TypeError,
1620 "__int__ returned non-int (type %.200s)",
1621 res->ob_type->tp_name);
1622 Py_DECREF(res);
1623 return NULL;
1624 }
1625 return res;
1626 }
1627 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001628 PyIntObject *io = (PyIntObject*)o;
1629 return PyInt_FromLong(io->ob_ival);
1630 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001631 trunc_func = PyObject_GetAttr(o, trunc_name);
1632 if (trunc_func) {
1633 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1634 Py_DECREF(trunc_func);
1635 /* __trunc__ is specified to return an Integral type, but
1636 int() needs to return an int. */
1637 return _PyNumber_ConvertIntegralToInt(
1638 truncated,
1639 "__trunc__ returned non-Integral (type %.200s)");
1640 }
1641 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1642
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001643 if (PyString_Check(o))
1644 return int_from_string(PyString_AS_STRING(o),
1645 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001646#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001647 if (PyUnicode_Check(o))
1648 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1649 PyUnicode_GET_SIZE(o),
1650 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001651#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001652 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001653 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001654
Georg Brandlccff7852006-06-18 22:17:29 +00001655 return type_error("int() argument must be a string or a "
1656 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001657}
1658
Guido van Rossum9e896b32000-04-05 20:11:21 +00001659/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001660static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001661long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001662{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001663 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001664 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001665
Guido van Rossum4c08d552000-03-10 22:55:18 +00001666 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001667 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001668 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001669 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001670 PyErr_SetString(PyExc_ValueError,
1671 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001672 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001673 return NULL;
1674 }
1675 return x;
1676}
1677
Guido van Rossume15dee51995-07-18 14:12:02 +00001678PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001679PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001680{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001681 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001682 static PyObject *trunc_name = NULL;
1683 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001684 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001685 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001686
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001687 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001688 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001689 if (trunc_name == NULL)
1690 return NULL;
1691 }
1692
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001693 if (o == NULL)
1694 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001695 m = o->ob_type->tp_as_number;
1696 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001697 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001698 PyObject *res = m->nb_long(o);
1699 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1700 PyErr_Format(PyExc_TypeError,
1701 "__long__ returned non-long (type %.200s)",
1702 res->ob_type->tp_name);
1703 Py_DECREF(res);
1704 return NULL;
1705 }
1706 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001707 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001708 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001709 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001710 trunc_func = PyObject_GetAttr(o, trunc_name);
1711 if (trunc_func) {
1712 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1713 PyObject *int_instance;
1714 Py_DECREF(trunc_func);
1715 /* __trunc__ is specified to return an Integral type,
1716 but long() needs to return a long. */
1717 int_instance = _PyNumber_ConvertIntegralToInt(
1718 truncated,
1719 "__trunc__ returned non-Integral (type %.200s)");
1720 if (int_instance && PyInt_Check(int_instance)) {
1721 /* Make sure that long() returns a long instance. */
1722 long value = PyInt_AS_LONG(int_instance);
1723 Py_DECREF(int_instance);
1724 return PyLong_FromLong(value);
1725 }
1726 return int_instance;
1727 }
1728 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1729
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001730 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001731 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001732 * doesn't do. In particular long('9.5') must raise an
1733 * exception, not truncate the float.
1734 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001735 return long_from_string(PyString_AS_STRING(o),
1736 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001737#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001738 if (PyUnicode_Check(o))
1739 /* The above check is done in PyLong_FromUnicode(). */
1740 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1741 PyUnicode_GET_SIZE(o),
1742 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001743#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001744 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1745 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001746
Georg Brandlccff7852006-06-18 22:17:29 +00001747 return type_error("long() argument must be a string or a "
1748 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001749}
1750
1751PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001752PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001753{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001754 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001755
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001756 if (o == NULL)
1757 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001758 m = o->ob_type->tp_as_number;
1759 if (m && m->nb_float) { /* This should include subclasses of float */
1760 PyObject *res = m->nb_float(o);
1761 if (res && !PyFloat_Check(res)) {
1762 PyErr_Format(PyExc_TypeError,
1763 "__float__ returned non-float (type %.200s)",
1764 res->ob_type->tp_name);
1765 Py_DECREF(res);
1766 return NULL;
1767 }
1768 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001769 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001770 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001771 PyFloatObject *po = (PyFloatObject *)o;
1772 return PyFloat_FromDouble(po->ob_fval);
1773 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001774 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001775}
1776
Eric Smith5e527eb2008-02-10 01:36:53 +00001777PyObject *
1778PyNumber_ToBase(PyObject *n, int base)
1779{
1780 PyObject *res = NULL;
1781 PyObject *index = PyNumber_Index(n);
1782
1783 if (!index)
1784 return NULL;
1785 if (PyLong_Check(index))
1786 res = _PyLong_Format(index, base, 0, 1);
1787 else if (PyInt_Check(index))
1788 res = _PyInt_Format((PyIntObject*)index, base, 1);
1789 else
Eric Smith3f914372008-02-15 12:14:32 +00001790 /* It should not be possible to get here, as
1791 PyNumber_Index already has a check for the same
1792 condition */
1793 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1794 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001795 Py_DECREF(index);
1796 return res;
1797}
1798
1799
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001800/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001801
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001802int
Fred Drake79912472000-07-09 04:06:11 +00001803PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001804{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001805 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001806 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001807 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001808 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001809 return s != NULL && s->ob_type->tp_as_sequence &&
1810 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001811}
1812
Martin v. Löwis18e16552006-02-15 17:27:45 +00001813Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001814PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001815{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001816 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001817
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001818 if (s == NULL) {
1819 null_error();
1820 return -1;
1821 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001822
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001823 m = s->ob_type->tp_as_sequence;
1824 if (m && m->sq_length)
1825 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001826
Georg Brandlb0061c82006-08-08 11:56:21 +00001827 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001828 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001829}
1830
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001831#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001832Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001833PySequence_Length(PyObject *s)
1834{
1835 return PySequence_Size(s);
1836}
1837#define PySequence_Length PySequence_Size
1838
Guido van Rossume15dee51995-07-18 14:12:02 +00001839PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001840PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001841{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001842 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001843
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 if (s == NULL || o == NULL)
1845 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001846
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001847 m = s->ob_type->tp_as_sequence;
1848 if (m && m->sq_concat)
1849 return m->sq_concat(s, o);
1850
Armin Rigofd163f92005-12-29 15:59:19 +00001851 /* Instances of user classes defining an __add__() method only
1852 have an nb_add slot, not an sq_concat slot. So we fall back
1853 to nb_add if both arguments appear to be sequences. */
1854 if (PySequence_Check(s) && PySequence_Check(o)) {
1855 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1856 if (result != Py_NotImplemented)
1857 return result;
1858 Py_DECREF(result);
1859 }
Georg Brandlccff7852006-06-18 22:17:29 +00001860 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001861}
1862
1863PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001864PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001865{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001866 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001867
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001868 if (o == NULL)
1869 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001870
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001871 m = o->ob_type->tp_as_sequence;
1872 if (m && m->sq_repeat)
1873 return m->sq_repeat(o, count);
1874
Armin Rigofd163f92005-12-29 15:59:19 +00001875 /* Instances of user classes defining a __mul__() method only
1876 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1877 to nb_multiply if o appears to be a sequence. */
1878 if (PySequence_Check(o)) {
1879 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001880 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001881 if (n == NULL)
1882 return NULL;
1883 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1884 Py_DECREF(n);
1885 if (result != Py_NotImplemented)
1886 return result;
1887 Py_DECREF(result);
1888 }
Georg Brandlccff7852006-06-18 22:17:29 +00001889 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001890}
1891
1892PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001893PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1894{
1895 PySequenceMethods *m;
1896
1897 if (s == NULL || o == NULL)
1898 return null_error();
1899
1900 m = s->ob_type->tp_as_sequence;
1901 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1902 return m->sq_inplace_concat(s, o);
1903 if (m && m->sq_concat)
1904 return m->sq_concat(s, o);
1905
Armin Rigofd163f92005-12-29 15:59:19 +00001906 if (PySequence_Check(s) && PySequence_Check(o)) {
1907 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1908 NB_SLOT(nb_add));
1909 if (result != Py_NotImplemented)
1910 return result;
1911 Py_DECREF(result);
1912 }
Georg Brandlccff7852006-06-18 22:17:29 +00001913 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001914}
1915
1916PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001917PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001918{
1919 PySequenceMethods *m;
1920
1921 if (o == NULL)
1922 return null_error();
1923
1924 m = o->ob_type->tp_as_sequence;
1925 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1926 return m->sq_inplace_repeat(o, count);
1927 if (m && m->sq_repeat)
1928 return m->sq_repeat(o, count);
1929
Armin Rigofd163f92005-12-29 15:59:19 +00001930 if (PySequence_Check(o)) {
1931 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001932 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001933 if (n == NULL)
1934 return NULL;
1935 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1936 NB_SLOT(nb_multiply));
1937 Py_DECREF(n);
1938 if (result != Py_NotImplemented)
1939 return result;
1940 Py_DECREF(result);
1941 }
Georg Brandlccff7852006-06-18 22:17:29 +00001942 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001943}
1944
1945PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001946PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001947{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001948 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001949
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001950 if (s == NULL)
1951 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001952
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001953 m = s->ob_type->tp_as_sequence;
1954 if (m && m->sq_item) {
1955 if (i < 0) {
1956 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001957 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001958 if (l < 0)
1959 return NULL;
1960 i += l;
1961 }
1962 }
1963 return m->sq_item(s, i);
1964 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001965
Skip Montanaro2c7ca9b2008-07-07 11:16:14 +00001966 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001967}
1968
1969PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001970PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001971{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001972 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001973 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001974
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001975 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001976
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001977 m = s->ob_type->tp_as_sequence;
1978 if (m && m->sq_slice) {
1979 if (i1 < 0 || i2 < 0) {
1980 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001981 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001982 if (l < 0)
1983 return NULL;
1984 if (i1 < 0)
1985 i1 += l;
1986 if (i2 < 0)
1987 i2 += l;
1988 }
1989 }
1990 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001991 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1992 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001993 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001994 if (!slice)
1995 return NULL;
1996 res = mp->mp_subscript(s, slice);
1997 Py_DECREF(slice);
1998 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001999 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002000
Georg Brandlccff7852006-06-18 22:17:29 +00002001 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00002002}
2003
2004int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002005PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002006{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002007 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002008
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002009 if (s == NULL) {
2010 null_error();
2011 return -1;
2012 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002013
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002014 m = s->ob_type->tp_as_sequence;
2015 if (m && m->sq_ass_item) {
2016 if (i < 0) {
2017 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002018 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002019 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002020 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002021 i += l;
2022 }
2023 }
2024 return m->sq_ass_item(s, i, o);
2025 }
2026
Georg Brandlccff7852006-06-18 22:17:29 +00002027 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002028 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002029}
2030
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002031int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002032PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002033{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002034 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002035
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002036 if (s == NULL) {
2037 null_error();
2038 return -1;
2039 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002040
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002041 m = s->ob_type->tp_as_sequence;
2042 if (m && m->sq_ass_item) {
2043 if (i < 0) {
2044 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002045 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002046 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002047 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002048 i += l;
2049 }
2050 }
2051 return m->sq_ass_item(s, i, (PyObject *)NULL);
2052 }
2053
Georg Brandlccff7852006-06-18 22:17:29 +00002054 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002055 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002056}
2057
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002058int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002059PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002060{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002061 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002062 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002064 if (s == NULL) {
2065 null_error();
2066 return -1;
2067 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002068
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002069 m = s->ob_type->tp_as_sequence;
2070 if (m && m->sq_ass_slice) {
2071 if (i1 < 0 || i2 < 0) {
2072 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002073 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002074 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002075 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002076 if (i1 < 0)
2077 i1 += l;
2078 if (i2 < 0)
2079 i2 += l;
2080 }
2081 }
2082 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002083 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2084 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002085 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002086 if (!slice)
2087 return -1;
2088 res = mp->mp_ass_subscript(s, slice, o);
2089 Py_DECREF(slice);
2090 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002091 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002092
Georg Brandlccff7852006-06-18 22:17:29 +00002093 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002094 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002095}
2096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002097int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002098PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002099{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002100 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002101
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002102 if (s == NULL) {
2103 null_error();
2104 return -1;
2105 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002106
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002107 m = s->ob_type->tp_as_sequence;
2108 if (m && m->sq_ass_slice) {
2109 if (i1 < 0 || i2 < 0) {
2110 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002111 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002112 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002113 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002114 if (i1 < 0)
2115 i1 += l;
2116 if (i2 < 0)
2117 i2 += l;
2118 }
2119 }
2120 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2121 }
Georg Brandlccff7852006-06-18 22:17:29 +00002122 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002123 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002124}
2125
Guido van Rossume15dee51995-07-18 14:12:02 +00002126PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002127PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002128{
Tim Peters6912d4d2001-05-05 03:56:37 +00002129 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002130 Py_ssize_t n; /* guess for result tuple size */
Raymond Hettingerb5163702009-02-02 21:50:13 +00002131 PyObject *result = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002132 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002134 if (v == NULL)
2135 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002136
Tim Peters6912d4d2001-05-05 03:56:37 +00002137 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002138 if (PyTuple_CheckExact(v)) {
2139 /* Note that we can't know whether it's safe to return
2140 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002141 to exact tuples here. In contrast, lists always make
2142 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002143 Py_INCREF(v);
2144 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002145 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002146 if (PyList_Check(v))
2147 return PyList_AsTuple(v);
2148
Tim Peters6912d4d2001-05-05 03:56:37 +00002149 /* Get iterator. */
2150 it = PyObject_GetIter(v);
2151 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002152 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002153
Tim Peters6912d4d2001-05-05 03:56:37 +00002154 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002155 n = _PyObject_LengthHint(v, 10);
Raymond Hettingerb5163702009-02-02 21:50:13 +00002156 if (n == -1)
2157 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002158 result = PyTuple_New(n);
2159 if (result == NULL)
2160 goto Fail;
2161
2162 /* Fill the tuple. */
2163 for (j = 0; ; ++j) {
2164 PyObject *item = PyIter_Next(it);
2165 if (item == NULL) {
2166 if (PyErr_Occurred())
2167 goto Fail;
2168 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002169 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002170 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002171 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002172 /* The over-allocation strategy can grow a bit faster
2173 than for lists because unlike lists the
2174 over-allocation isn't permanent -- we reclaim
2175 the excess before the end of this routine.
2176 So, grow by ten and then add 25%.
2177 */
2178 n += 10;
2179 n += n >> 2;
2180 if (n < oldn) {
2181 /* Check for overflow */
2182 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002183 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002184 goto Fail;
2185 }
Tim Peters4324aa32001-05-28 22:30:08 +00002186 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002187 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002188 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002189 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002190 }
2191 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002192 }
2193
Tim Peters6912d4d2001-05-05 03:56:37 +00002194 /* Cut tuple back if guess was too large. */
2195 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002196 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002197 goto Fail;
2198
2199 Py_DECREF(it);
2200 return result;
2201
2202Fail:
2203 Py_XDECREF(result);
2204 Py_DECREF(it);
2205 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002206}
2207
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002208PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002209PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002210{
Tim Petersf553f892001-05-01 20:45:31 +00002211 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002212 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002213
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002214 if (v == NULL)
2215 return null_error();
2216
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002217 result = PyList_New(0);
2218 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002219 return NULL;
2220
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002221 rv = _PyList_Extend((PyListObject *)result, v);
2222 if (rv == NULL) {
2223 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002224 return NULL;
2225 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002226 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002227 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002228}
2229
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002230PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002231PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002232{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002233 PyObject *it;
2234
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002235 if (v == NULL)
2236 return null_error();
2237
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002238 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002239 Py_INCREF(v);
2240 return v;
2241 }
2242
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002243 it = PyObject_GetIter(v);
2244 if (it == NULL) {
2245 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002246 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002247 return NULL;
2248 }
2249
Raymond Hettinger193814c2004-12-18 19:00:59 +00002250 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002251 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002252
2253 return v;
2254}
2255
Tim Peters16a77ad2001-09-08 04:00:12 +00002256/* Iterate over seq. Result depends on the operation:
2257 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002258 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
Tim Peters16a77ad2001-09-08 04:00:12 +00002259 set ValueError and return -1 if none found; also return -1 on error.
2260 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2261*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002262Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002263_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002264{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002265 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002266 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2267 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002268
Tim Peters16a77ad2001-09-08 04:00:12 +00002269 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002270 null_error();
2271 return -1;
2272 }
Tim Peters75f8e352001-05-05 11:33:43 +00002273
Tim Peters16a77ad2001-09-08 04:00:12 +00002274 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002275 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002276 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002277 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002278 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002279
Tim Peters16a77ad2001-09-08 04:00:12 +00002280 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002281 for (;;) {
2282 int cmp;
2283 PyObject *item = PyIter_Next(it);
2284 if (item == NULL) {
2285 if (PyErr_Occurred())
2286 goto Fail;
2287 break;
2288 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002289
2290 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002291 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002292 if (cmp < 0)
2293 goto Fail;
2294 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002295 switch (operation) {
2296 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002297 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002298 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002299 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002300 goto Fail;
2301 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002302 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002303 break;
2304
2305 case PY_ITERSEARCH_INDEX:
2306 if (wrapped) {
2307 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002308 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002309 goto Fail;
2310 }
2311 goto Done;
2312
2313 case PY_ITERSEARCH_CONTAINS:
2314 n = 1;
2315 goto Done;
2316
2317 default:
2318 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002319 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002320 }
2321
2322 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002323 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002324 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002325 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002326 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002327 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002328
2329 if (operation != PY_ITERSEARCH_INDEX)
2330 goto Done;
2331
2332 PyErr_SetString(PyExc_ValueError,
2333 "sequence.index(x): x not in sequence");
2334 /* fall into failure code */
2335Fail:
2336 n = -1;
2337 /* fall through */
2338Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002339 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002340 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002341
Guido van Rossume15dee51995-07-18 14:12:02 +00002342}
2343
Tim Peters16a77ad2001-09-08 04:00:12 +00002344/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002345Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002346PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002347{
Tim Peters16a77ad2001-09-08 04:00:12 +00002348 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002349}
2350
Tim Peterscb8d3682001-05-05 21:05:01 +00002351/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002352 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002353 */
2354int
2355PySequence_Contains(PyObject *seq, PyObject *ob)
2356{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002357 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002358 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2359 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2360 if (sqm != NULL && sqm->sq_contains != NULL)
2361 return (*sqm->sq_contains)(seq, ob);
2362 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002363 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2364 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002365}
2366
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002367/* Backwards compatibility */
2368#undef PySequence_In
2369int
Fred Drake79912472000-07-09 04:06:11 +00002370PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002371{
2372 return PySequence_Contains(w, v);
2373}
2374
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002375Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002376PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002377{
Tim Peters16a77ad2001-09-08 04:00:12 +00002378 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002379}
2380
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002381/* Operations on mappings */
2382
2383int
Fred Drake79912472000-07-09 04:06:11 +00002384PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002385{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002386 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002387 return PyObject_HasAttrString(o, "__getitem__");
2388
2389 return o && o->ob_type->tp_as_mapping &&
2390 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002391 !(o->ob_type->tp_as_sequence &&
2392 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002393}
2394
Martin v. Löwis18e16552006-02-15 17:27:45 +00002395Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002396PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002397{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002398 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002399
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002400 if (o == NULL) {
2401 null_error();
2402 return -1;
2403 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002404
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002405 m = o->ob_type->tp_as_mapping;
2406 if (m && m->mp_length)
2407 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002408
Georg Brandlb0061c82006-08-08 11:56:21 +00002409 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002410 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002411}
2412
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002413#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002414Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002415PyMapping_Length(PyObject *o)
2416{
2417 return PyMapping_Size(o);
2418}
2419#define PyMapping_Length PyMapping_Size
2420
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002421PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002422PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002423{
2424 PyObject *okey, *r;
2425
2426 if (key == NULL)
2427 return null_error();
2428
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002429 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002430 if (okey == NULL)
2431 return NULL;
2432 r = PyObject_GetItem(o, okey);
2433 Py_DECREF(okey);
2434 return r;
2435}
2436
2437int
Fred Drake79912472000-07-09 04:06:11 +00002438PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002439{
2440 PyObject *okey;
2441 int r;
2442
2443 if (key == NULL) {
2444 null_error();
2445 return -1;
2446 }
2447
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002448 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002449 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002450 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002451 r = PyObject_SetItem(o, okey, value);
2452 Py_DECREF(okey);
2453 return r;
2454}
2455
2456int
Fred Drake79912472000-07-09 04:06:11 +00002457PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002458{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002459 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002460
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002461 v = PyMapping_GetItemString(o, key);
2462 if (v) {
2463 Py_DECREF(v);
2464 return 1;
2465 }
2466 PyErr_Clear();
2467 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002468}
2469
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002470int
Fred Drake79912472000-07-09 04:06:11 +00002471PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002472{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002473 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002474
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002475 v = PyObject_GetItem(o, key);
2476 if (v) {
2477 Py_DECREF(v);
2478 return 1;
2479 }
2480 PyErr_Clear();
2481 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002482}
2483
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002484/* Operations on callable objects */
2485
2486/* XXX PyCallable_Check() is in object.c */
2487
Guido van Rossume15dee51995-07-18 14:12:02 +00002488PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002489PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002490{
Guido van Rossum5560b742001-09-14 16:47:50 +00002491 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002492}
Guido van Rossume15dee51995-07-18 14:12:02 +00002493
2494PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002495PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2496{
2497 ternaryfunc call;
2498
2499 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002500 PyObject *result;
2501 if (Py_EnterRecursiveCall(" while calling a Python object"))
2502 return NULL;
2503 result = (*call)(func, arg, kw);
2504 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002505 if (result == NULL && !PyErr_Occurred())
2506 PyErr_SetString(
2507 PyExc_SystemError,
2508 "NULL result without error in PyObject_Call");
2509 return result;
2510 }
Georg Brandlccff7852006-06-18 22:17:29 +00002511 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002512 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002513 return NULL;
2514}
2515
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002516static PyObject*
2517call_function_tail(PyObject *callable, PyObject *args)
2518{
2519 PyObject *retval;
2520
2521 if (args == NULL)
2522 return NULL;
2523
2524 if (!PyTuple_Check(args)) {
2525 PyObject *a;
2526
2527 a = PyTuple_New(1);
2528 if (a == NULL) {
2529 Py_DECREF(args);
2530 return NULL;
2531 }
2532 PyTuple_SET_ITEM(a, 0, args);
2533 args = a;
2534 }
2535 retval = PyObject_Call(callable, args, NULL);
2536
2537 Py_DECREF(args);
2538
2539 return retval;
2540}
2541
Tim Peters6d6c1a32001-08-02 04:15:00 +00002542PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002543PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002544{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002545 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002546 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002547
Fred Drakeb92cf062001-10-27 06:16:31 +00002548 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002549 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002550
Fred Drakeb92cf062001-10-27 06:16:31 +00002551 if (format && *format) {
2552 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002553 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002554 va_end(va);
2555 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002556 else
2557 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002558
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002559 return call_function_tail(callable, args);
2560}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002561
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002562PyObject *
2563_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2564{
2565 va_list va;
2566 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002567
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002568 if (callable == NULL)
2569 return null_error();
2570
2571 if (format && *format) {
2572 va_start(va, format);
2573 args = _Py_VaBuildValue_SizeT(format, va);
2574 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002575 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002576 else
2577 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002578
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002579 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002580}
2581
2582PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002583PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002584{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002585 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002586 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002587 PyObject *func = NULL;
2588 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002589
Fred Drakeb92cf062001-10-27 06:16:31 +00002590 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002591 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002592
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002593 func = PyObject_GetAttrString(o, name);
2594 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002595 PyErr_SetString(PyExc_AttributeError, name);
2596 return 0;
2597 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002598
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002599 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002600 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002601 goto exit;
2602 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002603
Fred Drakeb92cf062001-10-27 06:16:31 +00002604 if (format && *format) {
2605 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002606 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002607 va_end(va);
2608 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002609 else
2610 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002611
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002612 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002613
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002614 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002615 /* args gets consumed in call_function_tail */
2616 Py_XDECREF(func);
2617
2618 return retval;
2619}
2620
2621PyObject *
2622_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2623{
2624 va_list va;
2625 PyObject *args;
2626 PyObject *func = NULL;
2627 PyObject *retval = NULL;
2628
2629 if (o == NULL || name == NULL)
2630 return null_error();
2631
2632 func = PyObject_GetAttrString(o, name);
2633 if (func == NULL) {
2634 PyErr_SetString(PyExc_AttributeError, name);
2635 return 0;
2636 }
2637
2638 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002639 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002640 goto exit;
2641 }
2642
2643 if (format && *format) {
2644 va_start(va, format);
2645 args = _Py_VaBuildValue_SizeT(format, va);
2646 va_end(va);
2647 }
2648 else
2649 args = PyTuple_New(0);
2650
2651 retval = call_function_tail(func, args);
2652
2653 exit:
2654 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002655 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002656
2657 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002658}
Guido van Rossum823649d2001-03-21 18:40:58 +00002659
2660
Fred Drakeb421b8c2001-10-26 16:21:32 +00002661static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002662objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002663{
2664 int i, n = 0;
2665 va_list countva;
2666 PyObject *result, *tmp;
2667
2668#ifdef VA_LIST_IS_ARRAY
2669 memcpy(countva, va, sizeof(va_list));
2670#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002671#ifdef __va_copy
2672 __va_copy(countva, va);
2673#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002674 countva = va;
2675#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002676#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002677
2678 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2679 ++n;
2680 result = PyTuple_New(n);
2681 if (result != NULL && n > 0) {
2682 for (i = 0; i < n; ++i) {
2683 tmp = (PyObject *)va_arg(va, PyObject *);
2684 PyTuple_SET_ITEM(result, i, tmp);
2685 Py_INCREF(tmp);
2686 }
2687 }
2688 return result;
2689}
2690
2691PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002692PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002693{
2694 PyObject *args, *tmp;
2695 va_list vargs;
2696
2697 if (callable == NULL || name == NULL)
2698 return null_error();
2699
2700 callable = PyObject_GetAttr(callable, name);
2701 if (callable == NULL)
2702 return NULL;
2703
2704 /* count the args */
2705 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002706 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002707 va_end(vargs);
2708 if (args == NULL) {
2709 Py_DECREF(callable);
2710 return NULL;
2711 }
2712 tmp = PyObject_Call(callable, args, NULL);
2713 Py_DECREF(args);
2714 Py_DECREF(callable);
2715
2716 return tmp;
2717}
2718
2719PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002720PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002721{
2722 PyObject *args, *tmp;
2723 va_list vargs;
2724
2725 if (callable == NULL)
2726 return null_error();
2727
2728 /* count the args */
2729 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002730 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002731 va_end(vargs);
2732 if (args == NULL)
2733 return NULL;
2734 tmp = PyObject_Call(callable, args, NULL);
2735 Py_DECREF(args);
2736
2737 return tmp;
2738}
2739
2740
Guido van Rossum823649d2001-03-21 18:40:58 +00002741/* isinstance(), issubclass() */
2742
Barry Warsawf16951c2002-04-23 22:45:44 +00002743/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2744 * state that will almost never happen.
2745 *
2746 * 0. creating the __bases__ static string could get a MemoryError
2747 * 1. getattr(cls, '__bases__') could raise an AttributeError
2748 * 2. getattr(cls, '__bases__') could raise some other exception
2749 * 3. getattr(cls, '__bases__') could return a tuple
2750 * 4. getattr(cls, '__bases__') could return something other than a tuple
2751 *
2752 * Only state #3 is a non-error state and only it returns a non-NULL object
2753 * (it returns the retrieved tuple).
2754 *
2755 * Any raised AttributeErrors are masked by clearing the exception and
2756 * returning NULL. If an object other than a tuple comes out of __bases__,
2757 * then again, the return value is NULL. So yes, these two situations
2758 * produce exactly the same results: NULL is returned and no error is set.
2759 *
2760 * If some exception other than AttributeError is raised, then NULL is also
2761 * returned, but the exception is not cleared. That's because we want the
2762 * exception to be propagated along.
2763 *
2764 * Callers are expected to test for PyErr_Occurred() when the return value
2765 * is NULL to decide whether a valid exception should be propagated or not.
2766 * When there's no exception to propagate, it's customary for the caller to
2767 * set a TypeError.
2768 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002769static PyObject *
2770abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002771{
2772 static PyObject *__bases__ = NULL;
2773 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002774
2775 if (__bases__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002776 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002777 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002778 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002779 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002780 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002781 if (bases == NULL) {
2782 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2783 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002784 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002785 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002786 if (!PyTuple_Check(bases)) {
2787 Py_DECREF(bases);
2788 return NULL;
2789 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002790 return bases;
2791}
2792
2793
2794static int
2795abstract_issubclass(PyObject *derived, PyObject *cls)
2796{
Antoine Pitrou0668c622008-08-26 22:42:08 +00002797 PyObject *bases = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002798 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002799 int r = 0;
2800
Antoine Pitrou0668c622008-08-26 22:42:08 +00002801 while (1) {
2802 if (derived == cls)
2803 return 1;
2804 bases = abstract_get_bases(derived);
2805 if (bases == NULL) {
2806 if (PyErr_Occurred())
2807 return -1;
2808 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002809 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002810 n = PyTuple_GET_SIZE(bases);
2811 if (n == 0) {
2812 Py_DECREF(bases);
2813 return 0;
2814 }
2815 /* Avoid recursivity in the single inheritance case */
2816 if (n == 1) {
2817 derived = PyTuple_GET_ITEM(bases, 0);
2818 Py_DECREF(bases);
2819 continue;
2820 }
2821 for (i = 0; i < n; i++) {
2822 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2823 if (r != 0)
2824 break;
2825 }
2826 Py_DECREF(bases);
2827 return r;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002828 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002829}
2830
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002831static int
2832check_class(PyObject *cls, const char *error)
2833{
2834 PyObject *bases = abstract_get_bases(cls);
2835 if (bases == NULL) {
2836 /* Do not mask errors. */
2837 if (!PyErr_Occurred())
2838 PyErr_SetString(PyExc_TypeError, error);
2839 return 0;
2840 }
2841 Py_DECREF(bases);
2842 return -1;
2843}
2844
Brett Cannon4f653312004-03-20 22:52:14 +00002845static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002846recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002847{
2848 PyObject *icls;
2849 static PyObject *__class__ = NULL;
2850 int retval = 0;
2851
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002852 if (__class__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002853 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002854 if (__class__ == NULL)
2855 return -1;
2856 }
2857
Neil Schemenauer6b471292001-10-18 03:18:43 +00002858 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2859 PyObject *inclass =
2860 (PyObject*)((PyInstanceObject*)inst)->in_class;
2861 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002862 }
2863 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002864 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002865 if (retval == 0) {
2866 PyObject *c = PyObject_GetAttr(inst, __class__);
2867 if (c == NULL) {
2868 PyErr_Clear();
2869 }
2870 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002871 if (c != (PyObject *)(inst->ob_type) &&
2872 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002873 retval = PyType_IsSubtype(
2874 (PyTypeObject *)c,
2875 (PyTypeObject *)cls);
2876 Py_DECREF(c);
2877 }
2878 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002879 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002880 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002881 if (!check_class(cls,
2882 "isinstance() arg 2 must be a class, type,"
2883 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002884 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002885 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002886 if (icls == NULL) {
2887 PyErr_Clear();
2888 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002889 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002890 else {
2891 retval = abstract_issubclass(icls, cls);
2892 Py_DECREF(icls);
2893 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002894 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002895
Guido van Rossum823649d2001-03-21 18:40:58 +00002896 return retval;
2897}
2898
2899int
Brett Cannon4f653312004-03-20 22:52:14 +00002900PyObject_IsInstance(PyObject *inst, PyObject *cls)
2901{
Christian Heimese247f002008-02-14 22:40:11 +00002902 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002903 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002904
2905 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002906 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002907 return 1;
2908
Antoine Pitrou0668c622008-08-26 22:42:08 +00002909 if (PyTuple_Check(cls)) {
2910 Py_ssize_t i;
2911 Py_ssize_t n;
2912 int r = 0;
2913
2914 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2915 return -1;
2916 n = PyTuple_GET_SIZE(cls);
2917 for (i = 0; i < n; ++i) {
2918 PyObject *item = PyTuple_GET_ITEM(cls, i);
2919 r = PyObject_IsInstance(inst, item);
2920 if (r != 0)
2921 /* either found it, or got an error */
2922 break;
2923 }
2924 Py_LeaveRecursiveCall();
2925 return r;
2926 }
Christian Heimese247f002008-02-14 22:40:11 +00002927 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002928 name = PyString_InternFromString("__instancecheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002929 if (name == NULL)
2930 return -1;
2931 }
2932 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002933 if (checker == NULL && PyErr_Occurred())
2934 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002935 if (checker != NULL) {
2936 PyObject *res;
2937 int ok = -1;
2938 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2939 Py_DECREF(checker);
2940 return ok;
2941 }
2942 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2943 Py_LeaveRecursiveCall();
2944 Py_DECREF(checker);
2945 if (res != NULL) {
2946 ok = PyObject_IsTrue(res);
2947 Py_DECREF(res);
2948 }
2949 return ok;
2950 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002951 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002952}
2953
2954static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002955recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002956{
2957 int retval;
2958
Antoine Pitrou0668c622008-08-26 22:42:08 +00002959 if (PyType_Check(cls) && PyType_Check(derived)) {
2960 /* Fast path (non-recursive) */
2961 return PyType_IsSubtype(
2962 (PyTypeObject *)derived, (PyTypeObject *)cls);
2963 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002964 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002965 if (!check_class(derived,
2966 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002967 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002968
Antoine Pitrou0668c622008-08-26 22:42:08 +00002969 if (!check_class(cls,
2970 "issubclass() arg 2 must be a class"
2971 " or tuple of classes"))
2972 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002973 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002974 }
2975 else {
2976 /* shortcut */
2977 if (!(retval = (derived == cls)))
2978 retval = PyClass_IsSubclass(derived, cls);
2979 }
2980
2981 return retval;
2982}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002983
Brett Cannon4f653312004-03-20 22:52:14 +00002984int
2985PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2986{
Christian Heimese247f002008-02-14 22:40:11 +00002987 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002988 PyObject *t, *v, *tb;
2989 PyObject *checker;
Christian Heimese247f002008-02-14 22:40:11 +00002990
Antoine Pitrou0668c622008-08-26 22:42:08 +00002991 if (PyTuple_Check(cls)) {
2992 Py_ssize_t i;
2993 Py_ssize_t n;
2994 int r = 0;
2995
2996 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2997 return -1;
2998 n = PyTuple_GET_SIZE(cls);
2999 for (i = 0; i < n; ++i) {
3000 PyObject *item = PyTuple_GET_ITEM(cls, i);
3001 r = PyObject_IsSubclass(derived, item);
3002 if (r != 0)
3003 /* either found it, or got an error */
3004 break;
3005 }
3006 Py_LeaveRecursiveCall();
3007 return r;
3008 }
Christian Heimese247f002008-02-14 22:40:11 +00003009 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003010 name = PyString_InternFromString("__subclasscheck__");
Christian Heimese247f002008-02-14 22:40:11 +00003011 if (name == NULL)
3012 return -1;
3013 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003014 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00003015 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003016 PyErr_Restore(t, v, tb);
3017 if (checker != NULL) {
3018 PyObject *res;
3019 int ok = -1;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003020 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
3021 Py_DECREF(checker);
Guido van Rossumb5591132007-09-10 22:36:02 +00003022 return ok;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003023 }
Guido van Rossumb5591132007-09-10 22:36:02 +00003024 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3025 Py_LeaveRecursiveCall();
3026 Py_DECREF(checker);
3027 if (res != NULL) {
3028 ok = PyObject_IsTrue(res);
3029 Py_DECREF(res);
3030 }
3031 return ok;
3032 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003033 return recursive_issubclass(derived, cls);
3034}
3035
3036int
3037_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
3038{
3039 return recursive_isinstance(inst, cls);
3040}
3041
3042int
3043_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
3044{
3045 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00003046}
3047
3048
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003049PyObject *
3050PyObject_GetIter(PyObject *o)
3051{
3052 PyTypeObject *t = o->ob_type;
3053 getiterfunc f = NULL;
3054 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3055 f = t->tp_iter;
3056 if (f == NULL) {
3057 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003058 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003059 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003060 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003061 else {
3062 PyObject *res = (*f)(o);
3063 if (res != NULL && !PyIter_Check(res)) {
3064 PyErr_Format(PyExc_TypeError,
3065 "iter() returned non-iterator "
3066 "of type '%.100s'",
3067 res->ob_type->tp_name);
3068 Py_DECREF(res);
3069 res = NULL;
3070 }
3071 return res;
3072 }
3073}
3074
Tim Petersf4848da2001-05-05 00:14:56 +00003075/* Return next item.
3076 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3077 * If the iteration terminates normally, return NULL and clear the
3078 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3079 * will be false.
3080 * Else return the next object. PyErr_Occurred() will be false.
3081 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003082PyObject *
3083PyIter_Next(PyObject *iter)
3084{
Tim Petersf4848da2001-05-05 00:14:56 +00003085 PyObject *result;
Tim Petersf4848da2001-05-05 00:14:56 +00003086 result = (*iter->ob_type->tp_iternext)(iter);
3087 if (result == NULL &&
3088 PyErr_Occurred() &&
3089 PyErr_ExceptionMatches(PyExc_StopIteration))
3090 PyErr_Clear();
3091 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003092}