blob: e90710c4f51ad35d20f258b7715a930d061326cb [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Guido van Rossume15dee51995-07-18 14:12:02 +00003#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00004#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00005#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00006#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00007
8#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +00009 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000010
Martin v. Löwis5cb69362006-04-14 09:08:42 +000011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000013
14static PyObject *
Georg Brandlccff7852006-06-18 22:17:29 +000015type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000016{
Georg Brandlccff7852006-06-18 22:17:29 +000017 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000018 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000019}
20
Guido van Rossum052b7e11996-11-11 15:08:19 +000021static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000022null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000023{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000024 if (!PyErr_Occurred())
25 PyErr_SetString(PyExc_SystemError,
26 "null argument to internal routine");
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000030/* Operations on any object */
31
32int
Fred Drake79912472000-07-09 04:06:11 +000033PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034{
35 int r;
36
37 if (o1 == NULL || o2 == NULL) {
38 null_error();
39 return -1;
40 }
41 r = PyObject_Compare(o1, o2);
42 if (PyErr_Occurred())
43 return -1;
44 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000045 return 0;
46}
Guido van Rossume15dee51995-07-18 14:12:02 +000047
48PyObject *
Fred Drake79912472000-07-09 04:06:11 +000049PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000050{
51 PyObject *v;
52
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000053 if (o == NULL)
54 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000055 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
58}
59
Martin v. Löwis18e16552006-02-15 17:27:45 +000060Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000061PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 m = o->ob_type->tp_as_sequence;
71 if (m && m->sq_length)
72 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Jeremy Hylton6253f832000-07-12 12:56:19 +000074 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075}
76
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000077#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000078Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000079PyObject_Length(PyObject *o)
80{
81 return PyObject_Size(o);
82}
83#define PyObject_Length PyObject_Size
84
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000085
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000086/* The length hint function returns a non-negative value from o.__len__()
87 or o.__length_hint__(). If those methods aren't found or return a negative
Raymond Hettingerb5163702009-02-02 21:50:13 +000088 value, then the defaultvalue is returned. If one of the calls fails,
89 this function returns -1.
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000090*/
91
92Py_ssize_t
93_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
94{
95 static PyObject *hintstrobj = NULL;
Benjamin Petersonaf1692a2009-05-09 16:36:39 +000096 PyObject *ro, *hintmeth;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000097 Py_ssize_t rv;
98
99 /* try o.__len__() */
100 rv = PyObject_Size(o);
101 if (rv >= 0)
102 return rv;
Raymond Hettingerb5163702009-02-02 21:50:13 +0000103 if (PyErr_Occurred()) {
104 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
105 !PyErr_ExceptionMatches(PyExc_AttributeError))
106 return -1;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000107 PyErr_Clear();
Raymond Hettingerb5163702009-02-02 21:50:13 +0000108 }
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000109
Benjamin Peterson3f3d36b2009-05-09 16:51:51 +0000110 if (PyInstance_Check(o))
111 return defaultvalue;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000112 /* try o.__length_hint__() */
Benjamin Petersonaf1692a2009-05-09 16:36:39 +0000113 hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
114 if (hintmeth == NULL)
115 return defaultvalue;
116 ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
117 Py_DECREF(hintmeth);
Raymond Hettingerb5163702009-02-02 21:50:13 +0000118 if (ro == NULL) {
Benjamin Petersona7dc9492009-05-09 19:03:05 +0000119 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
120 !PyErr_ExceptionMatches(PyExc_AttributeError))
Benjamin Petersonaf1692a2009-05-09 16:36:39 +0000121 return -1;
Raymond Hettingerb5163702009-02-02 21:50:13 +0000122 return defaultvalue;
123 }
Mark Dickinsonb91d2f52009-02-08 13:58:10 +0000124 rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000125 Py_DECREF(ro);
Raymond Hettingerb5163702009-02-02 21:50:13 +0000126 return rv;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000127}
128
Guido van Rossume15dee51995-07-18 14:12:02 +0000129PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000130PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000131{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000132 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000133
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000134 if (o == NULL || key == NULL)
135 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000136
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000137 m = o->ob_type->tp_as_mapping;
138 if (m && m->mp_subscript)
139 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000140
Guido van Rossum21308241998-08-13 16:44:44 +0000141 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000142 if (PyIndex_Check(key)) {
143 Py_ssize_t key_value;
144 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000145 if (key_value == -1 && PyErr_Occurred())
146 return NULL;
147 return PySequence_GetItem(o, key_value);
148 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000149 else if (o->ob_type->tp_as_sequence->sq_item)
Georg Brandlccff7852006-06-18 22:17:29 +0000150 return type_error("sequence index must "
151 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000152 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000153
Georg Brandlf5fd5232009-04-18 08:26:21 +0000154 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000155}
156
157int
Fred Drake79912472000-07-09 04:06:11 +0000158PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000159{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000160 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000161
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000162 if (o == NULL || key == NULL || value == NULL) {
163 null_error();
164 return -1;
165 }
166 m = o->ob_type->tp_as_mapping;
167 if (m && m->mp_ass_subscript)
168 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000169
Guido van Rossum21308241998-08-13 16:44:44 +0000170 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000171 if (PyIndex_Check(key)) {
172 Py_ssize_t key_value;
173 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000174 if (key_value == -1 && PyErr_Occurred())
175 return -1;
176 return PySequence_SetItem(o, key_value, value);
177 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000178 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000179 type_error("sequence index must be "
180 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000181 return -1;
182 }
Guido van Rossum21308241998-08-13 16:44:44 +0000183 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000184
Georg Brandlccff7852006-06-18 22:17:29 +0000185 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000186 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000187}
188
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000189int
Fred Drake79912472000-07-09 04:06:11 +0000190PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000191{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000192 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000193
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000194 if (o == NULL || key == NULL) {
195 null_error();
196 return -1;
197 }
198 m = o->ob_type->tp_as_mapping;
199 if (m && m->mp_ass_subscript)
200 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000201
Guido van Rossum21308241998-08-13 16:44:44 +0000202 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000203 if (PyIndex_Check(key)) {
204 Py_ssize_t key_value;
205 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000206 if (key_value == -1 && PyErr_Occurred())
207 return -1;
208 return PySequence_DelItem(o, key_value);
209 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000210 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000211 type_error("sequence index must be "
212 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000213 return -1;
214 }
Guido van Rossum21308241998-08-13 16:44:44 +0000215 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000216
Georg Brandlccff7852006-06-18 22:17:29 +0000217 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000218 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000219}
220
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000221int
222PyObject_DelItemString(PyObject *o, char *key)
223{
224 PyObject *okey;
225 int ret;
226
227 if (o == NULL || key == NULL) {
228 null_error();
229 return -1;
230 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000231 okey = PyString_FromString(key);
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000232 if (okey == NULL)
233 return -1;
234 ret = PyObject_DelItem(o, okey);
235 Py_DECREF(okey);
236 return ret;
237}
238
Brett Cannonea229bd2006-06-06 18:08:16 +0000239int
240PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000241 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000242 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000243{
244 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000245 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000246 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000247
248 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
249 null_error();
250 return -1;
251 }
252 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000253 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000254 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000255 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000256 PyErr_SetString(PyExc_TypeError,
257 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000258 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000259 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000260 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000261 PyErr_SetString(PyExc_TypeError,
262 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000263 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000264 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000265 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000266 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000267 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000268 *buffer = pp;
269 *buffer_len = len;
270 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000271}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000272
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000273int
274PyObject_CheckReadBuffer(PyObject *obj)
275{
276 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
277
278 if (pb == NULL ||
279 pb->bf_getreadbuffer == NULL ||
280 pb->bf_getsegcount == NULL ||
281 (*pb->bf_getsegcount)(obj, NULL) != 1)
282 return 0;
283 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000284}
285
286int PyObject_AsReadBuffer(PyObject *obj,
287 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000288 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000289{
290 PyBufferProcs *pb;
291 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000292 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000293
294 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
295 null_error();
296 return -1;
297 }
298 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000299 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000300 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000301 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000302 PyErr_SetString(PyExc_TypeError,
303 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000304 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000305 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000306 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000307 PyErr_SetString(PyExc_TypeError,
308 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000309 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000310 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000311 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000312 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000313 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000314 *buffer = pp;
315 *buffer_len = len;
316 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000317}
318
319int PyObject_AsWriteBuffer(PyObject *obj,
320 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000321 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000322{
323 PyBufferProcs *pb;
324 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000325 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000326
327 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
328 null_error();
329 return -1;
330 }
331 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000332 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000333 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000334 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000335 PyErr_SetString(PyExc_TypeError,
336 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000337 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000338 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000339 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000340 PyErr_SetString(PyExc_TypeError,
341 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000342 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000343 }
344 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
345 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000346 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000347 *buffer = pp;
348 *buffer_len = len;
349 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000350}
351
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000352/* Buffer C-API for Python 3.0 */
353
354int
355PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
356{
357 if (!PyObject_CheckBuffer(obj)) {
358 PyErr_Format(PyExc_TypeError,
359 "'%100s' does not have the buffer interface",
360 Py_TYPE(obj)->tp_name);
361 return -1;
362 }
363 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
364}
365
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000366static int
367_IsFortranContiguous(Py_buffer *view)
368{
369 Py_ssize_t sd, dim;
370 int i;
371
372 if (view->ndim == 0) return 1;
373 if (view->strides == NULL) return (view->ndim == 1);
374
375 sd = view->itemsize;
376 if (view->ndim == 1) return (view->shape[0] == 1 ||
377 sd == view->strides[0]);
378 for (i=0; i<view->ndim; i++) {
379 dim = view->shape[i];
380 if (dim == 0) return 1;
381 if (view->strides[i] != sd) return 0;
382 sd *= dim;
383 }
384 return 1;
385}
386
387static int
388_IsCContiguous(Py_buffer *view)
389{
390 Py_ssize_t sd, dim;
391 int i;
392
393 if (view->ndim == 0) return 1;
394 if (view->strides == NULL) return 1;
395
396 sd = view->itemsize;
397 if (view->ndim == 1) return (view->shape[0] == 1 ||
398 sd == view->strides[0]);
399 for (i=view->ndim-1; i>=0; i--) {
400 dim = view->shape[i];
401 if (dim == 0) return 1;
402 if (view->strides[i] != sd) return 0;
403 sd *= dim;
404 }
405 return 1;
406}
407
408int
409PyBuffer_IsContiguous(Py_buffer *view, char fort)
410{
411
412 if (view->suboffsets != NULL) return 0;
413
414 if (fort == 'C')
415 return _IsCContiguous(view);
416 else if (fort == 'F')
417 return _IsFortranContiguous(view);
418 else if (fort == 'A')
419 return (_IsCContiguous(view) || _IsFortranContiguous(view));
420 return 0;
421}
422
423
424void*
425PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
426{
427 char* pointer;
428 int i;
429 pointer = (char *)view->buf;
430 for (i = 0; i < view->ndim; i++) {
431 pointer += view->strides[i]*indices[i];
432 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
433 pointer = *((char**)pointer) + view->suboffsets[i];
434 }
435 }
436 return (void*)pointer;
437}
438
439
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000440void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000441_add_one_to_index_F(int nd, Py_ssize_t *index, Py_ssize_t *shape)
442{
443 int k;
444
445 for (k=0; k<nd; k++) {
446 if (index[k] < shape[k]-1) {
447 index[k]++;
448 break;
449 }
450 else {
451 index[k] = 0;
452 }
453 }
454}
455
Antoine Pitrou789be0c2009-04-02 21:18:34 +0000456void
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000457_add_one_to_index_C(int nd, Py_ssize_t *index, Py_ssize_t *shape)
458{
459 int k;
460
461 for (k=nd-1; k>=0; k--) {
462 if (index[k] < shape[k]-1) {
463 index[k]++;
464 break;
465 }
466 else {
467 index[k] = 0;
468 }
469 }
470}
471
472 /* view is not checked for consistency in either of these. It is
473 assumed that the size of the buffer is view->len in
474 view->len / view->itemsize elements.
475 */
476
477int
478PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
479{
480 int k;
481 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
482 Py_ssize_t *indices, elements;
483 char *dest, *ptr;
484
485 if (len > view->len) {
486 len = view->len;
487 }
488
489 if (PyBuffer_IsContiguous(view, fort)) {
490 /* simplest copy is all that is needed */
491 memcpy(buf, view->buf, len);
492 return 0;
493 }
494
495 /* Otherwise a more elaborate scheme is needed */
496
497 /* XXX(nnorwitz): need to check for overflow! */
498 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
499 if (indices == NULL) {
500 PyErr_NoMemory();
501 return -1;
502 }
503 for (k=0; k<view->ndim;k++) {
504 indices[k] = 0;
505 }
506
507 if (fort == 'F') {
508 addone = _add_one_to_index_F;
509 }
510 else {
511 addone = _add_one_to_index_C;
512 }
513 dest = buf;
514 /* XXX : This is not going to be the fastest code in the world
515 several optimizations are possible.
516 */
517 elements = len / view->itemsize;
518 while (elements--) {
519 addone(view->ndim, indices, view->shape);
520 ptr = PyBuffer_GetPointer(view, indices);
521 memcpy(dest, ptr, view->itemsize);
522 dest += view->itemsize;
523 }
524 PyMem_Free(indices);
525 return 0;
526}
527
528int
529PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
530{
531 int k;
532 void (*addone)(int, Py_ssize_t *, Py_ssize_t *);
533 Py_ssize_t *indices, elements;
534 char *src, *ptr;
535
536 if (len > view->len) {
537 len = view->len;
538 }
539
540 if (PyBuffer_IsContiguous(view, fort)) {
541 /* simplest copy is all that is needed */
542 memcpy(view->buf, buf, len);
543 return 0;
544 }
545
546 /* Otherwise a more elaborate scheme is needed */
547
548 /* XXX(nnorwitz): need to check for overflow! */
549 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
550 if (indices == NULL) {
551 PyErr_NoMemory();
552 return -1;
553 }
554 for (k=0; k<view->ndim;k++) {
555 indices[k] = 0;
556 }
557
558 if (fort == 'F') {
559 addone = _add_one_to_index_F;
560 }
561 else {
562 addone = _add_one_to_index_C;
563 }
564 src = buf;
565 /* XXX : This is not going to be the fastest code in the world
566 several optimizations are possible.
567 */
568 elements = len / view->itemsize;
569 while (elements--) {
570 addone(view->ndim, indices, view->shape);
571 ptr = PyBuffer_GetPointer(view, indices);
572 memcpy(ptr, src, view->itemsize);
573 src += view->itemsize;
574 }
575
576 PyMem_Free(indices);
577 return 0;
578}
579
580int PyObject_CopyData(PyObject *dest, PyObject *src)
581{
582 Py_buffer view_dest, view_src;
583 int k;
584 Py_ssize_t *indices, elements;
585 char *dptr, *sptr;
586
587 if (!PyObject_CheckBuffer(dest) ||
588 !PyObject_CheckBuffer(src)) {
589 PyErr_SetString(PyExc_TypeError,
590 "both destination and source must have the "\
591 "buffer interface");
592 return -1;
593 }
594
595 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
596 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000597 PyBuffer_Release(&view_dest);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000598 return -1;
599 }
600
601 if (view_dest.len < view_src.len) {
602 PyErr_SetString(PyExc_BufferError,
603 "destination is too small to receive data from source");
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000604 PyBuffer_Release(&view_dest);
605 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000606 return -1;
607 }
608
609 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
610 PyBuffer_IsContiguous(&view_src, 'C')) ||
611 (PyBuffer_IsContiguous(&view_dest, 'F') &&
612 PyBuffer_IsContiguous(&view_src, 'F'))) {
613 /* simplest copy is all that is needed */
614 memcpy(view_dest.buf, view_src.buf, view_src.len);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000615 PyBuffer_Release(&view_dest);
616 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000617 return 0;
618 }
619
620 /* Otherwise a more elaborate copy scheme is needed */
621
622 /* XXX(nnorwitz): need to check for overflow! */
623 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
624 if (indices == NULL) {
625 PyErr_NoMemory();
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000626 PyBuffer_Release(&view_dest);
627 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000628 return -1;
629 }
630 for (k=0; k<view_src.ndim;k++) {
631 indices[k] = 0;
632 }
633 elements = 1;
634 for (k=0; k<view_src.ndim; k++) {
635 /* XXX(nnorwitz): can this overflow? */
636 elements *= view_src.shape[k];
637 }
638 while (elements--) {
639 _add_one_to_index_C(view_src.ndim, indices, view_src.shape);
640 dptr = PyBuffer_GetPointer(&view_dest, indices);
641 sptr = PyBuffer_GetPointer(&view_src, indices);
642 memcpy(dptr, sptr, view_src.itemsize);
643 }
644 PyMem_Free(indices);
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000645 PyBuffer_Release(&view_dest);
646 PyBuffer_Release(&view_src);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000647 return 0;
648}
649
650void
651PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
652 Py_ssize_t *strides, int itemsize,
653 char fort)
654{
655 int k;
656 Py_ssize_t sd;
657
658 sd = itemsize;
659 if (fort == 'F') {
660 for (k=0; k<nd; k++) {
661 strides[k] = sd;
662 sd *= shape[k];
663 }
664 }
665 else {
666 for (k=nd-1; k>=0; k--) {
667 strides[k] = sd;
668 sd *= shape[k];
669 }
670 }
671 return;
672}
673
674int
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000675PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000676 int readonly, int flags)
677{
678 if (view == NULL) return 0;
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000679 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
680 (readonly == 1)) {
681 PyErr_SetString(PyExc_BufferError,
682 "Object is not writable.");
683 return -1;
684 }
685
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000686 view->obj = obj;
Martin v. Löwis241b8342008-08-14 15:54:27 +0000687 if (obj)
688 Py_INCREF(obj);
Travis E. Oliphant3781aef2008-03-18 04:44:57 +0000689 view->buf = buf;
690 view->len = len;
691 view->readonly = readonly;
692 view->itemsize = 1;
693 view->format = NULL;
694 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
695 view->format = "B";
696 view->ndim = 1;
697 view->shape = NULL;
698 if ((flags & PyBUF_ND) == PyBUF_ND)
699 view->shape = &(view->len);
700 view->strides = NULL;
701 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
702 view->strides = &(view->itemsize);
703 view->suboffsets = NULL;
704 view->internal = NULL;
705 return 0;
706}
707
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000708void
709PyBuffer_Release(Py_buffer *view)
710{
711 PyObject *obj = view->obj;
Martin v. Löwis64034f92008-08-14 20:12:06 +0000712 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
713 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
714 Py_XDECREF(obj);
Martin v. Löwis241b8342008-08-14 15:54:27 +0000715 view->obj = NULL;
Martin v. Löwisf91d46a2008-08-12 14:49:50 +0000716}
717
Eric Smitha9f7d622008-02-17 19:46:49 +0000718PyObject *
719PyObject_Format(PyObject* obj, PyObject *format_spec)
720{
721 static PyObject * str__format__ = NULL;
722 PyObject *empty = NULL;
723 PyObject *result = NULL;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000724#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000725 int spec_is_unicode;
726 int result_is_unicode;
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000727#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000728
729 /* Initialize cached value */
730 if (str__format__ == NULL) {
731 /* Initialize static variable needed by _PyType_Lookup */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000732 str__format__ = PyString_InternFromString("__format__");
Eric Smitha9f7d622008-02-17 19:46:49 +0000733 if (str__format__ == NULL)
734 goto done;
735 }
736
737 /* If no format_spec is provided, use an empty string */
738 if (format_spec == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000739 empty = PyString_FromStringAndSize(NULL, 0);
Eric Smitha9f7d622008-02-17 19:46:49 +0000740 format_spec = empty;
741 }
742
743 /* Check the format_spec type, and make sure it's str or unicode */
Hirokazu Yamamoto1e234e82009-01-25 17:46:48 +0000744#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000745 if (PyUnicode_Check(format_spec))
746 spec_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000747 else if (PyString_Check(format_spec))
Eric Smitha9f7d622008-02-17 19:46:49 +0000748 spec_is_unicode = 0;
749 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000750#else
751 if (!PyString_Check(format_spec)) {
752#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000753 PyErr_Format(PyExc_TypeError,
754 "format expects arg 2 to be string "
755 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
756 goto done;
757 }
758
759 /* Make sure the type is initialized. float gets initialized late */
760 if (Py_TYPE(obj)->tp_dict == NULL)
761 if (PyType_Ready(Py_TYPE(obj)) < 0)
762 goto done;
763
764 /* Check for a __format__ method and call it. */
765 if (PyInstance_Check(obj)) {
766 /* We're an instance of a classic class */
767 PyObject *bound_method = PyObject_GetAttr(obj,
768 str__format__);
769 if (bound_method != NULL) {
770 result = PyObject_CallFunctionObjArgs(bound_method,
771 format_spec,
772 NULL);
773 Py_DECREF(bound_method);
774 } else {
775 PyObject *self_as_str;
776 PyObject *format_method;
777
778 PyErr_Clear();
779 /* Per the PEP, convert to str (or unicode,
780 depending on the type of the format
781 specifier). For new-style classes, this
782 logic is done by object.__format__(). */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000783#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000784 if (spec_is_unicode)
785 self_as_str = PyObject_Unicode(obj);
786 else
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000787#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000788 self_as_str = PyObject_Str(obj);
789 if (self_as_str == NULL)
790 goto done;
791
792 /* Then call str.__format__ on that result */
793 format_method = PyObject_GetAttr(self_as_str,
794 str__format__);
795 if (format_method == NULL) {
796 Py_DECREF(self_as_str);
797 goto done;
798 }
799 result = PyObject_CallFunctionObjArgs(format_method,
800 format_spec,
801 NULL);
802 Py_DECREF(self_as_str);
803 Py_DECREF(format_method);
804 if (result == NULL)
805 goto done;
806 }
807 } else {
808 /* Not an instance of a classic class, use the code
809 from py3k */
810
811 /* Find the (unbound!) __format__ method (a borrowed
812 reference) */
813 PyObject *method = _PyType_Lookup(Py_TYPE(obj),
814 str__format__);
815 if (method == NULL) {
816 PyErr_Format(PyExc_TypeError,
817 "Type %.100s doesn't define __format__",
818 Py_TYPE(obj)->tp_name);
819 goto done;
820 }
821 /* And call it, binding it to the value */
822 result = PyObject_CallFunctionObjArgs(method, obj,
823 format_spec, NULL);
824 }
825
826 if (result == NULL)
827 goto done;
828
829 /* Check the result type, and make sure it's str or unicode */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000830#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000831 if (PyUnicode_Check(result))
832 result_is_unicode = 1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000833 else if (PyString_Check(result))
Eric Smitha9f7d622008-02-17 19:46:49 +0000834 result_is_unicode = 0;
835 else {
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000836#else
837 if (!PyString_Check(result)) {
838#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000839 PyErr_Format(PyExc_TypeError,
840 "%.100s.__format__ must return string or "
841 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
842 Py_TYPE(result)->tp_name);
843 Py_DECREF(result);
844 result = NULL;
845 goto done;
846 }
847
848 /* Convert to unicode, if needed. Required if spec is unicode
849 and result is str */
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000850#ifdef Py_USING_UNICODE
Eric Smitha9f7d622008-02-17 19:46:49 +0000851 if (spec_is_unicode && !result_is_unicode) {
852 PyObject *tmp = PyObject_Unicode(result);
853 /* This logic works whether or not tmp is NULL */
854 Py_DECREF(result);
855 result = tmp;
856 }
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000857#endif
Eric Smitha9f7d622008-02-17 19:46:49 +0000858
859done:
860 Py_XDECREF(empty);
861 return result;
862}
863
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000864/* Operations on numbers */
865
866int
Fred Drake79912472000-07-09 04:06:11 +0000867PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000868{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000869 return o && o->ob_type->tp_as_number &&
870 (o->ob_type->tp_as_number->nb_int ||
871 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000872}
873
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000874/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000875
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000876/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000877
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000878#define NB_SLOT(x) offsetof(PyNumberMethods, x)
879#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000880 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000881#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000882 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000883
884/*
885 Calling scheme used for binary operations:
886
887 v w Action
888 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000889 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000890 new old v.op(v,w), coerce(v,w), v.op(v,w)
891 old new w.op(v,w), coerce(v,w), v.op(v,w)
892 old old coerce(v,w), v.op(v,w)
893
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000894 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
895 v->ob_type
896
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000897 Legend:
898 -------
899 * new == new style number
900 * old == old style number
901 * Action indicates the order in which operations are tried until either
902 a valid result is produced or an error occurs.
903
904 */
905
906static PyObject *
907binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000908{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000909 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000910 binaryfunc slotv = NULL;
911 binaryfunc slotw = NULL;
912
913 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000914 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000915 if (w->ob_type != v->ob_type &&
916 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000917 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000918 if (slotw == slotv)
919 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000920 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000921 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000922 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
923 x = slotw(v, w);
924 if (x != Py_NotImplemented)
925 return x;
926 Py_DECREF(x); /* can't do it */
927 slotw = NULL;
928 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000929 x = slotv(v, w);
930 if (x != Py_NotImplemented)
931 return x;
932 Py_DECREF(x); /* can't do it */
933 }
934 if (slotw) {
935 x = slotw(v, w);
936 if (x != Py_NotImplemented)
937 return x;
938 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000939 }
940 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
941 int err = PyNumber_CoerceEx(&v, &w);
942 if (err < 0) {
943 return NULL;
944 }
945 if (err == 0) {
946 PyNumberMethods *mv = v->ob_type->tp_as_number;
947 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000948 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000949 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000950 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000951 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000952 Py_DECREF(v);
953 Py_DECREF(w);
954 return x;
955 }
956 }
957 /* CoerceEx incremented the reference counts */
958 Py_DECREF(v);
959 Py_DECREF(w);
960 }
961 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000962 Py_INCREF(Py_NotImplemented);
963 return Py_NotImplemented;
964}
Guido van Rossum77660912002-04-16 16:32:50 +0000965
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000966static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000967binop_type_error(PyObject *v, PyObject *w, const char *op_name)
968{
969 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000970 "unsupported operand type(s) for %.100s: "
971 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000972 op_name,
973 v->ob_type->tp_name,
974 w->ob_type->tp_name);
975 return NULL;
976}
977
978static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000979binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
980{
981 PyObject *result = binary_op1(v, w, op_slot);
982 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000983 Py_DECREF(result);
984 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000985 }
986 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000987}
988
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000989
990/*
991 Calling scheme used for ternary operations:
992
Guido van Rossum84675ac2001-09-29 01:05:03 +0000993 *** In some cases, w.op is called before v.op; see binary_op1. ***
994
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000995 v w z Action
996 -------------------------------------------------------------------
997 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
998 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
999 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1000 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1001 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1002 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1003 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
1004 old old old coerce(v,w,z), v.op(v,w,z)
1005
1006 Legend:
1007 -------
1008 * new == new style number
1009 * old == old style number
1010 * Action indicates the order in which operations are tried until either
1011 a valid result is produced or an error occurs.
1012 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
1013 only if z != Py_None; if z == Py_None, then it is treated as absent
1014 variable and only coerce(v,w) is tried.
1015
1016 */
1017
1018static PyObject *
1019ternary_op(PyObject *v,
1020 PyObject *w,
1021 PyObject *z,
1022 const int op_slot,
1023 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +00001024{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001025 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001026 PyObject *x = NULL;
1027 ternaryfunc slotv = NULL;
1028 ternaryfunc slotw = NULL;
1029 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +00001030
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001031 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001032 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001033 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001034 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001035 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +00001036 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001037 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001038 if (slotw == slotv)
1039 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001040 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001041 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +00001042 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
1043 x = slotw(v, w, z);
1044 if (x != Py_NotImplemented)
1045 return x;
1046 Py_DECREF(x); /* can't do it */
1047 slotw = NULL;
1048 }
Guido van Rossum84675ac2001-09-29 01:05:03 +00001049 x = slotv(v, w, z);
1050 if (x != Py_NotImplemented)
1051 return x;
1052 Py_DECREF(x); /* can't do it */
1053 }
1054 if (slotw) {
1055 x = slotw(v, w, z);
1056 if (x != Py_NotImplemented)
1057 return x;
1058 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001059 }
1060 mz = z->ob_type->tp_as_number;
1061 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001062 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001063 if (slotz == slotv || slotz == slotw)
1064 slotz = NULL;
1065 if (slotz) {
1066 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001067 if (x != Py_NotImplemented)
1068 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +00001069 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001070 }
1071 }
1072
1073 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
1074 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
1075 /* we have an old style operand, coerce */
1076 PyObject *v1, *z1, *w2, *z2;
1077 int c;
Guido van Rossum77660912002-04-16 16:32:50 +00001078
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001079 c = PyNumber_Coerce(&v, &w);
1080 if (c != 0)
1081 goto error3;
1082
1083 /* Special case: if the third argument is None, it is
1084 treated as absent argument and not coerced. */
1085 if (z == Py_None) {
1086 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001087 slotz = NB_TERNOP(v->ob_type->tp_as_number,
1088 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001089 if (slotz)
1090 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001091 else
1092 c = -1;
1093 }
1094 else
1095 c = -1;
1096 goto error2;
1097 }
1098 v1 = v;
1099 z1 = z;
1100 c = PyNumber_Coerce(&v1, &z1);
1101 if (c != 0)
1102 goto error2;
1103 w2 = w;
1104 z2 = z1;
1105 c = PyNumber_Coerce(&w2, &z2);
1106 if (c != 0)
1107 goto error1;
1108
1109 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001110 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
1111 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +00001112 if (slotv)
1113 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001114 else
1115 c = -1;
1116 }
1117 else
1118 c = -1;
1119
1120 Py_DECREF(w2);
1121 Py_DECREF(z2);
1122 error1:
1123 Py_DECREF(v1);
1124 Py_DECREF(z1);
1125 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +00001126 Py_DECREF(v);
1127 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001128 error3:
1129 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +00001130 return x;
1131 }
Guido van Rossum5c66a262001-10-22 04:12:44 +00001132
1133 if (z == Py_None)
1134 PyErr_Format(
1135 PyExc_TypeError,
1136 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001137 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001138 v->ob_type->tp_name,
1139 w->ob_type->tp_name);
1140 else
1141 PyErr_Format(
1142 PyExc_TypeError,
1143 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +00001144 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +00001145 v->ob_type->tp_name,
1146 w->ob_type->tp_name,
1147 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001148 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001149}
1150
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001151#define BINARY_FUNC(func, op, op_name) \
1152 PyObject * \
1153 func(PyObject *v, PyObject *w) { \
1154 return binary_op(v, w, NB_SLOT(op), op_name); \
1155 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001156
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001157BINARY_FUNC(PyNumber_Or, nb_or, "|")
1158BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1159BINARY_FUNC(PyNumber_And, nb_and, "&")
1160BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1161BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1162BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001163BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
1164BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001165
1166PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001167PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001168{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001169 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
1170 if (result == Py_NotImplemented) {
1171 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +00001172 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001173 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +00001174 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +00001175 }
Armin Rigofd163f92005-12-29 15:59:19 +00001176 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001177 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001178 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00001179}
1180
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001181static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001182sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001183{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001184 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001185 if (PyIndex_Check(n)) {
1186 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001187 if (count == -1 && PyErr_Occurred())
1188 return NULL;
1189 }
1190 else {
Georg Brandlccff7852006-06-18 22:17:29 +00001191 return type_error("can't multiply sequence by "
1192 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001193 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001194 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001195}
1196
1197PyObject *
1198PyNumber_Multiply(PyObject *v, PyObject *w)
1199{
1200 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
1201 if (result == Py_NotImplemented) {
1202 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1203 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +00001204 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001205 if (mv && mv->sq_repeat) {
1206 return sequence_repeat(mv->sq_repeat, v, w);
1207 }
1208 else if (mw && mw->sq_repeat) {
1209 return sequence_repeat(mw->sq_repeat, w, v);
1210 }
1211 result = binop_type_error(v, w, "*");
1212 }
1213 return result;
1214}
1215
Guido van Rossume15dee51995-07-18 14:12:02 +00001216PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001217PyNumber_FloorDivide(PyObject *v, PyObject *w)
1218{
1219 /* XXX tp_flags test */
1220 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
1221}
1222
1223PyObject *
1224PyNumber_TrueDivide(PyObject *v, PyObject *w)
1225{
1226 /* XXX tp_flags test */
1227 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
1228}
1229
1230PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001231PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001232{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001233 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001234}
1235
1236PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001237PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001238{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001239 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001240}
1241
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001242/* Binary in-place operators */
1243
1244/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001245 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001246
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001247 - If the left hand object has the appropriate struct members, and
1248 they are filled, call the appropriate function and return the
1249 result. No coercion is done on the arguments; the left-hand object
1250 is the one the operation is performed on, and it's up to the
1251 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001252
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001253 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001254 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001255
1256 */
1257
Guido van Rossum77660912002-04-16 16:32:50 +00001258#define HASINPLACE(t) \
1259 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001260
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001261static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001262binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001263{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001264 PyNumberMethods *mv = v->ob_type->tp_as_number;
1265 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +00001266 binaryfunc slot = NB_BINOP(mv, iop_slot);
1267 if (slot) {
1268 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001269 if (x != Py_NotImplemented) {
1270 return x;
1271 }
1272 Py_DECREF(x);
1273 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001274 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001275 return binary_op1(v, w, op_slot);
1276}
1277
1278static PyObject *
1279binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
1280 const char *op_name)
1281{
1282 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1283 if (result == Py_NotImplemented) {
1284 Py_DECREF(result);
1285 return binop_type_error(v, w, op_name);
1286 }
1287 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001288}
1289
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001290#define INPLACE_BINOP(func, iop, op, op_name) \
1291 PyObject * \
1292 func(PyObject *v, PyObject *w) { \
1293 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001294 }
1295
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001296INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1297INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1298INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1299INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1300INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1301INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
1302INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001303
1304PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001305PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1306{
1307 /* XXX tp_flags test */
1308 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1309 NB_SLOT(nb_floor_divide), "//=");
1310}
1311
1312PyObject *
1313PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1314{
1315 /* XXX tp_flags test */
1316 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1317 NB_SLOT(nb_true_divide), "/=");
1318}
1319
1320PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001321PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1322{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001323 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1324 NB_SLOT(nb_add));
1325 if (result == Py_NotImplemented) {
1326 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1327 Py_DECREF(result);
1328 if (m != NULL) {
1329 binaryfunc f = NULL;
1330 if (HASINPLACE(v))
1331 f = m->sq_inplace_concat;
1332 if (f == NULL)
1333 f = m->sq_concat;
1334 if (f != NULL)
1335 return (*f)(v, w);
1336 }
1337 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +00001338 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001339 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001340}
1341
1342PyObject *
1343PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1344{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001345 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1346 NB_SLOT(nb_multiply));
1347 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001348 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001349 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1350 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1351 Py_DECREF(result);
1352 if (mv != NULL) {
1353 if (HASINPLACE(v))
1354 f = mv->sq_inplace_repeat;
1355 if (f == NULL)
1356 f = mv->sq_repeat;
1357 if (f != NULL)
1358 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001359 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001360 else if (mw != NULL) {
1361 /* Note that the right hand operand should not be
1362 * mutated in this case so sq_inplace_repeat is not
1363 * used. */
1364 if (mw->sq_repeat)
1365 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001366 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001367 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001368 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001369 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001370}
1371
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001372PyObject *
1373PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1374{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +00001375 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1376 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001377}
1378
1379PyObject *
1380PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1381{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001382 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
1383 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1384 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001385 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001386 else {
1387 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1388 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001389}
1390
1391
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001393
1394PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001395PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001396{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 PyNumberMethods *m;
1398
1399 if (o == NULL)
1400 return null_error();
1401 m = o->ob_type->tp_as_number;
1402 if (m && m->nb_negative)
1403 return (*m->nb_negative)(o);
1404
Georg Brandlccff7852006-06-18 22:17:29 +00001405 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001406}
1407
1408PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001409PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001410{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411 PyNumberMethods *m;
1412
1413 if (o == NULL)
1414 return null_error();
1415 m = o->ob_type->tp_as_number;
1416 if (m && m->nb_positive)
1417 return (*m->nb_positive)(o);
1418
Georg Brandlccff7852006-06-18 22:17:29 +00001419 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001420}
1421
1422PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001423PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001424{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 PyNumberMethods *m;
1426
1427 if (o == NULL)
1428 return null_error();
1429 m = o->ob_type->tp_as_number;
1430 if (m && m->nb_invert)
1431 return (*m->nb_invert)(o);
1432
Georg Brandlccff7852006-06-18 22:17:29 +00001433 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001434}
1435
1436PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001437PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001438{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001439 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001440
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001441 if (o == NULL)
1442 return null_error();
1443 m = o->ob_type->tp_as_number;
1444 if (m && m->nb_absolute)
1445 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001446
Georg Brandlccff7852006-06-18 22:17:29 +00001447 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001448}
1449
Guido van Rossum9e896b32000-04-05 20:11:21 +00001450/* Add a check for embedded NULL-bytes in the argument. */
1451static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001452int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001453{
1454 char *end;
1455 PyObject *x;
1456
1457 x = PyInt_FromString((char*)s, &end, 10);
1458 if (x == NULL)
1459 return NULL;
1460 if (end != s + len) {
1461 PyErr_SetString(PyExc_ValueError,
1462 "null byte in argument for int()");
1463 Py_DECREF(x);
1464 return NULL;
1465 }
1466 return x;
1467}
1468
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001469/* Return a Python Int or Long from the object item
1470 Raise TypeError if the result is not an int-or-long
1471 or if the object cannot be interpreted as an index.
1472*/
1473PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001474PyNumber_Index(PyObject *item)
1475{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001476 PyObject *result = NULL;
1477 if (item == NULL)
1478 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +00001479 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001480 Py_INCREF(item);
1481 return item;
1482 }
1483 if (PyIndex_Check(item)) {
1484 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001485 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +00001486 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001487 PyErr_Format(PyExc_TypeError,
1488 "__index__ returned non-(int,long) " \
1489 "(type %.200s)",
1490 result->ob_type->tp_name);
1491 Py_DECREF(result);
1492 return NULL;
1493 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001494 }
1495 else {
Armin Rigo314861c2006-03-30 14:04:02 +00001496 PyErr_Format(PyExc_TypeError,
1497 "'%.200s' object cannot be interpreted "
1498 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001499 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001500 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001501}
1502
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001503/* Return an error on Overflow only if err is not NULL*/
1504
1505Py_ssize_t
1506PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1507{
1508 Py_ssize_t result;
1509 PyObject *runerr;
1510 PyObject *value = PyNumber_Index(item);
1511 if (value == NULL)
1512 return -1;
1513
1514 /* We're done if PyInt_AsSsize_t() returns without error. */
1515 result = PyInt_AsSsize_t(value);
1516 if (result != -1 || !(runerr = PyErr_Occurred()))
1517 goto finish;
1518
1519 /* Error handling code -- only manage OverflowError differently */
1520 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1521 goto finish;
1522
1523 PyErr_Clear();
1524 /* If no error-handling desired then the default clipping
1525 is sufficient.
1526 */
1527 if (!err) {
1528 assert(PyLong_Check(value));
1529 /* Whether or not it is less than or equal to
1530 zero is determined by the sign of ob_size
1531 */
1532 if (_PyLong_Sign(value) < 0)
1533 result = PY_SSIZE_T_MIN;
1534 else
1535 result = PY_SSIZE_T_MAX;
1536 }
1537 else {
1538 /* Otherwise replace the error with caller's error object. */
1539 PyErr_Format(err,
1540 "cannot fit '%.200s' into an index-sized integer",
1541 item->ob_type->tp_name);
1542 }
1543
1544 finish:
1545 Py_DECREF(value);
1546 return result;
1547}
1548
1549
Guido van Rossume15dee51995-07-18 14:12:02 +00001550PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001551_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1552{
1553 const char *type_name;
1554 static PyObject *int_name = NULL;
1555 if (int_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001556 int_name = PyString_InternFromString("__int__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001557 if (int_name == NULL)
1558 return NULL;
1559 }
1560
1561 if (integral && (!PyInt_Check(integral) &&
1562 !PyLong_Check(integral))) {
1563 /* Don't go through tp_as_number->nb_int to avoid
1564 hitting the classic class fallback to __trunc__. */
1565 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1566 if (int_func == NULL) {
1567 PyErr_Clear(); /* Raise a different error. */
1568 goto non_integral_error;
1569 }
1570 Py_DECREF(integral);
1571 integral = PyEval_CallObject(int_func, NULL);
1572 Py_DECREF(int_func);
1573 if (integral && (!PyInt_Check(integral) &&
1574 !PyLong_Check(integral))) {
1575 goto non_integral_error;
1576 }
1577 }
1578 return integral;
1579
1580non_integral_error:
1581 if (PyInstance_Check(integral)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001582 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001583 ->in_class->cl_name);
1584 }
1585 else {
1586 type_name = integral->ob_type->tp_name;
1587 }
1588 PyErr_Format(PyExc_TypeError, error_format, type_name);
1589 Py_DECREF(integral);
1590 return NULL;
1591}
1592
1593
1594PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001595PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001596{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001597 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001598 static PyObject *trunc_name = NULL;
1599 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001600 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001601 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001602
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001603 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001604 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001605 if (trunc_name == NULL)
1606 return NULL;
1607 }
1608
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001609 if (o == NULL)
1610 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001611 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001612 Py_INCREF(o);
1613 return o;
1614 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001615 m = o->ob_type->tp_as_number;
1616 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001617 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001618 PyObject *res = m->nb_int(o);
1619 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1620 PyErr_Format(PyExc_TypeError,
1621 "__int__ returned non-int (type %.200s)",
1622 res->ob_type->tp_name);
1623 Py_DECREF(res);
1624 return NULL;
1625 }
1626 return res;
1627 }
1628 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001629 PyIntObject *io = (PyIntObject*)o;
1630 return PyInt_FromLong(io->ob_ival);
1631 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001632 trunc_func = PyObject_GetAttr(o, trunc_name);
1633 if (trunc_func) {
1634 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1635 Py_DECREF(trunc_func);
1636 /* __trunc__ is specified to return an Integral type, but
1637 int() needs to return an int. */
1638 return _PyNumber_ConvertIntegralToInt(
1639 truncated,
1640 "__trunc__ returned non-Integral (type %.200s)");
1641 }
1642 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1643
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001644 if (PyString_Check(o))
1645 return int_from_string(PyString_AS_STRING(o),
1646 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001647#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001648 if (PyUnicode_Check(o))
1649 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1650 PyUnicode_GET_SIZE(o),
1651 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001652#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001653 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001654 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001655
Georg Brandlccff7852006-06-18 22:17:29 +00001656 return type_error("int() argument must be a string or a "
1657 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001658}
1659
Guido van Rossum9e896b32000-04-05 20:11:21 +00001660/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001661static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001662long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001663{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001664 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001665 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001666
Guido van Rossum4c08d552000-03-10 22:55:18 +00001667 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001668 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001669 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001670 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001671 PyErr_SetString(PyExc_ValueError,
1672 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001673 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001674 return NULL;
1675 }
1676 return x;
1677}
1678
Guido van Rossume15dee51995-07-18 14:12:02 +00001679PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001680PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001681{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001682 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001683 static PyObject *trunc_name = NULL;
1684 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001685 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001686 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001687
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001688 if (trunc_name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001689 trunc_name = PyString_InternFromString("__trunc__");
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001690 if (trunc_name == NULL)
1691 return NULL;
1692 }
1693
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001694 if (o == NULL)
1695 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001696 m = o->ob_type->tp_as_number;
1697 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001698 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001699 PyObject *res = m->nb_long(o);
1700 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1701 PyErr_Format(PyExc_TypeError,
1702 "__long__ returned non-long (type %.200s)",
1703 res->ob_type->tp_name);
1704 Py_DECREF(res);
1705 return NULL;
1706 }
1707 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001708 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001709 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001710 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001711 trunc_func = PyObject_GetAttr(o, trunc_name);
1712 if (trunc_func) {
1713 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1714 PyObject *int_instance;
1715 Py_DECREF(trunc_func);
1716 /* __trunc__ is specified to return an Integral type,
1717 but long() needs to return a long. */
1718 int_instance = _PyNumber_ConvertIntegralToInt(
1719 truncated,
1720 "__trunc__ returned non-Integral (type %.200s)");
1721 if (int_instance && PyInt_Check(int_instance)) {
1722 /* Make sure that long() returns a long instance. */
1723 long value = PyInt_AS_LONG(int_instance);
1724 Py_DECREF(int_instance);
1725 return PyLong_FromLong(value);
1726 }
1727 return int_instance;
1728 }
1729 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1730
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001731 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001732 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001733 * doesn't do. In particular long('9.5') must raise an
1734 * exception, not truncate the float.
1735 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001736 return long_from_string(PyString_AS_STRING(o),
1737 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001738#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001739 if (PyUnicode_Check(o))
1740 /* The above check is done in PyLong_FromUnicode(). */
1741 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1742 PyUnicode_GET_SIZE(o),
1743 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001744#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001745 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1746 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001747
Georg Brandlccff7852006-06-18 22:17:29 +00001748 return type_error("long() argument must be a string or a "
1749 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001750}
1751
1752PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001753PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001754{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001755 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001756
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001757 if (o == NULL)
1758 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001759 m = o->ob_type->tp_as_number;
1760 if (m && m->nb_float) { /* This should include subclasses of float */
1761 PyObject *res = m->nb_float(o);
1762 if (res && !PyFloat_Check(res)) {
1763 PyErr_Format(PyExc_TypeError,
1764 "__float__ returned non-float (type %.200s)",
1765 res->ob_type->tp_name);
1766 Py_DECREF(res);
1767 return NULL;
1768 }
1769 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001770 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001771 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001772 PyFloatObject *po = (PyFloatObject *)o;
1773 return PyFloat_FromDouble(po->ob_fval);
1774 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001775 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001776}
1777
Eric Smith5e527eb2008-02-10 01:36:53 +00001778PyObject *
1779PyNumber_ToBase(PyObject *n, int base)
1780{
1781 PyObject *res = NULL;
1782 PyObject *index = PyNumber_Index(n);
1783
1784 if (!index)
1785 return NULL;
1786 if (PyLong_Check(index))
1787 res = _PyLong_Format(index, base, 0, 1);
1788 else if (PyInt_Check(index))
1789 res = _PyInt_Format((PyIntObject*)index, base, 1);
1790 else
Eric Smith3f914372008-02-15 12:14:32 +00001791 /* It should not be possible to get here, as
1792 PyNumber_Index already has a check for the same
1793 condition */
1794 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1795 "int or long");
Eric Smith5e527eb2008-02-10 01:36:53 +00001796 Py_DECREF(index);
1797 return res;
1798}
1799
1800
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001801/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001802
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001803int
Fred Drake79912472000-07-09 04:06:11 +00001804PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001805{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001806 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001807 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001808 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001809 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001810 return s != NULL && s->ob_type->tp_as_sequence &&
1811 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001812}
1813
Martin v. Löwis18e16552006-02-15 17:27:45 +00001814Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001815PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001816{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001817 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001818
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001819 if (s == NULL) {
1820 null_error();
1821 return -1;
1822 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001823
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001824 m = s->ob_type->tp_as_sequence;
1825 if (m && m->sq_length)
1826 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001827
Georg Brandlb0061c82006-08-08 11:56:21 +00001828 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001829 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001830}
1831
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001832#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001833Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001834PySequence_Length(PyObject *s)
1835{
1836 return PySequence_Size(s);
1837}
1838#define PySequence_Length PySequence_Size
1839
Guido van Rossume15dee51995-07-18 14:12:02 +00001840PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001841PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001842{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001843 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001844
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001845 if (s == NULL || o == NULL)
1846 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001847
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001848 m = s->ob_type->tp_as_sequence;
1849 if (m && m->sq_concat)
1850 return m->sq_concat(s, o);
1851
Armin Rigofd163f92005-12-29 15:59:19 +00001852 /* Instances of user classes defining an __add__() method only
1853 have an nb_add slot, not an sq_concat slot. So we fall back
1854 to nb_add if both arguments appear to be sequences. */
1855 if (PySequence_Check(s) && PySequence_Check(o)) {
1856 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1857 if (result != Py_NotImplemented)
1858 return result;
1859 Py_DECREF(result);
1860 }
Georg Brandlccff7852006-06-18 22:17:29 +00001861 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001862}
1863
1864PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001865PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001866{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001867 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001868
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001869 if (o == NULL)
1870 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001871
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001872 m = o->ob_type->tp_as_sequence;
1873 if (m && m->sq_repeat)
1874 return m->sq_repeat(o, count);
1875
Armin Rigofd163f92005-12-29 15:59:19 +00001876 /* Instances of user classes defining a __mul__() method only
1877 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1878 to nb_multiply if o appears to be a sequence. */
1879 if (PySequence_Check(o)) {
1880 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001881 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001882 if (n == NULL)
1883 return NULL;
1884 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1885 Py_DECREF(n);
1886 if (result != Py_NotImplemented)
1887 return result;
1888 Py_DECREF(result);
1889 }
Georg Brandlccff7852006-06-18 22:17:29 +00001890 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001891}
1892
1893PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001894PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1895{
1896 PySequenceMethods *m;
1897
1898 if (s == NULL || o == NULL)
1899 return null_error();
1900
1901 m = s->ob_type->tp_as_sequence;
1902 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1903 return m->sq_inplace_concat(s, o);
1904 if (m && m->sq_concat)
1905 return m->sq_concat(s, o);
1906
Armin Rigofd163f92005-12-29 15:59:19 +00001907 if (PySequence_Check(s) && PySequence_Check(o)) {
1908 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1909 NB_SLOT(nb_add));
1910 if (result != Py_NotImplemented)
1911 return result;
1912 Py_DECREF(result);
1913 }
Georg Brandlccff7852006-06-18 22:17:29 +00001914 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001915}
1916
1917PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001918PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001919{
1920 PySequenceMethods *m;
1921
1922 if (o == NULL)
1923 return null_error();
1924
1925 m = o->ob_type->tp_as_sequence;
1926 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1927 return m->sq_inplace_repeat(o, count);
1928 if (m && m->sq_repeat)
1929 return m->sq_repeat(o, count);
1930
Armin Rigofd163f92005-12-29 15:59:19 +00001931 if (PySequence_Check(o)) {
1932 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001933 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001934 if (n == NULL)
1935 return NULL;
1936 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1937 NB_SLOT(nb_multiply));
1938 Py_DECREF(n);
1939 if (result != Py_NotImplemented)
1940 return result;
1941 Py_DECREF(result);
1942 }
Georg Brandlccff7852006-06-18 22:17:29 +00001943 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001944}
1945
1946PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001947PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001948{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001949 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001950
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001951 if (s == NULL)
1952 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001953
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001954 m = s->ob_type->tp_as_sequence;
1955 if (m && m->sq_item) {
1956 if (i < 0) {
1957 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001958 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001959 if (l < 0)
1960 return NULL;
1961 i += l;
1962 }
1963 }
1964 return m->sq_item(s, i);
1965 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001966
Skip Montanaro2c7ca9b2008-07-07 11:16:14 +00001967 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001968}
1969
1970PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001971PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001972{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001973 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001974 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001975
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001976 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001977
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001978 m = s->ob_type->tp_as_sequence;
1979 if (m && m->sq_slice) {
1980 if (i1 < 0 || i2 < 0) {
1981 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001982 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001983 if (l < 0)
1984 return NULL;
1985 if (i1 < 0)
1986 i1 += l;
1987 if (i2 < 0)
1988 i2 += l;
1989 }
1990 }
1991 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001992 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1993 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001994 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001995 if (!slice)
1996 return NULL;
1997 res = mp->mp_subscript(s, slice);
1998 Py_DECREF(slice);
1999 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002000 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002001
Georg Brandlccff7852006-06-18 22:17:29 +00002002 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00002003}
2004
2005int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002006PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002007{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002008 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002009
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002010 if (s == NULL) {
2011 null_error();
2012 return -1;
2013 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002014
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002015 m = s->ob_type->tp_as_sequence;
2016 if (m && m->sq_ass_item) {
2017 if (i < 0) {
2018 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002019 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002020 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002021 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002022 i += l;
2023 }
2024 }
2025 return m->sq_ass_item(s, i, o);
2026 }
2027
Georg Brandlccff7852006-06-18 22:17:29 +00002028 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002029 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002030}
2031
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002032int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002033PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002034{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002035 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002036
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002037 if (s == NULL) {
2038 null_error();
2039 return -1;
2040 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002041
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002042 m = s->ob_type->tp_as_sequence;
2043 if (m && m->sq_ass_item) {
2044 if (i < 0) {
2045 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002046 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002047 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002048 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002049 i += l;
2050 }
2051 }
2052 return m->sq_ass_item(s, i, (PyObject *)NULL);
2053 }
2054
Georg Brandlccff7852006-06-18 22:17:29 +00002055 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002056 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002057}
2058
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002059int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002060PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002062 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00002063 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00002064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002065 if (s == NULL) {
2066 null_error();
2067 return -1;
2068 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002070 m = s->ob_type->tp_as_sequence;
2071 if (m && m->sq_ass_slice) {
2072 if (i1 < 0 || i2 < 0) {
2073 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002074 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002075 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002076 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002077 if (i1 < 0)
2078 i1 += l;
2079 if (i2 < 0)
2080 i2 += l;
2081 }
2082 }
2083 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002084 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
2085 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00002086 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00002087 if (!slice)
2088 return -1;
2089 res = mp->mp_ass_subscript(s, slice, o);
2090 Py_DECREF(slice);
2091 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002092 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002093
Georg Brandlccff7852006-06-18 22:17:29 +00002094 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002095 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002096}
2097
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002098int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002099PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002100{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002101 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002102
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002103 if (s == NULL) {
2104 null_error();
2105 return -1;
2106 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002107
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002108 m = s->ob_type->tp_as_sequence;
2109 if (m && m->sq_ass_slice) {
2110 if (i1 < 0 || i2 < 0) {
2111 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002112 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002113 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002114 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002115 if (i1 < 0)
2116 i1 += l;
2117 if (i2 < 0)
2118 i2 += l;
2119 }
2120 }
2121 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
2122 }
Georg Brandlccff7852006-06-18 22:17:29 +00002123 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002124 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002125}
2126
Guido van Rossume15dee51995-07-18 14:12:02 +00002127PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002128PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002129{
Tim Peters6912d4d2001-05-05 03:56:37 +00002130 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002131 Py_ssize_t n; /* guess for result tuple size */
Raymond Hettingerb5163702009-02-02 21:50:13 +00002132 PyObject *result = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002133 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002134
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002135 if (v == NULL)
2136 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002137
Tim Peters6912d4d2001-05-05 03:56:37 +00002138 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00002139 if (PyTuple_CheckExact(v)) {
2140 /* Note that we can't know whether it's safe to return
2141 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00002142 to exact tuples here. In contrast, lists always make
2143 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002144 Py_INCREF(v);
2145 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002146 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002147 if (PyList_Check(v))
2148 return PyList_AsTuple(v);
2149
Tim Peters6912d4d2001-05-05 03:56:37 +00002150 /* Get iterator. */
2151 it = PyObject_GetIter(v);
2152 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00002153 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002154
Tim Peters6912d4d2001-05-05 03:56:37 +00002155 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00002156 n = _PyObject_LengthHint(v, 10);
Raymond Hettingerb5163702009-02-02 21:50:13 +00002157 if (n == -1)
2158 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002159 result = PyTuple_New(n);
2160 if (result == NULL)
2161 goto Fail;
2162
2163 /* Fill the tuple. */
2164 for (j = 0; ; ++j) {
2165 PyObject *item = PyIter_Next(it);
2166 if (item == NULL) {
2167 if (PyErr_Occurred())
2168 goto Fail;
2169 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002170 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002171 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002172 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00002173 /* The over-allocation strategy can grow a bit faster
2174 than for lists because unlike lists the
2175 over-allocation isn't permanent -- we reclaim
2176 the excess before the end of this routine.
2177 So, grow by ten and then add 25%.
2178 */
2179 n += 10;
2180 n += n >> 2;
2181 if (n < oldn) {
2182 /* Check for overflow */
2183 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00002184 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00002185 goto Fail;
2186 }
Tim Peters4324aa32001-05-28 22:30:08 +00002187 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00002188 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00002189 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00002190 }
Tim Peters6912d4d2001-05-05 03:56:37 +00002191 }
2192 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002193 }
2194
Tim Peters6912d4d2001-05-05 03:56:37 +00002195 /* Cut tuple back if guess was too large. */
2196 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00002197 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00002198 goto Fail;
2199
2200 Py_DECREF(it);
2201 return result;
2202
2203Fail:
2204 Py_XDECREF(result);
2205 Py_DECREF(it);
2206 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002207}
2208
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002209PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002210PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002211{
Tim Petersf553f892001-05-01 20:45:31 +00002212 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002213 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002214
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002215 if (v == NULL)
2216 return null_error();
2217
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002218 result = PyList_New(0);
2219 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00002220 return NULL;
2221
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00002222 rv = _PyList_Extend((PyListObject *)result, v);
2223 if (rv == NULL) {
2224 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00002225 return NULL;
2226 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00002227 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00002228 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002229}
2230
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002231PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002232PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002233{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002234 PyObject *it;
2235
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002236 if (v == NULL)
2237 return null_error();
2238
Michael W. Hudson2801fe12002-11-05 18:05:49 +00002239 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002240 Py_INCREF(v);
2241 return v;
2242 }
2243
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002244 it = PyObject_GetIter(v);
2245 if (it == NULL) {
2246 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00002247 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002248 return NULL;
2249 }
2250
Raymond Hettinger193814c2004-12-18 19:00:59 +00002251 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002252 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002253
2254 return v;
2255}
2256
Tim Peters16a77ad2001-09-08 04:00:12 +00002257/* Iterate over seq. Result depends on the operation:
2258 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
Mark Dickinson3e4caeb2009-02-21 20:27:01 +00002259 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
Tim Peters16a77ad2001-09-08 04:00:12 +00002260 set ValueError and return -1 if none found; also return -1 on error.
2261 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2262*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002263Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002264_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002265{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002266 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002267 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2268 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002269
Tim Peters16a77ad2001-09-08 04:00:12 +00002270 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002271 null_error();
2272 return -1;
2273 }
Tim Peters75f8e352001-05-05 11:33:43 +00002274
Tim Peters16a77ad2001-09-08 04:00:12 +00002275 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00002276 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00002277 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002278 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00002279 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002280
Tim Peters16a77ad2001-09-08 04:00:12 +00002281 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00002282 for (;;) {
2283 int cmp;
2284 PyObject *item = PyIter_Next(it);
2285 if (item == NULL) {
2286 if (PyErr_Occurred())
2287 goto Fail;
2288 break;
2289 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002290
2291 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002292 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00002293 if (cmp < 0)
2294 goto Fail;
2295 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002296 switch (operation) {
2297 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00002298 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00002299 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002300 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002301 goto Fail;
2302 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00002303 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00002304 break;
2305
2306 case PY_ITERSEARCH_INDEX:
2307 if (wrapped) {
2308 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00002309 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00002310 goto Fail;
2311 }
2312 goto Done;
2313
2314 case PY_ITERSEARCH_CONTAINS:
2315 n = 1;
2316 goto Done;
2317
2318 default:
2319 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00002320 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002321 }
2322
2323 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00002324 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00002325 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00002326 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00002327 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002328 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002329
2330 if (operation != PY_ITERSEARCH_INDEX)
2331 goto Done;
2332
2333 PyErr_SetString(PyExc_ValueError,
2334 "sequence.index(x): x not in sequence");
2335 /* fall into failure code */
2336Fail:
2337 n = -1;
2338 /* fall through */
2339Done:
Tim Peters75f8e352001-05-05 11:33:43 +00002340 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002341 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002342
Guido van Rossume15dee51995-07-18 14:12:02 +00002343}
2344
Tim Peters16a77ad2001-09-08 04:00:12 +00002345/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002346Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002347PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002348{
Tim Peters16a77ad2001-09-08 04:00:12 +00002349 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002350}
2351
Tim Peterscb8d3682001-05-05 21:05:01 +00002352/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002353 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002354 */
2355int
2356PySequence_Contains(PyObject *seq, PyObject *ob)
2357{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002358 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00002359 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
2360 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2361 if (sqm != NULL && sqm->sq_contains != NULL)
2362 return (*sqm->sq_contains)(seq, ob);
2363 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002364 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2365 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002366}
2367
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002368/* Backwards compatibility */
2369#undef PySequence_In
2370int
Fred Drake79912472000-07-09 04:06:11 +00002371PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002372{
2373 return PySequence_Contains(w, v);
2374}
2375
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002376Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002377PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002378{
Tim Peters16a77ad2001-09-08 04:00:12 +00002379 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002380}
2381
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002382/* Operations on mappings */
2383
2384int
Fred Drake79912472000-07-09 04:06:11 +00002385PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002386{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00002387 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00002388 return PyObject_HasAttrString(o, "__getitem__");
2389
2390 return o && o->ob_type->tp_as_mapping &&
2391 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00002392 !(o->ob_type->tp_as_sequence &&
2393 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00002394}
2395
Martin v. Löwis18e16552006-02-15 17:27:45 +00002396Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002397PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002398{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002399 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002400
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002401 if (o == NULL) {
2402 null_error();
2403 return -1;
2404 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002405
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002406 m = o->ob_type->tp_as_mapping;
2407 if (m && m->mp_length)
2408 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002409
Georg Brandlb0061c82006-08-08 11:56:21 +00002410 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002411 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002412}
2413
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002414#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002415Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002416PyMapping_Length(PyObject *o)
2417{
2418 return PyMapping_Size(o);
2419}
2420#define PyMapping_Length PyMapping_Size
2421
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002422PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002423PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002424{
2425 PyObject *okey, *r;
2426
2427 if (key == NULL)
2428 return null_error();
2429
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002430 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002431 if (okey == NULL)
2432 return NULL;
2433 r = PyObject_GetItem(o, okey);
2434 Py_DECREF(okey);
2435 return r;
2436}
2437
2438int
Fred Drake79912472000-07-09 04:06:11 +00002439PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002440{
2441 PyObject *okey;
2442 int r;
2443
2444 if (key == NULL) {
2445 null_error();
2446 return -1;
2447 }
2448
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002449 okey = PyString_FromString(key);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002450 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00002451 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002452 r = PyObject_SetItem(o, okey, value);
2453 Py_DECREF(okey);
2454 return r;
2455}
2456
2457int
Fred Drake79912472000-07-09 04:06:11 +00002458PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002459{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002460 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002461
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002462 v = PyMapping_GetItemString(o, key);
2463 if (v) {
2464 Py_DECREF(v);
2465 return 1;
2466 }
2467 PyErr_Clear();
2468 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002469}
2470
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002471int
Fred Drake79912472000-07-09 04:06:11 +00002472PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002473{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002474 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002475
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002476 v = PyObject_GetItem(o, key);
2477 if (v) {
2478 Py_DECREF(v);
2479 return 1;
2480 }
2481 PyErr_Clear();
2482 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002483}
2484
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002485/* Operations on callable objects */
2486
2487/* XXX PyCallable_Check() is in object.c */
2488
Guido van Rossume15dee51995-07-18 14:12:02 +00002489PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002490PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002491{
Guido van Rossum5560b742001-09-14 16:47:50 +00002492 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002493}
Guido van Rossume15dee51995-07-18 14:12:02 +00002494
2495PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002496PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2497{
2498 ternaryfunc call;
2499
2500 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00002501 PyObject *result;
2502 if (Py_EnterRecursiveCall(" while calling a Python object"))
2503 return NULL;
2504 result = (*call)(func, arg, kw);
2505 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00002506 if (result == NULL && !PyErr_Occurred())
2507 PyErr_SetString(
2508 PyExc_SystemError,
2509 "NULL result without error in PyObject_Call");
2510 return result;
2511 }
Georg Brandlccff7852006-06-18 22:17:29 +00002512 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00002513 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002514 return NULL;
2515}
2516
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002517static PyObject*
2518call_function_tail(PyObject *callable, PyObject *args)
2519{
2520 PyObject *retval;
2521
2522 if (args == NULL)
2523 return NULL;
2524
2525 if (!PyTuple_Check(args)) {
2526 PyObject *a;
2527
2528 a = PyTuple_New(1);
2529 if (a == NULL) {
2530 Py_DECREF(args);
2531 return NULL;
2532 }
2533 PyTuple_SET_ITEM(a, 0, args);
2534 args = a;
2535 }
2536 retval = PyObject_Call(callable, args, NULL);
2537
2538 Py_DECREF(args);
2539
2540 return retval;
2541}
2542
Tim Peters6d6c1a32001-08-02 04:15:00 +00002543PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002544PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002545{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002546 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002547 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002548
Fred Drakeb92cf062001-10-27 06:16:31 +00002549 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002550 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002551
Fred Drakeb92cf062001-10-27 06:16:31 +00002552 if (format && *format) {
2553 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002554 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002555 va_end(va);
2556 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002557 else
2558 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002559
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002560 return call_function_tail(callable, args);
2561}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002562
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002563PyObject *
2564_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2565{
2566 va_list va;
2567 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002568
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002569 if (callable == NULL)
2570 return null_error();
2571
2572 if (format && *format) {
2573 va_start(va, format);
2574 args = _Py_VaBuildValue_SizeT(format, va);
2575 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002576 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002577 else
2578 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002579
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002580 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002581}
2582
2583PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002584PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002585{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002586 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002587 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002588 PyObject *func = NULL;
2589 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002590
Fred Drakeb92cf062001-10-27 06:16:31 +00002591 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002592 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002593
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002594 func = PyObject_GetAttrString(o, name);
2595 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002596 PyErr_SetString(PyExc_AttributeError, name);
2597 return 0;
2598 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002599
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002600 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002601 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002602 goto exit;
2603 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002604
Fred Drakeb92cf062001-10-27 06:16:31 +00002605 if (format && *format) {
2606 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002607 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002608 va_end(va);
2609 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002610 else
2611 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002612
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002613 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002614
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002615 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002616 /* args gets consumed in call_function_tail */
2617 Py_XDECREF(func);
2618
2619 return retval;
2620}
2621
2622PyObject *
2623_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2624{
2625 va_list va;
2626 PyObject *args;
2627 PyObject *func = NULL;
2628 PyObject *retval = NULL;
2629
2630 if (o == NULL || name == NULL)
2631 return null_error();
2632
2633 func = PyObject_GetAttrString(o, name);
2634 if (func == NULL) {
2635 PyErr_SetString(PyExc_AttributeError, name);
2636 return 0;
2637 }
2638
2639 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002640 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002641 goto exit;
2642 }
2643
2644 if (format && *format) {
2645 va_start(va, format);
2646 args = _Py_VaBuildValue_SizeT(format, va);
2647 va_end(va);
2648 }
2649 else
2650 args = PyTuple_New(0);
2651
2652 retval = call_function_tail(func, args);
2653
2654 exit:
2655 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002656 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002657
2658 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002659}
Guido van Rossum823649d2001-03-21 18:40:58 +00002660
2661
Fred Drakeb421b8c2001-10-26 16:21:32 +00002662static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002663objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002664{
2665 int i, n = 0;
2666 va_list countva;
2667 PyObject *result, *tmp;
2668
2669#ifdef VA_LIST_IS_ARRAY
2670 memcpy(countva, va, sizeof(va_list));
2671#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002672#ifdef __va_copy
2673 __va_copy(countva, va);
2674#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002675 countva = va;
2676#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002677#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002678
2679 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2680 ++n;
2681 result = PyTuple_New(n);
2682 if (result != NULL && n > 0) {
2683 for (i = 0; i < n; ++i) {
2684 tmp = (PyObject *)va_arg(va, PyObject *);
2685 PyTuple_SET_ITEM(result, i, tmp);
2686 Py_INCREF(tmp);
2687 }
2688 }
2689 return result;
2690}
2691
2692PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002693PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002694{
2695 PyObject *args, *tmp;
2696 va_list vargs;
2697
2698 if (callable == NULL || name == NULL)
2699 return null_error();
2700
2701 callable = PyObject_GetAttr(callable, name);
2702 if (callable == NULL)
2703 return NULL;
2704
2705 /* count the args */
2706 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002707 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002708 va_end(vargs);
2709 if (args == NULL) {
2710 Py_DECREF(callable);
2711 return NULL;
2712 }
2713 tmp = PyObject_Call(callable, args, NULL);
2714 Py_DECREF(args);
2715 Py_DECREF(callable);
2716
2717 return tmp;
2718}
2719
2720PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002721PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002722{
2723 PyObject *args, *tmp;
2724 va_list vargs;
2725
2726 if (callable == NULL)
2727 return null_error();
2728
2729 /* count the args */
2730 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002731 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002732 va_end(vargs);
2733 if (args == NULL)
2734 return NULL;
2735 tmp = PyObject_Call(callable, args, NULL);
2736 Py_DECREF(args);
2737
2738 return tmp;
2739}
2740
2741
Guido van Rossum823649d2001-03-21 18:40:58 +00002742/* isinstance(), issubclass() */
2743
Barry Warsawf16951c2002-04-23 22:45:44 +00002744/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2745 * state that will almost never happen.
2746 *
2747 * 0. creating the __bases__ static string could get a MemoryError
2748 * 1. getattr(cls, '__bases__') could raise an AttributeError
2749 * 2. getattr(cls, '__bases__') could raise some other exception
2750 * 3. getattr(cls, '__bases__') could return a tuple
2751 * 4. getattr(cls, '__bases__') could return something other than a tuple
2752 *
2753 * Only state #3 is a non-error state and only it returns a non-NULL object
2754 * (it returns the retrieved tuple).
2755 *
2756 * Any raised AttributeErrors are masked by clearing the exception and
2757 * returning NULL. If an object other than a tuple comes out of __bases__,
2758 * then again, the return value is NULL. So yes, these two situations
2759 * produce exactly the same results: NULL is returned and no error is set.
2760 *
2761 * If some exception other than AttributeError is raised, then NULL is also
2762 * returned, but the exception is not cleared. That's because we want the
2763 * exception to be propagated along.
2764 *
2765 * Callers are expected to test for PyErr_Occurred() when the return value
2766 * is NULL to decide whether a valid exception should be propagated or not.
2767 * When there's no exception to propagate, it's customary for the caller to
2768 * set a TypeError.
2769 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002770static PyObject *
2771abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002772{
2773 static PyObject *__bases__ = NULL;
2774 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002775
2776 if (__bases__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002777 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002778 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002779 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002780 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002781 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002782 if (bases == NULL) {
2783 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2784 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002785 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002786 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002787 if (!PyTuple_Check(bases)) {
2788 Py_DECREF(bases);
2789 return NULL;
2790 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002791 return bases;
2792}
2793
2794
2795static int
2796abstract_issubclass(PyObject *derived, PyObject *cls)
2797{
Antoine Pitrou0668c622008-08-26 22:42:08 +00002798 PyObject *bases = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002799 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002800 int r = 0;
2801
Antoine Pitrou0668c622008-08-26 22:42:08 +00002802 while (1) {
2803 if (derived == cls)
2804 return 1;
2805 bases = abstract_get_bases(derived);
2806 if (bases == NULL) {
2807 if (PyErr_Occurred())
2808 return -1;
2809 return 0;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002810 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002811 n = PyTuple_GET_SIZE(bases);
2812 if (n == 0) {
2813 Py_DECREF(bases);
2814 return 0;
2815 }
2816 /* Avoid recursivity in the single inheritance case */
2817 if (n == 1) {
2818 derived = PyTuple_GET_ITEM(bases, 0);
2819 Py_DECREF(bases);
2820 continue;
2821 }
2822 for (i = 0; i < n; i++) {
2823 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2824 if (r != 0)
2825 break;
2826 }
2827 Py_DECREF(bases);
2828 return r;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002829 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002830}
2831
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002832static int
2833check_class(PyObject *cls, const char *error)
2834{
2835 PyObject *bases = abstract_get_bases(cls);
2836 if (bases == NULL) {
2837 /* Do not mask errors. */
2838 if (!PyErr_Occurred())
2839 PyErr_SetString(PyExc_TypeError, error);
2840 return 0;
2841 }
2842 Py_DECREF(bases);
2843 return -1;
2844}
2845
Brett Cannon4f653312004-03-20 22:52:14 +00002846static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002847recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002848{
2849 PyObject *icls;
2850 static PyObject *__class__ = NULL;
2851 int retval = 0;
2852
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002853 if (__class__ == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002854 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002855 if (__class__ == NULL)
2856 return -1;
2857 }
2858
Neil Schemenauer6b471292001-10-18 03:18:43 +00002859 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2860 PyObject *inclass =
2861 (PyObject*)((PyInstanceObject*)inst)->in_class;
2862 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002863 }
2864 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002865 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002866 if (retval == 0) {
2867 PyObject *c = PyObject_GetAttr(inst, __class__);
2868 if (c == NULL) {
2869 PyErr_Clear();
2870 }
2871 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002872 if (c != (PyObject *)(inst->ob_type) &&
2873 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002874 retval = PyType_IsSubtype(
2875 (PyTypeObject *)c,
2876 (PyTypeObject *)cls);
2877 Py_DECREF(c);
2878 }
2879 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002880 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002881 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002882 if (!check_class(cls,
2883 "isinstance() arg 2 must be a class, type,"
2884 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002885 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002886 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002887 if (icls == NULL) {
2888 PyErr_Clear();
2889 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002890 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002891 else {
2892 retval = abstract_issubclass(icls, cls);
2893 Py_DECREF(icls);
2894 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002895 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002896
Guido van Rossum823649d2001-03-21 18:40:58 +00002897 return retval;
2898}
2899
2900int
Brett Cannon4f653312004-03-20 22:52:14 +00002901PyObject_IsInstance(PyObject *inst, PyObject *cls)
2902{
Christian Heimese247f002008-02-14 22:40:11 +00002903 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002904 PyObject *checker;
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002905
2906 /* Quick test for an exact match */
Raymond Hettingerde48d842008-03-19 03:56:59 +00002907 if (Py_TYPE(inst) == (PyTypeObject *)cls)
Raymond Hettinger9a47e622008-03-18 23:22:29 +00002908 return 1;
2909
Antoine Pitrou0668c622008-08-26 22:42:08 +00002910 if (PyTuple_Check(cls)) {
2911 Py_ssize_t i;
2912 Py_ssize_t n;
2913 int r = 0;
2914
2915 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2916 return -1;
2917 n = PyTuple_GET_SIZE(cls);
2918 for (i = 0; i < n; ++i) {
2919 PyObject *item = PyTuple_GET_ITEM(cls, i);
2920 r = PyObject_IsInstance(inst, item);
2921 if (r != 0)
2922 /* either found it, or got an error */
2923 break;
2924 }
2925 Py_LeaveRecursiveCall();
2926 return r;
2927 }
Christian Heimese247f002008-02-14 22:40:11 +00002928 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002929 name = PyString_InternFromString("__instancecheck__");
Christian Heimese247f002008-02-14 22:40:11 +00002930 if (name == NULL)
2931 return -1;
2932 }
2933 checker = PyObject_GetAttr(cls, name);
Raymond Hettingerc71d2a92008-03-19 22:47:48 +00002934 if (checker == NULL && PyErr_Occurred())
2935 PyErr_Clear();
Guido van Rossumb5591132007-09-10 22:36:02 +00002936 if (checker != NULL) {
2937 PyObject *res;
2938 int ok = -1;
2939 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2940 Py_DECREF(checker);
2941 return ok;
2942 }
2943 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2944 Py_LeaveRecursiveCall();
2945 Py_DECREF(checker);
2946 if (res != NULL) {
2947 ok = PyObject_IsTrue(res);
2948 Py_DECREF(res);
2949 }
2950 return ok;
2951 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00002952 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002953}
2954
2955static int
Antoine Pitrou0668c622008-08-26 22:42:08 +00002956recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002957{
2958 int retval;
2959
Antoine Pitrou0668c622008-08-26 22:42:08 +00002960 if (PyType_Check(cls) && PyType_Check(derived)) {
2961 /* Fast path (non-recursive) */
2962 return PyType_IsSubtype(
2963 (PyTypeObject *)derived, (PyTypeObject *)cls);
2964 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002965 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002966 if (!check_class(derived,
2967 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002968 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002969
Antoine Pitrou0668c622008-08-26 22:42:08 +00002970 if (!check_class(cls,
2971 "issubclass() arg 2 must be a class"
2972 " or tuple of classes"))
2973 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002974 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002975 }
2976 else {
2977 /* shortcut */
2978 if (!(retval = (derived == cls)))
2979 retval = PyClass_IsSubclass(derived, cls);
2980 }
2981
2982 return retval;
2983}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002984
Brett Cannon4f653312004-03-20 22:52:14 +00002985int
2986PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2987{
Christian Heimese247f002008-02-14 22:40:11 +00002988 static PyObject *name = NULL;
Guido van Rossumb5591132007-09-10 22:36:02 +00002989 PyObject *t, *v, *tb;
2990 PyObject *checker;
Christian Heimese247f002008-02-14 22:40:11 +00002991
Antoine Pitrou0668c622008-08-26 22:42:08 +00002992 if (PyTuple_Check(cls)) {
2993 Py_ssize_t i;
2994 Py_ssize_t n;
2995 int r = 0;
2996
2997 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2998 return -1;
2999 n = PyTuple_GET_SIZE(cls);
3000 for (i = 0; i < n; ++i) {
3001 PyObject *item = PyTuple_GET_ITEM(cls, i);
3002 r = PyObject_IsSubclass(derived, item);
3003 if (r != 0)
3004 /* either found it, or got an error */
3005 break;
3006 }
3007 Py_LeaveRecursiveCall();
3008 return r;
3009 }
Christian Heimese247f002008-02-14 22:40:11 +00003010 if (name == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003011 name = PyString_InternFromString("__subclasscheck__");
Christian Heimese247f002008-02-14 22:40:11 +00003012 if (name == NULL)
3013 return -1;
3014 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003015 PyErr_Fetch(&t, &v, &tb);
Christian Heimese247f002008-02-14 22:40:11 +00003016 checker = PyObject_GetAttr(cls, name);
Guido van Rossumb5591132007-09-10 22:36:02 +00003017 PyErr_Restore(t, v, tb);
3018 if (checker != NULL) {
3019 PyObject *res;
3020 int ok = -1;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003021 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
3022 Py_DECREF(checker);
Guido van Rossumb5591132007-09-10 22:36:02 +00003023 return ok;
Antoine Pitrou0668c622008-08-26 22:42:08 +00003024 }
Guido van Rossumb5591132007-09-10 22:36:02 +00003025 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
3026 Py_LeaveRecursiveCall();
3027 Py_DECREF(checker);
3028 if (res != NULL) {
3029 ok = PyObject_IsTrue(res);
3030 Py_DECREF(res);
3031 }
3032 return ok;
3033 }
Antoine Pitrou0668c622008-08-26 22:42:08 +00003034 return recursive_issubclass(derived, cls);
3035}
3036
3037int
3038_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
3039{
3040 return recursive_isinstance(inst, cls);
3041}
3042
3043int
3044_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
3045{
3046 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00003047}
3048
3049
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003050PyObject *
3051PyObject_GetIter(PyObject *o)
3052{
3053 PyTypeObject *t = o->ob_type;
3054 getiterfunc f = NULL;
3055 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
3056 f = t->tp_iter;
3057 if (f == NULL) {
3058 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00003059 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00003060 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003061 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00003062 else {
3063 PyObject *res = (*f)(o);
3064 if (res != NULL && !PyIter_Check(res)) {
3065 PyErr_Format(PyExc_TypeError,
3066 "iter() returned non-iterator "
3067 "of type '%.100s'",
3068 res->ob_type->tp_name);
3069 Py_DECREF(res);
3070 res = NULL;
3071 }
3072 return res;
3073 }
3074}
3075
Tim Petersf4848da2001-05-05 00:14:56 +00003076/* Return next item.
3077 * If an error occurs, return NULL. PyErr_Occurred() will be true.
3078 * If the iteration terminates normally, return NULL and clear the
3079 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
3080 * will be false.
3081 * Else return the next object. PyErr_Occurred() will be false.
3082 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00003083PyObject *
3084PyIter_Next(PyObject *iter)
3085{
Tim Petersf4848da2001-05-05 00:14:56 +00003086 PyObject *result;
Tim Petersf4848da2001-05-05 00:14:56 +00003087 result = (*iter->ob_type->tp_iternext)(iter);
3088 if (result == NULL &&
3089 PyErr_Occurred() &&
3090 PyErr_ExceptionMatches(PyExc_StopIteration))
3091 PyErr_Clear();
3092 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003093}