blob: cd14386f90cb79fe0e5f6e8629f1354b7df0b8b4 [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;
96 PyObject *ro;
97 Py_ssize_t rv;
98
99 /* try o.__len__() */
100 rv = PyObject_Size(o);
101 if (rv >= 0)
102 return rv;
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
110 /* cache a hashed version of the attribute string */
111 if (hintstrobj == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000112 hintstrobj = PyString_InternFromString("__length_hint__");
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000113 if (hintstrobj == NULL)
Raymond Hettingerb5163702009-02-02 21:50:13 +0000114 return -1;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000115 }
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000116
117 /* try o.__length_hint__() */
118 ro = PyObject_CallMethodObjArgs(o, hintstrobj, NULL);
Raymond Hettingerb5163702009-02-02 21:50:13 +0000119 if (ro == NULL) {
120 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
121 !PyErr_ExceptionMatches(PyExc_AttributeError))
122 return -1;
123 PyErr_Clear();
124 return defaultvalue;
125 }
Mark Dickinsonb91d2f52009-02-08 13:58:10 +0000126 rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000127 Py_DECREF(ro);
Raymond Hettingerb5163702009-02-02 21:50:13 +0000128 return rv;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000129}
130
Guido van Rossume15dee51995-07-18 14:12:02 +0000131PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000132PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000133{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000134 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000136 if (o == NULL || key == NULL)
137 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000138
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000139 m = o->ob_type->tp_as_mapping;
140 if (m && m->mp_subscript)
141 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000142
Guido van Rossum21308241998-08-13 16:44:44 +0000143 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000144 if (PyIndex_Check(key)) {
145 Py_ssize_t key_value;
146 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000147 if (key_value == -1 && PyErr_Occurred())
148 return NULL;
149 return PySequence_GetItem(o, key_value);
150 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000151 else if (o->ob_type->tp_as_sequence->sq_item)
Georg Brandlccff7852006-06-18 22:17:29 +0000152 return type_error("sequence index must "
153 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000154 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000155
Georg Brandlf5fd5232009-04-18 08:26:21 +0000156 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000157}
158
159int
Fred Drake79912472000-07-09 04:06:11 +0000160PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000161{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000162 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000163
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000164 if (o == NULL || key == NULL || value == NULL) {
165 null_error();
166 return -1;
167 }
168 m = o->ob_type->tp_as_mapping;
169 if (m && m->mp_ass_subscript)
170 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000171
Guido van Rossum21308241998-08-13 16:44:44 +0000172 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000173 if (PyIndex_Check(key)) {
174 Py_ssize_t key_value;
175 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000176 if (key_value == -1 && PyErr_Occurred())
177 return -1;
178 return PySequence_SetItem(o, key_value, value);
179 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000180 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000181 type_error("sequence index must be "
182 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000183 return -1;
184 }
Guido van Rossum21308241998-08-13 16:44:44 +0000185 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000186
Georg Brandlccff7852006-06-18 22:17:29 +0000187 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000188 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000189}
190
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000191int
Fred Drake79912472000-07-09 04:06:11 +0000192PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000193{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000194 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000195
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000196 if (o == NULL || key == NULL) {
197 null_error();
198 return -1;
199 }
200 m = o->ob_type->tp_as_mapping;
201 if (m && m->mp_ass_subscript)
202 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000203
Guido van Rossum21308241998-08-13 16:44:44 +0000204 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000205 if (PyIndex_Check(key)) {
206 Py_ssize_t key_value;
207 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000208 if (key_value == -1 && PyErr_Occurred())
209 return -1;
210 return PySequence_DelItem(o, key_value);
211 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000212 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000213 type_error("sequence index must be "
214 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000215 return -1;
216 }
Guido van Rossum21308241998-08-13 16:44:44 +0000217 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000218
Georg Brandlccff7852006-06-18 22:17:29 +0000219 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000220 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000221}
222
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000223int
224PyObject_DelItemString(PyObject *o, char *key)
225{
226 PyObject *okey;
227 int ret;
228
229 if (o == NULL || key == NULL) {
230 null_error();
231 return -1;
232 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000233 okey = PyString_FromString(key);
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000234 if (okey == NULL)
235 return -1;
236 ret = PyObject_DelItem(o, okey);
237 Py_DECREF(okey);
238 return ret;
239}
240
Brett Cannonea229bd2006-06-06 18:08:16 +0000241int
242PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000243 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000244 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000245{
246 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000247 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000248 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000249
250 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
251 null_error();
252 return -1;
253 }
254 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000255 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000256 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000257 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000258 PyErr_SetString(PyExc_TypeError,
259 "expected a character 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 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263 PyErr_SetString(PyExc_TypeError,
264 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000265 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000266 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000267 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000268 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000269 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000270 *buffer = pp;
271 *buffer_len = len;
272 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000273}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000274
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000275int
276PyObject_CheckReadBuffer(PyObject *obj)
277{
278 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
279
280 if (pb == NULL ||
281 pb->bf_getreadbuffer == NULL ||
282 pb->bf_getsegcount == NULL ||
283 (*pb->bf_getsegcount)(obj, NULL) != 1)
284 return 0;
285 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000286}
287
288int PyObject_AsReadBuffer(PyObject *obj,
289 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000290 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000291{
292 PyBufferProcs *pb;
293 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000294 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000295
296 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
297 null_error();
298 return -1;
299 }
300 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000301 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000302 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000303 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304 PyErr_SetString(PyExc_TypeError,
305 "expected a readable 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 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000309 PyErr_SetString(PyExc_TypeError,
310 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000311 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000312 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000313 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000314 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000315 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316 *buffer = pp;
317 *buffer_len = len;
318 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000319}
320
321int PyObject_AsWriteBuffer(PyObject *obj,
322 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000323 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000324{
325 PyBufferProcs *pb;
326 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000328
329 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
330 null_error();
331 return -1;
332 }
333 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000334 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000335 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000336 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000337 PyErr_SetString(PyExc_TypeError,
338 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000339 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000340 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000341 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000342 PyErr_SetString(PyExc_TypeError,
343 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000344 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000345 }
346 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
347 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000348 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000349 *buffer = pp;
350 *buffer_len = len;
351 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000352}
353
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000354/* Buffer C-API for Python 3.0 */
355
356int
357PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
358{
359 if (!PyObject_CheckBuffer(obj)) {
360 PyErr_Format(PyExc_TypeError,
361 "'%100s' does not have the buffer interface",
362 Py_TYPE(obj)->tp_name);
363 return -1;
364 }
365 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
366}
367
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000368static int
369_IsFortranContiguous(Py_buffer *view)
370{
371 Py_ssize_t sd, dim;
372 int i;
373
374 if (view->ndim == 0) return 1;
375 if (view->strides == NULL) return (view->ndim == 1);
376
377 sd = view->itemsize;
378 if (view->ndim == 1) return (view->shape[0] == 1 ||
379 sd == view->strides[0]);
380 for (i=0; i<view->ndim; i++) {
381 dim = view->shape[i];
382 if (dim == 0) return 1;
383 if (view->strides[i] != sd) return 0;
384 sd *= dim;
385 }
386 return 1;
387}
388
389static int
390_IsCContiguous(Py_buffer *view)
391{
392 Py_ssize_t sd, dim;
393 int i;
394
395 if (view->ndim == 0) return 1;
396 if (view->strides == NULL) return 1;
397
398 sd = view->itemsize;
399 if (view->ndim == 1) return (view->shape[0] == 1 ||
400 sd == view->strides[0]);
401 for (i=view->ndim-1; i>=0; i--) {
402 dim = view->shape[i];
403 if (dim == 0) return 1;
404 if (view->strides[i] != sd) return 0;
405 sd *= dim;
406 }
407 return 1;
408}
409
410int
411PyBuffer_IsContiguous(Py_buffer *view, char fort)
412{
413
414 if (view->suboffsets != NULL) return 0;
415
416 if (fort == 'C')
417 return _IsCContiguous(view);
418 else if (fort == 'F')
419 return _IsFortranContiguous(view);
420 else if (fort == 'A')
421 return (_IsCContiguous(view) || _IsFortranContiguous(view));
422 return 0;
423}
424
425
426void*
427PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
428{
429 char* pointer;
430 int i;
431 pointer = (char *)view->buf;
432 for (i = 0; i < view->ndim; i++) {
433 pointer += view->strides[i]*indices[i];
434 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
435 pointer = *((char**)pointer) + view->suboffsets[i];
436 }
437 }
438 return (void*)pointer;
439}
440
441
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000442void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000443_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape)
444{
445 int k;
446
447 for (k=0; k<nd; k++) {
448 if (index[k] < shape[k]-1) {
449 index[k]++;
450 break;
451 }
452 else {
453 index[k] = 0;
454 }
455 }
456}
457
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000458void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000459_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape)
460{
461 int k;
462
463 for (k=nd-1; k>=0; k--) {
464 if (index[k] < shape[k]-1) {
465 index[k]++;
466 break;
467 }
468 else {
469 index[k] = 0;
470 }
471 }
472}
473
474 /* view is not checked for consistency in either of these. It is
475 assumed that the size of the buffer is view->len in
476 view->len / view->itemsize elements.
477 */
478
479int
480PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
481{
482 int k;
483 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
484 Py_ssize_t *indices, elements;
485 char *dest, *ptr;
486
487 if (len > view->len) {
488 len = view->len;
489 }
490
491 if (PyBuffer_IsContiguous(view, fort)) {
492 /* simplest copy is all that is needed */
493 memcpy(buf, view->buf, len);
494 return 0;
495 }
496
497 /* Otherwise a more elaborate scheme is needed */
498
499 /* XXX(nnorwitz): need to check for overflow! */
500 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
501 if (indices == NULL) {
502 PyErr_NoMemory();
503 return -1;
504 }
505 for (k=0; k<view->ndim;k++) {
506 indices[k] = 0;
507 }
508
509 if (fort == 'F') {
510 addone = _add_one_to_index_F;
511 }
512 else {
513 addone = _add_one_to_index_C;
514 }
515 dest = buf;
516 /* XXX : This is not going to be the fastest code in the world
517 several optimizations are possible.
518 */
519 elements = len / view->itemsize;
520 while (elements--) {
521 addone(view->ndim, indices, view->shape);
522 ptr = PyBuffer_GetPointer(view, indices);
523 memcpy(dest, ptr, view->itemsize);
524 dest += view->itemsize;
525 }
526 PyMem_Free(indices);
527 return 0;
528}
529
530int
531PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
532{
533 int k;
534 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
535 Py_ssize_t *indices, elements;
536 char *src, *ptr;
537
538 if (len > view->len) {
539 len = view->len;
540 }
541
542 if (PyBuffer_IsContiguous(view, fort)) {
543 /* simplest copy is all that is needed */
544 memcpy(view->buf, buf, len);
545 return 0;
546 }
547
548 /* Otherwise a more elaborate scheme is needed */
549
550 /* XXX(nnorwitz): need to check for overflow! */
551 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
552 if (indices == NULL) {
553 PyErr_NoMemory();
554 return -1;
555 }
556 for (k=0; k<view->ndim;k++) {
557 indices[k] = 0;
558 }
559
560 if (fort == 'F') {
561 addone = _add_one_to_index_F;
562 }
563 else {
564 addone = _add_one_to_index_C;
565 }
566 src = buf;
567 /* XXX : This is not going to be the fastest code in the world
568 several optimizations are possible.
569 */
570 elements = len / view->itemsize;
571 while (elements--) {
572 addone(view->ndim, indices, view->shape);
573 ptr = PyBuffer_GetPointer(view, indices);
574 memcpy(ptr, src, view->itemsize);
575 src += view->itemsize;
576 }
577
578 PyMem_Free(indices);
579 return 0;
580}
581
582int PyObject_CopyData(PyObject *dest, PyObject *src)
583{
584 Py_buffer view_dest, view_src;
585 int k;
586 Py_ssize_t *indices, elements;
587 char *dptr, *sptr;
588
589 if (!PyObject_CheckBuffer(dest) ||
590 !PyObject_CheckBuffer(src)) {
591 PyErr_SetString(PyExc_TypeError,
592 "both destination and source must have the "\
593 "buffer interface");
594 return -1;
595 }
596
597 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
598 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000599 PyBuffer_Release(&view_dest);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000600 return -1;
601 }
602
603 if (view_dest.len < view_src.len) {
604 PyErr_SetString(PyExc_BufferError,
605 "destination is too small to receive data from source");
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000606 PyBuffer_Release(&view_dest);
607 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000608 return -1;
609 }
610
611 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
612 PyBuffer_IsContiguous(&view_src, 'C')) ||
613 (PyBuffer_IsContiguous(&view_dest, 'F') &&
614 PyBuffer_IsContiguous(&view_src, 'F'))) {
615 /* simplest copy is all that is needed */
616 memcpy(view_dest.buf, view_src.buf, view_src.len);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000617 PyBuffer_Release(&view_dest);
618 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000619 return 0;
620 }
621
622 /* Otherwise a more elaborate copy scheme is needed */
623
624 /* XXX(nnorwitz): need to check for overflow! */
625 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
626 if (indices == NULL) {
627 PyErr_NoMemory();
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000628 PyBuffer_Release(&view_dest);
629 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000630 return -1;
631 }
632 for (k=0; k<view_src.ndim;k++) {
633 indices[k] = 0;
634 }
635 elements = 1;
636 for (k=0; k<view_src.ndim; k++) {
637 /* XXX(nnorwitz): can this overflow? */
638 elements *= view_src.shape[k];
639 }
640 while (elements--) {
641 _add_one_to_index_C(view_src.ndim, indices, view_src.shape);
642 dptr = PyBuffer_GetPointer(&view_dest, indices);
643 sptr = PyBuffer_GetPointer(&view_src, indices);
644 memcpy(dptr, sptr, view_src.itemsize);
645 }
646 PyMem_Free(indices);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000647 PyBuffer_Release(&view_dest);
648 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000649 return 0;
650}
651
652void
653PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
654 Py_ssize_t *strides, int itemsize,
655 char fort)
656{
657 int k;
658 Py_ssize_t sd;
659
660 sd = itemsize;
661 if (fort == 'F') {
662 for (k=0; k<nd; k++) {
663 strides[k] = sd;
664 sd *= shape[k];
665 }
666 }
667 else {
668 for (k=nd-1; k>=0; k--) {
669 strides[k] = sd;
670 sd *= shape[k];
671 }
672 }
673 return;
674}
675
676int
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000677PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000678 int readonly, int flags)
679{
680 if (view == NULL) return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000681 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
682 (readonly == 1)) {
683 PyErr_SetString(PyExc_BufferError,
684 "Object is not writable.");
685 return -1;
686 }
687
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000688 view->obj = obj;
Martin v. Löwis241b8342008-08-14 15:54:27 +0000689 if (obj)
690 Py_INCREF(obj);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000691 view->buf = buf;
692 view->len = len;
693 view->readonly = readonly;
694 view->itemsize = 1;
695 view->format = NULL;
696 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
697 view->format = "B";
698 view->ndim = 1;
699 view->shape = NULL;
700 if ((flags & PyBUF_ND) == PyBUF_ND)
701 view->shape = &(view->len);
702 view->strides = NULL;
703 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
704 view->strides = &(view->itemsize);
705 view->suboffsets = NULL;
706 view->internal = NULL;
707 return 0;
708}
709
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000710void
711PyBuffer_Release(Py_buffer *view)
712{
713 PyObject *obj = view->obj;
Martin v. Löwis64034f92008-08-14 20:12:06 +0000714 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
715 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
716 Py_XDECREF(obj);
Martin v. Löwis241b8342008-08-14 15:54:27 +0000717 view->obj = NULL;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000718}
719
Eric Smitha9f7d622008-02-17 19:46:49 +0000720PyObject *
721PyObject_Format(PyObject* obj, PyObject *format_spec)
722{
723 static PyObject * str__format__ = NULL;
724 PyObject *empty = NULL;
725 PyObject *result = NULL;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000726#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000727 int spec_is_unicode;
728 int result_is_unicode;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000729#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000730
731 /* Initialize cached value */
732 if (str__format__ == NULL) {
733 /* Initialize static variable needed by _PyType_Lookup */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000734 str__format__ = PyString_InternFromString("__format__");
Eric Smitha9f7d622008-02-17 19:46:49 +0000735 if (str__format__ == NULL)
736 goto done;
737 }
738
739 /* If no format_spec is provided, use an empty string */
740 if (format_spec == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000741 empty = PyString_FromStringAndSize(NULL, 0);
Eric Smitha9f7d622008-02-17 19:46:49 +0000742 format_spec = empty;
743 }
744
745 /* Check the format_spec type, and make sure it's str or unicode */
Hirokazu Yamamoto1e234e82009-01-25 17:46:48 +0000746#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000747 if (PyUnicode_Check(format_spec))
748 spec_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000749 else if (PyString_Check(format_spec))
Eric Smitha9f7d622008-02-17 19:46:49 +0000750 spec_is_unicode = 0;
751 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000752#else
753 if (!PyString_Check(format_spec)) {
754#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000755 PyErr_Format(PyExc_TypeError,
756 "format expects arg 2 to be string "
757 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
758 goto done;
759 }
760
761 /* Make sure the type is initialized. float gets initialized late */
762 if (Py_TYPE(obj)->tp_dict == NULL)
763 if (PyType_Ready(Py_TYPE(obj)) < 0)
764 goto done;
765
766 /* Check for a __format__ method and call it. */
767 if (PyInstance_Check(obj)) {
768 /* We're an instance of a classic class */
769 PyObject *bound_method = PyObject_GetAttr(obj,
770 str__format__);
771 if (bound_method != NULL) {
772 result = PyObject_CallFunctionObjArgs(bound_method,
773 format_spec,
774 NULL);
775 Py_DECREF(bound_method);
776 } else {
777 PyObject *self_as_str;
778 PyObject *format_method;
779
780 PyErr_Clear();
781 /* Per the PEP, convert to str (or unicode,
782 depending on the type of the format
783 specifier). For new-style classes, this
784 logic is done by object.__format__(). */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000785#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000786 if (spec_is_unicode)
787 self_as_str = PyObject_Unicode(obj);
788 else
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000789#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000790 self_as_str = PyObject_Str(obj);
791 if (self_as_str == NULL)
792 goto done;
793
794 /* Then call str.__format__ on that result */
795 format_method = PyObject_GetAttr(self_as_str,
796 str__format__);
797 if (format_method == NULL) {
798 Py_DECREF(self_as_str);
799 goto done;
800 }
801 result = PyObject_CallFunctionObjArgs(format_method,
802 format_spec,
803 NULL);
804 Py_DECREF(self_as_str);
805 Py_DECREF(format_method);
806 if (result == NULL)
807 goto done;
808 }
809 } else {
810 /* Not an instance of a classic class, use the code
811 from py3k */
812
813 /* Find the (unbound!) __format__ method (a borrowed
814 reference) */
815 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
816 str__format__);
817 if (method == NULL) {
818 PyErr_Format(PyExc_TypeError,
819 "Type %.100s doesn't define __format__",
820 Py_TYPE(obj)->tp_name);
821 goto done;
822 }
823 /* And call it, binding it to the value */
824 result = PyObject_CallFunctionObjArgs(method, obj,
825 format_spec, NULL);
826 }
827
828 if (result == NULL)
829 goto done;
830
831 /* Check the result type, and make sure it's str or unicode */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000832#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000833 if (PyUnicode_Check(result))
834 result_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000835 else if (PyString_Check(result))
Eric Smitha9f7d622008-02-17 19:46:49 +0000836 result_is_unicode = 0;
837 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000838#else
839 if (!PyString_Check(result)) {
840#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000841 PyErr_Format(PyExc_TypeError,
842 "%.100s.__format__ must return string or "
843 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
844 Py_TYPE(result)->tp_name);
845 Py_DECREF(result);
846 result = NULL;
847 goto done;
848 }
849
850 /* Convert to unicode, if needed. Required if spec is unicode
851 and result is str */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000852#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000853 if (spec_is_unicode && !result_is_unicode) {
854 PyObject *tmp = PyObject_Unicode(result);
855 /* This logic works whether or not tmp is NULL */
856 Py_DECREF(result);
857 result = tmp;
858 }
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000859#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000860
861done:
862 Py_XDECREF(empty);
863 return result;
864}
865
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000866/* Operations on numbers */
867
868int
Fred Drake79912472000-07-09 04:06:11 +0000869PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000870{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000871 return o && o->ob_type->tp_as_number &&
872 (o->ob_type->tp_as_number->nb_int ||
873 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000874}
875
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000876/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000877
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000878/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000879
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000880#define NB_SLOT(x) offsetof(PyNumberMethods, x)
881#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000882 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000883#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000884 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000885
886/*
887 Calling scheme used for binary operations:
888
889 v w Action
890 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000891 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000892 new old v.op(v,w), coerce(v,w), v.op(v,w)
893 old new w.op(v,w), coerce(v,w), v.op(v,w)
894 old old coerce(v,w), v.op(v,w)
895
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000896 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
897 v->ob_type
898
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000899 Legend:
900 -------
901 * new == new style number
902 * old == old style number
903 * Action indicates the order in which operations are tried until either
904 a valid result is produced or an error occurs.
905
906 */
907
908static PyObject *
909binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000910{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000911 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000912 binaryfunc slotv = NULL;
913 binaryfunc slotw = NULL;
914
915 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000916 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000917 if (w->ob_type != v->ob_type &&
918 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000919 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000920 if (slotw == slotv)
921 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000922 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000923 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000924 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
925 x = slotw(v, w);
926 if (x != Py_NotImplemented)
927 return x;
928 Py_DECREF(x); /* can't do it */
929 slotw = NULL;
930 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000931 x = slotv(v, w);
932 if (x != Py_NotImplemented)
933 return x;
934 Py_DECREF(x); /* can't do it */
935 }
936 if (slotw) {
937 x = slotw(v, w);
938 if (x != Py_NotImplemented)
939 return x;
940 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000941 }
942 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
943 int err = PyNumber_CoerceEx(&v, &w);
944 if (err < 0) {
945 return NULL;
946 }
947 if (err == 0) {
948 PyNumberMethods *mv = v->ob_type->tp_as_number;
949 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000950 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000951 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000952 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000953 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000954 Py_DECREF(v);
955 Py_DECREF(w);
956 return x;
957 }
958 }
959 /* CoerceEx incremented the reference counts */
960 Py_DECREF(v);
961 Py_DECREF(w);
962 }
963 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000964 Py_INCREF(Py_NotImplemented);
965 return Py_NotImplemented;
966}
Guido van Rossum77660912002-04-16 16:32:50 +0000967
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000968static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000969binop_type_error(PyObject *v, PyObject *w, const char *op_name)
970{
971 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000972 "unsupported operand type(s) for %.100s: "
973 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000974 op_name,
975 v->ob_type->tp_name,
976 w->ob_type->tp_name);
977 return NULL;
978}
979
980static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000981binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
982{
983 PyObject *result = binary_op1(v, w, op_slot);
984 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000985 Py_DECREF(result);
986 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000987 }
988 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000989}
990
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000991
992/*
993 Calling scheme used for ternary operations:
994
Guido van Rossum84675ac2001-09-29 01:05:03 +0000995 *** In some cases, w.op is called before v.op; see binary_op1. ***
996
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000997 v w z Action
998 -------------------------------------------------------------------
999 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
1000 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1001 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1002 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1003 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1004 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1005 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1006 old old old coerce(v,w,z), v.op(v,w,z)
1007
1008 Legend:
1009 -------
1010 * new == new style number
1011 * old == old style number
1012 * Action indicates the order in which operations are tried until either
1013 a valid result is produced or an error occurs.
1014 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
1015 only if z != Py_None; if z == Py_None, then it is treated as absent
1016 variable and only coerce(v,w) is tried.
1017
1018 */
1019
1020static PyObject *
1021ternary_op(PyObject *v,
1022 PyObject *w,
1023 PyObject *z,
1024 const int op_slot,
1025 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001026{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001027 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001028 PyObject *x = NULL;
1029 ternaryfunc slotv = NULL;
1030 ternaryfunc slotw = NULL;
1031 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001032
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001033 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001034 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001035 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001036 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001037 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001038 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001039 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001040 if (slotw == slotv)
1041 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001042 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001043 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001044 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1045 x = slotw(v, w, z);
1046 if (x != Py_NotImplemented)
1047 return x;
1048 Py_DECREF(x); /* can't do it */
1049 slotw = NULL;
1050 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001051 x = slotv(v, w, z);
1052 if (x != Py_NotImplemented)
1053 return x;
1054 Py_DECREF(x); /* can't do it */
1055 }
1056 if (slotw) {
1057 x = slotw(v, w, z);
1058 if (x != Py_NotImplemented)
1059 return x;
1060 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001061 }
1062 mz = z->ob_type->tp_as_number;
1063 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001064 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001065 if (slotz == slotv || slotz == slotw)
1066 slotz = NULL;
1067 if (slotz) {
1068 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001069 if (x != Py_NotImplemented)
1070 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001071 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001072 }
1073 }
1074
1075 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1076 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1077 /* we have an old style operand, coerce */
1078 PyObject *v1, *z1, *w2, *z2;
1079 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001080
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001081 c = PyNumber_Coerce(&v, &w);
1082 if (c != 0)
1083 goto error3;
1084
1085 /* Special case: if the third argument is None, it is
1086 treated as absent argument and not coerced. */
1087 if (z == Py_None) {
1088 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001089 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1090 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001091 if (slotz)
1092 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001093 else
1094 c = -1;
1095 }
1096 else
1097 c = -1;
1098 goto error2;
1099 }
1100 v1 = v;
1101 z1 = z;
1102 c = PyNumber_Coerce(&v1, &z1);
1103 if (c != 0)
1104 goto error2;
1105 w2 = w;
1106 z2 = z1;
1107 c = PyNumber_Coerce(&w2, &z2);
1108 if (c != 0)
1109 goto error1;
1110
1111 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001112 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1113 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001114 if (slotv)
1115 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001116 else
1117 c = -1;
1118 }
1119 else
1120 c = -1;
1121
1122 Py_DECREF(w2);
1123 Py_DECREF(z2);
1124 error1:
1125 Py_DECREF(v1);
1126 Py_DECREF(z1);
1127 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001128 Py_DECREF(v);
1129 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001130 error3:
1131 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001132 return x;
1133 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001134
1135 if (z == Py_None)
1136 PyErr_Format(
1137 PyExc_TypeError,
1138 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001139 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001140 v->ob_type->tp_name,
1141 w->ob_type->tp_name);
1142 else
1143 PyErr_Format(
1144 PyExc_TypeError,
1145 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001146 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001147 v->ob_type->tp_name,
1148 w->ob_type->tp_name,
1149 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001150 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001151}
1152
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001153#define BINARY_FUNC(func, op, op_name) \
1154 PyObject * \
1155 func(PyObject *v, PyObject *w) { \
1156 return binary_op(v, w, NB_SLOT(op), op_name); \
1157 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001158
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001159BINARY_FUNC(PyNumber_Or, nb_or, "|")
1160BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1161BINARY_FUNC(PyNumber_And, nb_and, "&")
1162BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1163BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1164BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001165BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1166BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001167
1168PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001169PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001170{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001171 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1172 if (result == Py_NotImplemented) {
1173 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001174 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001175 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001176 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001177 }
Armin Rigofd163f92005-12-29 15:59:19 +00001178 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001179 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001180 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001181}
1182
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001183static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001184sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001185{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001186 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001187 if (PyIndex_Check(n)) {
1188 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001189 if (count == -1 && PyErr_Occurred())
1190 return NULL;
1191 }
1192 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001193 return type_error("can't multiply sequence by "
1194 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001195 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001196 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001197}
1198
1199PyObject *
1200PyNumber_Multiply(PyObject *v, PyObject *w)
1201{
1202 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1203 if (result == Py_NotImplemented) {
1204 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1205 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001206 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001207 if (mv && mv->sq_repeat) {
1208 return sequence_repeat(mv->sq_repeat, v, w);
1209 }
1210 else if (mw && mw->sq_repeat) {
1211 return sequence_repeat(mw->sq_repeat, w, v);
1212 }
1213 result = binop_type_error(v, w, "*");
1214 }
1215 return result;
1216}
1217
Guido van Rossume15dee51995-07-18 14:12:02 +00001218PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001219PyNumber_FloorDivide(PyObject *v, PyObject *w)
1220{
1221 /* XXX tp_flags test */
1222 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1223}
1224
1225PyObject *
1226PyNumber_TrueDivide(PyObject *v, PyObject *w)
1227{
1228 /* XXX tp_flags test */
1229 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1230}
1231
1232PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001233PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001234{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001235 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001236}
1237
1238PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001239PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001240{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001241 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001242}
1243
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001244/* Binary in-place operators */
1245
1246/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001247 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001248
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001249 - If the left hand object has the appropriate struct members, and
1250 they are filled, call the appropriate function and return the
1251 result. No coercion is done on the arguments; the left-hand object
1252 is the one the operation is performed on, and it's up to the
1253 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001254
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001255 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001256 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001257
1258 */
1259
Guido van Rossum77660912002-04-16 16:32:50 +00001260#define HASINPLACE(t) \
1261 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001262
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001263static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001264binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001265{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001266 PyNumberMethods *mv = v->ob_type->tp_as_number;
1267 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001268 binaryfunc slot = NB_BINOP(mv, iop_slot);
1269 if (slot) {
1270 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001271 if (x != Py_NotImplemented) {
1272 return x;
1273 }
1274 Py_DECREF(x);
1275 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001276 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001277 return binary_op1(v, w, op_slot);
1278}
1279
1280static PyObject *
1281binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1282 const char *op_name)
1283{
1284 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1285 if (result == Py_NotImplemented) {
1286 Py_DECREF(result);
1287 return binop_type_error(v, w, op_name);
1288 }
1289 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001290}
1291
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001292#define INPLACE_BINOP(func, iop, op, op_name) \
1293 PyObject * \
1294 func(PyObject *v, PyObject *w) { \
1295 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001296 }
1297
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001298INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1299INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1300INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1301INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1302INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1303INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1304INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001305
1306PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001307PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1308{
1309 /* XXX tp_flags test */
1310 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1311 NB_SLOT(nb_floor_divide), "//=");
1312}
1313
1314PyObject *
1315PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1316{
1317 /* XXX tp_flags test */
1318 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1319 NB_SLOT(nb_true_divide), "/=");
1320}
1321
1322PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001323PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1324{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001325 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1326 NB_SLOT(nb_add));
1327 if (result == Py_NotImplemented) {
1328 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1329 Py_DECREF(result);
1330 if (m != NULL) {
1331 binaryfunc f = NULL;
1332 if (HASINPLACE(v))
1333 f = m->sq_inplace_concat;
1334 if (f == NULL)
1335 f = m->sq_concat;
1336 if (f != NULL)
1337 return (*f)(v, w);
1338 }
1339 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001340 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001341 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001342}
1343
1344PyObject *
1345PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1346{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001347 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1348 NB_SLOT(nb_multiply));
1349 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001350 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001351 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1352 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1353 Py_DECREF(result);
1354 if (mv != NULL) {
1355 if (HASINPLACE(v))
1356 f = mv->sq_inplace_repeat;
1357 if (f == NULL)
1358 f = mv->sq_repeat;
1359 if (f != NULL)
1360 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001361 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001362 else if (mw != NULL) {
1363 /* Note that the right hand operand should not be
1364 * mutated in this case so sq_inplace_repeat is not
1365 * used. */
1366 if (mw->sq_repeat)
1367 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001368 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001369 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001370 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001371 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001372}
1373
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001374PyObject *
1375PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1376{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001377 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1378 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001379}
1380
1381PyObject *
1382PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1383{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001384 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1385 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1386 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001387 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001388 else {
1389 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1390 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001391}
1392
1393
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001394/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001395
1396PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001397PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001398{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 PyNumberMethods *m;
1400
1401 if (o == NULL)
1402 return null_error();
1403 m = o->ob_type->tp_as_number;
1404 if (m && m->nb_negative)
1405 return (*m->nb_negative)(o);
1406
Georg Brandlccff7852006-06-18 22:17:29 +00001407 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001408}
1409
1410PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001411PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001412{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 PyNumberMethods *m;
1414
1415 if (o == NULL)
1416 return null_error();
1417 m = o->ob_type->tp_as_number;
1418 if (m && m->nb_positive)
1419 return (*m->nb_positive)(o);
1420
Georg Brandlccff7852006-06-18 22:17:29 +00001421 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001422}
1423
1424PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001425PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001426{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 PyNumberMethods *m;
1428
1429 if (o == NULL)
1430 return null_error();
1431 m = o->ob_type->tp_as_number;
1432 if (m && m->nb_invert)
1433 return (*m->nb_invert)(o);
1434
Georg Brandlccff7852006-06-18 22:17:29 +00001435 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001436}
1437
1438PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001439PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001440{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001441 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001442
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001443 if (o == NULL)
1444 return null_error();
1445 m = o->ob_type->tp_as_number;
1446 if (m && m->nb_absolute)
1447 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001448
Georg Brandlccff7852006-06-18 22:17:29 +00001449 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001450}
1451
Guido van Rossum9e896b32000-04-05 20:11:21 +00001452/* Add a check for embedded NULL-bytes in the argument. */
1453static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001454int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001455{
1456 char *end;
1457 PyObject *x;
1458
1459 x = PyInt_FromString((char*)s, &end, 10);
1460 if (x == NULL)
1461 return NULL;
1462 if (end != s + len) {
1463 PyErr_SetString(PyExc_ValueError,
1464 "null byte in argument for int()");
1465 Py_DECREF(x);
1466 return NULL;
1467 }
1468 return x;
1469}
1470
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001471/* Return a Python Int or Long from the object item
1472 Raise TypeError if the result is not an int-or-long
1473 or if the object cannot be interpreted as an index.
1474*/
1475PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001476PyNumber_Index(PyObject *item)
1477{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001478 PyObject *result = NULL;
1479 if (item == NULL)
1480 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001481 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001482 Py_INCREF(item);
1483 return item;
1484 }
1485 if (PyIndex_Check(item)) {
1486 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001487 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001488 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001489 PyErr_Format(PyExc_TypeError,
1490 "__index__ returned non-(int,long) " \
1491 "(type %.200s)",
1492 result->ob_type->tp_name);
1493 Py_DECREF(result);
1494 return NULL;
1495 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001496 }
1497 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001498 PyErr_Format(PyExc_TypeError,
1499 "'%.200s' object cannot be interpreted "
1500 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001501 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001502 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001503}
1504
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001505/* Return an error on Overflow only if err is not NULL*/
1506
1507Py_ssize_t
1508PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1509{
1510 Py_ssize_t result;
1511 PyObject *runerr;
1512 PyObject *value = PyNumber_Index(item);
1513 if (value == NULL)
1514 return -1;
1515
1516 /* We're done if PyInt_AsSsize_t() returns without error. */
1517 result = PyInt_AsSsize_t(value);
1518 if (result != -1 || !(runerr = PyErr_Occurred()))
1519 goto finish;
1520
1521 /* Error handling code -- only manage OverflowError differently */
1522 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1523 goto finish;
1524
1525 PyErr_Clear();
1526 /* If no error-handling desired then the default clipping
1527 is sufficient.
1528 */
1529 if (!err) {
1530 assert(PyLong_Check(value));
1531 /* Whether or not it is less than or equal to
1532 zero is determined by the sign of ob_size
1533 */
1534 if (_PyLong_Sign(value) < 0)
1535 result = PY_SSIZE_T_MIN;
1536 else
1537 result = PY_SSIZE_T_MAX;
1538 }
1539 else {
1540 /* Otherwise replace the error with caller's error object. */
1541 PyErr_Format(err,
1542 "cannot fit '%.200s' into an index-sized integer",
1543 item->ob_type->tp_name);
1544 }
1545
1546 finish:
1547 Py_DECREF(value);
1548 return result;
1549}
1550
1551
Guido van Rossume15dee51995-07-18 14:12:02 +00001552PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001553_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1554{
1555 const char *type_name;
1556 static PyObject *int_name = NULL;
1557 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001558 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001559 if (int_name == NULL)
1560 return NULL;
1561 }
1562
1563 if (integral && (!PyInt_Check(integral) &&
1564 !PyLong_Check(integral))) {
1565 /* Don't go through tp_as_number->nb_int to avoid
1566 hitting the classic class fallback to __trunc__. */
1567 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1568 if (int_func == NULL) {
1569 PyErr_Clear(); /* Raise a different error. */
1570 goto non_integral_error;
1571 }
1572 Py_DECREF(integral);
1573 integral = PyEval_CallObject(int_func, NULL);
1574 Py_DECREF(int_func);
1575 if (integral && (!PyInt_Check(integral) &&
1576 !PyLong_Check(integral))) {
1577 goto non_integral_error;
1578 }
1579 }
1580 return integral;
1581
1582non_integral_error:
1583 if (PyInstance_Check(integral)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001584 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001585 ->in_class->cl_name);
1586 }
1587 else {
1588 type_name = integral->ob_type->tp_name;
1589 }
1590 PyErr_Format(PyExc_TypeError, error_format, type_name);
1591 Py_DECREF(integral);
1592 return NULL;
1593}
1594
1595
1596PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001597PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001598{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001599 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001600 static PyObject *trunc_name = NULL;
1601 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001602 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001603 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001604
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001605 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001606 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001607 if (trunc_name == NULL)
1608 return NULL;
1609 }
1610
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611 if (o == NULL)
1612 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001613 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001614 Py_INCREF(o);
1615 return o;
1616 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001617 m = o->ob_type->tp_as_number;
1618 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001619 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001620 PyObject *res = m->nb_int(o);
1621 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1622 PyErr_Format(PyExc_TypeError,
1623 "__int__ returned non-int (type %.200s)",
1624 res->ob_type->tp_name);
1625 Py_DECREF(res);
1626 return NULL;
1627 }
1628 return res;
1629 }
1630 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001631 PyIntObject *io = (PyIntObject*)o;
1632 return PyInt_FromLong(io->ob_ival);
1633 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001634 trunc_func = PyObject_GetAttr(o, trunc_name);
1635 if (trunc_func) {
1636 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1637 Py_DECREF(trunc_func);
1638 /* __trunc__ is specified to return an Integral type, but
1639 int() needs to return an int. */
1640 return _PyNumber_ConvertIntegralToInt(
1641 truncated,
1642 "__trunc__ returned non-Integral (type %.200s)");
1643 }
1644 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1645
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001646 if (PyString_Check(o))
1647 return int_from_string(PyString_AS_STRING(o),
1648 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001649#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001650 if (PyUnicode_Check(o))
1651 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1652 PyUnicode_GET_SIZE(o),
1653 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001654#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001655 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001656 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001657
Georg Brandlccff7852006-06-18 22:17:29 +00001658 return type_error("int() argument must be a string or a "
1659 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001660}
1661
Guido van Rossum9e896b32000-04-05 20:11:21 +00001662/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001663static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001664long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001665{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001666 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001667 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001668
Guido van Rossum4c08d552000-03-10 22:55:18 +00001669 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001670 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001671 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001672 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001673 PyErr_SetString(PyExc_ValueError,
1674 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001675 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001676 return NULL;
1677 }
1678 return x;
1679}
1680
Guido van Rossume15dee51995-07-18 14:12:02 +00001681PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001682PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001683{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001684 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001685 static PyObject *trunc_name = NULL;
1686 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001687 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001688 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001689
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001690 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001691 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001692 if (trunc_name == NULL)
1693 return NULL;
1694 }
1695
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001696 if (o == NULL)
1697 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001698 m = o->ob_type->tp_as_number;
1699 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001700 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001701 PyObject *res = m->nb_long(o);
1702 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1703 PyErr_Format(PyExc_TypeError,
1704 "__long__ returned non-long (type %.200s)",
1705 res->ob_type->tp_name);
1706 Py_DECREF(res);
1707 return NULL;
1708 }
1709 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001710 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001711 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001712 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001713 trunc_func = PyObject_GetAttr(o, trunc_name);
1714 if (trunc_func) {
1715 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1716 PyObject *int_instance;
1717 Py_DECREF(trunc_func);
1718 /* __trunc__ is specified to return an Integral type,
1719 but long() needs to return a long. */
1720 int_instance = _PyNumber_ConvertIntegralToInt(
1721 truncated,
1722 "__trunc__ returned non-Integral (type %.200s)");
1723 if (int_instance && PyInt_Check(int_instance)) {
1724 /* Make sure that long() returns a long instance. */
1725 long value = PyInt_AS_LONG(int_instance);
1726 Py_DECREF(int_instance);
1727 return PyLong_FromLong(value);
1728 }
1729 return int_instance;
1730 }
1731 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1732
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001733 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001734 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001735 * doesn't do. In particular long('9.5') must raise an
1736 * exception, not truncate the float.
1737 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001738 return long_from_string(PyString_AS_STRING(o),
1739 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001740#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001741 if (PyUnicode_Check(o))
1742 /* The above check is done in PyLong_FromUnicode(). */
1743 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1744 PyUnicode_GET_SIZE(o),
1745 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001746#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001747 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1748 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001749
Georg Brandlccff7852006-06-18 22:17:29 +00001750 return type_error("long() argument must be a string or a "
1751 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001752}
1753
1754PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001755PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001756{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001757 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001758
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001759 if (o == NULL)
1760 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001761 m = o->ob_type->tp_as_number;
1762 if (m && m->nb_float) { /* This should include subclasses of float */
1763 PyObject *res = m->nb_float(o);
1764 if (res && !PyFloat_Check(res)) {
1765 PyErr_Format(PyExc_TypeError,
1766 "__float__ returned non-float (type %.200s)",
1767 res->ob_type->tp_name);
1768 Py_DECREF(res);
1769 return NULL;
1770 }
1771 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001772 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001773 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001774 PyFloatObject *po = (PyFloatObject *)o;
1775 return PyFloat_FromDouble(po->ob_fval);
1776 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001777 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001778}
1779
Eric Smith5e527eb2008-02-10 01:36:53 +00001780PyObject *
1781PyNumber_ToBase(PyObject *n, int base)
1782{
1783 PyObject *res = NULL;
1784 PyObject *index = PyNumber_Index(n);
1785
1786 if (!index)
1787 return NULL;
1788 if (PyLong_Check(index))
1789 res = _PyLong_Format(index, base, 0, 1);
1790 else if (PyInt_Check(index))
1791 res = _PyInt_Format((PyIntObject*)index, base, 1);
1792 else
Eric Smith3f914372008-02-15 12:14:32 +00001793 /* It should not be possible to get here, as
1794 PyNumber_Index already has a check for the same
1795 condition */
1796 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1797 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001798 Py_DECREF(index);
1799 return res;
1800}
1801
1802
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001803/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001804
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001805int
Fred Drake79912472000-07-09 04:06:11 +00001806PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001807{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001808 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001809 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001810 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001811 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001812 return s != NULL && s->ob_type->tp_as_sequence &&
1813 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001814}
1815
Martin v. Löwis18e16552006-02-15 17:27:45 +00001816Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001817PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001818{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001819 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001820
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001821 if (s == NULL) {
1822 null_error();
1823 return -1;
1824 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001825
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001826 m = s->ob_type->tp_as_sequence;
1827 if (m && m->sq_length)
1828 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001829
Georg Brandlb0061c82006-08-08 11:56:21 +00001830 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001832}
1833
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001834#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001835Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001836PySequence_Length(PyObject *s)
1837{
1838 return PySequence_Size(s);
1839}
1840#define PySequence_Length PySequence_Size
1841
Guido van Rossume15dee51995-07-18 14:12:02 +00001842PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001843PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001844{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001845 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001846
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001847 if (s == NULL || o == NULL)
1848 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001849
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001850 m = s->ob_type->tp_as_sequence;
1851 if (m && m->sq_concat)
1852 return m->sq_concat(s, o);
1853
Armin Rigofd163f92005-12-29 15:59:19 +00001854 /* Instances of user classes defining an __add__() method only
1855 have an nb_add slot, not an sq_concat slot. So we fall back
1856 to nb_add if both arguments appear to be sequences. */
1857 if (PySequence_Check(s) && PySequence_Check(o)) {
1858 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1859 if (result != Py_NotImplemented)
1860 return result;
1861 Py_DECREF(result);
1862 }
Georg Brandlccff7852006-06-18 22:17:29 +00001863 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001864}
1865
1866PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001867PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001868{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001869 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001870
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001871 if (o == NULL)
1872 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001873
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001874 m = o->ob_type->tp_as_sequence;
1875 if (m && m->sq_repeat)
1876 return m->sq_repeat(o, count);
1877
Armin Rigofd163f92005-12-29 15:59:19 +00001878 /* Instances of user classes defining a __mul__() method only
1879 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1880 to nb_multiply if o appears to be a sequence. */
1881 if (PySequence_Check(o)) {
1882 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001883 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001884 if (n == NULL)
1885 return NULL;
1886 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1887 Py_DECREF(n);
1888 if (result != Py_NotImplemented)
1889 return result;
1890 Py_DECREF(result);
1891 }
Georg Brandlccff7852006-06-18 22:17:29 +00001892 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001893}
1894
1895PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001896PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1897{
1898 PySequenceMethods *m;
1899
1900 if (s == NULL || o == NULL)
1901 return null_error();
1902
1903 m = s->ob_type->tp_as_sequence;
1904 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1905 return m->sq_inplace_concat(s, o);
1906 if (m && m->sq_concat)
1907 return m->sq_concat(s, o);
1908
Armin Rigofd163f92005-12-29 15:59:19 +00001909 if (PySequence_Check(s) && PySequence_Check(o)) {
1910 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1911 NB_SLOT(nb_add));
1912 if (result != Py_NotImplemented)
1913 return result;
1914 Py_DECREF(result);
1915 }
Georg Brandlccff7852006-06-18 22:17:29 +00001916 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001917}
1918
1919PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001920PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001921{
1922 PySequenceMethods *m;
1923
1924 if (o == NULL)
1925 return null_error();
1926
1927 m = o->ob_type->tp_as_sequence;
1928 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1929 return m->sq_inplace_repeat(o, count);
1930 if (m && m->sq_repeat)
1931 return m->sq_repeat(o, count);
1932
Armin Rigofd163f92005-12-29 15:59:19 +00001933 if (PySequence_Check(o)) {
1934 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001935 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001936 if (n == NULL)
1937 return NULL;
1938 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1939 NB_SLOT(nb_multiply));
1940 Py_DECREF(n);
1941 if (result != Py_NotImplemented)
1942 return result;
1943 Py_DECREF(result);
1944 }
Georg Brandlccff7852006-06-18 22:17:29 +00001945 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001946}
1947
1948PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001949PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001950{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001951 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001952
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001953 if (s == NULL)
1954 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001955
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001956 m = s->ob_type->tp_as_sequence;
1957 if (m && m->sq_item) {
1958 if (i < 0) {
1959 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001960 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001961 if (l < 0)
1962 return NULL;
1963 i += l;
1964 }
1965 }
1966 return m->sq_item(s, i);
1967 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001968
Skip Montanaro2c7ca9b2008-07-07 11:16:14 +00001969 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001970}
1971
1972PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001973PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001974{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001975 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001976 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001977
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001978 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001979
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001980 m = s->ob_type->tp_as_sequence;
1981 if (m && m->sq_slice) {
1982 if (i1 < 0 || i2 < 0) {
1983 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001984 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001985 if (l < 0)
1986 return NULL;
1987 if (i1 < 0)
1988 i1 += l;
1989 if (i2 < 0)
1990 i2 += l;
1991 }
1992 }
1993 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001994 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1995 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001996 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001997 if (!slice)
1998 return NULL;
1999 res = mp->mp_subscript(s, slice);
2000 Py_DECREF(slice);
2001 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002002 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002003
Georg Brandlccff7852006-06-18 22:17:29 +00002004 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00002005}
2006
2007int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002008PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002009{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002010 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002012 if (s == NULL) {
2013 null_error();
2014 return -1;
2015 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002016
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002017 m = s->ob_type->tp_as_sequence;
2018 if (m && m->sq_ass_item) {
2019 if (i < 0) {
2020 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002021 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002022 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002023 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002024 i += l;
2025 }
2026 }
2027 return m->sq_ass_item(s, i, o);
2028 }
2029
Georg Brandlccff7852006-06-18 22:17:29 +00002030 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002031 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002032}
2033
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002034int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002035PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002036{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002037 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002038
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002039 if (s == NULL) {
2040 null_error();
2041 return -1;
2042 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002043
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002044 m = s->ob_type->tp_as_sequence;
2045 if (m && m->sq_ass_item) {
2046 if (i < 0) {
2047 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002048 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002049 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002050 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002051 i += l;
2052 }
2053 }
2054 return m->sq_ass_item(s, i, (PyObject *)NULL);
2055 }
2056
Georg Brandlccff7852006-06-18 22:17:29 +00002057 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002058 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002059}
2060
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002061int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002062PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002063{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002064 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002065 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002066
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002067 if (s == NULL) {
2068 null_error();
2069 return -1;
2070 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002071
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002072 m = s->ob_type->tp_as_sequence;
2073 if (m && m->sq_ass_slice) {
2074 if (i1 < 0 || i2 < 0) {
2075 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002076 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002077 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002078 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002079 if (i1 < 0)
2080 i1 += l;
2081 if (i2 < 0)
2082 i2 += l;
2083 }
2084 }
2085 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002086 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2087 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002088 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002089 if (!slice)
2090 return -1;
2091 res = mp->mp_ass_subscript(s, slice, o);
2092 Py_DECREF(slice);
2093 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002094 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002095
Georg Brandlccff7852006-06-18 22:17:29 +00002096 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002097 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002098}
2099
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002100int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002101PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002102{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002103 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002104
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002105 if (s == NULL) {
2106 null_error();
2107 return -1;
2108 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002109
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002110 m = s->ob_type->tp_as_sequence;
2111 if (m && m->sq_ass_slice) {
2112 if (i1 < 0 || i2 < 0) {
2113 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002114 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002115 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002116 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002117 if (i1 < 0)
2118 i1 += l;
2119 if (i2 < 0)
2120 i2 += l;
2121 }
2122 }
2123 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2124 }
Georg Brandlccff7852006-06-18 22:17:29 +00002125 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002126 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002127}
2128
Guido van Rossume15dee51995-07-18 14:12:02 +00002129PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002130PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002131{
Tim Peters6912d4d2001-05-05 03:56:37 +00002132 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002133 Py_ssize_t n; /* guess for result tuple size */
Raymond Hettingerb5163702009-02-02 21:50:13 +00002134 PyObject *result = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002135 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002136
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002137 if (v == NULL)
2138 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002139
Tim Peters6912d4d2001-05-05 03:56:37 +00002140 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002141 if (PyTuple_CheckExact(v)) {
2142 /* Note that we can't know whether it's safe to return
2143 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002144 to exact tuples here. In contrast, lists always make
2145 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002146 Py_INCREF(v);
2147 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002148 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002149 if (PyList_Check(v))
2150 return PyList_AsTuple(v);
2151
Tim Peters6912d4d2001-05-05 03:56:37 +00002152 /* Get iterator. */
2153 it = PyObject_GetIter(v);
2154 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002155 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002156
Tim Peters6912d4d2001-05-05 03:56:37 +00002157 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002158 n = _PyObject_LengthHint(v, 10);
Raymond Hettingerb5163702009-02-02 21:50:13 +00002159 if (n == -1)
2160 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002161 result = PyTuple_New(n);
2162 if (result == NULL)
2163 goto Fail;
2164
2165 /* Fill the tuple. */
2166 for (j = 0; ; ++j) {
2167 PyObject *item = PyIter_Next(it);
2168 if (item == NULL) {
2169 if (PyErr_Occurred())
2170 goto Fail;
2171 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002172 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002173 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002174 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002175 /* The over-allocation strategy can grow a bit faster
2176 than for lists because unlike lists the
2177 over-allocation isn't permanent -- we reclaim
2178 the excess before the end of this routine.
2179 So, grow by ten and then add 25%.
2180 */
2181 n += 10;
2182 n += n >> 2;
2183 if (n < oldn) {
2184 /* Check for overflow */
2185 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002186 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002187 goto Fail;
2188 }
Tim Peters4324aa32001-05-28 22:30:08 +00002189 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002190 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002191 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002192 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002193 }
2194 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002195 }
2196
Tim Peters6912d4d2001-05-05 03:56:37 +00002197 /* Cut tuple back if guess was too large. */
2198 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002199 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002200 goto Fail;
2201
2202 Py_DECREF(it);
2203 return result;
2204
2205Fail:
2206 Py_XDECREF(result);
2207 Py_DECREF(it);
2208 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002209}
2210
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002211PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002212PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002213{
Tim Petersf553f892001-05-01 20:45:31 +00002214 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002215 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002216
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002217 if (v == NULL)
2218 return null_error();
2219
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002220 result = PyList_New(0);
2221 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002222 return NULL;
2223
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002224 rv = _PyList_Extend((PyListObject *)result, v);
2225 if (rv == NULL) {
2226 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002227 return NULL;
2228 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002229 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002230 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002231}
2232
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002233PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002234PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002235{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002236 PyObject *it;
2237
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002238 if (v == NULL)
2239 return null_error();
2240
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002241 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002242 Py_INCREF(v);
2243 return v;
2244 }
2245
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002246 it = PyObject_GetIter(v);
2247 if (it == NULL) {
2248 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002249 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002250 return NULL;
2251 }
2252
Raymond Hettinger193814c2004-12-18 19:00:59 +00002253 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002254 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002255
2256 return v;
2257}
2258
Tim Peters16a77ad2001-09-08 04:00:12 +00002259/* Iterate over seq. Result depends on the operation:
2260 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002261 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
Tim Peters16a77ad2001-09-08 04:00:12 +00002262 set ValueError and return -1 if none found; also return -1 on error.
2263 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2264*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002265Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002266_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002267{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002268 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002269 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2270 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002271
Tim Peters16a77ad2001-09-08 04:00:12 +00002272 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002273 null_error();
2274 return -1;
2275 }
Tim Peters75f8e352001-05-05 11:33:43 +00002276
Tim Peters16a77ad2001-09-08 04:00:12 +00002277 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002278 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002279 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002280 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002281 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002282
Tim Peters16a77ad2001-09-08 04:00:12 +00002283 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002284 for (;;) {
2285 int cmp;
2286 PyObject *item = PyIter_Next(it);
2287 if (item == NULL) {
2288 if (PyErr_Occurred())
2289 goto Fail;
2290 break;
2291 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002292
2293 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002294 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002295 if (cmp < 0)
2296 goto Fail;
2297 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002298 switch (operation) {
2299 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002300 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002301 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002302 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002303 goto Fail;
2304 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002305 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002306 break;
2307
2308 case PY_ITERSEARCH_INDEX:
2309 if (wrapped) {
2310 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002311 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002312 goto Fail;
2313 }
2314 goto Done;
2315
2316 case PY_ITERSEARCH_CONTAINS:
2317 n = 1;
2318 goto Done;
2319
2320 default:
2321 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002322 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002323 }
2324
2325 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002326 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002327 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002328 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002329 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002330 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002331
2332 if (operation != PY_ITERSEARCH_INDEX)
2333 goto Done;
2334
2335 PyErr_SetString(PyExc_ValueError,
2336 "sequence.index(x): x not in sequence");
2337 /* fall into failure code */
2338Fail:
2339 n = -1;
2340 /* fall through */
2341Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002342 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002343 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002344
Guido van Rossume15dee51995-07-18 14:12:02 +00002345}
2346
Tim Peters16a77ad2001-09-08 04:00:12 +00002347/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002348Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002349PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002350{
Tim Peters16a77ad2001-09-08 04:00:12 +00002351 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002352}
2353
Tim Peterscb8d3682001-05-05 21:05:01 +00002354/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002355 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002356 */
2357int
2358PySequence_Contains(PyObject *seq, PyObject *ob)
2359{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002360 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002361 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2362 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2363 if (sqm != NULL && sqm->sq_contains != NULL)
2364 return (*sqm->sq_contains)(seq, ob);
2365 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002366 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2367 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002368}
2369
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002370/* Backwards compatibility */
2371#undef PySequence_In
2372int
Fred Drake79912472000-07-09 04:06:11 +00002373PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002374{
2375 return PySequence_Contains(w, v);
2376}
2377
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002378Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002379PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002380{
Tim Peters16a77ad2001-09-08 04:00:12 +00002381 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002382}
2383
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002384/* Operations on mappings */
2385
2386int
Fred Drake79912472000-07-09 04:06:11 +00002387PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002388{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002389 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002390 return PyObject_HasAttrString(o, "__getitem__");
2391
2392 return o && o->ob_type->tp_as_mapping &&
2393 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002394 !(o->ob_type->tp_as_sequence &&
2395 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002396}
2397
Martin v. Löwis18e16552006-02-15 17:27:45 +00002398Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002399PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002400{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002401 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002402
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002403 if (o == NULL) {
2404 null_error();
2405 return -1;
2406 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002407
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002408 m = o->ob_type->tp_as_mapping;
2409 if (m && m->mp_length)
2410 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002411
Georg Brandlb0061c82006-08-08 11:56:21 +00002412 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002413 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002414}
2415
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002416#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002417Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002418PyMapping_Length(PyObject *o)
2419{
2420 return PyMapping_Size(o);
2421}
2422#define PyMapping_Length PyMapping_Size
2423
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002424PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002425PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002426{
2427 PyObject *okey, *r;
2428
2429 if (key == NULL)
2430 return null_error();
2431
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002432 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002433 if (okey == NULL)
2434 return NULL;
2435 r = PyObject_GetItem(o, okey);
2436 Py_DECREF(okey);
2437 return r;
2438}
2439
2440int
Fred Drake79912472000-07-09 04:06:11 +00002441PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002442{
2443 PyObject *okey;
2444 int r;
2445
2446 if (key == NULL) {
2447 null_error();
2448 return -1;
2449 }
2450
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002451 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002452 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002453 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002454 r = PyObject_SetItem(o, okey, value);
2455 Py_DECREF(okey);
2456 return r;
2457}
2458
2459int
Fred Drake79912472000-07-09 04:06:11 +00002460PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002461{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002462 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002463
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002464 v = PyMapping_GetItemString(o, key);
2465 if (v) {
2466 Py_DECREF(v);
2467 return 1;
2468 }
2469 PyErr_Clear();
2470 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002471}
2472
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002473int
Fred Drake79912472000-07-09 04:06:11 +00002474PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002475{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002476 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002477
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002478 v = PyObject_GetItem(o, key);
2479 if (v) {
2480 Py_DECREF(v);
2481 return 1;
2482 }
2483 PyErr_Clear();
2484 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002485}
2486
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002487/* Operations on callable objects */
2488
2489/* XXX PyCallable_Check() is in object.c */
2490
Guido van Rossume15dee51995-07-18 14:12:02 +00002491PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002492PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002493{
Guido van Rossum5560b742001-09-14 16:47:50 +00002494 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002495}
Guido van Rossume15dee51995-07-18 14:12:02 +00002496
2497PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002498PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2499{
2500 ternaryfunc call;
2501
2502 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002503 PyObject *result;
2504 if (Py_EnterRecursiveCall(" while calling a Python object"))
2505 return NULL;
2506 result = (*call)(func, arg, kw);
2507 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002508 if (result == NULL && !PyErr_Occurred())
2509 PyErr_SetString(
2510 PyExc_SystemError,
2511 "NULL result without error in PyObject_Call");
2512 return result;
2513 }
Georg Brandlccff7852006-06-18 22:17:29 +00002514 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002515 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002516 return NULL;
2517}
2518
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002519static PyObject*
2520call_function_tail(PyObject *callable, PyObject *args)
2521{
2522 PyObject *retval;
2523
2524 if (args == NULL)
2525 return NULL;
2526
2527 if (!PyTuple_Check(args)) {
2528 PyObject *a;
2529
2530 a = PyTuple_New(1);
2531 if (a == NULL) {
2532 Py_DECREF(args);
2533 return NULL;
2534 }
2535 PyTuple_SET_ITEM(a, 0, args);
2536 args = a;
2537 }
2538 retval = PyObject_Call(callable, args, NULL);
2539
2540 Py_DECREF(args);
2541
2542 return retval;
2543}
2544
Tim Peters6d6c1a32001-08-02 04:15:00 +00002545PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002546PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002547{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002548 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002549 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002550
Fred Drakeb92cf062001-10-27 06:16:31 +00002551 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002552 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002553
Fred Drakeb92cf062001-10-27 06:16:31 +00002554 if (format && *format) {
2555 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002556 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002557 va_end(va);
2558 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002559 else
2560 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002561
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002562 return call_function_tail(callable, args);
2563}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002564
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002565PyObject *
2566_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2567{
2568 va_list va;
2569 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002570
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002571 if (callable == NULL)
2572 return null_error();
2573
2574 if (format && *format) {
2575 va_start(va, format);
2576 args = _Py_VaBuildValue_SizeT(format, va);
2577 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002578 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002579 else
2580 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002581
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002582 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002583}
2584
2585PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002586PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002587{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002588 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002589 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002590 PyObject *func = NULL;
2591 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002592
Fred Drakeb92cf062001-10-27 06:16:31 +00002593 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002594 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002595
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002596 func = PyObject_GetAttrString(o, name);
2597 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002598 PyErr_SetString(PyExc_AttributeError, name);
2599 return 0;
2600 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002601
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002602 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002603 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002604 goto exit;
2605 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002606
Fred Drakeb92cf062001-10-27 06:16:31 +00002607 if (format && *format) {
2608 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002609 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002610 va_end(va);
2611 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002612 else
2613 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002614
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002615 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002616
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002617 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002618 /* args gets consumed in call_function_tail */
2619 Py_XDECREF(func);
2620
2621 return retval;
2622}
2623
2624PyObject *
2625_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2626{
2627 va_list va;
2628 PyObject *args;
2629 PyObject *func = NULL;
2630 PyObject *retval = NULL;
2631
2632 if (o == NULL || name == NULL)
2633 return null_error();
2634
2635 func = PyObject_GetAttrString(o, name);
2636 if (func == NULL) {
2637 PyErr_SetString(PyExc_AttributeError, name);
2638 return 0;
2639 }
2640
2641 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002642 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002643 goto exit;
2644 }
2645
2646 if (format && *format) {
2647 va_start(va, format);
2648 args = _Py_VaBuildValue_SizeT(format, va);
2649 va_end(va);
2650 }
2651 else
2652 args = PyTuple_New(0);
2653
2654 retval = call_function_tail(func, args);
2655
2656 exit:
2657 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002658 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002659
2660 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002661}
Guido van Rossum823649d2001-03-21 18:40:58 +00002662
2663
Fred Drakeb421b8c2001-10-26 16:21:32 +00002664static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002665objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002666{
2667 int i, n = 0;
2668 va_list countva;
2669 PyObject *result, *tmp;
2670
2671#ifdef VA_LIST_IS_ARRAY
2672 memcpy(countva, va, sizeof(va_list));
2673#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002674#ifdef __va_copy
2675 __va_copy(countva, va);
2676#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002677 countva = va;
2678#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002679#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002680
2681 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2682 ++n;
2683 result = PyTuple_New(n);
2684 if (result != NULL && n > 0) {
2685 for (i = 0; i < n; ++i) {
2686 tmp = (PyObject *)va_arg(va, PyObject *);
2687 PyTuple_SET_ITEM(result, i, tmp);
2688 Py_INCREF(tmp);
2689 }
2690 }
2691 return result;
2692}
2693
2694PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002695PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002696{
2697 PyObject *args, *tmp;
2698 va_list vargs;
2699
2700 if (callable == NULL || name == NULL)
2701 return null_error();
2702
2703 callable = PyObject_GetAttr(callable, name);
2704 if (callable == NULL)
2705 return NULL;
2706
2707 /* count the args */
2708 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002709 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002710 va_end(vargs);
2711 if (args == NULL) {
2712 Py_DECREF(callable);
2713 return NULL;
2714 }
2715 tmp = PyObject_Call(callable, args, NULL);
2716 Py_DECREF(args);
2717 Py_DECREF(callable);
2718
2719 return tmp;
2720}
2721
2722PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002723PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002724{
2725 PyObject *args, *tmp;
2726 va_list vargs;
2727
2728 if (callable == NULL)
2729 return null_error();
2730
2731 /* count the args */
2732 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002733 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002734 va_end(vargs);
2735 if (args == NULL)
2736 return NULL;
2737 tmp = PyObject_Call(callable, args, NULL);
2738 Py_DECREF(args);
2739
2740 return tmp;
2741}
2742
2743
Guido van Rossum823649d2001-03-21 18:40:58 +00002744/* isinstance(), issubclass() */
2745
Barry Warsawf16951c2002-04-23 22:45:44 +00002746/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2747 * state that will almost never happen.
2748 *
2749 * 0. creating the __bases__ static string could get a MemoryError
2750 * 1. getattr(cls, '__bases__') could raise an AttributeError
2751 * 2. getattr(cls, '__bases__') could raise some other exception
2752 * 3. getattr(cls, '__bases__') could return a tuple
2753 * 4. getattr(cls, '__bases__') could return something other than a tuple
2754 *
2755 * Only state #3 is a non-error state and only it returns a non-NULL object
2756 * (it returns the retrieved tuple).
2757 *
2758 * Any raised AttributeErrors are masked by clearing the exception and
2759 * returning NULL. If an object other than a tuple comes out of __bases__,
2760 * then again, the return value is NULL. So yes, these two situations
2761 * produce exactly the same results: NULL is returned and no error is set.
2762 *
2763 * If some exception other than AttributeError is raised, then NULL is also
2764 * returned, but the exception is not cleared. That's because we want the
2765 * exception to be propagated along.
2766 *
2767 * Callers are expected to test for PyErr_Occurred() when the return value
2768 * is NULL to decide whether a valid exception should be propagated or not.
2769 * When there's no exception to propagate, it's customary for the caller to
2770 * set a TypeError.
2771 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002772static PyObject *
2773abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002774{
2775 static PyObject *__bases__ = NULL;
2776 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002777
2778 if (__bases__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002779 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002780 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002781 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002782 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002783 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002784 if (bases == NULL) {
2785 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2786 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002787 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002788 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002789 if (!PyTuple_Check(bases)) {
2790 Py_DECREF(bases);
2791 return NULL;
2792 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002793 return bases;
2794}
2795
2796
2797static int
2798abstract_issubclass(PyObject *derived, PyObject *cls)
2799{
Antoine Pitrou0668c622008-08-26 22:42:08 +00002800 PyObject *bases = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002801 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002802 int r = 0;
2803
Antoine Pitrou0668c622008-08-26 22:42:08 +00002804 while (1) {
2805 if (derived == cls)
2806 return 1;
2807 bases = abstract_get_bases(derived);
2808 if (bases == NULL) {
2809 if (PyErr_Occurred())
2810 return -1;
2811 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002812 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002813 n = PyTuple_GET_SIZE(bases);
2814 if (n == 0) {
2815 Py_DECREF(bases);
2816 return 0;
2817 }
2818 /* Avoid recursivity in the single inheritance case */
2819 if (n == 1) {
2820 derived = PyTuple_GET_ITEM(bases, 0);
2821 Py_DECREF(bases);
2822 continue;
2823 }
2824 for (i = 0; i < n; i++) {
2825 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2826 if (r != 0)
2827 break;
2828 }
2829 Py_DECREF(bases);
2830 return r;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002831 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002832}
2833
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002834static int
2835check_class(PyObject *cls, const char *error)
2836{
2837 PyObject *bases = abstract_get_bases(cls);
2838 if (bases == NULL) {
2839 /* Do not mask errors. */
2840 if (!PyErr_Occurred())
2841 PyErr_SetString(PyExc_TypeError, error);
2842 return 0;
2843 }
2844 Py_DECREF(bases);
2845 return -1;
2846}
2847
Brett Cannon4f653312004-03-20 22:52:14 +00002848static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002849recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002850{
2851 PyObject *icls;
2852 static PyObject *__class__ = NULL;
2853 int retval = 0;
2854
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002855 if (__class__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002856 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002857 if (__class__ == NULL)
2858 return -1;
2859 }
2860
Neil Schemenauer6b471292001-10-18 03:18:43 +00002861 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2862 PyObject *inclass =
2863 (PyObject*)((PyInstanceObject*)inst)->in_class;
2864 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002865 }
2866 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002867 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002868 if (retval == 0) {
2869 PyObject *c = PyObject_GetAttr(inst, __class__);
2870 if (c == NULL) {
2871 PyErr_Clear();
2872 }
2873 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002874 if (c != (PyObject *)(inst->ob_type) &&
2875 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002876 retval = PyType_IsSubtype(
2877 (PyTypeObject *)c,
2878 (PyTypeObject *)cls);
2879 Py_DECREF(c);
2880 }
2881 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002882 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002883 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002884 if (!check_class(cls,
2885 "isinstance() arg 2 must be a class, type,"
2886 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002887 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002888 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002889 if (icls == NULL) {
2890 PyErr_Clear();
2891 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002892 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002893 else {
2894 retval = abstract_issubclass(icls, cls);
2895 Py_DECREF(icls);
2896 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002897 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002898
Guido van Rossum823649d2001-03-21 18:40:58 +00002899 return retval;
2900}
2901
2902int
Brett Cannon4f653312004-03-20 22:52:14 +00002903PyObject_IsInstance(PyObject *inst, PyObject *cls)
2904{
Christian Heimese247f002008-02-14 22:40:11 +00002905 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002906 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002907
2908 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002909 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002910 return 1;
2911
Antoine Pitrou0668c622008-08-26 22:42:08 +00002912 if (PyTuple_Check(cls)) {
2913 Py_ssize_t i;
2914 Py_ssize_t n;
2915 int r = 0;
2916
2917 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2918 return -1;
2919 n = PyTuple_GET_SIZE(cls);
2920 for (i = 0; i < n; ++i) {
2921 PyObject *item = PyTuple_GET_ITEM(cls, i);
2922 r = PyObject_IsInstance(inst, item);
2923 if (r != 0)
2924 /* either found it, or got an error */
2925 break;
2926 }
2927 Py_LeaveRecursiveCall();
2928 return r;
2929 }
Christian Heimese247f002008-02-14 22:40:11 +00002930 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002931 name = PyString_InternFromString("__instancecheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002932 if (name == NULL)
2933 return -1;
2934 }
2935 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002936 if (checker == NULL && PyErr_Occurred())
2937 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002938 if (checker != NULL) {
2939 PyObject *res;
2940 int ok = -1;
2941 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2942 Py_DECREF(checker);
2943 return ok;
2944 }
2945 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2946 Py_LeaveRecursiveCall();
2947 Py_DECREF(checker);
2948 if (res != NULL) {
2949 ok = PyObject_IsTrue(res);
2950 Py_DECREF(res);
2951 }
2952 return ok;
2953 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002954 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002955}
2956
2957static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002958recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002959{
2960 int retval;
2961
Antoine Pitrou0668c622008-08-26 22:42:08 +00002962 if (PyType_Check(cls) && PyType_Check(derived)) {
2963 /* Fast path (non-recursive) */
2964 return PyType_IsSubtype(
2965 (PyTypeObject *)derived, (PyTypeObject *)cls);
2966 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002967 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002968 if (!check_class(derived,
2969 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002970 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002971
Antoine Pitrou0668c622008-08-26 22:42:08 +00002972 if (!check_class(cls,
2973 "issubclass() arg 2 must be a class"
2974 " or tuple of classes"))
2975 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002976 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002977 }
2978 else {
2979 /* shortcut */
2980 if (!(retval = (derived == cls)))
2981 retval = PyClass_IsSubclass(derived, cls);
2982 }
2983
2984 return retval;
2985}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002986
Brett Cannon4f653312004-03-20 22:52:14 +00002987int
2988PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2989{
Christian Heimese247f002008-02-14 22:40:11 +00002990 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002991 PyObject *t, *v, *tb;
2992 PyObject *checker;
Christian Heimese247f002008-02-14 22:40:11 +00002993
Antoine Pitrou0668c622008-08-26 22:42:08 +00002994 if (PyTuple_Check(cls)) {
2995 Py_ssize_t i;
2996 Py_ssize_t n;
2997 int r = 0;
2998
2999 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
3000 return -1;
3001 n = PyTuple_GET_SIZE(cls);
3002 for (i = 0; i < n; ++i) {
3003 PyObject *item = PyTuple_GET_ITEM(cls, i);
3004 r = PyObject_IsSubclass(derived, item);
3005 if (r != 0)
3006 /* either found it, or got an error */
3007 break;
3008 }
3009 Py_LeaveRecursiveCall();
3010 return r;
3011 }
Christian Heimese247f002008-02-14 22:40:11 +00003012 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003013 name = PyString_InternFromString("__subclasscheck__");
Christian Heimese247f002008-02-14 22:40:11 +00003014 if (name == NULL)
3015 return -1;
3016 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003017 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00003018 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003019 PyErr_Restore(t, v, tb);
3020 if (checker != NULL) {
3021 PyObject *res;
3022 int ok = -1;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003023 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
3024 Py_DECREF(checker);
Guido van Rossumb5591132007-09-10 22:36:02 +00003025 return ok;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003026 }
Guido van Rossumb5591132007-09-10 22:36:02 +00003027 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3028 Py_LeaveRecursiveCall();
3029 Py_DECREF(checker);
3030 if (res != NULL) {
3031 ok = PyObject_IsTrue(res);
3032 Py_DECREF(res);
3033 }
3034 return ok;
3035 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003036 return recursive_issubclass(derived, cls);
3037}
3038
3039int
3040_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
3041{
3042 return recursive_isinstance(inst, cls);
3043}
3044
3045int
3046_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
3047{
3048 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00003049}
3050
3051
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003052PyObject *
3053PyObject_GetIter(PyObject *o)
3054{
3055 PyTypeObject *t = o->ob_type;
3056 getiterfunc f = NULL;
3057 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3058 f = t->tp_iter;
3059 if (f == NULL) {
3060 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003061 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003062 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003063 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003064 else {
3065 PyObject *res = (*f)(o);
3066 if (res != NULL && !PyIter_Check(res)) {
3067 PyErr_Format(PyExc_TypeError,
3068 "iter() returned non-iterator "
3069 "of type '%.100s'",
3070 res->ob_type->tp_name);
3071 Py_DECREF(res);
3072 res = NULL;
3073 }
3074 return res;
3075 }
3076}
3077
Tim Petersf4848da2001-05-05 00:14:56 +00003078/* Return next item.
3079 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3080 * If the iteration terminates normally, return NULL and clear the
3081 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3082 * will be false.
3083 * Else return the next object. PyErr_Occurred() will be false.
3084 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003085PyObject *
3086PyIter_Next(PyObject *iter)
3087{
Tim Petersf4848da2001-05-05 00:14:56 +00003088 PyObject *result;
Tim Petersf4848da2001-05-05 00:14:56 +00003089 result = (*iter->ob_type->tp_iternext)(iter);
3090 if (result == NULL &&
3091 PyErr_Occurred() &&
3092 PyErr_ExceptionMatches(PyExc_StopIteration))
3093 PyErr_Clear();
3094 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003095}