blob: c2d8db71fdbc56be7ec4d91f1b3d7840d81b4f7e [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
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000110 /* try o.__length_hint__() */
Benjamin Petersonaf1692a2009-05-09 16:36:39 +0000111 hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
112 if (hintmeth == NULL)
113 return defaultvalue;
114 ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
115 Py_DECREF(hintmeth);
Raymond Hettingerb5163702009-02-02 21:50:13 +0000116 if (ro == NULL) {
Benjamin Petersonaf1692a2009-05-09 16:36:39 +0000117 if (!PyErr_ExceptionMatches(PyExc_TypeError))
118 return -1;
Raymond Hettingerb5163702009-02-02 21:50:13 +0000119 return defaultvalue;
120 }
Mark Dickinsonb91d2f52009-02-08 13:58:10 +0000121 rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000122 Py_DECREF(ro);
Raymond Hettingerb5163702009-02-02 21:50:13 +0000123 return rv;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000124}
125
Guido van Rossume15dee51995-07-18 14:12:02 +0000126PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000127PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000128{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000129 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000130
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000131 if (o == NULL || key == NULL)
132 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000134 m = o->ob_type->tp_as_mapping;
135 if (m && m->mp_subscript)
136 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000137
Guido van Rossum21308241998-08-13 16:44:44 +0000138 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000139 if (PyIndex_Check(key)) {
140 Py_ssize_t key_value;
141 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000142 if (key_value == -1 && PyErr_Occurred())
143 return NULL;
144 return PySequence_GetItem(o, key_value);
145 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000146 else if (o->ob_type->tp_as_sequence->sq_item)
Georg Brandlccff7852006-06-18 22:17:29 +0000147 return type_error("sequence index must "
148 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000149 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000150
Georg Brandlf5fd5232009-04-18 08:26:21 +0000151 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000152}
153
154int
Fred Drake79912472000-07-09 04:06:11 +0000155PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000156{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000157 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000158
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000159 if (o == NULL || key == NULL || value == NULL) {
160 null_error();
161 return -1;
162 }
163 m = o->ob_type->tp_as_mapping;
164 if (m && m->mp_ass_subscript)
165 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000166
Guido van Rossum21308241998-08-13 16:44:44 +0000167 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000168 if (PyIndex_Check(key)) {
169 Py_ssize_t key_value;
170 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000171 if (key_value == -1 && PyErr_Occurred())
172 return -1;
173 return PySequence_SetItem(o, key_value, value);
174 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000175 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000176 type_error("sequence index must be "
177 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000178 return -1;
179 }
Guido van Rossum21308241998-08-13 16:44:44 +0000180 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000181
Georg Brandlccff7852006-06-18 22:17:29 +0000182 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000183 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000184}
185
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000186int
Fred Drake79912472000-07-09 04:06:11 +0000187PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000188{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000189 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000190
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000191 if (o == NULL || key == NULL) {
192 null_error();
193 return -1;
194 }
195 m = o->ob_type->tp_as_mapping;
196 if (m && m->mp_ass_subscript)
197 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000198
Guido van Rossum21308241998-08-13 16:44:44 +0000199 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000200 if (PyIndex_Check(key)) {
201 Py_ssize_t key_value;
202 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000203 if (key_value == -1 && PyErr_Occurred())
204 return -1;
205 return PySequence_DelItem(o, key_value);
206 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000207 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000208 type_error("sequence index must be "
209 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000210 return -1;
211 }
Guido van Rossum21308241998-08-13 16:44:44 +0000212 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000213
Georg Brandlccff7852006-06-18 22:17:29 +0000214 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000215 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000216}
217
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000218int
219PyObject_DelItemString(PyObject *o, char *key)
220{
221 PyObject *okey;
222 int ret;
223
224 if (o == NULL || key == NULL) {
225 null_error();
226 return -1;
227 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000228 okey = PyString_FromString(key);
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000229 if (okey == NULL)
230 return -1;
231 ret = PyObject_DelItem(o, okey);
232 Py_DECREF(okey);
233 return ret;
234}
235
Brett Cannonea229bd2006-06-06 18:08:16 +0000236int
237PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000238 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000239 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240{
241 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000242 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000243 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000244
245 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
246 null_error();
247 return -1;
248 }
249 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000250 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000251 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000253 PyErr_SetString(PyExc_TypeError,
254 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000255 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000256 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000257 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000258 PyErr_SetString(PyExc_TypeError,
259 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000260 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000261 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000262 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 *buffer = pp;
266 *buffer_len = len;
267 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000268}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000269
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000270int
271PyObject_CheckReadBuffer(PyObject *obj)
272{
273 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
274
275 if (pb == NULL ||
276 pb->bf_getreadbuffer == NULL ||
277 pb->bf_getsegcount == NULL ||
278 (*pb->bf_getsegcount)(obj, NULL) != 1)
279 return 0;
280 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000281}
282
283int PyObject_AsReadBuffer(PyObject *obj,
284 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000285 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000286{
287 PyBufferProcs *pb;
288 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000289 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290
291 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
292 null_error();
293 return -1;
294 }
295 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000296 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000297 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000298 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000299 PyErr_SetString(PyExc_TypeError,
300 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000301 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000302 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000303 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304 PyErr_SetString(PyExc_TypeError,
305 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000306 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000307 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000308 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000309 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000310 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311 *buffer = pp;
312 *buffer_len = len;
313 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000314}
315
316int PyObject_AsWriteBuffer(PyObject *obj,
317 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000318 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000319{
320 PyBufferProcs *pb;
321 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000322 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000323
324 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
325 null_error();
326 return -1;
327 }
328 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000329 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000330 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000331 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000332 PyErr_SetString(PyExc_TypeError,
333 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000334 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000335 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000336 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000337 PyErr_SetString(PyExc_TypeError,
338 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000339 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000340 }
341 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
342 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000343 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000344 *buffer = pp;
345 *buffer_len = len;
346 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000347}
348
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000349/* Buffer C-API for Python 3.0 */
350
351int
352PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
353{
354 if (!PyObject_CheckBuffer(obj)) {
355 PyErr_Format(PyExc_TypeError,
356 "'%100s' does not have the buffer interface",
357 Py_TYPE(obj)->tp_name);
358 return -1;
359 }
360 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
361}
362
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000363static int
364_IsFortranContiguous(Py_buffer *view)
365{
366 Py_ssize_t sd, dim;
367 int i;
368
369 if (view->ndim == 0) return 1;
370 if (view->strides == NULL) return (view->ndim == 1);
371
372 sd = view->itemsize;
373 if (view->ndim == 1) return (view->shape[0] == 1 ||
374 sd == view->strides[0]);
375 for (i=0; i<view->ndim; i++) {
376 dim = view->shape[i];
377 if (dim == 0) return 1;
378 if (view->strides[i] != sd) return 0;
379 sd *= dim;
380 }
381 return 1;
382}
383
384static int
385_IsCContiguous(Py_buffer *view)
386{
387 Py_ssize_t sd, dim;
388 int i;
389
390 if (view->ndim == 0) return 1;
391 if (view->strides == NULL) return 1;
392
393 sd = view->itemsize;
394 if (view->ndim == 1) return (view->shape[0] == 1 ||
395 sd == view->strides[0]);
396 for (i=view->ndim-1; i>=0; i--) {
397 dim = view->shape[i];
398 if (dim == 0) return 1;
399 if (view->strides[i] != sd) return 0;
400 sd *= dim;
401 }
402 return 1;
403}
404
405int
406PyBuffer_IsContiguous(Py_buffer *view, char fort)
407{
408
409 if (view->suboffsets != NULL) return 0;
410
411 if (fort == 'C')
412 return _IsCContiguous(view);
413 else if (fort == 'F')
414 return _IsFortranContiguous(view);
415 else if (fort == 'A')
416 return (_IsCContiguous(view) || _IsFortranContiguous(view));
417 return 0;
418}
419
420
421void*
422PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
423{
424 char* pointer;
425 int i;
426 pointer = (char *)view->buf;
427 for (i = 0; i < view->ndim; i++) {
428 pointer += view->strides[i]*indices[i];
429 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
430 pointer = *((char**)pointer) + view->suboffsets[i];
431 }
432 }
433 return (void*)pointer;
434}
435
436
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000437void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000438_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape)
439{
440 int k;
441
442 for (k=0; k<nd; k++) {
443 if (index[k] < shape[k]-1) {
444 index[k]++;
445 break;
446 }
447 else {
448 index[k] = 0;
449 }
450 }
451}
452
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000453void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000454_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape)
455{
456 int k;
457
458 for (k=nd-1; k>=0; k--) {
459 if (index[k] < shape[k]-1) {
460 index[k]++;
461 break;
462 }
463 else {
464 index[k] = 0;
465 }
466 }
467}
468
469 /* view is not checked for consistency in either of these. It is
470 assumed that the size of the buffer is view->len in
471 view->len / view->itemsize elements.
472 */
473
474int
475PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
476{
477 int k;
478 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
479 Py_ssize_t *indices, elements;
480 char *dest, *ptr;
481
482 if (len > view->len) {
483 len = view->len;
484 }
485
486 if (PyBuffer_IsContiguous(view, fort)) {
487 /* simplest copy is all that is needed */
488 memcpy(buf, view->buf, len);
489 return 0;
490 }
491
492 /* Otherwise a more elaborate scheme is needed */
493
494 /* XXX(nnorwitz): need to check for overflow! */
495 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
496 if (indices == NULL) {
497 PyErr_NoMemory();
498 return -1;
499 }
500 for (k=0; k<view->ndim;k++) {
501 indices[k] = 0;
502 }
503
504 if (fort == 'F') {
505 addone = _add_one_to_index_F;
506 }
507 else {
508 addone = _add_one_to_index_C;
509 }
510 dest = buf;
511 /* XXX : This is not going to be the fastest code in the world
512 several optimizations are possible.
513 */
514 elements = len / view->itemsize;
515 while (elements--) {
516 addone(view->ndim, indices, view->shape);
517 ptr = PyBuffer_GetPointer(view, indices);
518 memcpy(dest, ptr, view->itemsize);
519 dest += view->itemsize;
520 }
521 PyMem_Free(indices);
522 return 0;
523}
524
525int
526PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
527{
528 int k;
529 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
530 Py_ssize_t *indices, elements;
531 char *src, *ptr;
532
533 if (len > view->len) {
534 len = view->len;
535 }
536
537 if (PyBuffer_IsContiguous(view, fort)) {
538 /* simplest copy is all that is needed */
539 memcpy(view->buf, buf, len);
540 return 0;
541 }
542
543 /* Otherwise a more elaborate scheme is needed */
544
545 /* XXX(nnorwitz): need to check for overflow! */
546 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
547 if (indices == NULL) {
548 PyErr_NoMemory();
549 return -1;
550 }
551 for (k=0; k<view->ndim;k++) {
552 indices[k] = 0;
553 }
554
555 if (fort == 'F') {
556 addone = _add_one_to_index_F;
557 }
558 else {
559 addone = _add_one_to_index_C;
560 }
561 src = buf;
562 /* XXX : This is not going to be the fastest code in the world
563 several optimizations are possible.
564 */
565 elements = len / view->itemsize;
566 while (elements--) {
567 addone(view->ndim, indices, view->shape);
568 ptr = PyBuffer_GetPointer(view, indices);
569 memcpy(ptr, src, view->itemsize);
570 src += view->itemsize;
571 }
572
573 PyMem_Free(indices);
574 return 0;
575}
576
577int PyObject_CopyData(PyObject *dest, PyObject *src)
578{
579 Py_buffer view_dest, view_src;
580 int k;
581 Py_ssize_t *indices, elements;
582 char *dptr, *sptr;
583
584 if (!PyObject_CheckBuffer(dest) ||
585 !PyObject_CheckBuffer(src)) {
586 PyErr_SetString(PyExc_TypeError,
587 "both destination and source must have the "\
588 "buffer interface");
589 return -1;
590 }
591
592 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
593 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000594 PyBuffer_Release(&view_dest);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000595 return -1;
596 }
597
598 if (view_dest.len < view_src.len) {
599 PyErr_SetString(PyExc_BufferError,
600 "destination is too small to receive data from source");
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000601 PyBuffer_Release(&view_dest);
602 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000603 return -1;
604 }
605
606 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
607 PyBuffer_IsContiguous(&view_src, 'C')) ||
608 (PyBuffer_IsContiguous(&view_dest, 'F') &&
609 PyBuffer_IsContiguous(&view_src, 'F'))) {
610 /* simplest copy is all that is needed */
611 memcpy(view_dest.buf, view_src.buf, view_src.len);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000612 PyBuffer_Release(&view_dest);
613 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000614 return 0;
615 }
616
617 /* Otherwise a more elaborate copy scheme is needed */
618
619 /* XXX(nnorwitz): need to check for overflow! */
620 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
621 if (indices == NULL) {
622 PyErr_NoMemory();
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000623 PyBuffer_Release(&view_dest);
624 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000625 return -1;
626 }
627 for (k=0; k<view_src.ndim;k++) {
628 indices[k] = 0;
629 }
630 elements = 1;
631 for (k=0; k<view_src.ndim; k++) {
632 /* XXX(nnorwitz): can this overflow? */
633 elements *= view_src.shape[k];
634 }
635 while (elements--) {
636 _add_one_to_index_C(view_src.ndim, indices, view_src.shape);
637 dptr = PyBuffer_GetPointer(&view_dest, indices);
638 sptr = PyBuffer_GetPointer(&view_src, indices);
639 memcpy(dptr, sptr, view_src.itemsize);
640 }
641 PyMem_Free(indices);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000642 PyBuffer_Release(&view_dest);
643 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000644 return 0;
645}
646
647void
648PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
649 Py_ssize_t *strides, int itemsize,
650 char fort)
651{
652 int k;
653 Py_ssize_t sd;
654
655 sd = itemsize;
656 if (fort == 'F') {
657 for (k=0; k<nd; k++) {
658 strides[k] = sd;
659 sd *= shape[k];
660 }
661 }
662 else {
663 for (k=nd-1; k>=0; k--) {
664 strides[k] = sd;
665 sd *= shape[k];
666 }
667 }
668 return;
669}
670
671int
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000672PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000673 int readonly, int flags)
674{
675 if (view == NULL) return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000676 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
677 (readonly == 1)) {
678 PyErr_SetString(PyExc_BufferError,
679 "Object is not writable.");
680 return -1;
681 }
682
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000683 view->obj = obj;
Martin v. Löwis241b8342008-08-14 15:54:27 +0000684 if (obj)
685 Py_INCREF(obj);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000686 view->buf = buf;
687 view->len = len;
688 view->readonly = readonly;
689 view->itemsize = 1;
690 view->format = NULL;
691 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
692 view->format = "B";
693 view->ndim = 1;
694 view->shape = NULL;
695 if ((flags & PyBUF_ND) == PyBUF_ND)
696 view->shape = &(view->len);
697 view->strides = NULL;
698 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
699 view->strides = &(view->itemsize);
700 view->suboffsets = NULL;
701 view->internal = NULL;
702 return 0;
703}
704
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000705void
706PyBuffer_Release(Py_buffer *view)
707{
708 PyObject *obj = view->obj;
Martin v. Löwis64034f92008-08-14 20:12:06 +0000709 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
710 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
711 Py_XDECREF(obj);
Martin v. Löwis241b8342008-08-14 15:54:27 +0000712 view->obj = NULL;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000713}
714
Eric Smitha9f7d622008-02-17 19:46:49 +0000715PyObject *
716PyObject_Format(PyObject* obj, PyObject *format_spec)
717{
718 static PyObject * str__format__ = NULL;
719 PyObject *empty = NULL;
720 PyObject *result = NULL;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000721#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000722 int spec_is_unicode;
723 int result_is_unicode;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000724#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000725
726 /* Initialize cached value */
727 if (str__format__ == NULL) {
728 /* Initialize static variable needed by _PyType_Lookup */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000729 str__format__ = PyString_InternFromString("__format__");
Eric Smitha9f7d622008-02-17 19:46:49 +0000730 if (str__format__ == NULL)
731 goto done;
732 }
733
734 /* If no format_spec is provided, use an empty string */
735 if (format_spec == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000736 empty = PyString_FromStringAndSize(NULL, 0);
Eric Smitha9f7d622008-02-17 19:46:49 +0000737 format_spec = empty;
738 }
739
740 /* Check the format_spec type, and make sure it's str or unicode */
Hirokazu Yamamoto1e234e82009-01-25 17:46:48 +0000741#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000742 if (PyUnicode_Check(format_spec))
743 spec_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000744 else if (PyString_Check(format_spec))
Eric Smitha9f7d622008-02-17 19:46:49 +0000745 spec_is_unicode = 0;
746 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000747#else
748 if (!PyString_Check(format_spec)) {
749#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000750 PyErr_Format(PyExc_TypeError,
751 "format expects arg 2 to be string "
752 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
753 goto done;
754 }
755
756 /* Make sure the type is initialized. float gets initialized late */
757 if (Py_TYPE(obj)->tp_dict == NULL)
758 if (PyType_Ready(Py_TYPE(obj)) < 0)
759 goto done;
760
761 /* Check for a __format__ method and call it. */
762 if (PyInstance_Check(obj)) {
763 /* We're an instance of a classic class */
764 PyObject *bound_method = PyObject_GetAttr(obj,
765 str__format__);
766 if (bound_method != NULL) {
767 result = PyObject_CallFunctionObjArgs(bound_method,
768 format_spec,
769 NULL);
770 Py_DECREF(bound_method);
771 } else {
772 PyObject *self_as_str;
773 PyObject *format_method;
774
775 PyErr_Clear();
776 /* Per the PEP, convert to str (or unicode,
777 depending on the type of the format
778 specifier). For new-style classes, this
779 logic is done by object.__format__(). */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000780#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000781 if (spec_is_unicode)
782 self_as_str = PyObject_Unicode(obj);
783 else
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000784#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000785 self_as_str = PyObject_Str(obj);
786 if (self_as_str == NULL)
787 goto done;
788
789 /* Then call str.__format__ on that result */
790 format_method = PyObject_GetAttr(self_as_str,
791 str__format__);
792 if (format_method == NULL) {
793 Py_DECREF(self_as_str);
794 goto done;
795 }
796 result = PyObject_CallFunctionObjArgs(format_method,
797 format_spec,
798 NULL);
799 Py_DECREF(self_as_str);
800 Py_DECREF(format_method);
801 if (result == NULL)
802 goto done;
803 }
804 } else {
805 /* Not an instance of a classic class, use the code
806 from py3k */
807
808 /* Find the (unbound!) __format__ method (a borrowed
809 reference) */
810 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
811 str__format__);
812 if (method == NULL) {
813 PyErr_Format(PyExc_TypeError,
814 "Type %.100s doesn't define __format__",
815 Py_TYPE(obj)->tp_name);
816 goto done;
817 }
818 /* And call it, binding it to the value */
819 result = PyObject_CallFunctionObjArgs(method, obj,
820 format_spec, NULL);
821 }
822
823 if (result == NULL)
824 goto done;
825
826 /* Check the result type, and make sure it's str or unicode */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000827#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000828 if (PyUnicode_Check(result))
829 result_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000830 else if (PyString_Check(result))
Eric Smitha9f7d622008-02-17 19:46:49 +0000831 result_is_unicode = 0;
832 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000833#else
834 if (!PyString_Check(result)) {
835#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000836 PyErr_Format(PyExc_TypeError,
837 "%.100s.__format__ must return string or "
838 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
839 Py_TYPE(result)->tp_name);
840 Py_DECREF(result);
841 result = NULL;
842 goto done;
843 }
844
845 /* Convert to unicode, if needed. Required if spec is unicode
846 and result is str */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000847#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000848 if (spec_is_unicode && !result_is_unicode) {
849 PyObject *tmp = PyObject_Unicode(result);
850 /* This logic works whether or not tmp is NULL */
851 Py_DECREF(result);
852 result = tmp;
853 }
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000854#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000855
856done:
857 Py_XDECREF(empty);
858 return result;
859}
860
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000861/* Operations on numbers */
862
863int
Fred Drake79912472000-07-09 04:06:11 +0000864PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000865{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000866 return o && o->ob_type->tp_as_number &&
867 (o->ob_type->tp_as_number->nb_int ||
868 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000869}
870
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000871/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000872
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000873/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000874
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000875#define NB_SLOT(x) offsetof(PyNumberMethods, x)
876#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000877 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000878#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000879 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000880
881/*
882 Calling scheme used for binary operations:
883
884 v w Action
885 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000886 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000887 new old v.op(v,w), coerce(v,w), v.op(v,w)
888 old new w.op(v,w), coerce(v,w), v.op(v,w)
889 old old coerce(v,w), v.op(v,w)
890
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000891 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
892 v->ob_type
893
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000894 Legend:
895 -------
896 * new == new style number
897 * old == old style number
898 * Action indicates the order in which operations are tried until either
899 a valid result is produced or an error occurs.
900
901 */
902
903static PyObject *
904binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000905{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000906 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000907 binaryfunc slotv = NULL;
908 binaryfunc slotw = NULL;
909
910 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000911 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000912 if (w->ob_type != v->ob_type &&
913 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000914 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000915 if (slotw == slotv)
916 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000917 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000918 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000919 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
920 x = slotw(v, w);
921 if (x != Py_NotImplemented)
922 return x;
923 Py_DECREF(x); /* can't do it */
924 slotw = NULL;
925 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000926 x = slotv(v, w);
927 if (x != Py_NotImplemented)
928 return x;
929 Py_DECREF(x); /* can't do it */
930 }
931 if (slotw) {
932 x = slotw(v, w);
933 if (x != Py_NotImplemented)
934 return x;
935 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000936 }
937 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
938 int err = PyNumber_CoerceEx(&v, &w);
939 if (err < 0) {
940 return NULL;
941 }
942 if (err == 0) {
943 PyNumberMethods *mv = v->ob_type->tp_as_number;
944 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000945 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000946 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000947 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000948 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000949 Py_DECREF(v);
950 Py_DECREF(w);
951 return x;
952 }
953 }
954 /* CoerceEx incremented the reference counts */
955 Py_DECREF(v);
956 Py_DECREF(w);
957 }
958 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000959 Py_INCREF(Py_NotImplemented);
960 return Py_NotImplemented;
961}
Guido van Rossum77660912002-04-16 16:32:50 +0000962
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000963static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000964binop_type_error(PyObject *v, PyObject *w, const char *op_name)
965{
966 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000967 "unsupported operand type(s) for %.100s: "
968 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000969 op_name,
970 v->ob_type->tp_name,
971 w->ob_type->tp_name);
972 return NULL;
973}
974
975static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000976binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
977{
978 PyObject *result = binary_op1(v, w, op_slot);
979 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000980 Py_DECREF(result);
981 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000982 }
983 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000984}
985
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000986
987/*
988 Calling scheme used for ternary operations:
989
Guido van Rossum84675ac2001-09-29 01:05:03 +0000990 *** In some cases, w.op is called before v.op; see binary_op1. ***
991
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000992 v w z Action
993 -------------------------------------------------------------------
994 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
995 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
996 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
997 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
998 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
999 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1000 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1001 old old old coerce(v,w,z), v.op(v,w,z)
1002
1003 Legend:
1004 -------
1005 * new == new style number
1006 * old == old style number
1007 * Action indicates the order in which operations are tried until either
1008 a valid result is produced or an error occurs.
1009 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
1010 only if z != Py_None; if z == Py_None, then it is treated as absent
1011 variable and only coerce(v,w) is tried.
1012
1013 */
1014
1015static PyObject *
1016ternary_op(PyObject *v,
1017 PyObject *w,
1018 PyObject *z,
1019 const int op_slot,
1020 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001021{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001022 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001023 PyObject *x = NULL;
1024 ternaryfunc slotv = NULL;
1025 ternaryfunc slotw = NULL;
1026 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001027
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001028 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001029 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001030 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001031 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001032 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001033 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001034 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001035 if (slotw == slotv)
1036 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001037 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001038 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001039 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1040 x = slotw(v, w, z);
1041 if (x != Py_NotImplemented)
1042 return x;
1043 Py_DECREF(x); /* can't do it */
1044 slotw = NULL;
1045 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001046 x = slotv(v, w, z);
1047 if (x != Py_NotImplemented)
1048 return x;
1049 Py_DECREF(x); /* can't do it */
1050 }
1051 if (slotw) {
1052 x = slotw(v, w, z);
1053 if (x != Py_NotImplemented)
1054 return x;
1055 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001056 }
1057 mz = z->ob_type->tp_as_number;
1058 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001059 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001060 if (slotz == slotv || slotz == slotw)
1061 slotz = NULL;
1062 if (slotz) {
1063 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001064 if (x != Py_NotImplemented)
1065 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001066 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001067 }
1068 }
1069
1070 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1071 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1072 /* we have an old style operand, coerce */
1073 PyObject *v1, *z1, *w2, *z2;
1074 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001075
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001076 c = PyNumber_Coerce(&v, &w);
1077 if (c != 0)
1078 goto error3;
1079
1080 /* Special case: if the third argument is None, it is
1081 treated as absent argument and not coerced. */
1082 if (z == Py_None) {
1083 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001084 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1085 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001086 if (slotz)
1087 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001088 else
1089 c = -1;
1090 }
1091 else
1092 c = -1;
1093 goto error2;
1094 }
1095 v1 = v;
1096 z1 = z;
1097 c = PyNumber_Coerce(&v1, &z1);
1098 if (c != 0)
1099 goto error2;
1100 w2 = w;
1101 z2 = z1;
1102 c = PyNumber_Coerce(&w2, &z2);
1103 if (c != 0)
1104 goto error1;
1105
1106 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001107 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1108 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001109 if (slotv)
1110 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001111 else
1112 c = -1;
1113 }
1114 else
1115 c = -1;
1116
1117 Py_DECREF(w2);
1118 Py_DECREF(z2);
1119 error1:
1120 Py_DECREF(v1);
1121 Py_DECREF(z1);
1122 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001123 Py_DECREF(v);
1124 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001125 error3:
1126 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001127 return x;
1128 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001129
1130 if (z == Py_None)
1131 PyErr_Format(
1132 PyExc_TypeError,
1133 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001134 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001135 v->ob_type->tp_name,
1136 w->ob_type->tp_name);
1137 else
1138 PyErr_Format(
1139 PyExc_TypeError,
1140 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001141 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001142 v->ob_type->tp_name,
1143 w->ob_type->tp_name,
1144 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001145 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001146}
1147
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001148#define BINARY_FUNC(func, op, op_name) \
1149 PyObject * \
1150 func(PyObject *v, PyObject *w) { \
1151 return binary_op(v, w, NB_SLOT(op), op_name); \
1152 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001153
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001154BINARY_FUNC(PyNumber_Or, nb_or, "|")
1155BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1156BINARY_FUNC(PyNumber_And, nb_and, "&")
1157BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1158BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1159BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001160BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1161BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001162
1163PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001164PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001165{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001166 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1167 if (result == Py_NotImplemented) {
1168 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001169 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001170 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001171 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001172 }
Armin Rigofd163f92005-12-29 15:59:19 +00001173 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001174 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001175 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001176}
1177
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001178static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001179sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001180{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001181 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001182 if (PyIndex_Check(n)) {
1183 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001184 if (count == -1 && PyErr_Occurred())
1185 return NULL;
1186 }
1187 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001188 return type_error("can't multiply sequence by "
1189 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001190 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001191 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001192}
1193
1194PyObject *
1195PyNumber_Multiply(PyObject *v, PyObject *w)
1196{
1197 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1198 if (result == Py_NotImplemented) {
1199 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1200 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001201 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001202 if (mv && mv->sq_repeat) {
1203 return sequence_repeat(mv->sq_repeat, v, w);
1204 }
1205 else if (mw && mw->sq_repeat) {
1206 return sequence_repeat(mw->sq_repeat, w, v);
1207 }
1208 result = binop_type_error(v, w, "*");
1209 }
1210 return result;
1211}
1212
Guido van Rossume15dee51995-07-18 14:12:02 +00001213PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001214PyNumber_FloorDivide(PyObject *v, PyObject *w)
1215{
1216 /* XXX tp_flags test */
1217 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1218}
1219
1220PyObject *
1221PyNumber_TrueDivide(PyObject *v, PyObject *w)
1222{
1223 /* XXX tp_flags test */
1224 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1225}
1226
1227PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001228PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001229{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001230 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001231}
1232
1233PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001234PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001235{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001236 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001237}
1238
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001239/* Binary in-place operators */
1240
1241/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001242 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001243
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001244 - If the left hand object has the appropriate struct members, and
1245 they are filled, call the appropriate function and return the
1246 result. No coercion is done on the arguments; the left-hand object
1247 is the one the operation is performed on, and it's up to the
1248 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001249
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001250 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001251 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001252
1253 */
1254
Guido van Rossum77660912002-04-16 16:32:50 +00001255#define HASINPLACE(t) \
1256 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001257
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001258static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001259binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001260{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001261 PyNumberMethods *mv = v->ob_type->tp_as_number;
1262 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001263 binaryfunc slot = NB_BINOP(mv, iop_slot);
1264 if (slot) {
1265 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001266 if (x != Py_NotImplemented) {
1267 return x;
1268 }
1269 Py_DECREF(x);
1270 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001271 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001272 return binary_op1(v, w, op_slot);
1273}
1274
1275static PyObject *
1276binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1277 const char *op_name)
1278{
1279 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1280 if (result == Py_NotImplemented) {
1281 Py_DECREF(result);
1282 return binop_type_error(v, w, op_name);
1283 }
1284 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001285}
1286
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001287#define INPLACE_BINOP(func, iop, op, op_name) \
1288 PyObject * \
1289 func(PyObject *v, PyObject *w) { \
1290 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001291 }
1292
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001293INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1294INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1295INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1296INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1297INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1298INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1299INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001300
1301PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001302PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1303{
1304 /* XXX tp_flags test */
1305 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1306 NB_SLOT(nb_floor_divide), "//=");
1307}
1308
1309PyObject *
1310PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1311{
1312 /* XXX tp_flags test */
1313 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1314 NB_SLOT(nb_true_divide), "/=");
1315}
1316
1317PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001318PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1319{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001320 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1321 NB_SLOT(nb_add));
1322 if (result == Py_NotImplemented) {
1323 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1324 Py_DECREF(result);
1325 if (m != NULL) {
1326 binaryfunc f = NULL;
1327 if (HASINPLACE(v))
1328 f = m->sq_inplace_concat;
1329 if (f == NULL)
1330 f = m->sq_concat;
1331 if (f != NULL)
1332 return (*f)(v, w);
1333 }
1334 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001335 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001336 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001337}
1338
1339PyObject *
1340PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1341{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001342 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1343 NB_SLOT(nb_multiply));
1344 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001345 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001346 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1347 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1348 Py_DECREF(result);
1349 if (mv != NULL) {
1350 if (HASINPLACE(v))
1351 f = mv->sq_inplace_repeat;
1352 if (f == NULL)
1353 f = mv->sq_repeat;
1354 if (f != NULL)
1355 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001356 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001357 else if (mw != NULL) {
1358 /* Note that the right hand operand should not be
1359 * mutated in this case so sq_inplace_repeat is not
1360 * used. */
1361 if (mw->sq_repeat)
1362 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001363 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001364 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001365 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001366 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001367}
1368
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001369PyObject *
1370PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1371{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001372 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1373 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001374}
1375
1376PyObject *
1377PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1378{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001379 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1380 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1381 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001382 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001383 else {
1384 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1385 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001386}
1387
1388
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001389/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001390
1391PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001392PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001393{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001394 PyNumberMethods *m;
1395
1396 if (o == NULL)
1397 return null_error();
1398 m = o->ob_type->tp_as_number;
1399 if (m && m->nb_negative)
1400 return (*m->nb_negative)(o);
1401
Georg Brandlccff7852006-06-18 22:17:29 +00001402 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001403}
1404
1405PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001406PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001407{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001408 PyNumberMethods *m;
1409
1410 if (o == NULL)
1411 return null_error();
1412 m = o->ob_type->tp_as_number;
1413 if (m && m->nb_positive)
1414 return (*m->nb_positive)(o);
1415
Georg Brandlccff7852006-06-18 22:17:29 +00001416 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001417}
1418
1419PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001420PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001421{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001422 PyNumberMethods *m;
1423
1424 if (o == NULL)
1425 return null_error();
1426 m = o->ob_type->tp_as_number;
1427 if (m && m->nb_invert)
1428 return (*m->nb_invert)(o);
1429
Georg Brandlccff7852006-06-18 22:17:29 +00001430 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001431}
1432
1433PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001434PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001435{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001436 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001437
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001438 if (o == NULL)
1439 return null_error();
1440 m = o->ob_type->tp_as_number;
1441 if (m && m->nb_absolute)
1442 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001443
Georg Brandlccff7852006-06-18 22:17:29 +00001444 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001445}
1446
Guido van Rossum9e896b32000-04-05 20:11:21 +00001447/* Add a check for embedded NULL-bytes in the argument. */
1448static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001449int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001450{
1451 char *end;
1452 PyObject *x;
1453
1454 x = PyInt_FromString((char*)s, &end, 10);
1455 if (x == NULL)
1456 return NULL;
1457 if (end != s + len) {
1458 PyErr_SetString(PyExc_ValueError,
1459 "null byte in argument for int()");
1460 Py_DECREF(x);
1461 return NULL;
1462 }
1463 return x;
1464}
1465
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001466/* Return a Python Int or Long from the object item
1467 Raise TypeError if the result is not an int-or-long
1468 or if the object cannot be interpreted as an index.
1469*/
1470PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001471PyNumber_Index(PyObject *item)
1472{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001473 PyObject *result = NULL;
1474 if (item == NULL)
1475 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001476 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001477 Py_INCREF(item);
1478 return item;
1479 }
1480 if (PyIndex_Check(item)) {
1481 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001482 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001483 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001484 PyErr_Format(PyExc_TypeError,
1485 "__index__ returned non-(int,long) " \
1486 "(type %.200s)",
1487 result->ob_type->tp_name);
1488 Py_DECREF(result);
1489 return NULL;
1490 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001491 }
1492 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001493 PyErr_Format(PyExc_TypeError,
1494 "'%.200s' object cannot be interpreted "
1495 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001496 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001497 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001498}
1499
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001500/* Return an error on Overflow only if err is not NULL*/
1501
1502Py_ssize_t
1503PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1504{
1505 Py_ssize_t result;
1506 PyObject *runerr;
1507 PyObject *value = PyNumber_Index(item);
1508 if (value == NULL)
1509 return -1;
1510
1511 /* We're done if PyInt_AsSsize_t() returns without error. */
1512 result = PyInt_AsSsize_t(value);
1513 if (result != -1 || !(runerr = PyErr_Occurred()))
1514 goto finish;
1515
1516 /* Error handling code -- only manage OverflowError differently */
1517 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1518 goto finish;
1519
1520 PyErr_Clear();
1521 /* If no error-handling desired then the default clipping
1522 is sufficient.
1523 */
1524 if (!err) {
1525 assert(PyLong_Check(value));
1526 /* Whether or not it is less than or equal to
1527 zero is determined by the sign of ob_size
1528 */
1529 if (_PyLong_Sign(value) < 0)
1530 result = PY_SSIZE_T_MIN;
1531 else
1532 result = PY_SSIZE_T_MAX;
1533 }
1534 else {
1535 /* Otherwise replace the error with caller's error object. */
1536 PyErr_Format(err,
1537 "cannot fit '%.200s' into an index-sized integer",
1538 item->ob_type->tp_name);
1539 }
1540
1541 finish:
1542 Py_DECREF(value);
1543 return result;
1544}
1545
1546
Guido van Rossume15dee51995-07-18 14:12:02 +00001547PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001548_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1549{
1550 const char *type_name;
1551 static PyObject *int_name = NULL;
1552 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001553 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001554 if (int_name == NULL)
1555 return NULL;
1556 }
1557
1558 if (integral && (!PyInt_Check(integral) &&
1559 !PyLong_Check(integral))) {
1560 /* Don't go through tp_as_number->nb_int to avoid
1561 hitting the classic class fallback to __trunc__. */
1562 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1563 if (int_func == NULL) {
1564 PyErr_Clear(); /* Raise a different error. */
1565 goto non_integral_error;
1566 }
1567 Py_DECREF(integral);
1568 integral = PyEval_CallObject(int_func, NULL);
1569 Py_DECREF(int_func);
1570 if (integral && (!PyInt_Check(integral) &&
1571 !PyLong_Check(integral))) {
1572 goto non_integral_error;
1573 }
1574 }
1575 return integral;
1576
1577non_integral_error:
1578 if (PyInstance_Check(integral)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001579 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001580 ->in_class->cl_name);
1581 }
1582 else {
1583 type_name = integral->ob_type->tp_name;
1584 }
1585 PyErr_Format(PyExc_TypeError, error_format, type_name);
1586 Py_DECREF(integral);
1587 return NULL;
1588}
1589
1590
1591PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001592PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001593{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001594 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001595 static PyObject *trunc_name = NULL;
1596 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001597 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001598 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001599
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001600 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001601 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001602 if (trunc_name == NULL)
1603 return NULL;
1604 }
1605
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001606 if (o == NULL)
1607 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001608 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001609 Py_INCREF(o);
1610 return o;
1611 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001612 m = o->ob_type->tp_as_number;
1613 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001614 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001615 PyObject *res = m->nb_int(o);
1616 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1617 PyErr_Format(PyExc_TypeError,
1618 "__int__ returned non-int (type %.200s)",
1619 res->ob_type->tp_name);
1620 Py_DECREF(res);
1621 return NULL;
1622 }
1623 return res;
1624 }
1625 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001626 PyIntObject *io = (PyIntObject*)o;
1627 return PyInt_FromLong(io->ob_ival);
1628 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001629 trunc_func = PyObject_GetAttr(o, trunc_name);
1630 if (trunc_func) {
1631 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1632 Py_DECREF(trunc_func);
1633 /* __trunc__ is specified to return an Integral type, but
1634 int() needs to return an int. */
1635 return _PyNumber_ConvertIntegralToInt(
1636 truncated,
1637 "__trunc__ returned non-Integral (type %.200s)");
1638 }
1639 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1640
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001641 if (PyString_Check(o))
1642 return int_from_string(PyString_AS_STRING(o),
1643 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001644#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001645 if (PyUnicode_Check(o))
1646 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1647 PyUnicode_GET_SIZE(o),
1648 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001649#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001650 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001651 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001652
Georg Brandlccff7852006-06-18 22:17:29 +00001653 return type_error("int() argument must be a string or a "
1654 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001655}
1656
Guido van Rossum9e896b32000-04-05 20:11:21 +00001657/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001658static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001659long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001660{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001661 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001662 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001663
Guido van Rossum4c08d552000-03-10 22:55:18 +00001664 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001665 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001666 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001667 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001668 PyErr_SetString(PyExc_ValueError,
1669 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001670 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001671 return NULL;
1672 }
1673 return x;
1674}
1675
Guido van Rossume15dee51995-07-18 14:12:02 +00001676PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001677PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001678{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001679 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001680 static PyObject *trunc_name = NULL;
1681 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001682 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001683 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001684
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001685 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001686 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001687 if (trunc_name == NULL)
1688 return NULL;
1689 }
1690
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001691 if (o == NULL)
1692 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001693 m = o->ob_type->tp_as_number;
1694 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001695 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001696 PyObject *res = m->nb_long(o);
1697 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1698 PyErr_Format(PyExc_TypeError,
1699 "__long__ returned non-long (type %.200s)",
1700 res->ob_type->tp_name);
1701 Py_DECREF(res);
1702 return NULL;
1703 }
1704 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001705 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001706 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001707 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001708 trunc_func = PyObject_GetAttr(o, trunc_name);
1709 if (trunc_func) {
1710 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1711 PyObject *int_instance;
1712 Py_DECREF(trunc_func);
1713 /* __trunc__ is specified to return an Integral type,
1714 but long() needs to return a long. */
1715 int_instance = _PyNumber_ConvertIntegralToInt(
1716 truncated,
1717 "__trunc__ returned non-Integral (type %.200s)");
1718 if (int_instance && PyInt_Check(int_instance)) {
1719 /* Make sure that long() returns a long instance. */
1720 long value = PyInt_AS_LONG(int_instance);
1721 Py_DECREF(int_instance);
1722 return PyLong_FromLong(value);
1723 }
1724 return int_instance;
1725 }
1726 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1727
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001728 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001729 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001730 * doesn't do. In particular long('9.5') must raise an
1731 * exception, not truncate the float.
1732 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001733 return long_from_string(PyString_AS_STRING(o),
1734 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001735#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001736 if (PyUnicode_Check(o))
1737 /* The above check is done in PyLong_FromUnicode(). */
1738 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1739 PyUnicode_GET_SIZE(o),
1740 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001741#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001742 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1743 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001744
Georg Brandlccff7852006-06-18 22:17:29 +00001745 return type_error("long() argument must be a string or a "
1746 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001747}
1748
1749PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001750PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001751{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001752 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001753
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001754 if (o == NULL)
1755 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001756 m = o->ob_type->tp_as_number;
1757 if (m && m->nb_float) { /* This should include subclasses of float */
1758 PyObject *res = m->nb_float(o);
1759 if (res && !PyFloat_Check(res)) {
1760 PyErr_Format(PyExc_TypeError,
1761 "__float__ returned non-float (type %.200s)",
1762 res->ob_type->tp_name);
1763 Py_DECREF(res);
1764 return NULL;
1765 }
1766 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001767 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001768 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001769 PyFloatObject *po = (PyFloatObject *)o;
1770 return PyFloat_FromDouble(po->ob_fval);
1771 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001772 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001773}
1774
Eric Smith5e527eb2008-02-10 01:36:53 +00001775PyObject *
1776PyNumber_ToBase(PyObject *n, int base)
1777{
1778 PyObject *res = NULL;
1779 PyObject *index = PyNumber_Index(n);
1780
1781 if (!index)
1782 return NULL;
1783 if (PyLong_Check(index))
1784 res = _PyLong_Format(index, base, 0, 1);
1785 else if (PyInt_Check(index))
1786 res = _PyInt_Format((PyIntObject*)index, base, 1);
1787 else
Eric Smith3f914372008-02-15 12:14:32 +00001788 /* It should not be possible to get here, as
1789 PyNumber_Index already has a check for the same
1790 condition */
1791 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1792 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001793 Py_DECREF(index);
1794 return res;
1795}
1796
1797
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001798/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001799
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001800int
Fred Drake79912472000-07-09 04:06:11 +00001801PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001802{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001803 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001804 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001805 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001806 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001807 return s != NULL && s->ob_type->tp_as_sequence &&
1808 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001809}
1810
Martin v. Löwis18e16552006-02-15 17:27:45 +00001811Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001812PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001813{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001814 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001815
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001816 if (s == NULL) {
1817 null_error();
1818 return -1;
1819 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001820
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001821 m = s->ob_type->tp_as_sequence;
1822 if (m && m->sq_length)
1823 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001824
Georg Brandlb0061c82006-08-08 11:56:21 +00001825 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001826 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001827}
1828
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001829#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001830Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001831PySequence_Length(PyObject *s)
1832{
1833 return PySequence_Size(s);
1834}
1835#define PySequence_Length PySequence_Size
1836
Guido van Rossume15dee51995-07-18 14:12:02 +00001837PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001838PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001839{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001840 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001841
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001842 if (s == NULL || o == NULL)
1843 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001844
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001845 m = s->ob_type->tp_as_sequence;
1846 if (m && m->sq_concat)
1847 return m->sq_concat(s, o);
1848
Armin Rigofd163f92005-12-29 15:59:19 +00001849 /* Instances of user classes defining an __add__() method only
1850 have an nb_add slot, not an sq_concat slot. So we fall back
1851 to nb_add if both arguments appear to be sequences. */
1852 if (PySequence_Check(s) && PySequence_Check(o)) {
1853 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1854 if (result != Py_NotImplemented)
1855 return result;
1856 Py_DECREF(result);
1857 }
Georg Brandlccff7852006-06-18 22:17:29 +00001858 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001859}
1860
1861PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001862PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001863{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001864 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001865
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001866 if (o == NULL)
1867 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001868
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001869 m = o->ob_type->tp_as_sequence;
1870 if (m && m->sq_repeat)
1871 return m->sq_repeat(o, count);
1872
Armin Rigofd163f92005-12-29 15:59:19 +00001873 /* Instances of user classes defining a __mul__() method only
1874 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1875 to nb_multiply if o appears to be a sequence. */
1876 if (PySequence_Check(o)) {
1877 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001878 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001879 if (n == NULL)
1880 return NULL;
1881 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1882 Py_DECREF(n);
1883 if (result != Py_NotImplemented)
1884 return result;
1885 Py_DECREF(result);
1886 }
Georg Brandlccff7852006-06-18 22:17:29 +00001887 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001888}
1889
1890PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001891PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1892{
1893 PySequenceMethods *m;
1894
1895 if (s == NULL || o == NULL)
1896 return null_error();
1897
1898 m = s->ob_type->tp_as_sequence;
1899 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1900 return m->sq_inplace_concat(s, o);
1901 if (m && m->sq_concat)
1902 return m->sq_concat(s, o);
1903
Armin Rigofd163f92005-12-29 15:59:19 +00001904 if (PySequence_Check(s) && PySequence_Check(o)) {
1905 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1906 NB_SLOT(nb_add));
1907 if (result != Py_NotImplemented)
1908 return result;
1909 Py_DECREF(result);
1910 }
Georg Brandlccff7852006-06-18 22:17:29 +00001911 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001912}
1913
1914PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001915PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001916{
1917 PySequenceMethods *m;
1918
1919 if (o == NULL)
1920 return null_error();
1921
1922 m = o->ob_type->tp_as_sequence;
1923 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1924 return m->sq_inplace_repeat(o, count);
1925 if (m && m->sq_repeat)
1926 return m->sq_repeat(o, count);
1927
Armin Rigofd163f92005-12-29 15:59:19 +00001928 if (PySequence_Check(o)) {
1929 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001930 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001931 if (n == NULL)
1932 return NULL;
1933 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1934 NB_SLOT(nb_multiply));
1935 Py_DECREF(n);
1936 if (result != Py_NotImplemented)
1937 return result;
1938 Py_DECREF(result);
1939 }
Georg Brandlccff7852006-06-18 22:17:29 +00001940 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001941}
1942
1943PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001944PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001945{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001946 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001947
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001948 if (s == NULL)
1949 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001950
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001951 m = s->ob_type->tp_as_sequence;
1952 if (m && m->sq_item) {
1953 if (i < 0) {
1954 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001955 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001956 if (l < 0)
1957 return NULL;
1958 i += l;
1959 }
1960 }
1961 return m->sq_item(s, i);
1962 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001963
Skip Montanaro2c7ca9b2008-07-07 11:16:14 +00001964 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001965}
1966
1967PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001968PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001969{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001970 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001971 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001972
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001973 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001974
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001975 m = s->ob_type->tp_as_sequence;
1976 if (m && m->sq_slice) {
1977 if (i1 < 0 || i2 < 0) {
1978 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001979 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001980 if (l < 0)
1981 return NULL;
1982 if (i1 < 0)
1983 i1 += l;
1984 if (i2 < 0)
1985 i2 += l;
1986 }
1987 }
1988 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001989 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1990 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001991 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001992 if (!slice)
1993 return NULL;
1994 res = mp->mp_subscript(s, slice);
1995 Py_DECREF(slice);
1996 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001997 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001998
Georg Brandlccff7852006-06-18 22:17:29 +00001999 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00002000}
2001
2002int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002003PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002004{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002005 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002006
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002007 if (s == NULL) {
2008 null_error();
2009 return -1;
2010 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002012 m = s->ob_type->tp_as_sequence;
2013 if (m && m->sq_ass_item) {
2014 if (i < 0) {
2015 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002016 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002017 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002018 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002019 i += l;
2020 }
2021 }
2022 return m->sq_ass_item(s, i, o);
2023 }
2024
Georg Brandlccff7852006-06-18 22:17:29 +00002025 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002026 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002027}
2028
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002029int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002030PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002031{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002032 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002033
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002034 if (s == NULL) {
2035 null_error();
2036 return -1;
2037 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002038
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002039 m = s->ob_type->tp_as_sequence;
2040 if (m && m->sq_ass_item) {
2041 if (i < 0) {
2042 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002043 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002044 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002045 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002046 i += l;
2047 }
2048 }
2049 return m->sq_ass_item(s, i, (PyObject *)NULL);
2050 }
2051
Georg Brandlccff7852006-06-18 22:17:29 +00002052 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002053 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002054}
2055
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002056int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002057PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002058{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002059 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002060 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002061
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002062 if (s == NULL) {
2063 null_error();
2064 return -1;
2065 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002066
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002067 m = s->ob_type->tp_as_sequence;
2068 if (m && m->sq_ass_slice) {
2069 if (i1 < 0 || i2 < 0) {
2070 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002071 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002072 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002073 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002074 if (i1 < 0)
2075 i1 += l;
2076 if (i2 < 0)
2077 i2 += l;
2078 }
2079 }
2080 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002081 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2082 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002083 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002084 if (!slice)
2085 return -1;
2086 res = mp->mp_ass_subscript(s, slice, o);
2087 Py_DECREF(slice);
2088 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002089 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002090
Georg Brandlccff7852006-06-18 22:17:29 +00002091 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002092 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002093}
2094
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002095int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002096PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002097{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002098 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002099
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002100 if (s == NULL) {
2101 null_error();
2102 return -1;
2103 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002104
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002105 m = s->ob_type->tp_as_sequence;
2106 if (m && m->sq_ass_slice) {
2107 if (i1 < 0 || i2 < 0) {
2108 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002109 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002110 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002111 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002112 if (i1 < 0)
2113 i1 += l;
2114 if (i2 < 0)
2115 i2 += l;
2116 }
2117 }
2118 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2119 }
Georg Brandlccff7852006-06-18 22:17:29 +00002120 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002121 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002122}
2123
Guido van Rossume15dee51995-07-18 14:12:02 +00002124PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002125PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002126{
Tim Peters6912d4d2001-05-05 03:56:37 +00002127 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002128 Py_ssize_t n; /* guess for result tuple size */
Raymond Hettingerb5163702009-02-02 21:50:13 +00002129 PyObject *result = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002130 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002131
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002132 if (v == NULL)
2133 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002134
Tim Peters6912d4d2001-05-05 03:56:37 +00002135 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002136 if (PyTuple_CheckExact(v)) {
2137 /* Note that we can't know whether it's safe to return
2138 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002139 to exact tuples here. In contrast, lists always make
2140 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002141 Py_INCREF(v);
2142 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002143 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002144 if (PyList_Check(v))
2145 return PyList_AsTuple(v);
2146
Tim Peters6912d4d2001-05-05 03:56:37 +00002147 /* Get iterator. */
2148 it = PyObject_GetIter(v);
2149 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002150 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002151
Tim Peters6912d4d2001-05-05 03:56:37 +00002152 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002153 n = _PyObject_LengthHint(v, 10);
Raymond Hettingerb5163702009-02-02 21:50:13 +00002154 if (n == -1)
2155 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002156 result = PyTuple_New(n);
2157 if (result == NULL)
2158 goto Fail;
2159
2160 /* Fill the tuple. */
2161 for (j = 0; ; ++j) {
2162 PyObject *item = PyIter_Next(it);
2163 if (item == NULL) {
2164 if (PyErr_Occurred())
2165 goto Fail;
2166 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002167 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002168 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002169 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002170 /* The over-allocation strategy can grow a bit faster
2171 than for lists because unlike lists the
2172 over-allocation isn't permanent -- we reclaim
2173 the excess before the end of this routine.
2174 So, grow by ten and then add 25%.
2175 */
2176 n += 10;
2177 n += n >> 2;
2178 if (n < oldn) {
2179 /* Check for overflow */
2180 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002181 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002182 goto Fail;
2183 }
Tim Peters4324aa32001-05-28 22:30:08 +00002184 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002185 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002186 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002187 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002188 }
2189 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002190 }
2191
Tim Peters6912d4d2001-05-05 03:56:37 +00002192 /* Cut tuple back if guess was too large. */
2193 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002194 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002195 goto Fail;
2196
2197 Py_DECREF(it);
2198 return result;
2199
2200Fail:
2201 Py_XDECREF(result);
2202 Py_DECREF(it);
2203 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002204}
2205
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002206PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002207PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002208{
Tim Petersf553f892001-05-01 20:45:31 +00002209 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002210 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002211
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002212 if (v == NULL)
2213 return null_error();
2214
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002215 result = PyList_New(0);
2216 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002217 return NULL;
2218
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002219 rv = _PyList_Extend((PyListObject *)result, v);
2220 if (rv == NULL) {
2221 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002222 return NULL;
2223 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002224 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002225 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002226}
2227
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002228PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002229PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002230{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002231 PyObject *it;
2232
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002233 if (v == NULL)
2234 return null_error();
2235
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002236 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002237 Py_INCREF(v);
2238 return v;
2239 }
2240
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002241 it = PyObject_GetIter(v);
2242 if (it == NULL) {
2243 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002244 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002245 return NULL;
2246 }
2247
Raymond Hettinger193814c2004-12-18 19:00:59 +00002248 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002249 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002250
2251 return v;
2252}
2253
Tim Peters16a77ad2001-09-08 04:00:12 +00002254/* Iterate over seq. Result depends on the operation:
2255 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002256 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
Tim Peters16a77ad2001-09-08 04:00:12 +00002257 set ValueError and return -1 if none found; also return -1 on error.
2258 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2259*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002260Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002261_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002262{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002263 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002264 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2265 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002266
Tim Peters16a77ad2001-09-08 04:00:12 +00002267 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002268 null_error();
2269 return -1;
2270 }
Tim Peters75f8e352001-05-05 11:33:43 +00002271
Tim Peters16a77ad2001-09-08 04:00:12 +00002272 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002273 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002274 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002275 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002276 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002277
Tim Peters16a77ad2001-09-08 04:00:12 +00002278 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002279 for (;;) {
2280 int cmp;
2281 PyObject *item = PyIter_Next(it);
2282 if (item == NULL) {
2283 if (PyErr_Occurred())
2284 goto Fail;
2285 break;
2286 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002287
2288 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002289 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002290 if (cmp < 0)
2291 goto Fail;
2292 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002293 switch (operation) {
2294 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002295 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002296 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002297 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002298 goto Fail;
2299 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002300 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002301 break;
2302
2303 case PY_ITERSEARCH_INDEX:
2304 if (wrapped) {
2305 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002306 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002307 goto Fail;
2308 }
2309 goto Done;
2310
2311 case PY_ITERSEARCH_CONTAINS:
2312 n = 1;
2313 goto Done;
2314
2315 default:
2316 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002317 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002318 }
2319
2320 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002321 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002322 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002323 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002324 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002325 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002326
2327 if (operation != PY_ITERSEARCH_INDEX)
2328 goto Done;
2329
2330 PyErr_SetString(PyExc_ValueError,
2331 "sequence.index(x): x not in sequence");
2332 /* fall into failure code */
2333Fail:
2334 n = -1;
2335 /* fall through */
2336Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002337 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002338 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002339
Guido van Rossume15dee51995-07-18 14:12:02 +00002340}
2341
Tim Peters16a77ad2001-09-08 04:00:12 +00002342/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002343Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002344PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002345{
Tim Peters16a77ad2001-09-08 04:00:12 +00002346 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002347}
2348
Tim Peterscb8d3682001-05-05 21:05:01 +00002349/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002350 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002351 */
2352int
2353PySequence_Contains(PyObject *seq, PyObject *ob)
2354{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002355 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002356 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2357 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2358 if (sqm != NULL && sqm->sq_contains != NULL)
2359 return (*sqm->sq_contains)(seq, ob);
2360 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002361 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2362 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002363}
2364
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002365/* Backwards compatibility */
2366#undef PySequence_In
2367int
Fred Drake79912472000-07-09 04:06:11 +00002368PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002369{
2370 return PySequence_Contains(w, v);
2371}
2372
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002373Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002374PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002375{
Tim Peters16a77ad2001-09-08 04:00:12 +00002376 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002377}
2378
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002379/* Operations on mappings */
2380
2381int
Fred Drake79912472000-07-09 04:06:11 +00002382PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002383{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002384 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002385 return PyObject_HasAttrString(o, "__getitem__");
2386
2387 return o && o->ob_type->tp_as_mapping &&
2388 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002389 !(o->ob_type->tp_as_sequence &&
2390 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002391}
2392
Martin v. Löwis18e16552006-02-15 17:27:45 +00002393Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002394PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002395{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002396 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002397
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002398 if (o == NULL) {
2399 null_error();
2400 return -1;
2401 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002402
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002403 m = o->ob_type->tp_as_mapping;
2404 if (m && m->mp_length)
2405 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002406
Georg Brandlb0061c82006-08-08 11:56:21 +00002407 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002408 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002409}
2410
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002411#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002412Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002413PyMapping_Length(PyObject *o)
2414{
2415 return PyMapping_Size(o);
2416}
2417#define PyMapping_Length PyMapping_Size
2418
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002419PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002420PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002421{
2422 PyObject *okey, *r;
2423
2424 if (key == NULL)
2425 return null_error();
2426
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002427 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002428 if (okey == NULL)
2429 return NULL;
2430 r = PyObject_GetItem(o, okey);
2431 Py_DECREF(okey);
2432 return r;
2433}
2434
2435int
Fred Drake79912472000-07-09 04:06:11 +00002436PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002437{
2438 PyObject *okey;
2439 int r;
2440
2441 if (key == NULL) {
2442 null_error();
2443 return -1;
2444 }
2445
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002446 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002447 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002448 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002449 r = PyObject_SetItem(o, okey, value);
2450 Py_DECREF(okey);
2451 return r;
2452}
2453
2454int
Fred Drake79912472000-07-09 04:06:11 +00002455PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002456{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002457 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002458
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002459 v = PyMapping_GetItemString(o, key);
2460 if (v) {
2461 Py_DECREF(v);
2462 return 1;
2463 }
2464 PyErr_Clear();
2465 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002466}
2467
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002468int
Fred Drake79912472000-07-09 04:06:11 +00002469PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002470{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002471 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002472
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002473 v = PyObject_GetItem(o, key);
2474 if (v) {
2475 Py_DECREF(v);
2476 return 1;
2477 }
2478 PyErr_Clear();
2479 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002480}
2481
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002482/* Operations on callable objects */
2483
2484/* XXX PyCallable_Check() is in object.c */
2485
Guido van Rossume15dee51995-07-18 14:12:02 +00002486PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002487PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002488{
Guido van Rossum5560b742001-09-14 16:47:50 +00002489 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002490}
Guido van Rossume15dee51995-07-18 14:12:02 +00002491
2492PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002493PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2494{
2495 ternaryfunc call;
2496
2497 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002498 PyObject *result;
2499 if (Py_EnterRecursiveCall(" while calling a Python object"))
2500 return NULL;
2501 result = (*call)(func, arg, kw);
2502 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002503 if (result == NULL && !PyErr_Occurred())
2504 PyErr_SetString(
2505 PyExc_SystemError,
2506 "NULL result without error in PyObject_Call");
2507 return result;
2508 }
Georg Brandlccff7852006-06-18 22:17:29 +00002509 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002510 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002511 return NULL;
2512}
2513
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002514static PyObject*
2515call_function_tail(PyObject *callable, PyObject *args)
2516{
2517 PyObject *retval;
2518
2519 if (args == NULL)
2520 return NULL;
2521
2522 if (!PyTuple_Check(args)) {
2523 PyObject *a;
2524
2525 a = PyTuple_New(1);
2526 if (a == NULL) {
2527 Py_DECREF(args);
2528 return NULL;
2529 }
2530 PyTuple_SET_ITEM(a, 0, args);
2531 args = a;
2532 }
2533 retval = PyObject_Call(callable, args, NULL);
2534
2535 Py_DECREF(args);
2536
2537 return retval;
2538}
2539
Tim Peters6d6c1a32001-08-02 04:15:00 +00002540PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002541PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002542{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002543 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002544 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002545
Fred Drakeb92cf062001-10-27 06:16:31 +00002546 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002547 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002548
Fred Drakeb92cf062001-10-27 06:16:31 +00002549 if (format && *format) {
2550 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002551 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002552 va_end(va);
2553 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002554 else
2555 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002556
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002557 return call_function_tail(callable, args);
2558}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002559
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002560PyObject *
2561_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2562{
2563 va_list va;
2564 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002565
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002566 if (callable == NULL)
2567 return null_error();
2568
2569 if (format && *format) {
2570 va_start(va, format);
2571 args = _Py_VaBuildValue_SizeT(format, va);
2572 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002573 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002574 else
2575 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002576
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002577 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002578}
2579
2580PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002581PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002582{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002583 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002584 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002585 PyObject *func = NULL;
2586 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002587
Fred Drakeb92cf062001-10-27 06:16:31 +00002588 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002589 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002590
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002591 func = PyObject_GetAttrString(o, name);
2592 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002593 PyErr_SetString(PyExc_AttributeError, name);
2594 return 0;
2595 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002596
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002597 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002598 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002599 goto exit;
2600 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002601
Fred Drakeb92cf062001-10-27 06:16:31 +00002602 if (format && *format) {
2603 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002604 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002605 va_end(va);
2606 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002607 else
2608 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002609
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002610 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002611
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002612 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002613 /* args gets consumed in call_function_tail */
2614 Py_XDECREF(func);
2615
2616 return retval;
2617}
2618
2619PyObject *
2620_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2621{
2622 va_list va;
2623 PyObject *args;
2624 PyObject *func = NULL;
2625 PyObject *retval = NULL;
2626
2627 if (o == NULL || name == NULL)
2628 return null_error();
2629
2630 func = PyObject_GetAttrString(o, name);
2631 if (func == NULL) {
2632 PyErr_SetString(PyExc_AttributeError, name);
2633 return 0;
2634 }
2635
2636 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002637 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002638 goto exit;
2639 }
2640
2641 if (format && *format) {
2642 va_start(va, format);
2643 args = _Py_VaBuildValue_SizeT(format, va);
2644 va_end(va);
2645 }
2646 else
2647 args = PyTuple_New(0);
2648
2649 retval = call_function_tail(func, args);
2650
2651 exit:
2652 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002653 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002654
2655 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002656}
Guido van Rossum823649d2001-03-21 18:40:58 +00002657
2658
Fred Drakeb421b8c2001-10-26 16:21:32 +00002659static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002660objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002661{
2662 int i, n = 0;
2663 va_list countva;
2664 PyObject *result, *tmp;
2665
2666#ifdef VA_LIST_IS_ARRAY
2667 memcpy(countva, va, sizeof(va_list));
2668#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002669#ifdef __va_copy
2670 __va_copy(countva, va);
2671#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002672 countva = va;
2673#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002674#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002675
2676 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2677 ++n;
2678 result = PyTuple_New(n);
2679 if (result != NULL && n > 0) {
2680 for (i = 0; i < n; ++i) {
2681 tmp = (PyObject *)va_arg(va, PyObject *);
2682 PyTuple_SET_ITEM(result, i, tmp);
2683 Py_INCREF(tmp);
2684 }
2685 }
2686 return result;
2687}
2688
2689PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002690PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002691{
2692 PyObject *args, *tmp;
2693 va_list vargs;
2694
2695 if (callable == NULL || name == NULL)
2696 return null_error();
2697
2698 callable = PyObject_GetAttr(callable, name);
2699 if (callable == NULL)
2700 return NULL;
2701
2702 /* count the args */
2703 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002704 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002705 va_end(vargs);
2706 if (args == NULL) {
2707 Py_DECREF(callable);
2708 return NULL;
2709 }
2710 tmp = PyObject_Call(callable, args, NULL);
2711 Py_DECREF(args);
2712 Py_DECREF(callable);
2713
2714 return tmp;
2715}
2716
2717PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002718PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002719{
2720 PyObject *args, *tmp;
2721 va_list vargs;
2722
2723 if (callable == NULL)
2724 return null_error();
2725
2726 /* count the args */
2727 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002728 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002729 va_end(vargs);
2730 if (args == NULL)
2731 return NULL;
2732 tmp = PyObject_Call(callable, args, NULL);
2733 Py_DECREF(args);
2734
2735 return tmp;
2736}
2737
2738
Guido van Rossum823649d2001-03-21 18:40:58 +00002739/* isinstance(), issubclass() */
2740
Barry Warsawf16951c2002-04-23 22:45:44 +00002741/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2742 * state that will almost never happen.
2743 *
2744 * 0. creating the __bases__ static string could get a MemoryError
2745 * 1. getattr(cls, '__bases__') could raise an AttributeError
2746 * 2. getattr(cls, '__bases__') could raise some other exception
2747 * 3. getattr(cls, '__bases__') could return a tuple
2748 * 4. getattr(cls, '__bases__') could return something other than a tuple
2749 *
2750 * Only state #3 is a non-error state and only it returns a non-NULL object
2751 * (it returns the retrieved tuple).
2752 *
2753 * Any raised AttributeErrors are masked by clearing the exception and
2754 * returning NULL. If an object other than a tuple comes out of __bases__,
2755 * then again, the return value is NULL. So yes, these two situations
2756 * produce exactly the same results: NULL is returned and no error is set.
2757 *
2758 * If some exception other than AttributeError is raised, then NULL is also
2759 * returned, but the exception is not cleared. That's because we want the
2760 * exception to be propagated along.
2761 *
2762 * Callers are expected to test for PyErr_Occurred() when the return value
2763 * is NULL to decide whether a valid exception should be propagated or not.
2764 * When there's no exception to propagate, it's customary for the caller to
2765 * set a TypeError.
2766 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002767static PyObject *
2768abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002769{
2770 static PyObject *__bases__ = NULL;
2771 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002772
2773 if (__bases__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002774 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002775 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002776 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002777 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002778 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002779 if (bases == NULL) {
2780 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2781 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002782 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002783 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002784 if (!PyTuple_Check(bases)) {
2785 Py_DECREF(bases);
2786 return NULL;
2787 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002788 return bases;
2789}
2790
2791
2792static int
2793abstract_issubclass(PyObject *derived, PyObject *cls)
2794{
Antoine Pitrou0668c622008-08-26 22:42:08 +00002795 PyObject *bases = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002796 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002797 int r = 0;
2798
Antoine Pitrou0668c622008-08-26 22:42:08 +00002799 while (1) {
2800 if (derived == cls)
2801 return 1;
2802 bases = abstract_get_bases(derived);
2803 if (bases == NULL) {
2804 if (PyErr_Occurred())
2805 return -1;
2806 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002807 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002808 n = PyTuple_GET_SIZE(bases);
2809 if (n == 0) {
2810 Py_DECREF(bases);
2811 return 0;
2812 }
2813 /* Avoid recursivity in the single inheritance case */
2814 if (n == 1) {
2815 derived = PyTuple_GET_ITEM(bases, 0);
2816 Py_DECREF(bases);
2817 continue;
2818 }
2819 for (i = 0; i < n; i++) {
2820 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2821 if (r != 0)
2822 break;
2823 }
2824 Py_DECREF(bases);
2825 return r;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002826 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002827}
2828
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002829static int
2830check_class(PyObject *cls, const char *error)
2831{
2832 PyObject *bases = abstract_get_bases(cls);
2833 if (bases == NULL) {
2834 /* Do not mask errors. */
2835 if (!PyErr_Occurred())
2836 PyErr_SetString(PyExc_TypeError, error);
2837 return 0;
2838 }
2839 Py_DECREF(bases);
2840 return -1;
2841}
2842
Brett Cannon4f653312004-03-20 22:52:14 +00002843static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002844recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002845{
2846 PyObject *icls;
2847 static PyObject *__class__ = NULL;
2848 int retval = 0;
2849
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002850 if (__class__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002851 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002852 if (__class__ == NULL)
2853 return -1;
2854 }
2855
Neil Schemenauer6b471292001-10-18 03:18:43 +00002856 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2857 PyObject *inclass =
2858 (PyObject*)((PyInstanceObject*)inst)->in_class;
2859 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002860 }
2861 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002862 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002863 if (retval == 0) {
2864 PyObject *c = PyObject_GetAttr(inst, __class__);
2865 if (c == NULL) {
2866 PyErr_Clear();
2867 }
2868 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002869 if (c != (PyObject *)(inst->ob_type) &&
2870 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002871 retval = PyType_IsSubtype(
2872 (PyTypeObject *)c,
2873 (PyTypeObject *)cls);
2874 Py_DECREF(c);
2875 }
2876 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002877 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002878 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002879 if (!check_class(cls,
2880 "isinstance() arg 2 must be a class, type,"
2881 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002882 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002883 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002884 if (icls == NULL) {
2885 PyErr_Clear();
2886 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002887 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002888 else {
2889 retval = abstract_issubclass(icls, cls);
2890 Py_DECREF(icls);
2891 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002892 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002893
Guido van Rossum823649d2001-03-21 18:40:58 +00002894 return retval;
2895}
2896
2897int
Brett Cannon4f653312004-03-20 22:52:14 +00002898PyObject_IsInstance(PyObject *inst, PyObject *cls)
2899{
Christian Heimese247f002008-02-14 22:40:11 +00002900 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002901 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002902
2903 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002904 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002905 return 1;
2906
Antoine Pitrou0668c622008-08-26 22:42:08 +00002907 if (PyTuple_Check(cls)) {
2908 Py_ssize_t i;
2909 Py_ssize_t n;
2910 int r = 0;
2911
2912 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2913 return -1;
2914 n = PyTuple_GET_SIZE(cls);
2915 for (i = 0; i < n; ++i) {
2916 PyObject *item = PyTuple_GET_ITEM(cls, i);
2917 r = PyObject_IsInstance(inst, item);
2918 if (r != 0)
2919 /* either found it, or got an error */
2920 break;
2921 }
2922 Py_LeaveRecursiveCall();
2923 return r;
2924 }
Christian Heimese247f002008-02-14 22:40:11 +00002925 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002926 name = PyString_InternFromString("__instancecheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002927 if (name == NULL)
2928 return -1;
2929 }
2930 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002931 if (checker == NULL && PyErr_Occurred())
2932 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002933 if (checker != NULL) {
2934 PyObject *res;
2935 int ok = -1;
2936 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2937 Py_DECREF(checker);
2938 return ok;
2939 }
2940 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2941 Py_LeaveRecursiveCall();
2942 Py_DECREF(checker);
2943 if (res != NULL) {
2944 ok = PyObject_IsTrue(res);
2945 Py_DECREF(res);
2946 }
2947 return ok;
2948 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002949 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002950}
2951
2952static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002953recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002954{
2955 int retval;
2956
Antoine Pitrou0668c622008-08-26 22:42:08 +00002957 if (PyType_Check(cls) && PyType_Check(derived)) {
2958 /* Fast path (non-recursive) */
2959 return PyType_IsSubtype(
2960 (PyTypeObject *)derived, (PyTypeObject *)cls);
2961 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002962 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002963 if (!check_class(derived,
2964 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002965 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002966
Antoine Pitrou0668c622008-08-26 22:42:08 +00002967 if (!check_class(cls,
2968 "issubclass() arg 2 must be a class"
2969 " or tuple of classes"))
2970 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002971 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002972 }
2973 else {
2974 /* shortcut */
2975 if (!(retval = (derived == cls)))
2976 retval = PyClass_IsSubclass(derived, cls);
2977 }
2978
2979 return retval;
2980}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002981
Brett Cannon4f653312004-03-20 22:52:14 +00002982int
2983PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2984{
Christian Heimese247f002008-02-14 22:40:11 +00002985 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002986 PyObject *t, *v, *tb;
2987 PyObject *checker;
Christian Heimese247f002008-02-14 22:40:11 +00002988
Antoine Pitrou0668c622008-08-26 22:42:08 +00002989 if (PyTuple_Check(cls)) {
2990 Py_ssize_t i;
2991 Py_ssize_t n;
2992 int r = 0;
2993
2994 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2995 return -1;
2996 n = PyTuple_GET_SIZE(cls);
2997 for (i = 0; i < n; ++i) {
2998 PyObject *item = PyTuple_GET_ITEM(cls, i);
2999 r = PyObject_IsSubclass(derived, item);
3000 if (r != 0)
3001 /* either found it, or got an error */
3002 break;
3003 }
3004 Py_LeaveRecursiveCall();
3005 return r;
3006 }
Christian Heimese247f002008-02-14 22:40:11 +00003007 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003008 name = PyString_InternFromString("__subclasscheck__");
Christian Heimese247f002008-02-14 22:40:11 +00003009 if (name == NULL)
3010 return -1;
3011 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003012 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00003013 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003014 PyErr_Restore(t, v, tb);
3015 if (checker != NULL) {
3016 PyObject *res;
3017 int ok = -1;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003018 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
3019 Py_DECREF(checker);
Guido van Rossumb5591132007-09-10 22:36:02 +00003020 return ok;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003021 }
Guido van Rossumb5591132007-09-10 22:36:02 +00003022 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3023 Py_LeaveRecursiveCall();
3024 Py_DECREF(checker);
3025 if (res != NULL) {
3026 ok = PyObject_IsTrue(res);
3027 Py_DECREF(res);
3028 }
3029 return ok;
3030 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003031 return recursive_issubclass(derived, cls);
3032}
3033
3034int
3035_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
3036{
3037 return recursive_isinstance(inst, cls);
3038}
3039
3040int
3041_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
3042{
3043 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00003044}
3045
3046
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003047PyObject *
3048PyObject_GetIter(PyObject *o)
3049{
3050 PyTypeObject *t = o->ob_type;
3051 getiterfunc f = NULL;
3052 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3053 f = t->tp_iter;
3054 if (f == NULL) {
3055 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003056 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003057 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003058 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003059 else {
3060 PyObject *res = (*f)(o);
3061 if (res != NULL && !PyIter_Check(res)) {
3062 PyErr_Format(PyExc_TypeError,
3063 "iter() returned non-iterator "
3064 "of type '%.100s'",
3065 res->ob_type->tp_name);
3066 Py_DECREF(res);
3067 res = NULL;
3068 }
3069 return res;
3070 }
3071}
3072
Tim Petersf4848da2001-05-05 00:14:56 +00003073/* Return next item.
3074 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3075 * If the iteration terminates normally, return NULL and clear the
3076 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3077 * will be false.
3078 * Else return the next object. PyErr_Occurred() will be false.
3079 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003080PyObject *
3081PyIter_Next(PyObject *iter)
3082{
Tim Petersf4848da2001-05-05 00:14:56 +00003083 PyObject *result;
Tim Petersf4848da2001-05-05 00:14:56 +00003084 result = (*iter->ob_type->tp_iternext)(iter);
3085 if (result == NULL &&
3086 PyErr_Occurred() &&
3087 PyErr_ExceptionMatches(PyExc_StopIteration))
3088 PyErr_Clear();
3089 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003090}